b311480e |
1 | // Created on: 1998-09-30 |
2 | // Created by: Sergey RUIN |
3 | // Copyright (c) 1998-1999 Matra Datavision |
973c2be1 |
4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
5 | // |
973c2be1 |
6 | // This file is part of Open CASCADE Technology software library. |
b311480e |
7 | // |
d5f74e42 |
8 | // This library is free software; you can redistribute it and/or modify it under |
9 | // the terms of the GNU Lesser General Public License version 2.1 as published |
973c2be1 |
10 | // by the Free Software Foundation, with special exception defined in the file |
11 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
12 | // distribution for complete text of the license and disclaimer of any warranty. |
b311480e |
13 | // |
973c2be1 |
14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. |
7fd59977 |
16 | |
7fd59977 |
17 | |
42cf5bc1 |
18 | #include <AIS_InteractiveContext.hxx> |
19 | #include <AIS_InteractiveObject.hxx> |
20 | #include <Standard_GUID.hxx> |
f47afe53 |
21 | #include <Standard_NullObject.hxx> |
22 | #include <Standard_NoMoreObject.hxx> |
42cf5bc1 |
23 | #include <TCollection_ExtendedString.hxx> |
24 | #include <TDF_Attribute.hxx> |
25 | #include <TDF_AttributeDelta.hxx> |
7fd59977 |
26 | #include <TDF_DefaultDeltaOnModification.hxx> |
42cf5bc1 |
27 | #include <TDF_DefaultDeltaOnRemoval.hxx> |
7fd59977 |
28 | #include <TDF_DeltaOnAddition.hxx> |
42cf5bc1 |
29 | #include <TDF_Label.hxx> |
30 | #include <TDF_RelocationTable.hxx> |
7fd59977 |
31 | #include <TDF_Tool.hxx> |
42cf5bc1 |
32 | #include <TPrsStd_AISPresentation.hxx> |
c3282ec1 |
33 | #include <TColStd_ListOfInteger.hxx> |
34 | #include <TColStd_ListIteratorOfListOfInteger.hxx> |
f47afe53 |
35 | #include <TDataXtd_Presentation.hxx> |
7fd59977 |
36 | #include <TPrsStd_AISViewer.hxx> |
7fd59977 |
37 | #include <TPrsStd_Driver.hxx> |
38 | #include <TPrsStd_DriverTable.hxx> |
39 | |
92efcf78 |
40 | IMPLEMENT_STANDARD_RTTIEXT(TPrsStd_AISPresentation,TDF_Attribute) |
41 | |
f47afe53 |
42 | #define NO_MORE_OBJECT "TPrsStd_AISPresentation has no associated TDataXtd_PresentationData" |
43 | |
7fd59977 |
44 | //======================================================================= |
f47afe53 |
45 | //function : TPrsStd_AISPresentation |
46 | //purpose : Constructor |
7fd59977 |
47 | //======================================================================= |
f47afe53 |
48 | TPrsStd_AISPresentation::TPrsStd_AISPresentation () |
49 | { |
7fd59977 |
50 | } |
51 | |
52 | |
53 | //======================================================================= |
f47afe53 |
54 | //function : Set |
7fd59977 |
55 | //purpose : |
56 | //======================================================================= |
f47afe53 |
57 | Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set |
58 | ( const TDF_Label& theLabel, const Standard_GUID& theDriver ) |
59 | { |
60 | Handle(TPrsStd_AISPresentation) aPresentation; |
61 | // create associated data (unless already there) |
62 | Handle(TDataXtd_Presentation) aData = TDataXtd_Presentation::Set (theLabel, theDriver); |
63 | if(aData.IsNull()) |
9775fa61 |
64 | throw Standard_NoMoreObject(NO_MORE_OBJECT); |
f47afe53 |
65 | if ( !theLabel.FindAttribute(TPrsStd_AISPresentation::GetID(), aPresentation) ) |
66 | { |
67 | aPresentation = new TPrsStd_AISPresentation(); |
f47afe53 |
68 | theLabel.AddAttribute(aPresentation); |
7fd59977 |
69 | } |
7fd59977 |
70 | |
f47afe53 |
71 | return aPresentation; |
72 | } |
7fd59977 |
73 | |
74 | //======================================================================= |
75 | //function : Set |
76 | //purpose : |
77 | //======================================================================= |
f47afe53 |
78 | Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set(const Handle(TDF_Attribute)& theMaster) |
79 | { |
c4a2f61e |
80 | return TPrsStd_AISPresentation::Set(theMaster->Label(), theMaster->ID()); |
7fd59977 |
81 | } |
82 | |
f47afe53 |
83 | //======================================================================= |
84 | //function : Unset |
85 | //purpose : |
86 | //======================================================================= |
87 | void TPrsStd_AISPresentation::Unset (const TDF_Label& theLabel) |
88 | { |
89 | Handle(TPrsStd_AISPresentation) aPresentation; |
90 | if ( theLabel.FindAttribute(TPrsStd_AISPresentation::GetID(), aPresentation) ) |
91 | theLabel.ForgetAttribute(aPresentation); |
7fd59977 |
92 | |
f47afe53 |
93 | // remove associated data |
94 | TDataXtd_Presentation::Unset (theLabel); |
95 | } |
7fd59977 |
96 | |
97 | //======================================================================= |
f47afe53 |
98 | //function : getData |
7fd59977 |
99 | //purpose : |
100 | //======================================================================= |
f47afe53 |
101 | Handle(TDataXtd_Presentation) TPrsStd_AISPresentation::getData () const |
7fd59977 |
102 | { |
f47afe53 |
103 | Handle(TDataXtd_Presentation) aData; |
c4a2f61e |
104 | if (!Label().FindAttribute(TDataXtd_Presentation::GetID(), aData)) |
9775fa61 |
105 | throw Standard_NoMoreObject(NO_MORE_OBJECT); |
f47afe53 |
106 | return aData; |
7fd59977 |
107 | } |
108 | |
7fd59977 |
109 | //======================================================================= |
f47afe53 |
110 | //function : GetID |
7fd59977 |
111 | //purpose : |
112 | //======================================================================= |
f47afe53 |
113 | const Standard_GUID& TPrsStd_AISPresentation::GetID() |
114 | { |
115 | static Standard_GUID TPrsStd_AISPresentationID("3680ac6c-47ae-4366-bb94-26abb6e07341"); |
116 | return TPrsStd_AISPresentationID; |
117 | } |
7fd59977 |
118 | |
7fd59977 |
119 | //======================================================================= |
120 | //function : Display |
121 | //purpose : |
122 | //======================================================================= |
f47afe53 |
123 | void TPrsStd_AISPresentation::Display(const Standard_Boolean theIsUpdate) |
7fd59977 |
124 | { |
f47afe53 |
125 | if ( theIsUpdate || myAIS.IsNull() ) |
7fd59977 |
126 | AISUpdate(); |
f47afe53 |
127 | |
128 | AISDisplay(); |
7fd59977 |
129 | } |
130 | |
7fd59977 |
131 | //======================================================================= |
132 | //function : Erase |
133 | //purpose : |
134 | //======================================================================= |
f47afe53 |
135 | void TPrsStd_AISPresentation::Erase(const Standard_Boolean theIsRemove) |
136 | { |
137 | if ( IsDisplayed() ) |
138 | { |
139 | AISErase(theIsRemove); |
f47afe53 |
140 | } |
7fd59977 |
141 | } |
142 | |
143 | //======================================================================= |
144 | //function : Update |
145 | //purpose : |
146 | //======================================================================= |
f47afe53 |
147 | void TPrsStd_AISPresentation::Update() |
148 | { |
7fd59977 |
149 | AISUpdate(); |
150 | } |
151 | |
7fd59977 |
152 | //======================================================================= |
153 | //function : IsDisplayed |
154 | //purpose : |
155 | //======================================================================= |
f47afe53 |
156 | Standard_Boolean TPrsStd_AISPresentation::IsDisplayed() const |
7fd59977 |
157 | { |
c4a2f61e |
158 | return getData()->IsDisplayed(); |
7fd59977 |
159 | } |
160 | |
7fd59977 |
161 | //======================================================================= |
f47afe53 |
162 | //function : SetDisplayed |
7fd59977 |
163 | //purpose : |
164 | //======================================================================= |
f47afe53 |
165 | void TPrsStd_AISPresentation::SetDisplayed(const Standard_Boolean theIsDisplayed) |
7fd59977 |
166 | { |
f47afe53 |
167 | // this method can be called by AISUpdate() in the process of removal, |
168 | // while data attribute may be already removed |
c4a2f61e |
169 | Backup(); |
170 | getData()->SetDisplayed(theIsDisplayed); |
f47afe53 |
171 | } |
7fd59977 |
172 | |
f47afe53 |
173 | //======================================================================= |
174 | //function :SetDriverGUID |
175 | //purpose : |
176 | //======================================================================= |
177 | void TPrsStd_AISPresentation::SetDriverGUID(const Standard_GUID& theGUID) |
178 | { |
c4a2f61e |
179 | Backup(); |
180 | getData()->SetDriverGUID (theGUID); |
7fd59977 |
181 | } |
182 | |
7fd59977 |
183 | //======================================================================= |
184 | //function :GetDriverGUID |
185 | //purpose : |
186 | //======================================================================= |
187 | Standard_GUID TPrsStd_AISPresentation::GetDriverGUID() const |
188 | { |
c4a2f61e |
189 | return getData()->GetDriverGUID(); |
7fd59977 |
190 | } |
191 | |
7fd59977 |
192 | //======================================================================= |
193 | //function :Material |
194 | //purpose : |
195 | //======================================================================= |
196 | Graphic3d_NameOfMaterial TPrsStd_AISPresentation::Material() const |
197 | { |
c4a2f61e |
198 | return (Graphic3d_NameOfMaterial)getData()->MaterialIndex(); |
7fd59977 |
199 | } |
200 | |
201 | //======================================================================= |
202 | //function :HasMaterial |
203 | //purpose : |
204 | //======================================================================= |
205 | Standard_Boolean TPrsStd_AISPresentation::HasOwnMaterial() const |
206 | { |
c4a2f61e |
207 | return getData()->HasOwnMaterial(); |
7fd59977 |
208 | } |
209 | |
210 | //======================================================================= |
f47afe53 |
211 | //function : UnsetMaterial |
7fd59977 |
212 | //purpose : |
213 | //======================================================================= |
214 | void TPrsStd_AISPresentation::UnsetMaterial() |
215 | { |
c4a2f61e |
216 | if ( !getData()->HasOwnMaterial() && !myAIS.IsNull() && !myAIS->HasMaterial() ) |
f47afe53 |
217 | return; |
218 | |
c4a2f61e |
219 | getData()->UnsetMaterial(); |
f47afe53 |
220 | |
221 | if ( myAIS.IsNull() ) |
222 | AISUpdate(); |
223 | |
224 | if ( !myAIS.IsNull() && myAIS->HasMaterial() ) |
225 | { |
226 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
227 | |
228 | if ( !aContext.IsNull() ) |
229 | aContext->UnsetMaterial(myAIS, Standard_False); |
230 | else |
7fd59977 |
231 | myAIS->UnsetMaterial(); |
232 | } |
233 | } |
234 | |
f47afe53 |
235 | |
7fd59977 |
236 | //======================================================================= |
f47afe53 |
237 | //function : SetMaterial |
7fd59977 |
238 | //purpose : |
239 | //======================================================================= |
f47afe53 |
240 | void TPrsStd_AISPresentation::SetMaterial(const Graphic3d_NameOfMaterial theName) |
c4a2f61e |
241 | { |
242 | Backup(); |
243 | if ( getData()->HasOwnMode() && getData()->MaterialIndex() == theName ) |
f47afe53 |
244 | if ( !myAIS.IsNull() && myAIS->HasMaterial() && myAIS->Material() == theName ) |
245 | return; |
246 | |
c4a2f61e |
247 | getData()->SetMaterialIndex(theName); |
f47afe53 |
248 | |
249 | if ( myAIS.IsNull() ) |
250 | AISUpdate(); |
251 | |
252 | if ( !myAIS.IsNull() ) |
253 | { |
254 | if ( myAIS->HasMaterial() && myAIS->Material() == theName ) |
255 | return; // AIS has already had that material |
256 | |
257 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
258 | |
259 | if ( !aContext.IsNull() ) |
260 | aContext->SetMaterial(myAIS, theName, Standard_False); |
261 | else |
262 | myAIS->SetMaterial(theName); |
7fd59977 |
263 | } |
264 | } |
265 | |
7fd59977 |
266 | //======================================================================= |
f47afe53 |
267 | //function :Transparency |
7fd59977 |
268 | //purpose : |
269 | //======================================================================= |
f47afe53 |
270 | Standard_Real TPrsStd_AISPresentation::Transparency() const |
7fd59977 |
271 | { |
c4a2f61e |
272 | return getData()->Transparency(); |
7fd59977 |
273 | } |
274 | |
7fd59977 |
275 | //======================================================================= |
f47afe53 |
276 | //function :SetTransparency |
7fd59977 |
277 | //purpose : |
278 | //======================================================================= |
f47afe53 |
279 | void TPrsStd_AISPresentation::SetTransparency(const Standard_Real theValue) |
7fd59977 |
280 | { |
c4a2f61e |
281 | Backup(); |
282 | if (getData()->HasOwnTransparency() && getData()->Transparency() == theValue) |
f47afe53 |
283 | if ( !myAIS.IsNull() && myAIS->Transparency() == theValue ) |
284 | return; |
285 | |
c4a2f61e |
286 | getData()->SetTransparency(theValue); |
f47afe53 |
287 | |
288 | if ( myAIS.IsNull() ) |
289 | AISUpdate(); |
290 | |
291 | if ( !myAIS.IsNull() ) |
292 | { |
293 | if ( myAIS->Transparency() == theValue ) |
294 | return; // AIS has already had that transparency |
295 | |
296 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
297 | |
298 | if ( !aContext.IsNull() ) |
299 | aContext->SetTransparency(myAIS, theValue, Standard_False); |
300 | else |
301 | myAIS->SetTransparency(theValue); |
302 | } |
7fd59977 |
303 | } |
304 | |
305 | //======================================================================= |
306 | //function :UnsetTransparency |
307 | //purpose : |
308 | //======================================================================= |
309 | void TPrsStd_AISPresentation::UnsetTransparency() |
310 | { |
c4a2f61e |
311 | if (!getData()->HasOwnTransparency()) |
7fd59977 |
312 | return; |
313 | |
c4a2f61e |
314 | getData()->UnsetTransparency(); |
f47afe53 |
315 | |
316 | if ( myAIS.IsNull() ) |
317 | AISUpdate(); |
318 | |
319 | if ( !myAIS.IsNull() ) |
320 | { |
321 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
322 | |
323 | if( !aContext.IsNull() ) |
324 | aContext->UnsetTransparency(myAIS, Standard_False); |
325 | else |
7fd59977 |
326 | myAIS->UnsetTransparency(); |
327 | } |
328 | } |
329 | |
330 | //======================================================================= |
f47afe53 |
331 | //function : HasTransparency |
7fd59977 |
332 | //purpose : |
333 | //======================================================================= |
334 | Standard_Boolean TPrsStd_AISPresentation::HasOwnTransparency() const |
335 | { |
c4a2f61e |
336 | return getData()->HasOwnTransparency(); |
7fd59977 |
337 | } |
338 | |
339 | //======================================================================= |
f47afe53 |
340 | //function : Color |
7fd59977 |
341 | //purpose : |
342 | //======================================================================= |
343 | Quantity_NameOfColor TPrsStd_AISPresentation::Color() const |
344 | { |
c4a2f61e |
345 | return getData()->Color(); |
7fd59977 |
346 | } |
347 | |
348 | //======================================================================= |
f47afe53 |
349 | //function : HasOwnColor |
7fd59977 |
350 | //purpose : |
351 | //======================================================================= |
352 | Standard_Boolean TPrsStd_AISPresentation::HasOwnColor() const |
353 | { |
c4a2f61e |
354 | return getData()->HasOwnColor(); |
7fd59977 |
355 | } |
356 | |
357 | //======================================================================= |
f47afe53 |
358 | //function : UnsetColor |
7fd59977 |
359 | //purpose : |
360 | //======================================================================= |
361 | void TPrsStd_AISPresentation::UnsetColor() |
362 | { |
c4a2f61e |
363 | if (!getData()->HasOwnColor() && ! myAIS.IsNull() && !myAIS->HasColor()) |
f47afe53 |
364 | return; |
c4a2f61e |
365 | getData()->UnsetColor(); |
f47afe53 |
366 | |
367 | if ( myAIS.IsNull() ) |
368 | AISUpdate(); |
369 | |
370 | if ( !myAIS.IsNull() && myAIS->HasColor() ) |
371 | { |
372 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
373 | |
374 | if ( !aContext.IsNull() ) |
375 | aContext->UnsetColor(myAIS, Standard_False); |
376 | else |
7fd59977 |
377 | myAIS->UnsetColor(); |
378 | } |
379 | } |
380 | |
381 | //======================================================================= |
f47afe53 |
382 | //function : SetColor |
7fd59977 |
383 | //purpose : |
384 | //======================================================================= |
f47afe53 |
385 | void TPrsStd_AISPresentation::SetColor(const Quantity_NameOfColor theColor) |
7fd59977 |
386 | { |
c4a2f61e |
387 | Backup(); |
388 | if ( getData()->HasOwnColor() && getData()->Color() == theColor ) |
87432b82 |
389 | { |
390 | if (!myAIS.IsNull() && myAIS->HasColor()) |
391 | { |
392 | Quantity_Color aColor; |
393 | myAIS->Color (aColor); |
394 | if (aColor.Name() == theColor) |
395 | { |
396 | return; |
397 | } |
398 | } |
399 | } |
f47afe53 |
400 | |
c4a2f61e |
401 | getData()->SetColor(theColor); |
f47afe53 |
402 | |
403 | if ( myAIS.IsNull() ) |
404 | AISUpdate(); |
405 | |
406 | if ( !myAIS.IsNull() ) |
407 | { |
87432b82 |
408 | if (myAIS->HasColor()) |
409 | { |
410 | Quantity_Color aColor; |
411 | myAIS->Color (aColor); |
412 | if (aColor.Name() == theColor) |
413 | { |
414 | return; // AIS has already had that color |
415 | } |
416 | } |
f47afe53 |
417 | |
418 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
419 | |
420 | if( !aContext.IsNull() ) |
421 | aContext->SetColor(myAIS, theColor, Standard_False); |
7fd59977 |
422 | else |
f47afe53 |
423 | myAIS->SetColor(theColor); |
7fd59977 |
424 | } |
425 | } |
426 | |
7fd59977 |
427 | //======================================================================= |
428 | //function :Width |
429 | //purpose : |
430 | //======================================================================= |
431 | Standard_Real TPrsStd_AISPresentation::Width() const |
432 | { |
c4a2f61e |
433 | return getData()->Width(); |
7fd59977 |
434 | } |
435 | |
436 | //======================================================================= |
f47afe53 |
437 | //function : HasWidth |
7fd59977 |
438 | //purpose : |
439 | //======================================================================= |
440 | Standard_Boolean TPrsStd_AISPresentation::HasOwnWidth() const |
441 | { |
c4a2f61e |
442 | return getData()->HasOwnWidth(); |
7fd59977 |
443 | } |
444 | |
445 | //======================================================================= |
f47afe53 |
446 | //function : SetWidth |
7fd59977 |
447 | //purpose : |
448 | //======================================================================= |
f47afe53 |
449 | void TPrsStd_AISPresentation::SetWidth(const Standard_Real theWidth) |
7fd59977 |
450 | { |
c4a2f61e |
451 | Backup(); |
452 | if ( getData()->HasOwnWidth() && getData()->Width() == theWidth ) |
f47afe53 |
453 | if ( !myAIS.IsNull() && myAIS->HasWidth() && myAIS->Width() == theWidth ) |
7fd59977 |
454 | return; |
455 | |
c4a2f61e |
456 | getData()->SetWidth(theWidth); |
f47afe53 |
457 | |
458 | if( !myAIS.IsNull() ) |
459 | { |
460 | if ( myAIS->HasWidth() && myAIS->Width() == theWidth ) |
461 | return; // AIS has already had that width |
462 | |
463 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
464 | |
465 | if( !aContext.IsNull() ) |
466 | aContext->SetWidth(myAIS, theWidth, Standard_False); |
7fd59977 |
467 | else |
f47afe53 |
468 | myAIS->SetWidth(theWidth); |
7fd59977 |
469 | } |
470 | } |
471 | |
472 | //======================================================================= |
f47afe53 |
473 | //function : UnsetWidth |
7fd59977 |
474 | //purpose : |
475 | //======================================================================= |
476 | void TPrsStd_AISPresentation::UnsetWidth() |
477 | { |
c4a2f61e |
478 | if ( !getData()->HasOwnWidth() ) |
f47afe53 |
479 | if ( !myAIS.IsNull() && !myAIS->HasWidth() ) |
7fd59977 |
480 | return; |
481 | |
c4a2f61e |
482 | getData()->UnsetWidth(); |
f47afe53 |
483 | |
484 | if( myAIS.IsNull() ) |
485 | AISUpdate(); |
486 | |
487 | if ( !myAIS.IsNull() && myAIS->HasWidth() ) |
488 | { |
489 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
490 | |
491 | if ( !aContext.IsNull() ) |
492 | aContext->UnsetWidth(myAIS, Standard_False); |
493 | else |
7fd59977 |
494 | myAIS->UnsetWidth(); |
495 | } |
496 | } |
497 | |
7fd59977 |
498 | //======================================================================= |
499 | //function : Mode |
500 | //purpose : |
501 | //======================================================================= |
7fd59977 |
502 | Standard_Integer TPrsStd_AISPresentation::Mode() const |
503 | { |
c4a2f61e |
504 | return getData()->Mode(); |
7fd59977 |
505 | } |
506 | |
507 | //======================================================================= |
f47afe53 |
508 | //function : HasOwnMode |
7fd59977 |
509 | //purpose : |
510 | //======================================================================= |
511 | Standard_Boolean TPrsStd_AISPresentation::HasOwnMode() const |
512 | { |
c4a2f61e |
513 | return getData()->HasOwnMode(); |
7fd59977 |
514 | } |
515 | |
516 | //======================================================================= |
f47afe53 |
517 | //function : SetMode |
7fd59977 |
518 | //purpose : |
519 | //======================================================================= |
f47afe53 |
520 | void TPrsStd_AISPresentation::SetMode(const Standard_Integer theMode) |
7fd59977 |
521 | { |
c4a2f61e |
522 | Backup(); |
523 | if ( getData()->HasOwnMode() && getData()->Mode() == theMode ) |
f47afe53 |
524 | if ( !myAIS.IsNull() && myAIS->DisplayMode() == theMode ) |
7fd59977 |
525 | return; |
526 | |
c4a2f61e |
527 | getData()->SetMode(theMode); |
f47afe53 |
528 | |
529 | if ( myAIS.IsNull() ) |
530 | AISUpdate(); |
531 | |
532 | if ( !myAIS.IsNull() ) |
533 | { |
534 | if ( myAIS->DisplayMode() == theMode ) |
535 | return; // AIS has already had that mode |
536 | |
537 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
538 | |
539 | if( !aContext.IsNull() ) |
540 | aContext->SetDisplayMode(myAIS, theMode, Standard_False); |
7fd59977 |
541 | else |
542 | myAIS->SetDisplayMode(theMode); |
543 | } |
544 | } |
545 | |
546 | //======================================================================= |
f47afe53 |
547 | //function : UnsetMode |
7fd59977 |
548 | //purpose : |
549 | //======================================================================= |
550 | void TPrsStd_AISPresentation::UnsetMode() |
551 | { |
c4a2f61e |
552 | if ( !getData()->HasOwnMode() ) |
f47afe53 |
553 | if ( !myAIS.IsNull() && !myAIS->HasDisplayMode() ) |
7fd59977 |
554 | return; |
555 | |
c4a2f61e |
556 | getData()->UnsetMode(); |
f47afe53 |
557 | |
558 | if ( myAIS.IsNull() ) |
559 | AISUpdate(); |
560 | |
561 | if( !myAIS.IsNull() && myAIS->HasDisplayMode() ) |
562 | { |
563 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
564 | |
565 | if ( !aContext.IsNull() ) |
566 | aContext->UnsetDisplayMode(myAIS, Standard_False); |
567 | else |
568 | myAIS->UnsetDisplayMode(); |
7fd59977 |
569 | } |
570 | } |
571 | |
7fd59977 |
572 | //======================================================================= |
573 | //function : SelectionMode |
574 | //purpose : |
575 | //======================================================================= |
7fd59977 |
576 | Standard_Integer TPrsStd_AISPresentation::SelectionMode() const |
577 | { |
c4a2f61e |
578 | return getData()->SelectionMode(); |
7fd59977 |
579 | } |
580 | |
581 | //======================================================================= |
f47afe53 |
582 | //function : HasOwnSelectionMode |
7fd59977 |
583 | //purpose : |
584 | //======================================================================= |
585 | Standard_Boolean TPrsStd_AISPresentation::HasOwnSelectionMode() const |
586 | { |
c4a2f61e |
587 | return getData()->HasOwnSelectionMode(); |
7fd59977 |
588 | } |
589 | |
590 | //======================================================================= |
f47afe53 |
591 | //function : SetSelectionMode |
7fd59977 |
592 | //purpose : |
593 | //======================================================================= |
f47afe53 |
594 | void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode) |
7fd59977 |
595 | { |
c4a2f61e |
596 | Backup(); |
597 | getData()->SetSelectionMode (theSelectionMode); |
f47afe53 |
598 | AISUpdate(); |
7fd59977 |
599 | } |
600 | |
601 | //======================================================================= |
f47afe53 |
602 | //function : UnsetSelectionMode |
7fd59977 |
603 | //purpose : |
604 | //======================================================================= |
605 | void TPrsStd_AISPresentation::UnsetSelectionMode() |
606 | { |
c4a2f61e |
607 | getData()->UnsetSelectionMode (); |
f47afe53 |
608 | AISUpdate(); |
7fd59977 |
609 | } |
7fd59977 |
610 | |
611 | //======================================================================= |
612 | //function : ID |
613 | //purpose : |
614 | //======================================================================= |
f47afe53 |
615 | const Standard_GUID& TPrsStd_AISPresentation::ID() const |
616 | { |
617 | return GetID(); |
618 | } |
7fd59977 |
619 | |
620 | //======================================================================= |
621 | //function : BackupCopy |
622 | //purpose : |
623 | //======================================================================= |
624 | Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const |
625 | { |
f47afe53 |
626 | return new TPrsStd_AISPresentation; |
7fd59977 |
627 | } |
628 | |
629 | |
630 | //======================================================================= |
631 | //function : NewEmpty |
632 | //purpose : |
633 | //======================================================================= |
634 | Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const |
635 | { |
f47afe53 |
636 | return new TPrsStd_AISPresentation(); |
7fd59977 |
637 | } |
638 | |
639 | //======================================================================= |
f47afe53 |
640 | //function : Paste |
7fd59977 |
641 | //purpose : |
642 | //======================================================================= |
f47afe53 |
643 | void TPrsStd_AISPresentation::Restore(const Handle(TDF_Attribute)& /*theWith*/) |
644 | { |
7fd59977 |
645 | myAIS.Nullify(); |
7fd59977 |
646 | } |
647 | |
648 | //======================================================================= |
649 | //function : Paste |
650 | //purpose : |
651 | //======================================================================= |
f47afe53 |
652 | void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& theInto, |
653 | const Handle(TDF_RelocationTable)& ) const |
654 | { |
655 | Handle(TPrsStd_AISPresentation) anInto = |
656 | Handle(TPrsStd_AISPresentation)::DownCast(theInto); |
7fd59977 |
657 | |
f47afe53 |
658 | anInto->Backup(); |
b66f3758 |
659 | if (!anInto->myAIS.IsNull()) |
660 | { |
661 | // Save displayed flag. |
662 | Standard_Boolean displayed = anInto->IsDisplayed(); |
663 | // Erase the interactive object. |
664 | anInto->AISErase(Standard_True); |
665 | // Restore the displayed flag. |
666 | if (displayed) |
667 | anInto->SetDisplayed(displayed); |
668 | } |
669 | // Nullify the interactive object. |
670 | // It will be restored on the next call to AISUpdate(). |
f47afe53 |
671 | anInto->myAIS.Nullify(); |
7fd59977 |
672 | } |
673 | |
674 | //======================================================================= |
675 | //function : AfterAddition |
676 | //purpose : erase if displayed |
677 | //======================================================================= |
678 | void TPrsStd_AISPresentation::AfterAddition() |
f47afe53 |
679 | { |
7fd59977 |
680 | AfterResume(); |
681 | } |
682 | |
683 | //======================================================================= |
684 | //function : BeforeRemoval |
685 | //purpose : erase if displayed |
686 | //======================================================================= |
687 | void TPrsStd_AISPresentation::BeforeRemoval() |
f47afe53 |
688 | { |
689 | BeforeForget(); |
7fd59977 |
690 | } |
691 | |
692 | //======================================================================= |
693 | //function : BeforeForget |
694 | //purpose : erase if displayed |
695 | //======================================================================= |
696 | void TPrsStd_AISPresentation::BeforeForget() |
697 | { |
f47afe53 |
698 | if ( !myAIS.IsNull() ) |
699 | { // Remove AISObject from context. |
700 | AISErase(Standard_True); |
7fd59977 |
701 | myAIS.Nullify(); |
702 | } |
703 | } |
704 | |
7fd59977 |
705 | //======================================================================= |
706 | //function : AfterResume |
707 | //purpose : display if displayed |
708 | //======================================================================= |
f47afe53 |
709 | void TPrsStd_AISPresentation::AfterResume() |
7fd59977 |
710 | { |
711 | AISUpdate(); |
f47afe53 |
712 | if ( IsDisplayed() ) |
713 | AISDisplay(); |
714 | else |
715 | AISErase(); |
7fd59977 |
716 | } |
717 | |
718 | //======================================================================= |
719 | //function : BeforeUndo |
720 | //purpose : le NamedShape associe doit etre present |
721 | //======================================================================= |
7fd59977 |
722 | Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD, |
c4a2f61e |
723 | const Standard_Boolean ) |
7fd59977 |
724 | { |
725 | Handle(TPrsStd_AISPresentation) P; |
f47afe53 |
726 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
7fd59977 |
727 | |
f47afe53 |
728 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) |
729 | { |
730 | if ( !P.IsNull() ) |
731 | P->BeforeForget(); |
7fd59977 |
732 | } |
733 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) { |
f47afe53 |
734 | } |
735 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) |
736 | { |
737 | if ( !P.IsNull() ) |
738 | P->BeforeForget(); |
739 | } |
7fd59977 |
740 | |
741 | return Standard_True; |
742 | } |
743 | |
7fd59977 |
744 | //======================================================================= |
745 | //function : AfterUndo |
746 | //purpose : le NamedShape associe doit etre present |
747 | //======================================================================= |
7fd59977 |
748 | Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD, |
f47afe53 |
749 | const Standard_Boolean ) |
7fd59977 |
750 | { |
751 | Handle(TPrsStd_AISPresentation) P; |
752 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
753 | |
f47afe53 |
754 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) |
755 | {} |
756 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) |
757 | { |
758 | if ( !P.IsNull() ) |
759 | P->AfterAddition(); |
7fd59977 |
760 | } |
f47afe53 |
761 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) |
762 | { |
763 | if ( !P.IsNull() ) |
764 | P->AfterResume(); |
7fd59977 |
765 | } |
766 | |
767 | return Standard_True; |
768 | } |
769 | |
7fd59977 |
770 | //======================================================================= |
771 | //function : AISUpdate |
772 | //purpose : |
773 | //======================================================================= |
f47afe53 |
774 | void TPrsStd_AISPresentation::AISUpdate() |
775 | { |
7fd59977 |
776 | Backup(); |
c4a2f61e |
777 | getData()->Backup(); |
f47afe53 |
778 | Handle(AIS_InteractiveContext) aContext; |
779 | if ( !Label().IsNull() ) |
780 | { |
781 | aContext = getAISContext(); |
782 | |
783 | Handle(TPrsStd_Driver) aDriver; |
784 | if ( TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), aDriver) ) |
785 | { |
786 | // Build a new AIS. |
787 | if ( myAIS.IsNull() ) |
788 | { |
789 | Handle(AIS_InteractiveObject) aNewObj; |
790 | if ( aDriver->Update(Label(), aNewObj) ) |
791 | { |
792 | myAIS = aNewObj; |
f47afe53 |
793 | aNewObj->SetOwner(this); |
794 | } |
7fd59977 |
795 | } |
f47afe53 |
796 | else |
797 | { |
798 | Handle(AIS_InteractiveObject) anObj = myAIS; |
799 | if ( aDriver->Update(Label(), anObj) ) |
800 | if ( !(anObj == myAIS) ) |
801 | { |
802 | if ( !aContext.IsNull() ) |
0577ae8c |
803 | aContext->Remove (myAIS, Standard_True); |
f47afe53 |
804 | |
805 | // Driver has built new AIS. |
806 | myAIS = anObj; |
f47afe53 |
807 | anObj->SetOwner(this); |
808 | } |
7fd59977 |
809 | } |
810 | } |
811 | } |
812 | else return; |
813 | |
f47afe53 |
814 | // Apply the visualization settings. |
815 | if ( !myAIS.IsNull() ) |
816 | { |
817 | if ( HasOwnColor() ) |
818 | { |
819 | Quantity_NameOfColor aColor = Color(); |
87432b82 |
820 | Quantity_Color aPrsColor; |
821 | myAIS->Color (aPrsColor); |
822 | if ( !(myAIS->HasColor()) || (myAIS->HasColor() && aPrsColor.Name() != aColor) ) |
f47afe53 |
823 | { |
824 | if ( !aContext.IsNull() ) |
825 | aContext->SetColor(myAIS, aColor, Standard_False); |
826 | else |
827 | myAIS->SetColor(aColor); |
7fd59977 |
828 | } |
f47afe53 |
829 | } |
7fd59977 |
830 | |
f47afe53 |
831 | if ( HasOwnMaterial() ) |
832 | { |
833 | Graphic3d_NameOfMaterial aMaterial = Material(); |
834 | if ( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != aMaterial) ) |
835 | { |
836 | if ( !aContext.IsNull() ) |
837 | aContext->SetMaterial(myAIS, aMaterial, Standard_False ); |
838 | else |
839 | myAIS->SetMaterial(aMaterial); |
7fd59977 |
840 | } |
f47afe53 |
841 | } |
842 | |
843 | if ( HasOwnTransparency() ) |
844 | { |
845 | const Standard_Real aTransparency = Transparency(); |
846 | if ( myAIS->Transparency() != aTransparency ) |
847 | { |
848 | if( !aContext.IsNull() ) |
849 | aContext->SetTransparency(myAIS, aTransparency, Standard_False); |
850 | else |
851 | myAIS->SetTransparency(aTransparency); |
7fd59977 |
852 | } |
853 | } |
854 | |
f47afe53 |
855 | if ( HasOwnWidth() ) |
856 | { |
857 | const Standard_Real aWidth = Width(); |
858 | if ( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != aWidth) ) |
859 | { |
860 | if ( !aContext.IsNull() ) |
861 | aContext->SetWidth(myAIS, aWidth, Standard_False); |
862 | else |
863 | myAIS->SetWidth(aWidth); |
7fd59977 |
864 | } |
865 | } |
866 | |
f47afe53 |
867 | if ( HasOwnMode() ) |
868 | { |
869 | const Standard_Integer aMode = Mode(); |
870 | if ( myAIS->DisplayMode() != aMode ) |
871 | myAIS->SetDisplayMode(aMode); |
7fd59977 |
872 | } |
873 | |
f47afe53 |
874 | if ( !aContext.IsNull() && IsDisplayed() ) |
875 | aContext->Redisplay(myAIS, Standard_False); |
876 | |
877 | if (HasOwnSelectionMode()) { |
c3282ec1 |
878 | if (!aContext.IsNull()) |
879 | { |
880 | TColStd_ListOfInteger anActivatedModes; |
881 | aContext->ActivatedModes (myAIS, anActivatedModes); |
882 | Standard_Boolean isActivated = Standard_False; |
f47afe53 |
883 | Standard_Integer aSelectionMode = SelectionMode(); |
c4a2f61e |
884 | if (aSelectionMode == -1) |
c3282ec1 |
885 | { |
c4a2f61e |
886 | aContext->Deactivate(myAIS); |
887 | } |
888 | else |
889 | { |
890 | for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next()) |
c3282ec1 |
891 | { |
c4a2f61e |
892 | if (aModeIter.Value() == aSelectionMode) |
893 | { |
894 | isActivated = Standard_True; |
895 | break; |
896 | } |
c3282ec1 |
897 | } |
c4a2f61e |
898 | if (!isActivated) |
899 | aContext->Activate (myAIS, aSelectionMode, Standard_False); |
c3282ec1 |
900 | } |
7fd59977 |
901 | } |
902 | } |
7fd59977 |
903 | |
904 | } |
905 | |
f47afe53 |
906 | if (IsDisplayed() && !aContext.IsNull()) |
907 | aContext->Redisplay(myAIS, Standard_False); |
7fd59977 |
908 | } |
909 | |
910 | //======================================================================= |
911 | //function : AISDisplay |
912 | //purpose : |
913 | //======================================================================= |
f47afe53 |
914 | void TPrsStd_AISPresentation::AISDisplay() |
915 | { |
916 | if ( !Label().IsNull() ) |
917 | { |
918 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
7fd59977 |
919 | |
f47afe53 |
920 | if ( aContext.IsNull() ) |
921 | return; |
922 | |
923 | if ( !myAIS.IsNull() ) |
924 | { |
925 | if ( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != aContext ) |
0577ae8c |
926 | myAIS->GetContext()->Remove (myAIS, Standard_False); |
7fd59977 |
927 | |
f47afe53 |
928 | if ( IsDisplayed() && aContext->IsDisplayed(myAIS) ) |
929 | return; |
7fd59977 |
930 | |
f47afe53 |
931 | aContext->Display(myAIS, Standard_False); |
7fd59977 |
932 | |
f47afe53 |
933 | if ( aContext->IsDisplayed(myAIS) ) |
934 | SetDisplayed(Standard_True); |
7fd59977 |
935 | } |
936 | } |
937 | } |
938 | |
7fd59977 |
939 | //======================================================================= |
940 | //function : AISErase |
941 | //purpose : |
942 | //======================================================================= |
f47afe53 |
943 | void TPrsStd_AISPresentation::AISErase(const Standard_Boolean theIsRemove) |
944 | { |
945 | Handle(AIS_InteractiveContext) aContext, anOwnContext; |
946 | |
947 | if ( !myAIS.IsNull() ) |
948 | { |
949 | Backup(); |
f47afe53 |
950 | if ( !Label().IsNull() ) |
951 | { |
c4a2f61e |
952 | if (IsAttribute(TDataXtd_Presentation::GetID())) |
953 | SetDisplayed(Standard_False); |
954 | |
f47afe53 |
955 | Handle(TPrsStd_AISViewer) viewer; |
956 | if( !TPrsStd_AISViewer::Find(Label(), viewer) ) |
957 | return; |
958 | anOwnContext = myAIS->GetContext(); |
959 | aContext = viewer->GetInteractiveContext(); |
7fd59977 |
960 | |
f47afe53 |
961 | if ( theIsRemove ) |
962 | { |
963 | if ( !aContext.IsNull() ) |
964 | aContext->Remove(myAIS, Standard_False); |
965 | if ( !anOwnContext.IsNull() && anOwnContext != aContext ) |
966 | anOwnContext->Remove(myAIS, Standard_False); |
7fd59977 |
967 | |
7fd59977 |
968 | myAIS->SetToUpdate(); |
969 | } |
f47afe53 |
970 | else |
971 | { |
972 | if ( !aContext.IsNull() ) |
973 | aContext->Erase(myAIS, Standard_False); |
974 | if ( !anOwnContext.IsNull() && anOwnContext != aContext ) |
975 | anOwnContext->Erase(myAIS, Standard_False); |
7fd59977 |
976 | } |
977 | } |
f47afe53 |
978 | else |
979 | { |
980 | if ( theIsRemove ) |
981 | { |
982 | if ( !anOwnContext.IsNull() ) |
983 | { |
984 | anOwnContext->Remove(myAIS, Standard_False); |
985 | myAIS->SetToUpdate(); |
986 | } |
7fd59977 |
987 | } |
f47afe53 |
988 | else |
989 | if( !anOwnContext.IsNull() ) |
990 | anOwnContext->Erase(myAIS, Standard_False); |
7fd59977 |
991 | } |
992 | } |
993 | } |
994 | |
7fd59977 |
995 | //======================================================================= |
996 | //function :GetAIS |
997 | //purpose : |
998 | //======================================================================= |
999 | Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const |
1000 | { |
1001 | return myAIS; |
1002 | } |
1003 | |
7fd59977 |
1004 | //======================================================================= |
f47afe53 |
1005 | //function : getAISContext |
7fd59977 |
1006 | //purpose : |
1007 | //======================================================================= |
f47afe53 |
1008 | Handle(AIS_InteractiveContext) TPrsStd_AISPresentation::getAISContext() const |
7fd59977 |
1009 | { |
f47afe53 |
1010 | Handle(TPrsStd_AISViewer) aViewer; |
1011 | if ( TPrsStd_AISViewer::Find(Label(), aViewer) ) |
1012 | return aViewer->GetInteractiveContext(); |
7fd59977 |
1013 | |
f47afe53 |
1014 | return Handle_AIS_InteractiveContext(); |
1015 | } |