b311480e |
1 | // Created on: 1998-09-30 |
2 | // Created by: Sergey RUIN |
3 | // Copyright (c) 1998-1999 Matra Datavision |
4 | // Copyright (c) 1999-2012 OPEN CASCADE SAS |
5 | // |
6 | // The content of this file is subject to the Open CASCADE Technology Public |
7 | // License Version 6.5 (the "License"). You may not use the content of this file |
8 | // except in compliance with the License. Please obtain a copy of the License |
9 | // at http://www.opencascade.org and read it completely before using this file. |
10 | // |
11 | // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its |
12 | // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. |
13 | // |
14 | // The Original Code and all software distributed under the License is |
15 | // distributed on an "AS IS" basis, without warranty of any kind, and the |
16 | // Initial Developer hereby disclaims all such warranties, including without |
17 | // limitation, any warranties of merchantability, fitness for a particular |
18 | // purpose or non-infringement. Please see the License for the specific terms |
19 | // and conditions governing the rights and limitations under the License. |
20 | |
7fd59977 |
21 | |
22 | |
23 | |
24 | // Lastly modified by : |
25 | // +---------------------------------------------------------------------------+ |
26 | // ! ivan ! SetMode ! 5-04-2001! 3.0-00-1! |
27 | // +---------------------------------------------------------------------------+ |
28 | #include <TPrsStd_AISPresentation.ixx> |
29 | |
30 | #include <TDF_DefaultDeltaOnRemoval.hxx> |
31 | #include <TDF_DefaultDeltaOnModification.hxx> |
32 | #include <TDF_DeltaOnAddition.hxx> |
33 | #include <TDF_Tool.hxx> |
34 | #include <TCollection_ExtendedString.hxx> |
35 | #include <TPrsStd_AISViewer.hxx> |
36 | #include <AIS_InteractiveContext.hxx> |
37 | #include <AIS_InteractiveObject.hxx> |
38 | #include <TPrsStd_Driver.hxx> |
39 | #include <TPrsStd_DriverTable.hxx> |
40 | |
41 | |
42 | #define BUC60917 |
43 | #define BUC61050 |
44 | |
45 | #define OCC1029 |
46 | #define OCC1030 |
47 | #define OCC1031 |
48 | #define OCC1032 |
49 | #define OCC1033 |
50 | #define OCC1034 |
51 | |
52 | //======================================================================= |
53 | //function : Set |
54 | //purpose : |
55 | //======================================================================= |
56 | Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set(const TDF_Label& L,const Standard_GUID& driver) |
57 | { |
58 | |
59 | Handle(TPrsStd_AISPresentation) P; |
60 | |
61 | if (!L.FindAttribute(TPrsStd_AISPresentation::GetID(),P)) { |
62 | P = new TPrsStd_AISPresentation (); |
63 | L.AddAttribute(P); |
64 | } |
65 | P->SetDriverGUID(driver); |
66 | return P; |
67 | } |
68 | |
69 | |
70 | //======================================================================= |
71 | //function : Unset |
72 | //purpose : |
73 | //======================================================================= |
74 | void TPrsStd_AISPresentation::Unset (const TDF_Label& L) |
75 | { |
76 | Handle(TPrsStd_AISPresentation) P; |
77 | |
78 | if (L.FindAttribute(TPrsStd_AISPresentation::GetID(),P)) { |
79 | L.ForgetAttribute(P); |
80 | } |
81 | } |
82 | |
83 | |
84 | //======================================================================= |
85 | //function : Set |
86 | //purpose : |
87 | //======================================================================= |
88 | Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set (const Handle(TDF_Attribute)& master) |
89 | { |
90 | Handle(TPrsStd_AISPresentation) P; |
91 | |
92 | if (!master->Label().FindAttribute(TPrsStd_AISPresentation::GetID(),P)) { |
93 | P = new TPrsStd_AISPresentation (); |
94 | master->Label().AddAttribute(P); |
95 | } |
96 | |
97 | P->SetDriverGUID( master->ID() ); |
98 | |
99 | return P; |
100 | } |
101 | |
102 | |
103 | |
104 | |
105 | //======================================================================= |
106 | //function : GetID |
107 | //purpose : |
108 | //======================================================================= |
109 | const Standard_GUID& TPrsStd_AISPresentation::GetID() |
110 | { |
111 | static Standard_GUID TPrsStd_AISPresentationID("04fb4d00-5690-11d1-8940-080009dc3333"); |
112 | return TPrsStd_AISPresentationID; |
113 | } |
114 | |
115 | |
116 | //======================================================================= |
117 | //function : TPrsStd_AISPresentation |
118 | //purpose : |
119 | //======================================================================= |
120 | TPrsStd_AISPresentation::TPrsStd_AISPresentation () : |
121 | myDriverGUID("00000000-0000-0000-0000-000000000000"), |
122 | myTransparency(0.), |
123 | myColor(Quantity_NOC_WHITE), |
124 | myMaterial(Graphic3d_NOM_BRASS), |
125 | myWidth(0.), |
126 | #ifdef BUC61050 |
127 | myMode(0), |
128 | mySelectionMode(0), |
129 | #endif |
130 | isDisplayed(Standard_False), |
131 | hasOwnColor(Standard_False), |
132 | hasOwnMaterial(Standard_False), |
133 | hasOwnTransparency(Standard_False), |
134 | hasOwnWidth(Standard_False) |
135 | #ifdef BUC61050 |
136 | ,hasOwnMode(Standard_False), |
137 | hasOwnSelectionMode(Standard_False) |
138 | #endif |
139 | {} |
140 | |
141 | |
142 | //======================================================================= |
143 | //function : Display |
144 | //purpose : |
145 | //======================================================================= |
146 | void TPrsStd_AISPresentation::Display (const Standard_Boolean update) |
147 | { |
148 | |
149 | if( update || myAIS.IsNull() ) { |
150 | AISUpdate(); |
151 | } |
152 | AISDisplay(); |
153 | } |
154 | |
155 | |
156 | //======================================================================= |
157 | //function : Erase |
158 | //purpose : |
159 | //======================================================================= |
160 | void TPrsStd_AISPresentation::Erase (const Standard_Boolean remove) |
161 | { |
162 | if( isDisplayed ) AISErase(remove); |
163 | } |
164 | |
165 | //======================================================================= |
166 | //function : Update |
167 | //purpose : |
168 | //======================================================================= |
169 | void TPrsStd_AISPresentation::Update () |
170 | { |
171 | AISUpdate(); |
172 | } |
173 | |
174 | |
175 | //======================================================================= |
176 | //function : IsDisplayed |
177 | //purpose : |
178 | //======================================================================= |
179 | Standard_Boolean TPrsStd_AISPresentation::IsDisplayed () const |
180 | { |
181 | return isDisplayed; |
182 | } |
183 | |
184 | |
185 | //======================================================================= |
186 | //function :SetDriverGUID |
187 | //purpose : |
188 | //======================================================================= |
189 | void TPrsStd_AISPresentation::SetDriverGUID(const Standard_GUID& guid) |
190 | { |
191 | // OCC2932 correction |
192 | if(myDriverGUID == guid) return; |
193 | |
194 | Backup(); |
195 | myDriverGUID = guid; |
196 | } |
197 | |
198 | |
199 | //======================================================================= |
200 | //function :GetDriverGUID |
201 | //purpose : |
202 | //======================================================================= |
203 | Standard_GUID TPrsStd_AISPresentation::GetDriverGUID() const |
204 | { |
205 | return myDriverGUID; |
206 | } |
207 | |
208 | |
209 | //======================================================================= |
210 | //function :Material |
211 | //purpose : |
212 | //======================================================================= |
213 | Graphic3d_NameOfMaterial TPrsStd_AISPresentation::Material() const |
214 | { |
215 | return myMaterial; |
216 | } |
217 | |
218 | //======================================================================= |
219 | //function :HasMaterial |
220 | //purpose : |
221 | //======================================================================= |
222 | Standard_Boolean TPrsStd_AISPresentation::HasOwnMaterial() const |
223 | { |
224 | return hasOwnMaterial; |
225 | } |
226 | |
227 | //======================================================================= |
228 | //function :UnsetMaterial |
229 | //purpose : |
230 | //======================================================================= |
231 | void TPrsStd_AISPresentation::UnsetMaterial() |
232 | { |
233 | // OCC2932 correction |
234 | if(hasOwnMaterial == Standard_False && !myAIS.IsNull()) { |
235 | if(!myAIS->HasMaterial()) |
236 | return; |
237 | } |
238 | |
239 | Backup(); |
240 | hasOwnMaterial = Standard_False; |
241 | if( myAIS.IsNull() ) AISUpdate(); |
242 | if( !myAIS.IsNull() && myAIS->HasMaterial() ) { |
243 | Handle(AIS_InteractiveContext) ctx; |
244 | Handle(TPrsStd_AISViewer) viewer; |
245 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
246 | if( !ctx.IsNull() ) |
247 | ctx->UnsetMaterial(myAIS, Standard_False); |
248 | else |
249 | myAIS->UnsetMaterial(); |
250 | } |
251 | } |
252 | |
253 | //======================================================================= |
254 | //function :SetMaterial |
255 | //purpose : |
256 | //======================================================================= |
257 | void TPrsStd_AISPresentation::SetMaterial(const Graphic3d_NameOfMaterial aName) |
258 | { |
259 | // OCC2932 correction |
260 | if(myMaterial == aName && hasOwnMaterial == Standard_True && !myAIS.IsNull()) { |
261 | if(myAIS->HasMaterial() && myAIS->Material() == aName) |
262 | return; |
263 | } |
264 | |
265 | Backup(); |
266 | myMaterial = aName; |
267 | hasOwnMaterial = Standard_True; |
268 | if( myAIS.IsNull() ) AISUpdate(); |
269 | if( !myAIS.IsNull() ) { |
270 | if( myAIS->HasMaterial() && myAIS->Material() == aName ) return; // AIS has already had that material |
271 | Handle(AIS_InteractiveContext) ctx; |
272 | Handle(TPrsStd_AISViewer) viewer; |
273 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
274 | if( !ctx.IsNull() ) |
275 | ctx->SetMaterial(myAIS, aName, Standard_False); |
276 | else |
277 | myAIS->SetMaterial(aName); |
278 | } |
279 | } |
280 | |
281 | |
282 | //======================================================================= |
283 | //function :SetTransparency |
284 | //purpose : |
285 | //======================================================================= |
286 | void TPrsStd_AISPresentation::SetTransparency(const Standard_Real aValue) |
287 | { |
288 | // OCC2932 correction |
289 | if(hasOwnTransparency == Standard_True && myTransparency == aValue && !myAIS.IsNull()) |
290 | if(myAIS->Transparency() == aValue) |
291 | return; |
292 | |
293 | Backup(); |
294 | myTransparency = aValue; |
295 | hasOwnTransparency = Standard_True; |
296 | if( myAIS.IsNull() ) AISUpdate(); |
297 | if( !myAIS.IsNull() ) { |
298 | if( myAIS->Transparency() == aValue ) return; // AIS has already had that transparency |
299 | Handle(AIS_InteractiveContext) ctx; |
300 | Handle(TPrsStd_AISViewer) viewer; |
301 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
302 | if( !ctx.IsNull() ) |
303 | ctx->SetTransparency(myAIS, aValue, Standard_False); |
304 | else |
305 | myAIS->SetTransparency(aValue); |
306 | } |
307 | } |
308 | |
309 | |
310 | //======================================================================= |
311 | //function :Transparency |
312 | //purpose : |
313 | //======================================================================= |
314 | Standard_Real TPrsStd_AISPresentation::Transparency() const |
315 | { |
316 | return myTransparency; |
317 | } |
318 | |
319 | //======================================================================= |
320 | //function :UnsetTransparency |
321 | //purpose : |
322 | //======================================================================= |
323 | void TPrsStd_AISPresentation::UnsetTransparency() |
324 | { |
325 | // OCC2932 correction |
326 | if(!hasOwnTransparency) |
327 | return; |
328 | |
329 | Backup(); |
330 | hasOwnTransparency = Standard_False; |
331 | if( myAIS.IsNull() ) AISUpdate(); |
332 | if( !myAIS.IsNull() ) { |
333 | Handle(AIS_InteractiveContext) ctx; |
334 | Handle(TPrsStd_AISViewer) viewer; |
335 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
336 | if( !ctx.IsNull() ) |
337 | ctx->UnsetTransparency(myAIS, Standard_False); |
338 | else |
339 | myAIS->UnsetTransparency(); |
340 | } |
341 | } |
342 | |
343 | //======================================================================= |
344 | //function :HasTransparency |
345 | //purpose : |
346 | //======================================================================= |
347 | Standard_Boolean TPrsStd_AISPresentation::HasOwnTransparency() const |
348 | { |
349 | return hasOwnTransparency; |
350 | } |
351 | |
352 | //======================================================================= |
353 | //function :Color |
354 | //purpose : |
355 | //======================================================================= |
356 | Quantity_NameOfColor TPrsStd_AISPresentation::Color() const |
357 | { |
358 | return myColor; |
359 | } |
360 | |
361 | //======================================================================= |
362 | //function :HasColor |
363 | //purpose : |
364 | //======================================================================= |
365 | Standard_Boolean TPrsStd_AISPresentation::HasOwnColor() const |
366 | { |
367 | return hasOwnColor; |
368 | } |
369 | |
370 | //======================================================================= |
371 | //function :UnsetColor |
372 | //purpose : |
373 | //======================================================================= |
374 | void TPrsStd_AISPresentation::UnsetColor() |
375 | { |
376 | // OCC2932 correction |
377 | if(!hasOwnColor && !myAIS.IsNull()) |
378 | if(!myAIS->HasColor()) |
379 | return; |
380 | |
381 | Backup(); |
382 | hasOwnColor = Standard_False; |
383 | if( myAIS.IsNull() ) AISUpdate(); |
384 | if( !myAIS.IsNull() && myAIS->HasColor() ) { |
385 | Handle(AIS_InteractiveContext) ctx; |
386 | Handle(TPrsStd_AISViewer) viewer; |
387 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
388 | if( !ctx.IsNull() ) |
389 | ctx->UnsetColor(myAIS, Standard_False); |
390 | else |
391 | myAIS->UnsetColor(); |
392 | } |
393 | } |
394 | |
395 | //======================================================================= |
396 | //function :SetColor |
397 | //purpose : |
398 | //======================================================================= |
399 | void TPrsStd_AISPresentation::SetColor(const Quantity_NameOfColor aColor) |
400 | { |
401 | // OCC2932 correction |
402 | if(hasOwnColor && myColor == aColor && ! myAIS.IsNull()) |
403 | if(myAIS->HasColor() && myAIS->Color() == aColor ) |
404 | return; |
405 | |
406 | Backup(); |
407 | myColor = aColor; |
408 | hasOwnColor = Standard_True; |
409 | if( myAIS.IsNull() ) AISUpdate(); |
410 | if( !myAIS.IsNull() ) { |
411 | if( myAIS->HasColor() && myAIS->Color() == aColor ) return; // AIS has already had that color |
412 | Handle(AIS_InteractiveContext) ctx; |
413 | Handle(TPrsStd_AISViewer) viewer; |
414 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
415 | if( !ctx.IsNull() ) |
416 | ctx->SetColor(myAIS, aColor, Standard_False); |
417 | else |
418 | myAIS->SetColor(aColor); |
419 | } |
420 | } |
421 | |
422 | |
423 | //======================================================================= |
424 | //function :Width |
425 | //purpose : |
426 | //======================================================================= |
427 | Standard_Real TPrsStd_AISPresentation::Width() const |
428 | { |
429 | return myWidth; |
430 | } |
431 | |
432 | //======================================================================= |
433 | //function :HasWidth |
434 | //purpose : |
435 | //======================================================================= |
436 | Standard_Boolean TPrsStd_AISPresentation::HasOwnWidth() const |
437 | { |
438 | return hasOwnWidth; |
439 | } |
440 | |
441 | //======================================================================= |
442 | //function :SetWidth |
443 | //purpose : |
444 | //======================================================================= |
445 | void TPrsStd_AISPresentation::SetWidth(const Standard_Real aWidth) |
446 | { |
447 | // OCC2932 correction |
448 | if(hasOwnWidth && myWidth == aWidth && myAIS.IsNull()) |
449 | if(myAIS->HasWidth() && myAIS->Width() == aWidth ) |
450 | return; |
451 | |
452 | Backup(); |
453 | myWidth = aWidth; |
454 | hasOwnWidth = Standard_True; |
455 | if( myAIS.IsNull() ) AISUpdate(); |
456 | if( !myAIS.IsNull() ) { |
457 | if( myAIS->HasWidth() && myAIS->Width() == aWidth ) return; // AIS has already had that width |
458 | Handle(AIS_InteractiveContext) ctx; |
459 | Handle(TPrsStd_AISViewer) viewer; |
460 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
461 | if( !ctx.IsNull() ) |
462 | ctx->SetWidth(myAIS, aWidth, Standard_False); |
463 | else |
464 | myAIS->SetWidth(aWidth); |
465 | } |
466 | } |
467 | |
468 | //======================================================================= |
469 | //function :UnsetWidth |
470 | //purpose : |
471 | //======================================================================= |
472 | void TPrsStd_AISPresentation::UnsetWidth() |
473 | { |
474 | // OCC2932 correction |
475 | if(!hasOwnWidth && !myAIS.IsNull()) |
476 | if(!myAIS->HasWidth()) |
477 | return; |
478 | |
479 | Backup(); |
480 | hasOwnWidth = Standard_False; |
481 | if( myAIS.IsNull() ) AISUpdate(); |
482 | if( !myAIS.IsNull() && myAIS->HasWidth() ) { |
483 | Handle(AIS_InteractiveContext) ctx; |
484 | Handle(TPrsStd_AISViewer) viewer; |
485 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
486 | if( !ctx.IsNull() ) |
487 | ctx->UnsetWidth(myAIS, Standard_False); |
488 | else |
489 | myAIS->UnsetWidth(); |
490 | } |
491 | } |
492 | |
493 | |
494 | |
495 | //======================================================================= |
496 | //function : Mode |
497 | //purpose : |
498 | //======================================================================= |
499 | |
500 | Standard_Integer TPrsStd_AISPresentation::Mode() const |
501 | { |
502 | return myMode; |
503 | } |
504 | |
505 | //======================================================================= |
506 | //function :HasOwnMode |
507 | //purpose : |
508 | //======================================================================= |
509 | Standard_Boolean TPrsStd_AISPresentation::HasOwnMode() const |
510 | { |
511 | return hasOwnMode; |
512 | } |
513 | |
514 | //======================================================================= |
515 | //function :SetMode |
516 | //purpose : |
517 | //======================================================================= |
518 | void TPrsStd_AISPresentation::SetMode(const Standard_Integer theMode) |
519 | { |
520 | // OCC2932 correction |
521 | if(hasOwnMode && myMode == theMode && !myAIS.IsNull()) |
522 | if(myAIS->DisplayMode() == theMode ) |
523 | return; |
524 | |
525 | Backup(); |
526 | myMode = theMode; |
527 | hasOwnMode = Standard_True; |
528 | if( myAIS.IsNull() ) AISUpdate(); |
529 | if( !myAIS.IsNull() ) { |
530 | if( myAIS->DisplayMode() == theMode ) return; // AIS has already had that mode |
531 | Handle(AIS_InteractiveContext) ctx; |
532 | Handle(TPrsStd_AISViewer) viewer; |
533 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) |
534 | ctx = viewer->GetInteractiveContext(); |
535 | if( !ctx.IsNull() ) |
536 | ctx->SetDisplayMode(myAIS, theMode, Standard_False); |
537 | else |
538 | myAIS->SetDisplayMode(theMode); |
539 | } |
540 | } |
541 | |
542 | //======================================================================= |
543 | //function :UnsetMode |
544 | //purpose : |
545 | //======================================================================= |
546 | void TPrsStd_AISPresentation::UnsetMode() |
547 | { |
548 | // OCC2932 correction |
549 | if(HasOwnMode() == Standard_False && myAIS.IsNull() == Standard_False) |
550 | if(!myAIS->HasDisplayMode()) |
551 | return; |
552 | |
553 | Backup(); |
554 | hasOwnMode = Standard_False; |
555 | if( myAIS.IsNull() ) AISUpdate(); |
556 | if( !myAIS.IsNull() && myAIS->HasDisplayMode() ) { |
557 | Handle(AIS_InteractiveContext) ctx; |
558 | Handle(TPrsStd_AISViewer) viewer; |
559 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) |
560 | ctx = viewer->GetInteractiveContext(); |
561 | if( !ctx.IsNull() ) |
562 | ctx->UnsetDisplayMode(myAIS, Standard_False); |
563 | else |
564 | myAIS->UnsetDisplayMode(); |
565 | } |
566 | } |
567 | |
568 | #ifdef BUC61050 |
569 | //======================================================================= |
570 | //function : SelectionMode |
571 | //purpose : |
572 | //======================================================================= |
573 | |
574 | Standard_Integer TPrsStd_AISPresentation::SelectionMode() const |
575 | { |
576 | return mySelectionMode; |
577 | } |
578 | |
579 | //======================================================================= |
580 | //function :HasOwnSelectionMode |
581 | //purpose : |
582 | //======================================================================= |
583 | Standard_Boolean TPrsStd_AISPresentation::HasOwnSelectionMode() const |
584 | { |
585 | return hasOwnSelectionMode; |
586 | } |
587 | |
588 | //======================================================================= |
589 | //function :SetSelectionMode |
590 | //purpose : |
591 | //======================================================================= |
592 | void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode) |
593 | { |
594 | // OCC2932 correction |
595 | if(hasOwnSelectionMode && mySelectionMode == theSelectionMode && !myAIS.IsNull()) |
596 | if(myAIS->SelectionMode() == theSelectionMode ) |
597 | return; |
598 | |
599 | Backup(); |
600 | mySelectionMode = theSelectionMode; |
601 | hasOwnSelectionMode = Standard_True; |
602 | if( myAIS.IsNull() ) AISUpdate(); |
603 | if( !myAIS.IsNull() ) { |
604 | if( myAIS->SelectionMode() == theSelectionMode ) return; |
605 | myAIS->SetSelectionMode(theSelectionMode); |
606 | } |
607 | } |
608 | |
609 | //======================================================================= |
610 | //function :UnsetSelectionMode |
611 | //purpose : |
612 | //======================================================================= |
613 | void TPrsStd_AISPresentation::UnsetSelectionMode() |
614 | { |
615 | if(!hasOwnSelectionMode && !myAIS.IsNull()) |
616 | if(!myAIS->HasSelectionMode()) |
617 | return; |
618 | |
619 | Backup(); |
620 | hasOwnSelectionMode = Standard_False; |
621 | if( myAIS.IsNull() ) AISUpdate(); |
622 | if( !myAIS.IsNull() && myAIS->HasSelectionMode() ) { |
623 | myAIS->UnsetSelectionMode(); |
624 | } |
625 | } |
626 | #endif |
627 | |
628 | |
629 | //======================================================================= |
630 | //function : ID |
631 | //purpose : |
632 | //======================================================================= |
633 | const Standard_GUID& TPrsStd_AISPresentation::ID() const { return GetID(); } |
634 | |
635 | |
636 | //======================================================================= |
637 | //function : BackupCopy |
638 | //purpose : |
639 | //======================================================================= |
640 | Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const |
641 | { |
642 | Handle(TPrsStd_AISPresentation) copy = new TPrsStd_AISPresentation; |
643 | copy->myTransparency = myTransparency; |
644 | copy->myColor = myColor; |
645 | copy->myMode= myMode; |
646 | #ifdef BUC60917 |
647 | copy->myWidth= myWidth; |
648 | #endif |
649 | copy->myMaterial = myMaterial; |
650 | copy->hasOwnColor = hasOwnColor; |
651 | copy->hasOwnMaterial = hasOwnMaterial; |
652 | copy->hasOwnWidth = hasOwnWidth; |
653 | copy->hasOwnMode=hasOwnMode; |
654 | copy->hasOwnTransparency = hasOwnTransparency; |
655 | copy->myAIS.Nullify(); |
656 | copy->isDisplayed = isDisplayed; |
657 | copy->myDriverGUID = myDriverGUID; |
658 | #ifdef BUC61050 |
659 | copy->mySelectionMode= mySelectionMode; |
660 | copy->hasOwnSelectionMode = hasOwnSelectionMode; |
661 | #endif |
662 | return copy; |
663 | } |
664 | |
665 | |
666 | //======================================================================= |
667 | //function : NewEmpty |
668 | //purpose : |
669 | //======================================================================= |
670 | Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const |
671 | { |
672 | return new TPrsStd_AISPresentation (); |
673 | } |
674 | |
675 | //======================================================================= |
676 | //function : Restore |
677 | //purpose : |
678 | //======================================================================= |
679 | void TPrsStd_AISPresentation::Restore (const Handle(TDF_Attribute)& With) |
680 | { |
681 | Handle(TPrsStd_AISPresentation) with = Handle(TPrsStd_AISPresentation)::DownCast(With); |
682 | |
683 | myAIS.Nullify(); |
684 | |
685 | if(!with->HasOwnMaterial()) hasOwnMaterial = Standard_False; |
686 | else { |
687 | #ifndef OCC1031 |
688 | myMaterial = with->Material(); |
689 | #endif |
690 | hasOwnMaterial = Standard_True; |
691 | } |
692 | #ifdef OCC1031 |
693 | myMaterial = with->Material(); |
694 | #endif |
695 | |
696 | if(!with->HasOwnColor()) hasOwnColor = Standard_False; |
697 | else { |
698 | #ifndef OCC1030 |
699 | myColor = with->Color(); |
700 | #endif |
701 | hasOwnColor = Standard_True; |
702 | } |
703 | #ifdef OCC1030 |
704 | myColor = with->Color(); |
705 | #endif |
706 | |
707 | if(!with->HasOwnWidth()) hasOwnWidth = Standard_False; |
708 | else { |
709 | #ifndef OCC1032 |
710 | myWidth = with->Width(); |
711 | #endif |
712 | hasOwnWidth = Standard_True; |
713 | } |
714 | #ifdef OCC1032 |
715 | myWidth = with->Width(); |
716 | #endif |
717 | |
718 | if(!with->HasOwnMode()) hasOwnMode = Standard_False; |
719 | else { |
720 | #ifndef OCC1033 |
721 | myMode = with->Mode(); |
722 | #endif |
723 | hasOwnMode = Standard_True; |
724 | } |
725 | #ifdef OCC1033 |
726 | myMode = with->Mode(); |
727 | #endif |
728 | |
729 | #ifdef BUC61050 |
730 | if(!with->HasOwnSelectionMode()) hasOwnSelectionMode = Standard_False; |
731 | else { |
732 | #ifndef OCC1034 |
733 | mySelectionMode = with->SelectionMode(); |
734 | #endif |
735 | hasOwnSelectionMode = Standard_True; |
736 | } |
737 | #ifdef OCC1034 |
738 | mySelectionMode = with->SelectionMode(); |
739 | #endif |
740 | #endif |
741 | |
742 | if(!with->HasOwnTransparency()) hasOwnTransparency = Standard_False; |
743 | else { |
744 | #ifndef OCC1029 |
745 | myTransparency = with->Transparency(); |
746 | #endif |
747 | hasOwnTransparency = Standard_True; |
748 | } |
749 | #ifdef OCC1029 |
750 | myTransparency = with->Transparency(); |
751 | #endif |
752 | |
753 | isDisplayed = with->IsDisplayed(); |
754 | myDriverGUID = with->GetDriverGUID(); |
755 | } |
756 | |
757 | //======================================================================= |
758 | //function : Paste |
759 | //purpose : |
760 | //======================================================================= |
761 | void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& Into, |
762 | const Handle(TDF_RelocationTable)& ) const |
763 | { |
764 | Handle(TPrsStd_AISPresentation) into = Handle(TPrsStd_AISPresentation)::DownCast(Into); |
765 | |
766 | into->Backup(); |
767 | |
768 | if(!hasOwnMaterial) into->hasOwnMaterial = Standard_False; |
769 | else { |
770 | into->myMaterial = myMaterial; |
771 | into->hasOwnMaterial = Standard_True; |
772 | } |
773 | |
774 | if(!hasOwnColor) into->hasOwnColor = Standard_False; |
775 | else { |
776 | into->myColor = myColor; |
777 | into->hasOwnColor = Standard_True; |
778 | } |
779 | |
780 | if(!hasOwnWidth) into->hasOwnWidth = Standard_False; |
781 | else { |
782 | into->myWidth = myWidth; |
783 | into->hasOwnWidth = Standard_True; |
784 | } |
785 | if(!hasOwnMode) into->hasOwnMode = Standard_False; |
786 | else { |
787 | into->myMode = myMode; |
788 | into->hasOwnMode = Standard_True; |
789 | } |
790 | |
791 | #ifdef BUC61050 |
792 | if(!hasOwnSelectionMode) into->hasOwnSelectionMode = Standard_False; |
793 | else { |
794 | into->mySelectionMode = mySelectionMode; |
795 | into->hasOwnSelectionMode = Standard_True; |
796 | } |
797 | #endif |
798 | |
799 | if(!hasOwnTransparency) into->hasOwnTransparency = Standard_False; |
800 | else { |
801 | into->myTransparency = myTransparency; |
802 | into->hasOwnTransparency = Standard_True; |
803 | } |
804 | |
805 | if (into->isDisplayed) |
806 | into->AISErase(Standard_True); |
807 | |
808 | into->isDisplayed = isDisplayed; |
809 | into->myDriverGUID = myDriverGUID; |
810 | |
811 | into->myAIS.Nullify(); |
812 | } |
813 | |
814 | //======================================================================= |
815 | //function : AfterAddition |
816 | //purpose : erase if displayed |
817 | //======================================================================= |
818 | void TPrsStd_AISPresentation::AfterAddition() |
819 | { |
820 | AfterResume(); |
821 | } |
822 | |
823 | //======================================================================= |
824 | //function : BeforeRemoval |
825 | //purpose : erase if displayed |
826 | //======================================================================= |
827 | void TPrsStd_AISPresentation::BeforeRemoval() |
828 | { |
829 | BeforeForget(); |
830 | } |
831 | |
832 | //======================================================================= |
833 | //function : BeforeForget |
834 | //purpose : erase if displayed |
835 | //======================================================================= |
836 | void TPrsStd_AISPresentation::BeforeForget() |
837 | { |
838 | if( !myAIS.IsNull() ) { |
839 | AISErase(Standard_True); //Remove AISObject from context |
840 | myAIS.Nullify(); |
841 | } |
842 | } |
843 | |
844 | |
845 | //======================================================================= |
846 | //function : AfterResume |
847 | //purpose : display if displayed |
848 | //======================================================================= |
849 | void TPrsStd_AISPresentation::AfterResume() |
850 | { |
851 | AISUpdate(); |
852 | if( IsDisplayed() ) AISDisplay(); |
853 | else AISErase(); |
854 | } |
855 | |
856 | //======================================================================= |
857 | //function : BeforeUndo |
858 | //purpose : le NamedShape associe doit etre present |
859 | //======================================================================= |
860 | |
861 | Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD, |
862 | const Standard_Boolean ) |
863 | { |
864 | Handle(TPrsStd_AISPresentation) P; |
865 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
866 | |
867 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) { |
868 | if( !P.IsNull() ) P->BeforeForget(); |
869 | } |
870 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) { |
871 | } |
872 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) { |
873 | if( !P.IsNull() ) P->BeforeForget(); |
874 | } |
875 | |
876 | return Standard_True; |
877 | } |
878 | |
879 | |
880 | //======================================================================= |
881 | //function : AfterUndo |
882 | //purpose : le NamedShape associe doit etre present |
883 | //======================================================================= |
884 | |
885 | Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD, |
886 | const Standard_Boolean ) |
887 | { |
888 | Handle(TPrsStd_AISPresentation) P; |
889 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
890 | |
891 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) { |
892 | } |
893 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) { |
894 | if( !P.IsNull() ) P->AfterAddition(); |
895 | } |
896 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) { |
897 | if( !P.IsNull() ) P->AfterResume(); |
898 | } |
899 | |
900 | return Standard_True; |
901 | } |
902 | |
903 | |
904 | |
905 | //======================================================================= |
906 | //function : AISUpdate |
907 | //purpose : |
908 | //======================================================================= |
909 | |
910 | void TPrsStd_AISPresentation::AISUpdate () |
911 | { |
912 | Backup(); |
913 | |
914 | Handle(AIS_InteractiveContext) ctx; |
915 | if(!Label().IsNull()) { |
916 | Handle(TPrsStd_AISViewer) viewer; |
917 | if( TPrsStd_AISViewer::Find(Label(), viewer) ) ctx = viewer->GetInteractiveContext(); |
918 | |
919 | Handle(TPrsStd_Driver) driver; |
920 | if (TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), driver)) { |
921 | if (myAIS.IsNull()) { // build a new AIS |
922 | Handle(AIS_InteractiveObject) newais; |
923 | if (driver->Update (Label(), newais)) { |
924 | myAIS = newais; |
925 | newais->SetOwner(this); |
926 | } |
927 | } |
928 | else { |
929 | Handle(AIS_InteractiveObject) theais = myAIS; |
930 | if (driver->Update (Label(), theais)) { |
931 | if (! (theais == myAIS)) { |
932 | if(!ctx.IsNull()) ctx->Remove(myAIS); |
933 | myAIS = theais; //Driver has built new AIS |
934 | theais->SetOwner(this); |
935 | } |
936 | } |
937 | } |
938 | } |
939 | } |
940 | else return; |
941 | |
942 | //Apply the visualization settings |
943 | if( !myAIS.IsNull() ) { |
944 | |
945 | if( hasOwnColor ) { |
946 | if( !(myAIS->HasColor()) || (myAIS->HasColor() && myAIS->Color() != myColor) ) { |
947 | if(!ctx.IsNull()) ctx->SetColor(myAIS, myColor, Standard_False); |
948 | else myAIS->SetColor(myColor); |
949 | } |
950 | } |
951 | |
952 | if( hasOwnMaterial ) { |
953 | if( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != myMaterial) ) { |
954 | if(!ctx.IsNull()) ctx->SetMaterial(myAIS, myMaterial, Standard_False ); |
955 | else myAIS->SetMaterial(myMaterial); |
956 | } |
957 | } |
958 | |
959 | if( hasOwnTransparency ) { |
960 | if( myAIS->Transparency() != myTransparency ) { |
961 | if(!ctx.IsNull()) ctx->SetTransparency(myAIS, myTransparency, Standard_False); |
962 | else myAIS->SetTransparency(myTransparency); |
963 | } |
964 | } |
965 | |
966 | if( hasOwnWidth ) { |
967 | if( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != myWidth) ) { |
968 | if(!ctx.IsNull()) ctx->SetWidth(myAIS, myWidth, Standard_False); |
969 | else myAIS->SetWidth(myWidth); |
970 | } |
971 | } |
972 | |
973 | if( hasOwnMode) { |
974 | if( myAIS->DisplayMode() != myMode ) { |
975 | myAIS->SetDisplayMode(myMode); |
976 | } |
977 | |
978 | |
979 | } |
980 | |
981 | #ifdef BUC61050 |
982 | if (hasOwnSelectionMode) { |
983 | if (myAIS->SelectionMode() != mySelectionMode ) { |
984 | myAIS->SetSelectionMode(mySelectionMode); |
985 | } |
986 | } |
987 | #endif |
988 | |
989 | } |
990 | |
991 | if( isDisplayed && !ctx.IsNull() ) ctx->Redisplay(myAIS, Standard_False); |
992 | |
993 | return; |
994 | } |
995 | |
996 | //======================================================================= |
997 | //function : AISDisplay |
998 | //purpose : |
999 | //======================================================================= |
1000 | |
1001 | void TPrsStd_AISPresentation::AISDisplay () |
1002 | { |
1003 | |
1004 | if (!Label().IsNull()) { |
1005 | Handle(TPrsStd_AISViewer) viewer; |
1006 | if( !TPrsStd_AISViewer::Find(Label(), viewer) ) return; |
1007 | Handle(AIS_InteractiveContext) ctx = viewer->GetInteractiveContext(); |
1008 | if( ctx.IsNull() ) return; |
1009 | |
1010 | if (!myAIS.IsNull()) { |
1011 | |
1012 | if( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != ctx ) myAIS->GetContext()->Remove(myAIS); |
1013 | |
1014 | if( isDisplayed && ctx->IsDisplayed(myAIS) ) return; |
1015 | |
1016 | ctx->Display(myAIS, Standard_False); |
1017 | |
1018 | if( ctx->IsDisplayed(myAIS) ) SetDisplayed(Standard_True); |
1019 | } |
1020 | } |
1021 | } |
1022 | |
1023 | |
1024 | //======================================================================= |
1025 | //function : AISErase |
1026 | //purpose : |
1027 | //======================================================================= |
1028 | |
1029 | void TPrsStd_AISPresentation::AISErase (const Standard_Boolean remove) |
1030 | { |
1031 | SetDisplayed(Standard_False); |
1032 | Handle(AIS_InteractiveContext) ctx, ownctx; |
1033 | |
1034 | if ( !myAIS.IsNull() ) { |
da0e82aa |
1035 | |
7fd59977 |
1036 | if ( !Label().IsNull()) { |
1037 | Handle(TPrsStd_AISViewer) viewer; |
da0e82aa |
1038 | if( !TPrsStd_AISViewer::Find(Label(), viewer) ) return; |
1039 | ownctx = myAIS->GetContext(); |
7fd59977 |
1040 | ctx = viewer->GetInteractiveContext(); |
1041 | if( remove ) { |
1042 | if( !ctx.IsNull() ) ctx->Remove (myAIS,Standard_False); |
1043 | if( !ownctx.IsNull() && ownctx != ctx ) ownctx->Remove (myAIS,Standard_False); |
1044 | myAIS->SetToUpdate(); |
1045 | } |
1046 | else { |
1047 | if( !ctx.IsNull() ) ctx->Erase (myAIS,Standard_False); |
1048 | if( !ownctx.IsNull() && ownctx != ctx ) ownctx->Erase (myAIS,Standard_False); |
1049 | } |
1050 | } |
1051 | else { |
44d9ae89 |
1052 | if( remove ) { |
7fd59977 |
1053 | if( !ownctx.IsNull() ) { |
1054 | ownctx->Remove (myAIS,Standard_False); |
1055 | myAIS->SetToUpdate(); |
1056 | } |
44d9ae89 |
1057 | } else |
7fd59977 |
1058 | if( !ownctx.IsNull() ) ownctx->Erase (myAIS,Standard_False); |
1059 | } |
1060 | } |
1061 | } |
1062 | |
1063 | |
1064 | //======================================================================= |
1065 | //function :GetAIS |
1066 | //purpose : |
1067 | //======================================================================= |
1068 | Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const |
1069 | { |
1070 | return myAIS; |
1071 | } |
1072 | |
1073 | |
1074 | //======================================================================= |
1075 | //function :SetDisplayed |
1076 | //purpose : |
1077 | //======================================================================= |
1078 | void TPrsStd_AISPresentation::SetDisplayed(const Standard_Boolean B) |
1079 | { |
1080 | Backup(); |
1081 | isDisplayed = B; |
1082 | } |
1083 | |