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(); |
0f3d1d7c |
68 | theLabel.AddAttribute(aPresentation, Standard_True); |
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 | { |
253cfde7 |
137 | if ( IsDisplayed() || theIsRemove) |
f47afe53 |
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 | //======================================================================= |
31e8d3c1 |
594 | void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode, const Standard_Boolean theTransaction) |
7fd59977 |
595 | { |
31e8d3c1 |
596 | if (theTransaction) |
597 | Backup(); |
598 | getData()->SetSelectionMode (theSelectionMode, theTransaction); |
ab3ff92c |
599 | |
600 | if ( myAIS.IsNull() ) |
601 | AISUpdate(); |
602 | else |
603 | ActivateSelectionMode(); |
7fd59977 |
604 | } |
605 | |
606 | //======================================================================= |
f47afe53 |
607 | //function : UnsetSelectionMode |
7fd59977 |
608 | //purpose : |
609 | //======================================================================= |
610 | void TPrsStd_AISPresentation::UnsetSelectionMode() |
611 | { |
c4a2f61e |
612 | getData()->UnsetSelectionMode (); |
f47afe53 |
613 | AISUpdate(); |
7fd59977 |
614 | } |
7fd59977 |
615 | |
616 | //======================================================================= |
617 | //function : ID |
618 | //purpose : |
619 | //======================================================================= |
f47afe53 |
620 | const Standard_GUID& TPrsStd_AISPresentation::ID() const |
621 | { |
622 | return GetID(); |
623 | } |
7fd59977 |
624 | |
625 | //======================================================================= |
626 | //function : BackupCopy |
627 | //purpose : |
628 | //======================================================================= |
629 | Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const |
630 | { |
f47afe53 |
631 | return new TPrsStd_AISPresentation; |
7fd59977 |
632 | } |
633 | |
634 | |
635 | //======================================================================= |
636 | //function : NewEmpty |
637 | //purpose : |
638 | //======================================================================= |
639 | Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const |
640 | { |
f47afe53 |
641 | return new TPrsStd_AISPresentation(); |
7fd59977 |
642 | } |
643 | |
644 | //======================================================================= |
f47afe53 |
645 | //function : Paste |
7fd59977 |
646 | //purpose : |
647 | //======================================================================= |
f47afe53 |
648 | void TPrsStd_AISPresentation::Restore(const Handle(TDF_Attribute)& /*theWith*/) |
649 | { |
7fd59977 |
650 | myAIS.Nullify(); |
7fd59977 |
651 | } |
652 | |
653 | //======================================================================= |
654 | //function : Paste |
655 | //purpose : |
656 | //======================================================================= |
f47afe53 |
657 | void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& theInto, |
658 | const Handle(TDF_RelocationTable)& ) const |
659 | { |
660 | Handle(TPrsStd_AISPresentation) anInto = |
661 | Handle(TPrsStd_AISPresentation)::DownCast(theInto); |
7fd59977 |
662 | |
f47afe53 |
663 | anInto->Backup(); |
b66f3758 |
664 | if (!anInto->myAIS.IsNull()) |
665 | { |
666 | // Save displayed flag. |
667 | Standard_Boolean displayed = anInto->IsDisplayed(); |
668 | // Erase the interactive object. |
669 | anInto->AISErase(Standard_True); |
670 | // Restore the displayed flag. |
671 | if (displayed) |
672 | anInto->SetDisplayed(displayed); |
673 | } |
674 | // Nullify the interactive object. |
675 | // It will be restored on the next call to AISUpdate(). |
f47afe53 |
676 | anInto->myAIS.Nullify(); |
7fd59977 |
677 | } |
678 | |
679 | //======================================================================= |
680 | //function : AfterAddition |
681 | //purpose : erase if displayed |
682 | //======================================================================= |
683 | void TPrsStd_AISPresentation::AfterAddition() |
f47afe53 |
684 | { |
7fd59977 |
685 | AfterResume(); |
686 | } |
687 | |
688 | //======================================================================= |
689 | //function : BeforeRemoval |
690 | //purpose : erase if displayed |
691 | //======================================================================= |
692 | void TPrsStd_AISPresentation::BeforeRemoval() |
f47afe53 |
693 | { |
694 | BeforeForget(); |
7fd59977 |
695 | } |
696 | |
697 | //======================================================================= |
698 | //function : BeforeForget |
699 | //purpose : erase if displayed |
700 | //======================================================================= |
701 | void TPrsStd_AISPresentation::BeforeForget() |
702 | { |
f47afe53 |
703 | if ( !myAIS.IsNull() ) |
704 | { // Remove AISObject from context. |
705 | AISErase(Standard_True); |
7fd59977 |
706 | myAIS.Nullify(); |
707 | } |
708 | } |
709 | |
7fd59977 |
710 | //======================================================================= |
711 | //function : AfterResume |
712 | //purpose : display if displayed |
713 | //======================================================================= |
f47afe53 |
714 | void TPrsStd_AISPresentation::AfterResume() |
7fd59977 |
715 | { |
f47afe53 |
716 | if ( IsDisplayed() ) |
39effd08 |
717 | { |
718 | AISUpdate(); |
f47afe53 |
719 | AISDisplay(); |
39effd08 |
720 | } |
f47afe53 |
721 | else |
722 | AISErase(); |
7fd59977 |
723 | } |
724 | |
725 | //======================================================================= |
726 | //function : BeforeUndo |
727 | //purpose : le NamedShape associe doit etre present |
728 | //======================================================================= |
7fd59977 |
729 | Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD, |
c4a2f61e |
730 | const Standard_Boolean ) |
7fd59977 |
731 | { |
732 | Handle(TPrsStd_AISPresentation) P; |
f47afe53 |
733 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
7fd59977 |
734 | |
f47afe53 |
735 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) |
736 | { |
737 | if ( !P.IsNull() ) |
738 | P->BeforeForget(); |
7fd59977 |
739 | } |
740 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) { |
f47afe53 |
741 | } |
742 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) |
743 | { |
744 | if ( !P.IsNull() ) |
745 | P->BeforeForget(); |
746 | } |
7fd59977 |
747 | |
748 | return Standard_True; |
749 | } |
750 | |
7fd59977 |
751 | //======================================================================= |
752 | //function : AfterUndo |
753 | //purpose : le NamedShape associe doit etre present |
754 | //======================================================================= |
7fd59977 |
755 | Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD, |
f47afe53 |
756 | const Standard_Boolean ) |
7fd59977 |
757 | { |
758 | Handle(TPrsStd_AISPresentation) P; |
759 | AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P); |
760 | |
f47afe53 |
761 | if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) |
762 | {} |
763 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) |
764 | { |
765 | if ( !P.IsNull() ) |
766 | P->AfterAddition(); |
7fd59977 |
767 | } |
f47afe53 |
768 | else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) |
769 | { |
770 | if ( !P.IsNull() ) |
771 | P->AfterResume(); |
7fd59977 |
772 | } |
773 | |
774 | return Standard_True; |
775 | } |
776 | |
7fd59977 |
777 | //======================================================================= |
778 | //function : AISUpdate |
779 | //purpose : |
780 | //======================================================================= |
f47afe53 |
781 | void TPrsStd_AISPresentation::AISUpdate() |
782 | { |
7fd59977 |
783 | Backup(); |
c4a2f61e |
784 | getData()->Backup(); |
f47afe53 |
785 | Handle(AIS_InteractiveContext) aContext; |
786 | if ( !Label().IsNull() ) |
787 | { |
788 | aContext = getAISContext(); |
789 | |
790 | Handle(TPrsStd_Driver) aDriver; |
791 | if ( TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), aDriver) ) |
792 | { |
793 | // Build a new AIS. |
794 | if ( myAIS.IsNull() ) |
795 | { |
796 | Handle(AIS_InteractiveObject) aNewObj; |
797 | if ( aDriver->Update(Label(), aNewObj) ) |
798 | { |
799 | myAIS = aNewObj; |
f47afe53 |
800 | aNewObj->SetOwner(this); |
801 | } |
7fd59977 |
802 | } |
f47afe53 |
803 | else |
804 | { |
805 | Handle(AIS_InteractiveObject) anObj = myAIS; |
806 | if ( aDriver->Update(Label(), anObj) ) |
807 | if ( !(anObj == myAIS) ) |
808 | { |
809 | if ( !aContext.IsNull() ) |
f6c2b39a |
810 | aContext->Remove (myAIS, Standard_False); |
f47afe53 |
811 | |
812 | // Driver has built new AIS. |
813 | myAIS = anObj; |
f47afe53 |
814 | anObj->SetOwner(this); |
815 | } |
7fd59977 |
816 | } |
817 | } |
818 | } |
819 | else return; |
820 | |
f47afe53 |
821 | // Apply the visualization settings. |
822 | if ( !myAIS.IsNull() ) |
823 | { |
824 | if ( HasOwnColor() ) |
825 | { |
826 | Quantity_NameOfColor aColor = Color(); |
87432b82 |
827 | Quantity_Color aPrsColor; |
828 | myAIS->Color (aPrsColor); |
829 | if ( !(myAIS->HasColor()) || (myAIS->HasColor() && aPrsColor.Name() != aColor) ) |
f47afe53 |
830 | { |
831 | if ( !aContext.IsNull() ) |
832 | aContext->SetColor(myAIS, aColor, Standard_False); |
833 | else |
834 | myAIS->SetColor(aColor); |
7fd59977 |
835 | } |
f47afe53 |
836 | } |
7fd59977 |
837 | |
f47afe53 |
838 | if ( HasOwnMaterial() ) |
839 | { |
840 | Graphic3d_NameOfMaterial aMaterial = Material(); |
841 | if ( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != aMaterial) ) |
842 | { |
843 | if ( !aContext.IsNull() ) |
844 | aContext->SetMaterial(myAIS, aMaterial, Standard_False ); |
845 | else |
846 | myAIS->SetMaterial(aMaterial); |
7fd59977 |
847 | } |
f47afe53 |
848 | } |
849 | |
850 | if ( HasOwnTransparency() ) |
851 | { |
852 | const Standard_Real aTransparency = Transparency(); |
853 | if ( myAIS->Transparency() != aTransparency ) |
854 | { |
855 | if( !aContext.IsNull() ) |
856 | aContext->SetTransparency(myAIS, aTransparency, Standard_False); |
857 | else |
858 | myAIS->SetTransparency(aTransparency); |
7fd59977 |
859 | } |
860 | } |
861 | |
f47afe53 |
862 | if ( HasOwnWidth() ) |
863 | { |
864 | const Standard_Real aWidth = Width(); |
865 | if ( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != aWidth) ) |
866 | { |
867 | if ( !aContext.IsNull() ) |
868 | aContext->SetWidth(myAIS, aWidth, Standard_False); |
869 | else |
870 | myAIS->SetWidth(aWidth); |
7fd59977 |
871 | } |
872 | } |
873 | |
f47afe53 |
874 | if ( HasOwnMode() ) |
875 | { |
876 | const Standard_Integer aMode = Mode(); |
877 | if ( myAIS->DisplayMode() != aMode ) |
878 | myAIS->SetDisplayMode(aMode); |
7fd59977 |
879 | } |
880 | |
ab3ff92c |
881 | ActivateSelectionMode(); |
7fd59977 |
882 | } |
883 | |
f47afe53 |
884 | if (IsDisplayed() && !aContext.IsNull()) |
885 | aContext->Redisplay(myAIS, Standard_False); |
7fd59977 |
886 | } |
887 | |
888 | //======================================================================= |
889 | //function : AISDisplay |
890 | //purpose : |
891 | //======================================================================= |
f47afe53 |
892 | void TPrsStd_AISPresentation::AISDisplay() |
893 | { |
894 | if ( !Label().IsNull() ) |
895 | { |
896 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
7fd59977 |
897 | |
f47afe53 |
898 | if ( aContext.IsNull() ) |
899 | return; |
900 | |
901 | if ( !myAIS.IsNull() ) |
902 | { |
903 | if ( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != aContext ) |
0577ae8c |
904 | myAIS->GetContext()->Remove (myAIS, Standard_False); |
7fd59977 |
905 | |
f47afe53 |
906 | if ( IsDisplayed() && aContext->IsDisplayed(myAIS) ) |
907 | return; |
7fd59977 |
908 | |
f47afe53 |
909 | aContext->Display(myAIS, Standard_False); |
7fd59977 |
910 | |
f47afe53 |
911 | if ( aContext->IsDisplayed(myAIS) ) |
912 | SetDisplayed(Standard_True); |
7fd59977 |
913 | } |
914 | } |
915 | } |
916 | |
7fd59977 |
917 | //======================================================================= |
918 | //function : AISErase |
919 | //purpose : |
920 | //======================================================================= |
f47afe53 |
921 | void TPrsStd_AISPresentation::AISErase(const Standard_Boolean theIsRemove) |
922 | { |
923 | Handle(AIS_InteractiveContext) aContext, anOwnContext; |
924 | |
925 | if ( !myAIS.IsNull() ) |
926 | { |
927 | Backup(); |
f47afe53 |
928 | if ( !Label().IsNull() ) |
929 | { |
c4a2f61e |
930 | if (IsAttribute(TDataXtd_Presentation::GetID())) |
931 | SetDisplayed(Standard_False); |
932 | |
f47afe53 |
933 | Handle(TPrsStd_AISViewer) viewer; |
934 | if( !TPrsStd_AISViewer::Find(Label(), viewer) ) |
935 | return; |
936 | anOwnContext = myAIS->GetContext(); |
937 | aContext = viewer->GetInteractiveContext(); |
7fd59977 |
938 | |
f47afe53 |
939 | if ( theIsRemove ) |
940 | { |
941 | if ( !aContext.IsNull() ) |
942 | aContext->Remove(myAIS, Standard_False); |
943 | if ( !anOwnContext.IsNull() && anOwnContext != aContext ) |
944 | anOwnContext->Remove(myAIS, Standard_False); |
7fd59977 |
945 | |
78a8dfb9 |
946 | myAIS.Nullify(); |
7fd59977 |
947 | } |
f47afe53 |
948 | else |
949 | { |
950 | if ( !aContext.IsNull() ) |
951 | aContext->Erase(myAIS, Standard_False); |
952 | if ( !anOwnContext.IsNull() && anOwnContext != aContext ) |
953 | anOwnContext->Erase(myAIS, Standard_False); |
7fd59977 |
954 | } |
955 | } |
f47afe53 |
956 | else |
957 | { |
958 | if ( theIsRemove ) |
959 | { |
960 | if ( !anOwnContext.IsNull() ) |
961 | { |
962 | anOwnContext->Remove(myAIS, Standard_False); |
78a8dfb9 |
963 | myAIS.Nullify(); |
f47afe53 |
964 | } |
7fd59977 |
965 | } |
f47afe53 |
966 | else |
967 | if( !anOwnContext.IsNull() ) |
968 | anOwnContext->Erase(myAIS, Standard_False); |
7fd59977 |
969 | } |
970 | } |
971 | } |
972 | |
7fd59977 |
973 | //======================================================================= |
974 | //function :GetAIS |
975 | //purpose : |
976 | //======================================================================= |
977 | Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const |
978 | { |
979 | return myAIS; |
980 | } |
981 | |
7fd59977 |
982 | //======================================================================= |
f47afe53 |
983 | //function : getAISContext |
7fd59977 |
984 | //purpose : |
985 | //======================================================================= |
f47afe53 |
986 | Handle(AIS_InteractiveContext) TPrsStd_AISPresentation::getAISContext() const |
7fd59977 |
987 | { |
f47afe53 |
988 | Handle(TPrsStd_AISViewer) aViewer; |
989 | if ( TPrsStd_AISViewer::Find(Label(), aViewer) ) |
990 | return aViewer->GetInteractiveContext(); |
7fd59977 |
991 | |
f47afe53 |
992 | return Handle_AIS_InteractiveContext(); |
993 | } |
ab3ff92c |
994 | |
995 | //======================================================================= |
996 | //function : ActivateSelectionMode |
997 | //purpose : Activates selection mode of the interactive object. |
998 | // It is called internally on change of selection mode and AISUpdate(). |
999 | //======================================================================= |
1000 | void TPrsStd_AISPresentation::ActivateSelectionMode() |
1001 | { |
1002 | if (!myAIS.IsNull() && HasOwnSelectionMode()) |
1003 | { |
1004 | Handle(AIS_InteractiveContext) aContext = getAISContext(); |
1005 | if (!aContext.IsNull()) |
1006 | { |
1007 | TColStd_ListOfInteger anActivatedModes; |
1008 | aContext->ActivatedModes (myAIS, anActivatedModes); |
1009 | Standard_Boolean isActivated = Standard_False; |
1010 | Standard_Integer aSelectionMode = SelectionMode(); |
1011 | if (aSelectionMode == -1) |
1012 | { |
1013 | aContext->Deactivate(myAIS); |
1014 | } |
1015 | else |
1016 | { |
1017 | for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next()) |
1018 | { |
1019 | if (aModeIter.Value() == aSelectionMode) |
1020 | { |
1021 | isActivated = Standard_True; |
1022 | break; |
1023 | } |
1024 | } |
1025 | if (!isActivated) |
1026 | aContext->Activate (myAIS, aSelectionMode, Standard_False); |
1027 | } |
1028 | } |
1029 | } |
1030 | } |