0022523: DRAWEXE randomly crashed on smooth navigation in 3D-Viewer
[occt.git] / src / AIS / AIS_InteractiveContext.cxx
CommitLineData
b311480e 1// Created on: 1997-01-17
2// Created by: Robert COUBLANC
3// Copyright (c) 1997-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// Modified by XAB & Serguei Dec 97 (angle &deviation coeffts)
7fd59977 22
23#define BUC60577 //GG_101099 Enable to compute correctly
24// transparency with more than one object in the view.
25
26#define GER61351 //GG_171199 Enable to set an object RGB color
27// instead a restricted object NameOfColor.
28
29#define G003 //EUG_26/01/00 Degenerate support (G003)
30
31#define IMP140200 //GG Add SetSelectedAspect() method.
32
33#define BUC60632 //GG 15/03/00 Add protection on SetDisplayMode()
34// method, compute only authorized presentation.
35
36#define BUC60688 //GG 25/05/00 Add SetSensitivity() methods.
37
38#define BUC60722 //GG 04/09/00 Always enable viewer update when erasing something
39
40#define IMP051001 //GG Adds SetZDetected() and ZDetected() methods
41
42#define OCC172 //SAV clear static map before destroying context.
43
44#define OCC204 //SAV 26/02/02 : pass <updateviewer> flag to
b311480e 45// AddOrRemoveCurrentObject method from ClearGlobal.
7fd59977 46
47#define OCC4373 //SAN 10/11/03 : improve display mode management in
b311480e 48// Display( IO, updateviewer ) and
49// SetDisplayMode( IO, mode, updateviewer ) methods
7fd59977 50
51#include <AIS_InteractiveContext.ixx>
52
53//#include <AIS_DataMapIteratorOfDataMapOfInteractiveInteger.hxx>
54#include <TColStd_ListIteratorOfListOfInteger.hxx>
55#include <TColStd_MapIteratorOfMapOfTransient.hxx>
56#include <AIS_LocalContext.hxx>
57#include <AIS_LocalStatus.hxx>
58#include <Precision.hxx>
59#include <AIS_Selection.hxx>
60#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
61#include <AIS_ConnectedShape.hxx>
62#include <AIS_MultipleConnectedShape.hxx>
63#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
64#include <AIS_GlobalStatus.hxx>
65#include <AIS_MapIteratorOfMapOfInteractive.hxx>
66#include <PrsMgr_ModedPresentation.hxx>
67#include <Visual3d_ViewManager.hxx>
68#include <Prs3d_ShadingAspect.hxx>
69#include <AIS_Shape.hxx>
70#include <Graphic3d_AspectFillArea3d.hxx>
71#include <HLRBRep.hxx>
72#include <Prs3d_IsoAspect.hxx>
73#include <Prs3d_DatumAspect.hxx>
74#include <Prs3d_PlaneAspect.hxx>
75#include <PrsMgr_PresentableObject.hxx>
e33e7e78 76#include <Standard_Atomic.hxx>
7fd59977 77#include <UnitsAPI.hxx>
78
79#include <AIS_Trihedron.hxx>
80#include <Geom_Axis2Placement.hxx>
81#include <OSD_Environment.hxx>
82
83#include <AIS_ListIteratorOfListOfInteractive.hxx>
84
85// In the method GetDefModes() the returned value of the selection mode
86// is always equal to 0 if it is -1.
87#define BUC61051
88
0d969553 89// The local context is closed the method ::ResetOriginalState() sets the selection mode equal to 0
7fd59977 90// in spite of the selection mode of the interactive object in Natural Point.
91#define OCC166
92
93// An interactive Object being erased in the main viewer and put into collector should have the same selection mode.
94// It impacts the performance!
95#define OCC328
96
97static Standard_Boolean AISDebugModeOn()
98{
99// static OSD_Environment aisdb("AISDEBUGMODE");
100// return !aisdb.Value().IsEmpty();
101 static Standard_Integer isDebugMode(-1);
102 if (isDebugMode < 0) {
103 isDebugMode = 1;
104 OSD_Environment aisdb("AISDEBUGMODE");
105 if (aisdb.Value().IsEmpty())
106 isDebugMode = 0;
107 }
108 return (isDebugMode != 0);
109}
110
e33e7e78 111namespace
7fd59977 112{
e33e7e78
RK
113 static volatile Standard_Integer THE_AIS_INDEX_SEL = 0;
114 static volatile Standard_Integer THE_AIS_INDEX_CUR = 0;
7fd59977 115
e33e7e78
RK
116 static TCollection_AsciiString AIS_Context_NewSelName()
117 {
118 return TCollection_AsciiString ("AIS_SelContext_")
119 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_SEL));
120 }
7fd59977 121
e33e7e78
RK
122 static TCollection_AsciiString AIS_Context_NewCurName()
123 {
124 return TCollection_AsciiString ("AIS_CurContext_")
125 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_CUR));
126 }
127};
7fd59977 128
129//=======================================================================
130//function : AIS_InteractiveContext
131//purpose :
132//=======================================================================
133
134AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
135mgrSelector(new SelectMgr_SelectionManager()),
136myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
137myMainVwr(MainViewer),
138myMainSel(new StdSelect_ViewerSelector3d()),
139myIsCollClosed(Standard_True),
140myToHilightSelected( Standard_False ),
141myFilters(new SelectMgr_OrFilter()),
142myDefaultDrawer(new Prs3d_Drawer()),
143myDefaultColor(Quantity_NOC_GOLDENROD),
144myHilightColor(Quantity_NOC_CYAN1),
145mySelectionColor(Quantity_NOC_GRAY80),
146myPreselectionColor(Quantity_NOC_GREEN),
147mySubIntensity(Quantity_NOC_GRAY40),
148myDisplayMode(0),
149myCurLocalIndex(0),
150#ifdef IMP051001
151myZDetectionFlag(0),
152#endif
153myIsAutoActivateSelMode( Standard_True )
154{
155 InitAttributes();
156}
157
158
159//=======================================================================
160//function : AIS_InteractiveContext
161//purpose :
162//=======================================================================
163
164AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer,
165 const Handle(V3d_Viewer)& Collector):
166mgrSelector(new SelectMgr_SelectionManager()),
167myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
168myMainVwr(MainViewer),
169myMainSel(new StdSelect_ViewerSelector3d()),
170myCollectorPM(new PrsMgr_PresentationManager3d(Collector->Viewer())),
171myCollectorVwr(Collector),
172myCollectorSel(new StdSelect_ViewerSelector3d()),
173myIsCollClosed(Standard_False),
174myToHilightSelected( Standard_False ),
175myFilters(new SelectMgr_OrFilter()),
176myDefaultDrawer(new Prs3d_Drawer()),
177myDefaultColor(Quantity_NOC_GOLDENROD),
178myHilightColor(Quantity_NOC_CYAN1),
179mySelectionColor(Quantity_NOC_GRAY80),
180myPreselectionColor(Quantity_NOC_GREEN),
181mySubIntensity(Quantity_NOC_GRAY40),
182myDisplayMode(0),
183myCurLocalIndex(0),
184#ifdef IMP051001
185myZDetectionFlag(0),
186#endif
187myIsAutoActivateSelMode( Standard_True )
188{
189 InitAttributes();
190 mgrSelector->Add(myCollectorSel);
191#ifdef BUC60688
192 SetSensitivity();
193#else
194 myCollectorSel->Set(4);
195#endif
196
197}
198
199void AIS_InteractiveContext::Delete() const
200{
201#ifdef OCC172
202 // to avoid an exception
203 if ( AIS_Selection::Find( mySelectionName.ToCString() ) )
204 AIS_Selection::Remove( mySelectionName.ToCString() );
205
206 // to avoid an exception
207 if ( AIS_Selection::Find( myCurrentName.ToCString() ) )
208 AIS_Selection::Remove( myCurrentName.ToCString() );
209
210 // let's remove one reference explicitly. this operation's supposed to
211 // be performed when mgrSelector will be destroyed but anyway...
212 mgrSelector->Remove( myMainSel );
213#endif
214 MMgt_TShared::Delete();
215}
216
217//=======================================================================
218//function : AIS_SelectionName
219//purpose :
220//=======================================================================
221const TCollection_AsciiString& AIS_InteractiveContext::SelectionName() const
222{
223 if(!HasOpenedContext())
224 return mySelectionName;
225 return myLocalContexts(myCurLocalIndex)->SelectionName();
226
227}
228
229
230
231//=======================================================================
232//function : UpdateCurrentViewer
233//purpose :
234//=======================================================================
235
236void AIS_InteractiveContext::UpdateCurrentViewer()
237{
238 if (!myMainVwr.IsNull())
239 myMainVwr->Update();
240}
241
242void AIS_InteractiveContext::OpenCollector()
243{
244 myIsCollClosed =Standard_True;
0d969553 245 // to be completed....
7fd59977 246}
247
248
249
250//=======================================================================
251//function : DomainOfMainViewer
252//purpose :
253//=======================================================================
254
255Standard_CString AIS_InteractiveContext::DomainOfMainViewer() const
256{
257 return myMainVwr->Domain();
258
259}
260
261//=======================================================================
262//function : DisplayedObjects
263//purpose :
264//=======================================================================
265
266void AIS_InteractiveContext::DisplayedObjects(AIS_ListOfInteractive& aListOfIO,
267 const Standard_Boolean OnlyFromNeutral) const
268{
269#ifdef DEBUG
270 cout<<"AIS_IC::DisplayedObjects"<<endl;
271#endif
272
273 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
274 if(!HasOpenedContext() || OnlyFromNeutral){
275 for(;It.More();It.Next()){
276 if(It.Value()->GraphicStatus()==AIS_DS_Displayed)
277 aListOfIO.Append(It.Key());
278 }
279 }
280 else{
281 TColStd_MapOfTransient theMap;
0d969553 282 // neutral point
7fd59977 283 for(;It.More();It.Next()){
284 if(It.Value()->GraphicStatus()==AIS_DS_Displayed)
285 theMap.Add(It.Key());
286 }
287#ifdef DEBUG
288 cout<<"\tFrom Neutral Point : "<<theMap.Extent()<<endl;
289#endif
290
0d969553 291 //parse all local contexts...
7fd59977 292 Standard_Integer NbDisp;
293 for(AIS_DataMapIteratorOfDataMapOfILC it1(myLocalContexts);it1.More();it1.Next()){
294 const Handle(AIS_LocalContext)& LC = it1.Value();
295 NbDisp = LC->DisplayedObjects(theMap);
296#ifdef DEBUG
297 cout<<"\tIn Local Context "<<it1.Key()<<" : "<<NbDisp<<endl;
298#endif
299
300 }
301 Handle(AIS_InteractiveObject) curIO;
302 Handle(Standard_Transient) Tr;
303 for(TColStd_MapIteratorOfMapOfTransient it2(theMap);it2.More();it2.Next()){
304 Tr = it2.Key();
305 curIO = *((Handle(AIS_InteractiveObject)*) &Tr);
306 aListOfIO.Append(curIO);
307 }
308 }
309}
310//=======================================================================
311//function : DisplayedObjects
312//purpose :
313//=======================================================================
314
315void AIS_InteractiveContext::DisplayedObjects(const AIS_KindOfInteractive TheKind,
316 const Standard_Integer TheSign,
317 AIS_ListOfInteractive& aListOfIO,
318 const Standard_Boolean /*OnlyFromNeutral*/) const
319{
320 ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_Displayed, aListOfIO );
321}
322
323//=======================================================================
324//function : UpdateCollector
325//purpose :
326//=======================================================================
327
328void AIS_InteractiveContext::UpdateCollector()
329{
330 if (!myCollectorVwr.IsNull())
331 myCollectorVwr->Update();
332}
333
334//=======================================================================
335//function : DomainOfCollector
336//purpose :
337//=======================================================================
338
339Standard_CString AIS_InteractiveContext::DomainOfCollector() const
340{
341 if(myCollectorVwr.IsNull()) return "";
342 return myCollectorVwr->Domain();
343}
344
345//=======================================================================
346//function : ObjectsInCollector
347//purpose :
348//=======================================================================
349
350void AIS_InteractiveContext::ObjectsInCollector(AIS_ListOfInteractive& aListOfIO) const
351{
352 ObjectsByDisplayStatus( AIS_DS_Erased, aListOfIO );
353}
354
355//=======================================================================
356//function : ObjectsInCollector
357//purpose :
358//=======================================================================
359
360void AIS_InteractiveContext::ObjectsInCollector(const AIS_KindOfInteractive TheKind,
361 const Standard_Integer TheSign,
362 AIS_ListOfInteractive& aListOfIO) const
363{
364 ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_Erased, aListOfIO );
365}
366
367//=======================================================================
368//function : ErasedObjects
369//purpose :
370//=======================================================================
371
372void AIS_InteractiveContext::ErasedObjects(AIS_ListOfInteractive& theListOfIO) const
373{
374 ObjectsByDisplayStatus( AIS_DS_FullErased, theListOfIO );
375}
376
377//=======================================================================
378//function : ErasedObjects
379//purpose :
380//=======================================================================
381
382void AIS_InteractiveContext::ErasedObjects(const AIS_KindOfInteractive TheKind,
383 const Standard_Integer TheSign,
384 AIS_ListOfInteractive& theListOfIO) const
385{
386 ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_FullErased, theListOfIO );
387}
388
389//=======================================================================
390//function : ObjectsByDisplayStatus
391//purpose :
392//=======================================================================
393
394void AIS_InteractiveContext::ObjectsByDisplayStatus(const AIS_DisplayStatus theStatus,
395 AIS_ListOfInteractive& theListOfIO) const
396{
397 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
398 for(;It.More();It.Next()){
399 if(It.Value()->GraphicStatus() == theStatus)
400 theListOfIO.Append(It.Key());
401 }
402}
403
404//=======================================================================
405//function : ObjectsByDisplayStatus
406//purpose :
407//=======================================================================
408
409void AIS_InteractiveContext::ObjectsByDisplayStatus(const AIS_KindOfInteractive TheKind,
410 const Standard_Integer TheSign,
411 const AIS_DisplayStatus theStatus,
412 AIS_ListOfInteractive& theListOfIO) const
413{
414 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
415 for(;It.More();It.Next()){
416 if(It.Value()->GraphicStatus()==theStatus){
417 if(It.Key()->Type()==TheKind){
418 if(TheSign ==-1)
419 theListOfIO.Append(It.Key());
420 else{
421 if(It.Key()->Signature()==TheSign)
422 theListOfIO.Append(It.Key());
423 }
424 }
425 }
426 }
427}
428
429//=======================================================================
430//function : ObjectsInside
431//purpose :
432//=======================================================================
433
434void AIS_InteractiveContext::ObjectsInside(AIS_ListOfInteractive& aListOfIO,
435 const AIS_KindOfInteractive TheKind,
436 const Standard_Integer TheSign) const
437{
438 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
439 if(TheKind==AIS_KOI_None && TheSign ==-1){
440 for(;It.More();It.Next()){
441 aListOfIO.Append(It.Key());
442 }
443 }
444 else{
445 for(;It.More();It.Next()){
446 if(It.Key()->Type()==TheKind){
447 if(TheSign ==-1)
448 aListOfIO.Append(It.Key());
449 else{
450 if(It.Key()->Signature()==TheSign)
451 aListOfIO.Append(It.Key());
452 }
453 }
454 }
455 }
456}
457
458//=======================================================================
459//function : Display
460//purpose :
461//=======================================================================
462
463void AIS_InteractiveContext::Display(const Handle(AIS_InteractiveObject)& anIObj,
464 const Standard_Boolean updateviewer )
465{
466 if(anIObj.IsNull()) return;
467
468 Standard_Integer DispMode,HiMod,SelMode;
469
470 GetDefModes(anIObj,DispMode,HiMod,SelMode);
471
472 Handle (AIS_InteractiveContext) aThis = this;
473 if(!anIObj->HasInteractiveContext())
474 anIObj->SetContext(aThis);
475
0d969553 476 //NO LOCAL CONTEXT OPEN
7fd59977 477 if(!HasOpenedContext()) {
478#ifndef OCC4373
479 // SAN : Do not return here. Perform advanced display mode analysis a bit later...
480 if(IsDisplayed(anIObj)) return;
481#endif
482 Standard_Boolean updcol = Standard_False;
483
0d969553 484 // it did not yet exist
7fd59977 485 if(!myObjects.IsBound(anIObj)){
486
487 Handle(AIS_GlobalStatus) STATUS=
488#ifdef OCC166
489 new AIS_GlobalStatus(AIS_DS_Displayed,DispMode,SelMode);
490#else
491 new AIS_GlobalStatus(AIS_DS_Displayed,DispMode,0);
492#endif
493 myObjects.Bind (anIObj,STATUS);
494 myMainPM->Display(anIObj,DispMode);
495 if( myIsAutoActivateSelMode )
496 {
497 if(!mgrSelector->Contains(anIObj))
498 mgrSelector->Load(anIObj);
499 mgrSelector->Activate(anIObj,SelMode,myMainSel);
500 }
501
502 if(updateviewer) myMainVwr->Update();
503 }
0d969553 504 // it is somewhere else...
7fd59977 505 else {
506 // CLE
507 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
508 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
509 // ENDCLE
510 switch (STATUS->GraphicStatus()){
511 case AIS_DS_Erased:{
512 if(STATUS->IsHilighted())
513 myCollectorPM->Unhighlight(anIObj,HiMod);
514 myCollectorPM->Erase(anIObj,HiMod);
515 mgrSelector->Deactivate(anIObj,myCollectorSel);
516 updcol = updateviewer;
0d969553 517 }// attention the break is not set on purpose...
7fd59977 518 case AIS_DS_FullErased:{
e33e7e78
RK
519 TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
520 for (;ItL.More();ItL.Next()){
7fd59977 521 myMainPM->Display(anIObj,ItL.Value());
522 if(STATUS->IsSubIntensityOn())
523 myMainPM->Color(anIObj,mySubIntensity,ItL.Value());
524 }
525 if( myIsAutoActivateSelMode )
526 for (ItL.Initialize(STATUS->SelectionModes());ItL.More();ItL.Next())
527 mgrSelector->Activate(anIObj,ItL.Value(),myMainSel);
528 STATUS->SetGraphicStatus(AIS_DS_Displayed);
529 if(STATUS->IsHilighted())
530 myMainPM->Highlight(anIObj,HiMod);
531 break;
532 }
533#ifdef OCC4373
534 // SAN : erase presentations for all display modes different from <DispMode>;
535 // then make sure <DispMode> is displayed and maybe highlighted;
536 // Finally, activate selection mode <SelMode> if not yet activated.
537 case AIS_DS_Displayed:{
538 TColStd_ListOfInteger aModesToRemove;
e33e7e78
RK
539 TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
540 for(;ItL.More();ItL.Next()){
7fd59977 541
542 Standard_Integer OldMode = ItL.Value();
543
544 if(OldMode!=DispMode){
545 aModesToRemove.Append(OldMode);
546 if(myMainPM->IsHighlighted(anIObj,OldMode))
547 myMainPM->Unhighlight(anIObj,OldMode);
548 myMainPM->Erase(anIObj,OldMode);
549 }
550 }
551
552 for(ItL.Initialize(aModesToRemove);ItL.More();ItL.Next())
553 STATUS->RemoveDisplayMode(ItL.Value());
554
555 if(!STATUS->IsDModeIn(DispMode))
556 STATUS->AddDisplayMode(DispMode);
557
558 myMainPM->Display(anIObj,DispMode);
559 if(STATUS->IsHilighted()){
560 myMainPM->Highlight(anIObj,HiMod);
561 }
562 if( myIsAutoActivateSelMode )
563 {
564 if(!mgrSelector->Contains(anIObj))
565 mgrSelector->Load(anIObj);
566 if(!mgrSelector->IsActivated(anIObj,SelMode))
567 mgrSelector->Activate(anIObj,SelMode,myMainSel);
568 }
569
570 break;
571 }
572#endif
573 default:
574 break;
575 }
576 }
577
578 if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
579 myMainVwr->Viewer()->SetTransparency(Standard_True);
580 if(updateviewer) myMainVwr->Update();
581 if(updcol && !myCollectorVwr.IsNull()) myCollectorVwr->Update();
582 }
583
0d969553 584 // LOCAL CONTEXT OPEN
7fd59977 585 else
586 {
587 myLocalContexts(myCurLocalIndex)->Display(anIObj,DispMode,anIObj->AcceptShapeDecomposition(),SelMode);
588
589 if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
590 myMainVwr->Viewer()->SetTransparency(Standard_True);
591
592
593 if(updateviewer) myMainVwr->Update();
594 }
595}
596
597//=======================================================================
598//function : Display
599//purpose :
600//=======================================================================
601
602void AIS_InteractiveContext::Display(const Handle(AIS_InteractiveObject)& anIObj,
603 const Standard_Integer aDisplayMode,
604 const Standard_Integer aSelectionMode,
605 const Standard_Boolean updateviewer,
606 const Standard_Boolean allowdecomposition)
607{
608 if(anIObj.IsNull()) return;
609
610 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
611
0d969553 612 // if no local context...
7fd59977 613 if(!HasOpenedContext()) {
614 // if(!anIObj->HasDisplayMode())
615 // anIObj->SetDisplayMode(aDisplayMode);
616
617 if(!myObjects.IsBound(anIObj)){
618 Handle(AIS_GlobalStatus) STATUS=
619 new AIS_GlobalStatus(AIS_DS_Displayed,aDisplayMode,aSelectionMode);
620 myObjects.Bind (anIObj,STATUS);
621 myMainPM->Display(anIObj,aDisplayMode);
622 if(aSelectionMode!=-1){
623 if(!mgrSelector->Contains(anIObj))
624 mgrSelector->Load(anIObj,aSelectionMode);
625 mgrSelector->Activate(anIObj,aSelectionMode,myMainSel);
626 }
627 if(updateviewer) myMainVwr->Update();
628 }
629 // anIObj->SelectionMode(aSelectionMode);
630 else{
631 // CLE
632 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
633 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
634 // ENDCLE
635 if(!STATUS->IsDModeIn(aDisplayMode)){
636 myMainPM->Display(anIObj,aDisplayMode);
637 STATUS->AddDisplayMode(aDisplayMode);
638 if(STATUS->IsSubIntensityOn())
639 myMainPM->Color(anIObj,mySubIntensity,aDisplayMode);
640 }
641 if(aSelectionMode!=-1){
642 STATUS->AddSelectionMode(aSelectionMode);
643 mgrSelector->Activate(anIObj,aSelectionMode,myMainSel);
644 }
645 if(updateviewer) myMainVwr->Update();
646
647 }
648 }
649 else
650 {
651 myLocalContexts(myCurLocalIndex)->Display(anIObj,aDisplayMode,allowdecomposition,aSelectionMode);
652 if(updateviewer) myMainVwr->Update();
653 }
654}
655
656
657//=======================================================================
658//function : Load
659//purpose :
660//=======================================================================
661
662void AIS_InteractiveContext::Load(const Handle(AIS_InteractiveObject)& anIObj,
663 const Standard_Integer SelMode,
664 const Standard_Boolean AllowDecomposition)
665{
666 if(anIObj.IsNull()) return;
667 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
668
669
670 if(!HasOpenedContext()) {
671 if(SelMode==-1 && !AllowDecomposition){
672 Standard_Integer DispMode,HiMod,SelModeDef;
673
674 GetDefModes(anIObj,DispMode,HiMod,SelModeDef);
675 Handle(AIS_GlobalStatus) STATUS=
676 new AIS_GlobalStatus(AIS_DS_FullErased,DispMode,SelModeDef);
677 myObjects.Bind (anIObj,STATUS);
678 return;
679 }
680 }
681 myLocalContexts(myCurLocalIndex)->Load(anIObj,AllowDecomposition,SelMode);
682}
683
684
685//=======================================================================
686//function : Erase
687//purpose :
688//=======================================================================
689
690void AIS_InteractiveContext::Erase(const Handle(AIS_InteractiveObject)& anIObj,
691 const Standard_Boolean updateviewer,
692 const Standard_Boolean PutInCollector)
693{
694 if(anIObj.IsNull()) return;
695
696 if ( !anIObj->IsAutoHilight() )
697 anIObj->ClearSelected();
698
699 if(!HasOpenedContext()){
700 EraseGlobal(anIObj,updateviewer,PutInCollector);
701 }
702 else
703 {
0d969553
Y
704 // First it is checked if it is possible to remove in the current local context
705 // then one tries to remove in other local contexts, if they allow it...
7fd59977 706
707 Standard_Boolean WasInCtx = myLocalContexts(myCurLocalIndex)->Erase(anIObj);
708// if(!WasInCtx) {
709 AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
710 for (;It.More();It.Next()){
711 if(It.Value()->AcceptErase())
712#ifdef BUC60722
713 WasInCtx |= It.Value()->Erase(anIObj);
714#else
715 WasInCtx = It.Value()->Erase(anIObj);
716#endif
717 }
718
719 if(!WasInCtx)
720 EraseGlobal(anIObj,updateviewer,PutInCollector);
721 else
722 if(updateviewer) myMainVwr->Update();
723 }
724}
725//=======================================================================
726//function : Erase
727//purpose :
728//=======================================================================
729
730void AIS_InteractiveContext::EraseMode(const Handle(AIS_InteractiveObject)& anIObj,
731 const Standard_Integer aMode,
732 const Standard_Boolean /*updateviewer*/)
733{
734 if(anIObj.IsNull()) return;
735
736 if(!myObjects.IsBound(anIObj)) return;
737
738 if(anIObj->HasDisplayMode()){
739 if(anIObj->DisplayMode()==aMode) return;
740 }
741 else if(myDisplayMode==aMode) return;
742 // CLE
743 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
744 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
745 // ENDCLE
746 if(STATUS->GraphicStatus()!=AIS_DS_Displayed) return;
747
748
749// if(STATUS->IsDModeIn(aMode)) {}
750}
751
752
753
754//=======================================================================
755//function : EraseAll
756//purpose :
757//=======================================================================
758
759void AIS_InteractiveContext::EraseAll(const Standard_Boolean PutInCollector,
760 const Standard_Boolean updateviewer)
761{
762 if(!HasOpenedContext()){
763 AIS_DataMapIteratorOfDataMapOfIOStatus ItM(myObjects);
764
765 for(;ItM.More();ItM.Next()){
766 if(ItM.Value()->GraphicStatus() == AIS_DS_Displayed)
767 Erase(ItM.Key(),Standard_False,PutInCollector);
768 }
769 if(updateviewer){
770 myMainVwr->Update();
771 if (PutInCollector && !myCollectorVwr.IsNull())
772 myCollectorVwr->Update();
773 }
774 }
775
776}
777
778//=======================================================================
779//function : DisplayAll
780//purpose :
781//=======================================================================
782
783void AIS_InteractiveContext::DisplayAll(const Standard_Boolean OnlyFromCollector,
784 const Standard_Boolean updateviewer)
785{
786 if(!HasOpenedContext()){
787 Standard_Boolean FoundInCollector(Standard_False);
788 AIS_DisplayStatus aDStatus = OnlyFromCollector ? AIS_DS_Erased : AIS_DS_FullErased,TheStatus;
789
790 if(!HasOpenedContext()){
791 AIS_DataMapIteratorOfDataMapOfIOStatus ItM(myObjects);
792
793 for(;ItM.More();ItM.Next()){
794 TheStatus = ItM.Value()->GraphicStatus();
795 if(TheStatus == aDStatus)
796 Display(ItM.Key(),Standard_False);
797 if(TheStatus == AIS_DS_Erased)
798 FoundInCollector = Standard_True;
799 }
800 if(updateviewer){
801 myMainVwr->Update();
802 if(FoundInCollector && !myCollectorVwr.IsNull())
803 myCollectorVwr->Update();
804 }
805 }
806 }
807
808}
809
810//=======================================================================
811//function : DisplaySelected
812//purpose :
813//=======================================================================
814
815void AIS_InteractiveContext::DisplaySelected(const Standard_Boolean updateviewer)
816{
817
818 if(!HasOpenedContext()){
819 Standard_Boolean found = Standard_False;
820 Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
821 Handle(AIS_InteractiveObject) iObj;
822 for (sel->Init();sel->More();sel->Next()) {
823 iObj = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
824 Display(iObj,Standard_False);
825 found = Standard_True;
826 }
827 if(found && updateviewer) {
828 myMainVwr->Update();
829 if(!(myIsCollClosed && myCollectorVwr.IsNull()))
830
831 myCollectorVwr->Update();
832 }
833 }
834}
835
836
837//=======================================================================
838//function : EraseSelected
839//purpose :
840//=======================================================================
841
842void AIS_InteractiveContext::EraseSelected(const Standard_Boolean PutInCollector,
843 const Standard_Boolean updateviewer)
844{
845
846 if(!HasOpenedContext()){
847 Standard_Boolean found = Standard_False;
848 Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
849 Handle(AIS_InteractiveObject) iObj;
850 for(sel->Init();sel->More();sel->Next()) {
851 iObj = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
852 Erase(iObj,Standard_False,PutInCollector);
853 found = Standard_True;
854 }
855 if(found && updateviewer) {
856 myMainVwr->Update();
857 if(PutInCollector && !myCollectorVwr.IsNull())
858 myCollectorVwr->Update();
859 }
860 }
861}
862//=======================================================================
863//function :
864//purpose :
865//=======================================================================
866
867Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_InteractiveObject)& anIObj,
868 const Standard_Integer WhichContext)
869{
870 if(anIObj.IsNull()) return Standard_False;
871
872 if(!HasOpenedContext()) return Standard_False;
873 if(myObjects.IsBound(anIObj)) return Standard_False;
874 if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
875
81bba717 876 // Protection : if one tries to preserve a temporary object
877 // which is not in the local active context... rob 11-06-97
7fd59977 878
879 Standard_Integer IsItInLocal = myCurLocalIndex;
880 Standard_Boolean Found(Standard_False);
881
882 while(IsItInLocal>0 && !Found){
883 if(!myLocalContexts.IsBound(IsItInLocal))
884 IsItInLocal--;
885 else if(myLocalContexts(IsItInLocal)->IsIn(anIObj))
886 Found = Standard_True;
887 else
888 IsItInLocal--;
889 }
890
891 if(!Found) return Standard_False;
892
893
894// const Handle(AIS_LocalStatus)& LS = (WhichContext== -1) ?
895// myLocalContexts(IsItInLocal)->Status(anIObj):myLocalContexts(WhichContext)->Status(anIObj);
896 // CLE
897 // const Handle(AIS_LocalStatus)& LS = myLocalContexts(IsItInLocal)->Status(anIObj);
898 Handle(AIS_LocalStatus) LS = myLocalContexts(IsItInLocal)->Status(anIObj);
899 // ENDCLE
900
901
902 if(LS->IsTemporary()){
903 Standard_Integer DM,HM,SM;
904 GetDefModes(anIObj,DM,HM,SM);
905
906 SM = LS->SelectionModes().IsEmpty() ? SM : LS->SelectionModes().First();
907 if(LS->DisplayMode()!= DM ){
908 Standard_Integer LSM = LS->SelectionModes().IsEmpty() ? -1 : LS->SelectionModes().First();
909 myLocalContexts(IsItInLocal)->Display(anIObj,DM,LS->Decomposed(),LSM);
910 }
911
912 Handle (AIS_GlobalStatus) GS = new AIS_GlobalStatus(AIS_DS_Displayed,
913 DM,
914 SM,
915 Standard_False);
916// GS->SubIntensityOn();
917 myObjects.Bind(anIObj,GS);
918 mgrSelector->Load(anIObj);
919 mgrSelector->Activate(anIObj,SM,myMainSel);
920
921 LS->SetTemporary(Standard_False);
922 }
923 return Standard_True;
924}
925
926
927//=======================================================================
928//purpose :
929//=======================================================================
930
931AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus(const Handle(AIS_InteractiveObject)& anIObj) const
932{
933 if(anIObj.IsNull()) return AIS_DS_None;
934
935 if(myObjects.IsBound(anIObj))
936 return myObjects(anIObj)->GraphicStatus();
937
938 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
939 for(;ItM.More();ItM.Next()){
940 if(ItM.Value()->IsIn(anIObj))
941 return AIS_DS_Temporary;
942 }
943
944 return AIS_DS_None;
945
946}
947
948
949
950
951//=======================================================================
952//function : DisplayedModes
953//purpose :
954//=======================================================================
955
956const TColStd_ListOfInteger& AIS_InteractiveContext::
957DisplayedModes(const Handle(AIS_InteractiveObject)& anIObj) const
958{
959 return myObjects(anIObj)->DisplayedModes();
960}
961
962
963//=======================================================================
964//function : Remove
965//purpose :
966//=======================================================================
967void AIS_InteractiveContext::Remove(const Handle(AIS_InteractiveObject)& anIObj,
968 const Standard_Boolean updateviewer)
969{
970
971 if(anIObj.IsNull()) return;
972
973 if(!HasOpenedContext()){
974 ClearGlobal(anIObj,updateviewer);
975 }
976 else
977 {
978 Standard_Boolean WasInCtx = myLocalContexts(myCurLocalIndex)->Remove(anIObj);
979 AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
980 for (;It.More() ;It.Next()){
981 if(It.Value()->AcceptErase())
982 WasInCtx = It.Value()->Remove(anIObj);
983
984 }
985 // if(!WasInCtx)
986 ClearGlobal(anIObj,updateviewer);
987// else
988// if(updateviewer) myMainVwr->Update();
989 }
990}
991
992//=======================================================================
993//function : RemoveAll
994//purpose :
995//=======================================================================
996void AIS_InteractiveContext::RemoveAll(const Standard_Boolean updateviewer)
997{
998 AIS_ListOfInteractive aList;
999 ObjectsInside(aList);
1000 AIS_ListIteratorOfListOfInteractive aListIterator;
1001 for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
1002 Remove(aListIterator.Value(), Standard_False);
1003 }
1004
1005 if(updateviewer)
1006 myMainVwr->Update();
1007}
1008
1009//=======================================================================
1010//function : Clear
1011//purpose :
1012//=======================================================================
1013
1014void AIS_InteractiveContext::Clear(const Handle(AIS_InteractiveObject)& anIObj,
1015 const Standard_Boolean updateviewer)
1016{
1017 if(anIObj.IsNull()) return;
1018
1019 if(!HasOpenedContext()){
1020 ClearGlobal(anIObj,updateviewer);
1021 }
1022 else
1023 {
1024
1025 Standard_Boolean WasInCtx = myLocalContexts(myCurLocalIndex)->Remove(anIObj);
1026 AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
1027 for (;It.More() ;It.Next()){
1028 if(It.Value()->AcceptErase())
1029 WasInCtx = It.Value()->Remove(anIObj);
1030
1031 }
1032 if(!WasInCtx)
1033 ClearGlobal(anIObj,updateviewer);
1034 else
1035 if(updateviewer) myMainVwr->Update();
1036 }
1037}
1038
1039
1040
1041
1042//=======================================================================
1043//function : ClearPrs
1044//purpose :
1045//=======================================================================
1046
1047void AIS_InteractiveContext::ClearPrs(const Handle(AIS_InteractiveObject)& anIObj,
1048 const Standard_Integer aMode,
1049 const Standard_Boolean updateviewer)
1050{
1051 if(anIObj.IsNull()) return;
1052
1053 if(!HasOpenedContext()){
1054 ClearGlobalPrs(anIObj,aMode,updateviewer);
1055 }
1056 else
1057 {
1058 Standard_Boolean WasInCtx = myLocalContexts(myCurLocalIndex)->ClearPrs(anIObj,aMode);
1059 AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
1060 for (;It.More() ;It.Next()){
1061 if(It.Value()->AcceptErase())
1062 WasInCtx = It.Value()->ClearPrs(anIObj,aMode);
1063 }
1064 if(!WasInCtx)
1065 ClearGlobalPrs(anIObj,aMode,updateviewer);
1066 else
1067 if(updateviewer) myMainVwr->Update();
1068
1069 }
1070}
1071
1072//=======================================================================
1073//function : Hilight
1074//purpose :
1075//=======================================================================
1076
1077void AIS_InteractiveContext::Hilight(const Handle(AIS_InteractiveObject)& anIObj,
1078 const Standard_Boolean updateviewer)
1079{
1080 if(anIObj.IsNull()) return;
1081
1082 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
1083 if (!HasOpenedContext())
1084 {
1085 if(!myObjects.IsBound(anIObj)) return;
1086
1087 // CLE
1088 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1089 // const TColStd_ListOfInteger& LL = STATUS->DisplayedModes();
1090 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1091
1092 // ENDCLE
1093 STATUS->SetHilightStatus (Standard_True);
1094
1095 switch(STATUS->GraphicStatus()){
1096 case AIS_DS_Displayed:
1097 {
1098 Standard_Integer DispMode,HiMode,SelMode;
1099 GetDefModes(anIObj,DispMode,HiMode,SelMode);
1100// if(!STATUS->IsDModeIn(HiMode)){
1101// myMainPM->Display(anIObj,HiMode);
1102// }
1103 myMainPM->Highlight(anIObj,HiMode);
1104 if(updateviewer) myMainVwr->Update();
1105 break;
1106 }
1107 case AIS_DS_Erased:
1108 {
1109 Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1110 myCollectorPM->Highlight(anIObj,HiMode);
1111 if(updateviewer) myCollectorVwr->Update();
1112 break;
1113 }
1114 default:
1115 break;
1116 }
1117 }
1118 else
1119 myLocalContexts(myCurLocalIndex)->Hilight(anIObj);
1120 if(updateviewer) myMainVwr->Update();
1121}
1122//=======================================================================
1123//function : Hilight
1124//purpose :
1125//=======================================================================
1126
1127void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& anIObj,
1128 const Quantity_NameOfColor aCol,
1129 const Standard_Boolean updateviewer)
1130{
1131 if(anIObj.IsNull()) return;
1132
1133 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
1134
1135 if (!HasOpenedContext())
1136 {
1137 if(!myObjects.IsBound(anIObj)) return;
1138
1139 const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1140 STATUS->SetHilightStatus (Standard_True);
1141
1142 switch(STATUS->GraphicStatus()){
1143 case AIS_DS_Displayed:
1144 {
1145 Standard_Integer DispMode,HiMode,SelMode;
1146 GetDefModes(anIObj,DispMode,HiMode,SelMode);
1147// if(!STATUS->IsDModeIn(HiMode)){
1148// myMainPM->Display(anIObj,HiMode);
1149// }
1150 myMainPM->Color(anIObj,aCol,HiMode);
1151 STATUS->SetHilightColor(aCol);
1152 if(updateviewer) myMainVwr->Update();
1153 break;
1154 }
1155 case AIS_DS_Erased:
1156 {
1157 Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1158 myCollectorPM->Color(anIObj,aCol,HiMode);
1159 if(updateviewer) myCollectorVwr->Update();
1160 break;
1161 }
1162 default:
1163 break;
1164 }
1165 }
1166 else
1167 myLocalContexts(myCurLocalIndex)->Hilight(anIObj,aCol);
1168 if(updateviewer) myMainVwr->Update();
1169}
1170
1171//=======================================================================
1172//function : Unhilight
1173//purpose :
1174//=======================================================================
1175
1176void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
1177{
1178 if(anIObj.IsNull()) return;
1179
1180 if (!HasOpenedContext())
1181 {
1182 if(!myObjects.IsBound(anIObj)) return;
1183
1184 const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1185 STATUS->SetHilightStatus (Standard_False);
1186 STATUS->SetHilightColor(Quantity_NOC_WHITE);
1187
1188 switch(STATUS->GraphicStatus()){
1189 case AIS_DS_Displayed:
1190 {
1191 Standard_Integer DispMode,HiMode,SelMode;
1192 GetDefModes(anIObj,DispMode,HiMode,SelMode);
1193 myMainPM->Unhighlight(anIObj,HiMode);
1194// if(!STATUS->IsDModeIn(HiMode))
1195// myMainPM->Erase(anIObj,HiMode);
1196 if(updateviewer) myMainVwr->Update();
1197 break;
1198 }
1199 case AIS_DS_Erased:
1200 {
1201 Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1202 myCollectorPM->Unhighlight(anIObj,HiMode);
1203 if(updateviewer) myCollectorVwr->Update();
1204 break;
1205 }
1206 default:
1207 break;
1208 }
1209 }
1210 else
1211 myLocalContexts(myCurLocalIndex)->Unhilight(anIObj);
1212 if(updateviewer) myMainVwr->Update();
1213}
1214
1215//=======================================================================
1216//function : IsHilighted
1217//purpose :
1218//=======================================================================
1219
1220Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj) const
1221{
1222 if(anIObj.IsNull()) return Standard_False;
1223
1224 if (!HasOpenedContext()){
1225 if(!myObjects.IsBound(anIObj))
1226 return Standard_False;
1227 return myObjects(anIObj)->IsHilighted();
1228 }
1229 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1230 for(;ItM.More();ItM.Next()){
1231 if(ItM.Value()->IsHilighted(anIObj))
1232 return Standard_True;
1233 }
1234 return Standard_False;
1235}
1236
1237Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj,
1238 Standard_Boolean& WithColor,
1239 Quantity_NameOfColor& TheHiCol) const
1240{
1241 if(!HasOpenedContext()){
1242 if(myObjects.IsBound(anIObj)){
1243 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
1244 if(STAT->IsHilighted()){
1245 if(STAT->HilightColor()!=Quantity_NOC_WHITE){
1246 WithColor=Standard_True;
1247 TheHiCol = STAT->HilightColor();
1248 }
1249 else
1250 WithColor = Standard_False;
1251 return Standard_True;
1252 }
1253 }
1254 return Standard_False;
1255 }
1256 Standard_Integer MaxIndex = HighestIndex();
1257 for(Standard_Integer i=MaxIndex;i>=1 ; i--){
1258 if(myLocalContexts.IsBound(i)){
1259 if(myLocalContexts(i)->IsHilighted(anIObj,WithColor,TheHiCol))
1260 return Standard_True;
1261 }
1262
1263 }
1264 return Standard_False;
1265}
1266
1267
1268
1269//=======================================================================
1270//function : IsDisplayed
1271//purpose :
1272//=======================================================================
1273
1274Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj) const
1275{
1276 if(anIObj.IsNull()) return Standard_False;
1277
1278
1279 if(myObjects.IsBound(anIObj))
1280 if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed)
1281 return Standard_True;
1282
1283 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1284 for(;ItM.More();ItM.Next()){
1285 if(ItM.Value()->IsDisplayed(anIObj))
1286 return Standard_True;
1287 }
1288 return Standard_False;
1289
1290}
1291//=======================================================================
1292//function : IsDisplayed
1293//purpose :
1294//=======================================================================
1295
1296Standard_Boolean AIS_InteractiveContext::IsInCollector(const Handle(AIS_InteractiveObject)& anIObj) const
1297{
1298 if(anIObj.IsNull()) return Standard_False;
1299
1300
1301 if(myObjects.IsBound(anIObj))
1302 return (myObjects(anIObj)->GraphicStatus()==AIS_DS_Erased);
1303 return Standard_False;
1304}
1305
1306
1307//=======================================================================
1308//function : IsDisplayed
1309//purpose :
1310//=======================================================================
1311
1312Standard_Boolean AIS_InteractiveContext::
1313IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj,
1314 const Standard_Integer aMode) const
1315{
1316 if(anIObj.IsNull()) return Standard_False;
1317 if(myObjects.IsBound(anIObj)) {
1318 if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed &&
1319 myObjects(anIObj)->IsDModeIn(aMode))
1320 return Standard_True;
1321 }
1322
1323 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1324 for(;ItM.More();ItM.Next()){
1325 if(ItM.Value()->IsDisplayed(anIObj,aMode))
1326 return Standard_True;
1327 }
1328 return Standard_False;
1329}
1330
1331
1332//=======================================================================
1333//function : DisplayPriority
1334//purpose :
1335//=======================================================================
1336
1337Standard_Integer AIS_InteractiveContext::
1338DisplayPriority(const Handle(AIS_InteractiveObject)& anIObj) const
1339{
1340 if(anIObj.IsNull()) return -1;
1341 if(myObjects.IsBound(anIObj)){
1342 // CLE
1343 // const Handle(AIS_GlobalStatus) & STATUS = myObjects(anIObj);
1344 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1345 // ENDCLE
1346 Standard_Integer DM,HM,SM ;
1347 GetDefModes(anIObj,DM,HM,SM);
1348 switch(STATUS->GraphicStatus()){
1349 case AIS_DS_Displayed:
1350 {
1351 return myMainPM->DisplayPriority(anIObj,DM);
1352 break;
1353 }
1354 case AIS_DS_Erased:
1355 return myCollectorPM->DisplayPriority(anIObj,HM);
1356 default:
1357 break;
1358 }
1359 return 0;
1360 }
1361 return 0;
1362}
1363//=======================================================================
1364//function : SetDisplayPriority
1365//purpose :
1366//=======================================================================
1367
1368void AIS_InteractiveContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anIObj,
1369 const Standard_Integer aPriority)
1370{
1371 if(anIObj.IsNull())
1372 return;
1373 if(!anIObj->HasInteractiveContext())
1374 anIObj->SetContext(this);
1375 if(myObjects.IsBound(anIObj)){
1376 // CLE
1377 // const Handle(AIS_GlobalStatus) & STATUS = myObjects(anIObj);
1378 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1379 // ENDCLE
1380 Standard_Integer DM,HM,SM ;
1381 GetDefModes(anIObj,DM,HM,SM);
1382 switch(STATUS->GraphicStatus()){
1383 case AIS_DS_Displayed:
1384 {
1385 myMainPM->SetDisplayPriority(anIObj,DM,aPriority);
1386 break;
1387 }
1388 case AIS_DS_Erased:
1389 {
1390 myCollectorPM->SetDisplayPriority(anIObj,HM,aPriority);
1391 break;
1392 }
1393 default:
1394 break;
1395 }
1396 }
1397 else if (HasOpenedContext())
1398 {myLocalContexts(myCurLocalIndex)->SetDisplayPriority(anIObj,aPriority);}
1399}
1400
1401//=======================================================================
1402//function : Redisplay
1403//purpose :
1404//=======================================================================
1405
1406void AIS_InteractiveContext::Redisplay(const Handle(AIS_InteractiveObject)& anIObj,
1407 const Standard_Boolean updateviewer,
1408 const Standard_Boolean allmodes)
1409{
1410 if(AISDebugModeOn()){
1411 cout<<"===>AIS_InteractiveContext::Redisplay de :";
1412 cout<<anIObj->DynamicType()->Name()<<endl;
1413 }
1414
1415 RecomputePrsOnly(anIObj,updateviewer,allmodes);
1416 RecomputeSelectionOnly(anIObj);
1417}
1418
1419//=======================================================================
1420//function : Redisplay
1421//purpose :
1422//=======================================================================
1423
1424void AIS_InteractiveContext::Redisplay(const AIS_KindOfInteractive KOI,
1425 const Standard_Integer /*Sign*/,
1426 const Standard_Boolean updateviewer)
1427{
1428 Standard_Boolean found_viewer(Standard_False),found_coll(Standard_False);
1429 // update
1430 for(AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);It.More();It.Next()){
1431 // CLE
1432 // const Handle(AIS_InteractiveObject)& IO = It.Key();
1433 Handle(AIS_InteractiveObject) IO = It.Key();
1434 // ENDCLE
1435 if(IO->Type()== KOI){
1436#ifdef DEB
1437// Standard_Boolean good = (Sign==-1)? Standard_True :
1438// ((IO->Signature()==Sign)? Standard_True:Standard_False);
1439#endif
1440 Redisplay(IO,Standard_False);
1441 switch(It.Value()->GraphicStatus()){
1442 case AIS_DS_Displayed:
1443 found_viewer = Standard_True;
1444 break;
1445 case AIS_DS_Erased:
1446 found_coll = Standard_True;
1447 break;
1448 default:
1449 break;
1450 }
1451 }
1452 }
1453 // update viewer...
1454 if(updateviewer){
1455 if(found_viewer)
1456 myMainVwr->Update();
1457 if(found_coll)
1458 myCollectorVwr->Update();
1459 }
1460}
1461
1462
1463//=======================================================================
1464//function : RecomputePrsOnly
1465//purpose :
1466//=======================================================================
1467
1468void AIS_InteractiveContext::RecomputePrsOnly(const Handle(AIS_InteractiveObject)& anIObj,
1469 const Standard_Boolean updateviewer,
1470 const Standard_Boolean allmodes)
1471{
1472 if(anIObj.IsNull()) return;
1473 anIObj->Update(allmodes);
1474
1475 if(updateviewer) {
1476 if(HasOpenedContext())
1477 myMainVwr->Update();
1478 else{
1479 if(myObjects.IsBound(anIObj)){
1480 switch(myObjects(anIObj)->GraphicStatus()){
1481 case AIS_DS_Displayed:
1482 myMainVwr->Update();
1483 break;
1484 case AIS_DS_Erased:
1485 {
1486 if(!myCollectorVwr.IsNull())
1487 myCollectorVwr->Update();
1488 }
1489 default:
1490 break;
1491 }
1492 }
1493 }
1494 }
1495}
1496//=======================================================================
1497//function : RecomputeSelectionOnly
1498//purpose :
1499//=======================================================================
1500void AIS_InteractiveContext::RecomputeSelectionOnly(const Handle(AIS_InteractiveObject)& anIObj)
1501{
1502 if(anIObj.IsNull()) return;
1503 mgrSelector->RecomputeSelection(anIObj);
1504
1505
0d969553 1506
7fd59977 1507 TColStd_ListOfInteger LI;
1508 TColStd_ListIteratorOfListOfInteger Lit;
1509 ActivatedModes(anIObj,LI);
1510 if(!HasOpenedContext()){
1511 if(!myObjects.IsBound(anIObj)) return;
1512 switch(myObjects(anIObj)->GraphicStatus())
1513 {
1514 case AIS_DS_Displayed:
1515 {
1516 for(Lit.Initialize(LI);Lit.More();Lit.Next())
1517 mgrSelector->Activate(anIObj,Lit.Value(),myMainSel);
1518 break;
1519 }
1520 case AIS_DS_Erased:
1521 {
1522 for(Lit.Initialize(LI);Lit.More();Lit.Next())
1523 mgrSelector->Activate(anIObj,Lit.Value(),myCollectorSel);
1524
1525 break;
1526 }
1527 default:
1528 break;
1529 }
1530 }
1531}
1532
1533//=======================================================================
1534//function : Update
1535//purpose :
1536//=======================================================================
1537
1538void AIS_InteractiveContext::Update(const Handle(AIS_InteractiveObject)& anIObj,
1539 const Standard_Boolean updateviewer)
1540{
1541 if(anIObj.IsNull()) return;
1542
1543
1544
1545 TColStd_ListOfInteger LL;
1546 anIObj->ToBeUpdated(LL);
1547 TColStd_ListIteratorOfListOfInteger ITI(LL);
1548 Standard_Boolean wasupdated(Standard_False);
1549
1550 for (;ITI.More();ITI.Next()){
1551 anIObj->Update(ITI.Value(),Standard_False);
1552 wasupdated = Standard_True;
1553 }
1554
1555 if(wasupdated)
1556 mgrSelector->Update(anIObj);
1557
1558 if(updateviewer){
1559 if(!myObjects.IsBound(anIObj)) return;
1560 switch(myObjects(anIObj)->GraphicStatus()){
1561 case AIS_DS_Displayed:
1562 case AIS_DS_Temporary:
1563 myMainVwr->Update();
1564 break;
1565 case AIS_DS_Erased:
1566 myCollectorVwr->Update();
1567 break;
1568 default:
1569 break;
1570 }
1571 }
1572}
1573
1574
1575
1576//=======================================================================
1577//function : SetLocation
1578//purpose :
1579//=======================================================================
1580
1581void AIS_InteractiveContext::SetLocation(const Handle(AIS_InteractiveObject)& anIObj,
1582 const TopLoc_Location& aLoc)
1583{
1584 if(anIObj.IsNull()) return;
1585
1586
1587 if(anIObj->HasLocation() && aLoc.IsIdentity()){
1588 anIObj->ResetLocation();
1589 mgrSelector->Update(anIObj,Standard_False);
1590 return;
1591 }
1592 if(aLoc.IsIdentity()) return ;
1593
0d969553 1594 // first reset the previous location to properly clean everything...
7fd59977 1595 if(anIObj->HasLocation())
1596 anIObj->ResetLocation();
1597
1598
1599 anIObj->SetLocation(aLoc);
1600
1601 if(!HasOpenedContext())
1602 mgrSelector->Update(anIObj,Standard_False);
1603 else
1604 {
1605 // CLE
1606 // const Handle(StdSelect_ViewerSelector3d)& tempSel = myLocalContexts(myCurLocalIndex)->MainSelector();
1607 Handle(StdSelect_ViewerSelector3d) tempSel = myLocalContexts(myCurLocalIndex)->MainSelector();
1608 // ENDCLE
1609 mgrSelector->Update(anIObj,tempSel,Standard_False);
1610 }
1611}
1612//=======================================================================
1613//function : ResetLocation
1614//purpose :
1615//=======================================================================
1616void AIS_InteractiveContext::ResetLocation(const Handle(AIS_InteractiveObject)& anIObj)
1617{
1618 if(anIObj.IsNull()) return;
1619
1620 anIObj->ResetLocation();
1621 mgrSelector->Update(anIObj,Standard_False);
1622}
1623
1624//=======================================================================
1625//function : HasLocation
1626//purpose :
1627//=======================================================================
1628
1629Standard_Boolean AIS_InteractiveContext::
1630HasLocation(const Handle(AIS_InteractiveObject)& anIObj) const
1631{
1632 if(anIObj.IsNull()) return Standard_False;
1633
1634 return anIObj->HasLocation();
1635}
1636
1637const TopLoc_Location& AIS_InteractiveContext::
1638Location(const Handle(AIS_InteractiveObject)& anIObj) const
1639{
1640 return anIObj->Location();
1641}
1642
1643//=======================================================================
1644//function : SetDeviationCoefficient
1645//purpose :
1646//=======================================================================
1647
1648void AIS_InteractiveContext::SetDeviationCoefficient(const Standard_Real aCoefficient)
1649{
1650 myDefaultDrawer->SetDeviationCoefficient(aCoefficient);
1651}
1652//=======================================================================
1653//function : SetDeviationAngle
1654//purpose :
1655//=======================================================================
1656
1657void AIS_InteractiveContext::SetDeviationAngle(const Standard_Real anAngle)
1658{
1659 myDefaultDrawer->SetDeviationCoefficient(anAngle);
1660}
1661
1662//=======================================================================
1663//function : DeviationAngle
1664//purpose : Gets deviationAngle
1665//=======================================================================
1666
1667Standard_Real AIS_InteractiveContext::DeviationAngle() const
1668{
c6541a0c 1669 return M_PI/180.0e0 ;
7fd59977 1670 // return myDefaultDrawer->DeviationAngle();
1671}
1672
1673//=======================================================================
1674//function : DeviationCoefficient
1675//purpose :
1676//=======================================================================
1677
1678Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
1679{
1680 return myDefaultDrawer->DeviationCoefficient();
1681}
1682//=======================================================================
1683//function : SetHLRDeviationCoefficient
1684//purpose :
1685//=======================================================================
1686
1687void AIS_InteractiveContext::SetHLRDeviationCoefficient(const Standard_Real aCoefficient)
1688{
1689 myDefaultDrawer->SetHLRDeviationCoefficient(aCoefficient);
1690}
1691
1692//=======================================================================
1693//function : HLRDeviationCoefficient
1694//purpose :
1695//=======================================================================
1696
1697Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const
1698{
1699 return myDefaultDrawer->HLRDeviationCoefficient();
1700}
1701
1702//=======================================================================
1703//function : SetHLRAngle
1704//purpose :
1705//=======================================================================
1706
1707void AIS_InteractiveContext::SetHLRAngle(const Standard_Real anAngle)
1708{
1709 myDefaultDrawer->SetHLRAngle(anAngle);
1710}
1711
1712//=======================================================================
1713//function : SetHLRAngleAndDeviation
1714//purpose : compute with anangle a HLRAngle and a HLRDeviationCoefficient
1715// and set them in myHLRAngle and in myHLRDeviationCoefficient
1716// of myDefaultDrawer
1717//=======================================================================
1718
1719void AIS_InteractiveContext::SetHLRAngleAndDeviation(const Standard_Real anAngle)
1720{
1721
1722 Standard_Real OutAngl,OutDefl;
1723 HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1724
1725 myDefaultDrawer->SetHLRAngle(OutAngl);
1726 myDefaultDrawer->SetHLRDeviationCoefficient(OutDefl);
1727
1728}
1729
1730//=======================================================================
1731//function : HLRAngle
1732//purpose :
1733//=======================================================================
1734
1735Standard_Real AIS_InteractiveContext::HLRAngle() const
1736{
1737 return myDefaultDrawer->HLRAngle();
1738}
1739
1740//=======================================================================
1741//function : SetDisplayMode
1742//purpose :
1743//=======================================================================
1744
1745void AIS_InteractiveContext::SetDisplayMode(const AIS_DisplayMode aMode,
1746 const Standard_Boolean updateviewer)
1747{
1748 if(aMode==myDisplayMode) return;
1749 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
1750
1751 for(;It.More();It.Next()){
1752 // CLE
1753 // const Handle(AIS_InteractiveObject)& anObj = It.Key();
1754 Handle(AIS_InteractiveObject) anObj = It.Key();
1755 // ENDCLE
1756 Standard_Boolean Processed = (anObj->IsKind(STANDARD_TYPE(AIS_Shape)) ||
1757 anObj->IsKind(STANDARD_TYPE(AIS_ConnectedShape)) ||
1758 anObj->IsKind(STANDARD_TYPE(AIS_MultipleConnectedShape)) );
1759
1760 if ((!anObj->HasDisplayMode()) && Processed)
1761 {
1762 if(anObj->AcceptDisplayMode(aMode)){
1763 // CLE
1764 // const Handle(AIS_GlobalStatus)& STATUS = It.Value();
1765 Handle(AIS_GlobalStatus) STATUS = It.Value();
1766 // ENDCLE
1767 if(STATUS->IsDModeIn(myDisplayMode))
1768 STATUS->RemoveDisplayMode(myDisplayMode);
1769
1770 STATUS->AddDisplayMode(aMode);
1771
1772 if(STATUS->GraphicStatus()== AIS_DS_Displayed){
1773 myMainPM->Erase(anObj, myDisplayMode);
1774 myMainPM->Display(anObj, aMode);
1775 if(STATUS->IsSubIntensityOn())
1776 myMainPM->Color(anObj,mySubIntensity,aMode);
1777 }
1778 // myDisplayMode = aMode;
1779 }
1780 }
1781
1782 }
1783 myDisplayMode = aMode;
1784 if(updateviewer) myMainVwr->Update();
1785}
1786
1787//=======================================================================
1788//function : SetDisplayMode
1789//purpose :
1790//=======================================================================
1791
1792void AIS_InteractiveContext::SetDisplayMode(const Handle(AIS_InteractiveObject)& anIObj,
1793 const Standard_Integer aMode,
1794 const Standard_Boolean updateviewer)
1795{
1796
1797 if(!anIObj->HasInteractiveContext())
1798 anIObj->SetContext(this);
1799 if(!HasOpenedContext()){
1800
1801 if(!myObjects.IsBound(anIObj))
1802 anIObj->SetDisplayMode(aMode);
1803#ifdef BUC60632
1804 else if( anIObj->AcceptDisplayMode(aMode) )
1805#else
1806 else
1807#endif
1808 {
1809 // CLE
1810 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1811 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1812 // ENDCLE
1813#ifndef OCC4373
81bba717 1814 // the interactive object has no mode : OldMode = Mode Session
1815 // already has a mode : OldMode = old mode Propre
7fd59977 1816
1817 Standard_Integer OldMode = anIObj->HasDisplayMode() ? anIObj->DisplayMode(): myDisplayMode;
1818
1819 if(STATUS->IsDModeIn(OldMode))
1820 STATUS->RemoveDisplayMode(OldMode);
1821 STATUS->AddDisplayMode(aMode);
1822
1823 if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1824 if(aMode!=OldMode ){
1825 if(myMainPM->IsHighlighted(anIObj,OldMode))
1826 myMainPM->Unhighlight(anIObj,OldMode);
1827
1828 myMainPM->Erase(anIObj,OldMode);
1829#else
1830 // SAN : erase presentations for all display modes different from <aMode>
1831 if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1832 TColStd_ListOfInteger aModesToRemove;
e33e7e78
RK
1833 TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
1834 for(;ItL.More();ItL.Next()){
7fd59977 1835
1836 Standard_Integer OldMode = ItL.Value();
1837
1838 if(OldMode!=aMode){
1839 aModesToRemove.Append(OldMode);
1840 if(myMainPM->IsHighlighted(anIObj,OldMode))
1841 myMainPM->Unhighlight(anIObj,OldMode);
1842 myMainPM->Erase(anIObj,OldMode);
1843 }
1844 }
1845
1846 for(ItL.Initialize(aModesToRemove);ItL.More();ItL.Next())
1847 STATUS->RemoveDisplayMode(ItL.Value());
1848
1849 if(!STATUS->IsDModeIn(aMode))
1850 STATUS->AddDisplayMode(aMode);
1851#endif
1852
1853 myMainPM->Display(anIObj,aMode);
1854 Standard_Integer DM,HM,SM;
1855 GetDefModes(anIObj,DM,HM,SM);
1856 if(STATUS->IsHilighted()){
1857 myMainPM->Highlight(anIObj,HM);
1858 }
1859 if(STATUS->IsSubIntensityOn()){
1860 myMainPM->Color(anIObj,mySubIntensity,aMode);
1861 }
1862 if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
1863 myMainVwr->Viewer()->SetTransparency(Standard_True);
1864
1865 if(updateviewer) myMainVwr->Update();
1866#ifndef OCC4373
1867 }
1868#endif
1869 }
1870 anIObj->SetDisplayMode(aMode);
1871 }
1872 }
1873}
1874
1875//=======================================================================
1876//function : UnsetDisplayMode
1877//purpose :
1878//=======================================================================
1879
1880void AIS_InteractiveContext::
1881UnsetDisplayMode(const Handle(AIS_InteractiveObject)& anIObj,
1882 const Standard_Boolean updateviewer)
1883{
1884 if(anIObj.IsNull()) return ;
1885 if(!anIObj->HasDisplayMode()) return;
1886
1887 if(!myObjects.IsBound(anIObj))
1888 anIObj->UnsetDisplayMode();
1889 else
1890 {
1891 Standard_Integer OldMode = anIObj->DisplayMode();
1892 if(myDisplayMode==OldMode) return;
1893 const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1894 STATUS->RemoveDisplayMode(OldMode);
1895 if(!STATUS->IsDModeIn(myDisplayMode))
1896 STATUS->AddDisplayMode(myDisplayMode);
1897 if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1898 if(myMainPM->IsHighlighted(anIObj,OldMode))
1899 myMainPM->Unhighlight(anIObj,OldMode);
1900 myMainPM->Erase(anIObj,OldMode);
1901 myMainPM->Display(anIObj,myDisplayMode);
1902 Standard_Integer DM,HM,SM;
1903 GetDefModes(anIObj,DM,HM,SM);
1904 if(STATUS->IsHilighted()){
1905 myMainPM->Highlight(anIObj,HM);
1906 }
1907 if(STATUS->IsSubIntensityOn()){
1908 myMainPM->Color(anIObj,mySubIntensity,myDisplayMode);
1909 }
1910 if(updateviewer) myMainVwr->Update();
1911 }
1912 anIObj->UnsetDisplayMode();
1913
1914 }
1915}
1916
1917//=======================================================================
1918//function : SetCurrentFacingModel
1919//purpose :
1920//=======================================================================
1921
1922#ifdef GER61351
1923void AIS_InteractiveContext::SetCurrentFacingModel(
1924 const Handle(AIS_InteractiveObject)& anIObj,
1925 const Aspect_TypeOfFacingModel aModel) {
1926 if ( !anIObj.IsNull () ) {
1927 anIObj->SetCurrentFacingModel(aModel);
1928 }
1929}
1930#endif
1931
1932//=======================================================================
1933//function : SetColor
1934//purpose :
1935//=======================================================================
1936
1937void AIS_InteractiveContext::SetColor(const Handle(AIS_InteractiveObject)& anIObj,
1938 const Quantity_NameOfColor aColor,
1939 const Standard_Boolean updateviewer)
1940#ifdef GER61351
1941{
1942 SetColor(anIObj,Quantity_Color(aColor),updateviewer);
1943}
1944
1945void AIS_InteractiveContext::SetColor(const Handle(AIS_InteractiveObject)& anIObj,
1946 const Quantity_Color &aColor,
1947 const Standard_Boolean updateviewer)
1948#endif
1949{
1950 if(anIObj.IsNull()) return ;
1951
1952 if(!anIObj->HasInteractiveContext())
1953 anIObj->SetContext(this);
1954 anIObj->SetColor(aColor);
1955 if(anIObj->RecomputeEveryPrs())
1956 anIObj->Redisplay();
1957 else
1958 {
1959 Standard_Integer NbDisp=0;
1960 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
1961 for (;ITI.More();ITI.Next())
1962 {
1963 anIObj->Update(ITI.Value(),Standard_False);
1964 NbDisp++;
1965 }
1966 anIObj->SetRecomputeOk();
1967#ifdef DEB
0d969553 1968 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 1969#endif
1970 }
1971
1972
1973#ifdef DEB
1974// // pour isg
1975// if(anIObj->Type()==AIS_KOI_Datum && anIObj->Signature()==3){
1976// Handle(AIS_Trihedron) Tr = *((Handle(AIS_Trihedron)*)&anIObj);
1977// Standard_Real Lx = myDefaultDrawer->DatumAspect()->FirstAxisLength();
1978// gp_Trsf T;
1979// gp_Dir D =Tr->Component()->XDirection();
1980// gp_Pnt O = Tr->Component()->Location();
1981// gp_Vec V(D);V*=Lx/5.;
c6541a0c 1982// T.SetRotation(gp_Ax1(O,D),M_PI/6.);
7fd59977 1983// T.SetTranslationPart(V);
1984// TopLoc_Location L,IncLoc(T);
1985
1986// for(Standard_Integer I=1;I<90;I++){
1987// if(anIObj->HasLocation())
1988// L = anIObj->Location() * IncLoc;
1989// else
1990// L = IncLoc;
1991// SetLocation(anIObj,L);
1992// UpdateCurrentViewer();
1993// }
1994// for(I=1;I<90;I++){
1995// L = anIObj->Location() /IncLoc;
1996// SetLocation(anIObj,L);
1997// UpdateCurrentViewer();
1998// }
1999// ResetLocation(anIObj);
2000// }
2001 #endif
2002 if(updateviewer) UpdateCurrentViewer();
2003}
2004
2005//=======================================================================
2006//function : SetDeviationCoefficient
2007//purpose :
2008//=======================================================================
2009
2010void AIS_InteractiveContext::SetDeviationCoefficient(
2011 const Handle(AIS_InteractiveObject)& anIObj,
2012 const Standard_Real aCoefficient,
2013 const Standard_Boolean updateviewer)
2014{
2015// cout<<" Coefficient:"<< aCoefficient <<endl;
2016 if(anIObj.IsNull()) return ;
2017
2018 if(!anIObj->HasInteractiveContext())
2019 anIObj->SetContext(this);
2020
81bba717 2021 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2022 if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
2023 if(anIObj->Signature()!=0) return;
2024 (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationCoefficient(aCoefficient);
2025
2026
2027
2028 if(anIObj->RecomputeEveryPrs())
2029 anIObj->Redisplay();
2030 else
2031 {
2032 Standard_Integer NbDisp=0;
2033 TColStd_ListOfInteger LL;
2034 anIObj->ToBeUpdated(LL);
2035 TColStd_ListIteratorOfListOfInteger ITI(LL);
2036 for (;ITI.More();ITI.Next())
2037 {
2038 anIObj->Update(ITI.Value(),Standard_False);
2039 NbDisp++;
2040 }
2041 anIObj->SetRecomputeOk();
2042#ifdef DEB
0d969553 2043 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2044#endif
2045 }
2046 if(updateviewer) UpdateCurrentViewer();
2047}
2048
2049//=======================================================================
2050//function : SetHLRDeviationCoefficient
2051//purpose :
2052//=======================================================================
2053
2054void AIS_InteractiveContext::SetHLRDeviationCoefficient(
2055 const Handle(AIS_InteractiveObject)& anIObj,
2056 const Standard_Real aCoefficient,
2057 const Standard_Boolean updateviewer)
2058{
2059// cout<<" HLRCoefficient:"<< aCoefficient <<endl;
2060 if(anIObj.IsNull()) return ;
2061
2062 if(!anIObj->HasInteractiveContext())
2063 anIObj->SetContext(this);
81bba717 2064 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2065 if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
2066 if(anIObj->Signature()!=0) return;
2067 (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationCoefficient(aCoefficient);
2068
2069
2070
2071 if(anIObj->RecomputeEveryPrs())
2072 anIObj->Redisplay();
2073 else
2074 {
2075 Standard_Integer NbDisp=0;
2076
2077 TColStd_ListOfInteger LL;
2078 anIObj->ToBeUpdated(LL);
2079 TColStd_ListIteratorOfListOfInteger ITI(LL);
2080 for (;ITI.More();ITI.Next())
2081 {
2082 anIObj->Update(ITI.Value(),Standard_False);
2083 NbDisp++;
2084 }
2085 anIObj->SetRecomputeOk();
2086#ifdef DEB
0d969553 2087 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2088#endif
2089 }
2090 if(updateviewer) UpdateCurrentViewer();
2091}
2092
2093
2094//=======================================================================
2095//function : SetDeviationAngle
2096//purpose :
2097//=======================================================================
2098
2099void AIS_InteractiveContext::SetDeviationAngle(
2100 const Handle(AIS_InteractiveObject)& anIObj,
2101 const Standard_Real anAngle,
2102 const Standard_Boolean updateviewer)
2103{
2104// cout<<" Angle:"<< anAngle <<endl;
2105 if(anIObj.IsNull()) return ;
2106
2107 if(!anIObj->HasInteractiveContext())
2108 anIObj->SetContext(this);
e33e7e78 2109 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2110 if(anIObj->Type()!=AIS_KOI_Shape) return;
2111 if(anIObj->Signature()!=0) return;
2112 (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationAngle(anAngle);
2113
2114
2115 if(anIObj->RecomputeEveryPrs())
2116 anIObj->Redisplay();
2117 else
2118 {
2119 Standard_Integer NbDisp=0;
2120 TColStd_ListOfInteger LL;
2121 anIObj->ToBeUpdated(LL);
2122 TColStd_ListIteratorOfListOfInteger ITI(LL);
2123 for (;ITI.More();ITI.Next())
2124 {
2125 anIObj->Update(ITI.Value(),Standard_False);
2126 NbDisp++;
2127 }
2128 anIObj->SetRecomputeOk();
2129#ifdef DEB
0d969553 2130 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2131#endif
2132 }
2133 if(updateviewer) UpdateCurrentViewer();
2134}
2135//=======================================================================
2136//function : SetDeviationAngle
2137//purpose :
2138//=======================================================================
2139
2140void AIS_InteractiveContext::SetAngleAndDeviation(
2141 const Handle(AIS_InteractiveObject)& anIObj,
2142 const Standard_Real anAngle,
2143 const Standard_Boolean updateviewer)
2144{
2145// cout<<" Angle:"<< anAngle <<endl;
2146 if(anIObj.IsNull()) return ;
c6541a0c 2147// Standard_Real anAngleRad = M_PI*anAngle/180; test rob...
7fd59977 2148 if(!anIObj->HasInteractiveContext())
2149 anIObj->SetContext(this);
2150
e33e7e78 2151 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2152 if(anIObj->Type()!=AIS_KOI_Shape) return;
2153 if(anIObj->Signature()!=0) return;
2154 (*((Handle(AIS_Shape)*)&anIObj))->SetAngleAndDeviation(anAngle);
2155
2156
2157 if(anIObj->RecomputeEveryPrs())
2158 anIObj->Redisplay();
2159 else
2160 Update(anIObj,updateviewer);
2161}
2162
2163//=======================================================================
2164//function : SetDeviationAngle
2165//purpose :
2166//=======================================================================
2167
2168void AIS_InteractiveContext::SetHLRAngleAndDeviation(
2169 const Handle(AIS_InteractiveObject)& anIObj,
2170 const Standard_Real anAngle,
2171 const Standard_Boolean updateviewer)
2172{
2173// cout<<" Angle:"<< anAngle <<endl;
2174
2175 if(anIObj.IsNull()) return ;
2176 if(!anIObj->HasInteractiveContext())
2177 anIObj->SetContext(this);
2178
e33e7e78 2179 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2180 if(anIObj->Type()!=AIS_KOI_Shape) return;
2181 if(anIObj->Signature()!=0) return;
2182 (*((Handle(AIS_Shape)*)&anIObj))->SetHLRAngleAndDeviation(anAngle);
2183
2184
2185 if(anIObj->RecomputeEveryPrs())
2186 anIObj->Redisplay();
2187 else
2188 {
2189 Standard_Integer NbDisp=0;
2190
2191 TColStd_ListOfInteger LL;
2192 anIObj->ToBeUpdated(LL);
2193 TColStd_ListIteratorOfListOfInteger ITI(LL);
2194 for (;ITI.More();ITI.Next())
2195 {
2196 anIObj->Update(ITI.Value(),Standard_False);
2197 NbDisp++;
2198 }
2199 anIObj->SetRecomputeOk();
2200#ifdef DEB
0d969553 2201 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2202#endif
2203 }
2204 if(updateviewer) UpdateCurrentViewer();
2205}
2206
2207//=======================================================================
2208//function : SetHLRDeviationAngle
2209//purpose :
2210//=======================================================================
2211
2212void AIS_InteractiveContext::SetHLRDeviationAngle(
2213 const Handle(AIS_InteractiveObject)& anIObj,
2214 const Standard_Real anAngle,
2215 const Standard_Boolean updateviewer)
2216{
2217// cout<<" HLRAngle:"<< anAngle <<endl;
2218 if(anIObj.IsNull()) return ;
2219
2220 if(!anIObj->HasInteractiveContext())
2221 anIObj->SetContext(this);
e33e7e78 2222 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
7fd59977 2223 if( anIObj->Type()!=AIS_KOI_Shape) return;
2224 if(anIObj->Signature()!=0) return;
2225 (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationAngle(anAngle);
2226
2227
2228 if(anIObj->RecomputeEveryPrs())
2229 anIObj->Redisplay();
2230 else
2231 {
2232 Standard_Integer NbDisp=0;
2233 TColStd_ListOfInteger LL;
2234 anIObj->ToBeUpdated(LL);
2235 TColStd_ListIteratorOfListOfInteger ITI(LL);
2236 for (;ITI.More();ITI.Next())
2237 {
2238 anIObj->Update(ITI.Value(),Standard_False);
2239 NbDisp++;
2240 }
2241 anIObj->SetRecomputeOk();
2242#ifdef DEB
0d969553 2243 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2244#endif
2245 }
2246 if(updateviewer) UpdateCurrentViewer();
2247}
2248
2249//=======================================================================
2250//function : UnsetColor
2251//purpose :
2252//=======================================================================
2253
2254void AIS_InteractiveContext::UnsetColor(const Handle(AIS_InteractiveObject)& anIObj,
2255 const Standard_Boolean updateviewer)
2256{
2257 if(anIObj.IsNull()) return ;
2258 anIObj->UnsetColor();
2259 if(anIObj->RecomputeEveryPrs())
2260 anIObj->Redisplay();
2261 else
2262 {
2263 Standard_Integer NbDisp =0;
2264 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2265 for (;ITI.More();ITI.Next())
2266 {
2267 anIObj->Update(ITI.Value(),Standard_False);
2268 NbDisp++;
2269 }
2270#ifdef DEB
0d969553 2271 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2272#endif
2273 anIObj->SetRecomputeOk();
2274 }
2275 if(updateviewer)
2276 UpdateCurrentViewer();
2277}
2278
2279//=======================================================================
2280//function : HasColor
2281//purpose :
2282//=======================================================================
2283
2284Standard_Boolean AIS_InteractiveContext::HasColor(const Handle(AIS_InteractiveObject)& anIObj) const
2285{
2286 return anIObj->HasColor();
2287
2288}
2289
2290//=======================================================================
2291//function : Color
2292//purpose :
2293//=======================================================================
2294
2295Quantity_NameOfColor AIS_InteractiveContext::Color(const Handle(AIS_InteractiveObject)& anIObj) const
2296{
2297 return anIObj->Color();
2298}
2299
2300#ifdef GER61351
2301void AIS_InteractiveContext::Color(const Handle(AIS_InteractiveObject)& anIObj,
2302 Quantity_Color &aColor) const
2303{
2304 anIObj->Color(aColor);
2305}
2306#endif
2307
2308//=======================================================================
2309//function : Width
2310//purpose :
2311//=======================================================================
2312
2313Standard_Real AIS_InteractiveContext::Width(const Handle(AIS_InteractiveObject)& anIObj) const
2314{
2315 return anIObj->Width();
2316}
2317
2318//=======================================================================
2319//function : SetWidth
2320//purpose :
2321//=======================================================================
2322
2323void AIS_InteractiveContext::SetWidth(const Handle(AIS_InteractiveObject)& anIObj,
2324 const Standard_Real aValue,
2325 const Standard_Boolean updateviewer)
2326{
2327 if(anIObj.IsNull()) return ;
2328
2329 if(!anIObj->HasInteractiveContext())
2330 anIObj->SetContext(this);
2331 anIObj->SetWidth(aValue);
2332 if(anIObj->RecomputeEveryPrs())
2333 anIObj->Redisplay();
2334 else
2335 {
2336 Standard_Integer NbDisp=0;
2337 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2338 for (;ITI.More();ITI.Next())
2339 {
2340 anIObj->Update(ITI.Value(),Standard_False);
2341 NbDisp++;
2342 }
2343#ifdef DEB
0d969553 2344 cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
7fd59977 2345#endif
2346 anIObj->SetRecomputeOk();
2347 }
2348 if(updateviewer)
2349 UpdateCurrentViewer();
2350}
2351
2352//=======================================================================
2353//function : UnsetWidth
2354//purpose :
2355//=======================================================================
2356
2357void AIS_InteractiveContext::UnsetWidth(const Handle(AIS_InteractiveObject)& anIObj,
2358 const Standard_Boolean updateviewer)
2359{
2360 if(anIObj.IsNull()) return ;
2361 anIObj->UnsetWidth();
2362 if(anIObj->RecomputeEveryPrs())
2363 anIObj->Redisplay();
2364 else
2365 {
2366 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2367 for (;ITI.More();ITI.Next())
2368 {
2369 anIObj->Update(ITI.Value(),Standard_False);
2370 }
2371 anIObj->SetRecomputeOk();
2372 }
2373 if(updateviewer)
2374 UpdateCurrentViewer();
2375}
2376
2377//=======================================================================
2378//function : SetMaterial
2379//purpose :
2380//=======================================================================
2381
2382void AIS_InteractiveContext::SetMaterial(const Handle(AIS_InteractiveObject)& anIObj,
2383//POP pour K4L
2384 const Graphic3d_NameOfMaterial aName,
2385// const Graphic3d_NameOfPhysicalMaterial aName,
2386 const Standard_Boolean updateviewer)
2387{
2388 if(!anIObj->HasInteractiveContext())
2389 anIObj->SetContext(this);
2390 anIObj->SetMaterial(aName);
2391 if(anIObj->RecomputeEveryPrs())
2392 anIObj->Redisplay();
2393 else
2394 {
2395 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2396 for (;ITI.More();ITI.Next())
2397 {
2398 anIObj->Update(ITI.Value(),Standard_False);
2399 }
2400 anIObj->SetRecomputeOk();
2401 }
2402 if(updateviewer)
2403 UpdateCurrentViewer();
2404
2405}
2406
2407//=======================================================================
2408//function : UnsetMaterial
2409//purpose :
2410//=======================================================================
2411
2412void AIS_InteractiveContext::UnsetMaterial(const Handle(AIS_InteractiveObject)& anIObj,
2413 const Standard_Boolean updateviewer)
2414{
2415 if(anIObj.IsNull()) return ;
2416 anIObj->UnsetMaterial();
2417 if(anIObj->RecomputeEveryPrs())
2418 anIObj->Redisplay();
2419 else
2420 {
2421 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2422 for (;ITI.More();ITI.Next())
2423 {
2424 anIObj->Update(ITI.Value(),Standard_False);
2425 }
2426 anIObj->SetRecomputeOk();
2427 }
2428 if(updateviewer)
2429 UpdateCurrentViewer();
2430}
2431
2432//=======================================================================
2433//function : SetTransparency
2434//purpose :
2435//=======================================================================
2436
2437void AIS_InteractiveContext::SetTransparency(const Handle(AIS_InteractiveObject)& anIObj,
2438 const Standard_Real aValue,
2439 const Standard_Boolean updateviewer)
2440{
2441 if(anIObj.IsNull()) return ;
2442 if(!anIObj->HasInteractiveContext())
2443 anIObj->SetContext(this);
2444
2445#ifdef BUC60577 //right optimization
2446 if(!anIObj->IsTransparent() && aValue<=0.05) return;
2447#else
2448// if(!anIObj->IsTransparent() && aValue<=0.05) return;
2449#endif
2450 if(aValue<=0.05){
2451 UnsetTransparency(anIObj,updateviewer);
2452 return;
2453 }
2454
2455 if(!myMainVwr->Viewer()->Transparency())
2456 myMainVwr->Viewer()->SetTransparency(Standard_True);
2457 anIObj->SetTransparency(aValue);
2458 if(anIObj->RecomputeEveryPrs())
2459 anIObj->Redisplay();
2460 else
2461 {
2462 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2463 for (;ITI.More();ITI.Next())
2464 {
2465 anIObj->Update(ITI.Value(),Standard_False);
2466 }
2467 anIObj->SetRecomputeOk();
2468 }
2469 if(updateviewer)
2470 UpdateCurrentViewer();
2471}
2472
2473//=======================================================================
2474//function : UnsetTransparency
2475//purpose :
2476//=======================================================================
2477
2478void AIS_InteractiveContext::UnsetTransparency(const Handle(AIS_InteractiveObject)& anIObj,
2479 const Standard_Boolean updateviewer)
2480{
2481 if(anIObj.IsNull()) return ;
2482 anIObj->UnsetTransparency();
2483 if(anIObj->RecomputeEveryPrs())
2484 anIObj->Redisplay();
2485 else
2486 {
2487 TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2488 for (;ITI.More();ITI.Next())
2489 {
2490 anIObj->Update(ITI.Value(),Standard_False);
2491 }
2492 anIObj->SetRecomputeOk();
2493 }
2494
2495 // To Unset transparency in the viewer, if no other object is transparent ...(Speed)
2496 AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
2497 Standard_Boolean FoundTransp(Standard_False);
2498 for(;It.More() && !FoundTransp ;It.Next()){
2499 if(It.Key()->IsTransparent())
2500 FoundTransp = Standard_True;
2501 }
2502 if(!FoundTransp)
2503 myMainVwr->Viewer()->SetTransparency(Standard_False);
2504
2505
2506 if(updateviewer)
2507 UpdateCurrentViewer();
2508}
2509
2510//=======================================================================
2511//function : SetDegenerateModel
2512//purpose :
2513//=======================================================================
2514
2515#ifdef G003
2516void AIS_InteractiveContext :: SetDegenerateModel (
2517 const Handle( AIS_InteractiveObject )& anObject,
2518 const Aspect_TypeOfDegenerateModel aModel,
2519 const Quantity_Ratio aRatio
2520 ) {
2521 if ( !anObject.IsNull () ) {
2522 if ( !anObject -> HasInteractiveContext () )
2523 anObject -> SetContext ( this );
2524 anObject->SetDegenerateModel(aModel,aRatio);
2525
2526 } // end if
2527} // end AIS_InteractiveContext :: SetDegenerateModel
2528
2529void AIS_InteractiveContext :: SetDegenerateModel (
2530 const Aspect_TypeOfDegenerateModel aModel,
2531 const Quantity_Ratio aRatio
2532 ) {
2533
2534 AIS_DataMapIteratorOfDataMapOfIOStatus it ( myObjects );
2535
2536 while ( it.More () ) {
2537
2538 Handle( AIS_InteractiveObject ) obj = it.Key ();
2539
2540 obj->SetDegenerateModel(aModel,aRatio);
2541
2542 it.Next ();
2543
2544 } // end while
2545
2546} // end AIS_InteractiveContext :: SetDegenerateModel
2547#endif
2548
2549#ifdef IMP140200
2550//=======================================================================
2551//function : SetSelectedAspect
2552//purpose :
2553//=======================================================================
2554void AIS_InteractiveContext::SetSelectedAspect(
2555 const Handle(Prs3d_BasicAspect)& anAspect,
2556 const Standard_Boolean globalChange,
2557 const Standard_Boolean updateViewer) {
2558 if( !HasOpenedContext() ) {
2559 Standard_Boolean found = Standard_False;
2560 Handle(AIS_Selection) sel =
2561 AIS_Selection::Selection(myCurrentName.ToCString());
2562 Handle(AIS_InteractiveObject) object;
2563 for( sel->Init() ; sel->More() ; sel->Next()) {
2564 found = Standard_True;
2565 object = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
2566 object->SetAspect(anAspect,globalChange);
2567 }
2568 if( found && updateViewer) {
2569 myMainVwr->Update();
2570 if( !(myIsCollClosed && myCollectorVwr.IsNull()) )
2571 myCollectorVwr->Update();
2572 }
2573 }
2574}
2575#endif
2576
2577//=======================================================================
2578//function : SetLocalAttributes
2579//purpose :
2580//=======================================================================
2581
2582void AIS_InteractiveContext::SetLocalAttributes(const Handle(AIS_InteractiveObject)& anIObj,
2583 const Handle(AIS_Drawer)& aDrawer,
2584 const Standard_Boolean updateviewer)
2585{
2586 if(anIObj.IsNull()) return ;
2587 if(!anIObj->HasInteractiveContext())
2588 anIObj->SetContext(this);
2589 anIObj->SetAttributes(aDrawer);
2590 Update(anIObj,updateviewer);
2591
2592}
2593
2594//=======================================================================
2595//function : UnsetLocalAttributes
2596//purpose :
2597//=======================================================================
2598void AIS_InteractiveContext::UnsetLocalAttributes(const Handle(AIS_InteractiveObject)& anIObj,
2599 const Standard_Boolean updateviewer)
2600{
2601 if(anIObj.IsNull()) return ;
2602 if(!anIObj->HasInteractiveContext())
2603 anIObj->SetContext(this);
2604 anIObj->UnsetAttributes();
2605 Update(anIObj,updateviewer);
2606}
2607
2608
2609//=======================================================================
2610//function : Status
2611//purpose :
2612//=======================================================================
2613
2614void AIS_InteractiveContext::Status(const Handle(AIS_InteractiveObject)& anIObj, TCollection_ExtendedString& astatus) const
2615{
2616 astatus = "";
2617
2618 if(anIObj.IsNull()) return ;
2619 if(myObjects.IsBound(anIObj)){
2620 astatus += "\t ____________________________________________";
2621 astatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
2622 const Handle(AIS_GlobalStatus)& ST = myObjects(anIObj);
2623 switch(ST->GraphicStatus()){
2624 case AIS_DS_Displayed:
2625 {
2626 astatus +="\t| -->Displayed\n";
2627 break;
2628 }
2629 case AIS_DS_Erased:
2630 {
2631 astatus +="\t| -->Erased\n";
2632 break;
2633 }
2634 case AIS_DS_FullErased:
2635 {
2636 astatus +="\t| -->Full Erased\n";
2637 break;
2638 }
2639 default:
2640 break;
2641 }
2642 astatus += "\t| Active Display Modes in the MainViewer :\n";
e33e7e78
RK
2643 TColStd_ListIteratorOfListOfInteger ItL (ST->DisplayedModes());
2644 for(;ItL.More();ItL.Next()){
7fd59977 2645 astatus += "\t|\t Mode ";
2646 astatus += TCollection_AsciiString(ItL.Value());
2647 astatus+="\n";
2648 }
2649 if(IsCurrent(anIObj)) astatus +="\t| Current\n";
2650 if(IsSelected(anIObj)) astatus +="\t| Selected\n";
2651
2652 astatus += "\t| Active Selection Modes in the MainViewer :\n";
2653 for(ItL.Initialize(ST->SelectionModes());ItL.More();ItL.Next()){
2654 astatus += "\t\t Mode ";
2655 astatus += TCollection_AsciiString(ItL.Value());
2656 astatus+="\n";
2657 }
2658 astatus += "\t ____________________________________________";
2659
2660 }
2661}
2662
2663
2664//=======================================================================
2665//function : GetDefModes
2666//purpose :
2667//=======================================================================
2668
2669void AIS_InteractiveContext::GetDefModes(const Handle(AIS_InteractiveObject)& anIObj,
2670 Standard_Integer& DispMode,
2671 Standard_Integer& HiMode,
2672 Standard_Integer& SelMode) const
2673{
2674 if(anIObj.IsNull()) return ;
2675 DispMode = anIObj->HasDisplayMode() ? anIObj->DisplayMode() :
2676 (anIObj->AcceptDisplayMode(myDisplayMode)? myDisplayMode : 0);
2677
2678 HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():DispMode;
2679#ifdef BUC61051
2680 SelMode = anIObj->HasSelectionMode()? anIObj->SelectionMode() : -1;
2681#else
2682 SelMode = anIObj->HasSelectionMode()? anIObj->SelectionMode() : 0;
2683#endif
2684}
2685
2686
2687//=======================================================================
2688//function : EraseGlobal
2689//purpose :
2690//=======================================================================
2691
2692void AIS_InteractiveContext::EraseGlobal(const Handle(AIS_InteractiveObject)& anIObj,
2693 const Standard_Boolean updateviewer,
2694 const Standard_Boolean PutInCollector)
2695{
2696 if(anIObj.IsNull()) return ;
2697 if(!myObjects.IsBound(anIObj)) return;
2698
2699 // CLE
2700 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2701 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
2702 // ENDCLE
2703 Standard_Integer Dmode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
2704 if(STATUS->GraphicStatus()==AIS_DS_Displayed){
2705
e33e7e78
RK
2706 TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
2707 for(;ItL.More();ItL.Next()){
7fd59977 2708 if(myMainPM->IsHighlighted(anIObj,ItL.Value()))
2709 myMainPM->Unhighlight(anIObj,ItL.Value());
2710 myMainPM->Erase(anIObj,ItL.Value());
2711 }
2712 if(IsCurrent(anIObj) && !STATUS->IsDModeIn(Dmode))
2713 myMainPM->Erase(anIObj,Dmode);
2714
2715 for(ItL.Initialize(STATUS->SelectionModes());ItL.More();ItL.Next())
2716 mgrSelector->Deactivate(anIObj,ItL.Value(),myMainSel);
2717 if(updateviewer) myMainVwr->Update();
2718 }
2719 if(PutInCollector && !myCollectorPM.IsNull()){
2720 myCollectorPM->Display(anIObj,Dmode);
2721#ifdef OCC328
2722 Standard_Integer SMode = anIObj->SelectionMode();
2723 mgrSelector->Activate(anIObj,SMode,myCollectorSel);
2724#else
2725 mgrSelector->Activate(anIObj,0,myCollectorSel);
2726#endif
2727 if(STATUS->IsHilighted())
2728 myCollectorPM->Highlight(anIObj,Dmode);
2729 STATUS->SetGraphicStatus(AIS_DS_Erased);
2730 if(updateviewer) myCollectorVwr->Update();
2731 }
2732 else
2733 STATUS->SetGraphicStatus(AIS_DS_FullErased);
2734
2735}
2736
2737//=======================================================================
2738//function : ClearGlobal
2739//purpose :
2740//=======================================================================
2741
2742void AIS_InteractiveContext::ClearGlobal(const Handle(AIS_InteractiveObject)& anIObj,
2743 const Standard_Boolean updateviewer)
2744{
2745 if(anIObj.IsNull()) return ;
2746 if(!myObjects.IsBound(anIObj)) return;
2747 // CLE
2748 // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2749 Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
2750 // ENDCLE
e33e7e78
RK
2751 TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
2752 for(;ItL.More();ItL.Next()){
7fd59977 2753 if(STATUS->IsHilighted()){
2754 if(IsCurrent(anIObj))
2755#ifdef OCC204
2756 AddOrRemoveCurrentObject( anIObj, updateviewer );
2757#else
2758 AddOrRemoveCurrentObject(anIObj);
2759#endif
2760 else if(myMainPM->IsHighlighted(anIObj,ItL.Value()))
2761 myMainPM->Unhighlight(anIObj,ItL.Value());
2762 }
2763 myMainPM->Erase(anIObj,ItL.Value());
2764 myMainPM->Clear(anIObj,ItL.Value());
2765 if(anIObj->HasHilightMode()){
2766 Standard_Integer im = anIObj->HilightMode();
2767 myMainPM->Unhighlight(anIObj,im);
2768 myMainPM->Erase(anIObj,im);
2769
2770 }
2771 }
2772
2773 //Object removes from Detected sequence
2774 Standard_Integer i = 1;
2775 for(i = 1; i < myAISDetectedSeq.Length(); i++)
2776 {
2777 Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
2778 if( !anObj.IsNull() && anObj != anIObj )
2779 myAISDetectedSeq.Remove( i );
2780 }
2781
44d9ae89
A
2782 if(myLastinMain == anIObj)
2783 myLastinMain.Nullify();
2784 if(myLastinColl == anIObj)
2785 myLastinColl.Nullify();
7fd59977 2786
2787 if(myLastPicked == anIObj)
2788 myLastPicked.Nullify();
2789
2790 // OCC21671: Remove IO from the selection manager in any case
2791 // to avoid memory leaks
2792 mgrSelector->Remove(anIObj);
2793
2794 switch(STATUS->GraphicStatus()){
2795 case AIS_DS_Erased:
2796 {
2797 Standard_Integer DM = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
2798 if(STATUS->IsHilighted()){
2799 myCollectorPM->Unhighlight(anIObj,DM);
2800 }
2801 myCollectorPM->Erase(anIObj,DM);
2802 myCollectorPM->Clear(anIObj,DM);
2803 if(updateviewer) myCollectorVwr->Update();
2804 break;
2805 }
2806 case AIS_DS_Displayed:
2807 {
2808 if(updateviewer) myMainVwr->Update();
2809 break;
2810 }
2811 default:
2812 break;
2813 }
2814 myObjects.UnBind(anIObj);
2815
2816}
2817
2818//=======================================================================
2819//function : ClearGlobalPrs
2820//purpose :
2821//=======================================================================
2822
2823void AIS_InteractiveContext::ClearGlobalPrs(const Handle(AIS_InteractiveObject)& anIObj,
2824 const Standard_Integer aMode,
2825 const Standard_Boolean updateviewer)
2826{
2827 if(anIObj.IsNull()) return ;
2828 if(!myObjects.IsBound(anIObj)) return;
2829 const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2830
2831 Standard_Integer DM = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
2832 if(STATUS->IsDModeIn(aMode)){
2833 if(DM==aMode && myMainPM->IsHighlighted(anIObj,aMode))
2834 myMainPM->Unhighlight(anIObj,aMode);
2835
2836 myMainPM->Erase(anIObj,aMode);
2837 myMainPM->Clear(anIObj,aMode);
2838 }
2839
2840 if(STATUS->GraphicStatus()== AIS_DS_Erased)
2841 {
2842 if(DM==aMode){
2843 if(STATUS->IsHilighted())
2844 myCollectorPM->Unhighlight(anIObj,aMode);
2845 myCollectorPM->Erase(anIObj,DM);
2846 myCollectorPM->Clear(anIObj,DM);
2847 }
2848 if(updateviewer) myCollectorVwr->Update();
2849 }
2850 else if(STATUS->GraphicStatus()==AIS_DS_Displayed && updateviewer)
2851 myMainVwr->Update();
2852}
2853
2854//=======================================================================
2855//function : DrawHiddenLine
2856//purpose :
2857//=======================================================================
2858
2859Standard_Boolean AIS_InteractiveContext::DrawHiddenLine () const {
2860
2861 return myDefaultDrawer->DrawHiddenLine();
2862}
2863
2864//=======================================================================
2865//function : EnableDrawHiddenLine
2866//purpose :
2867//=======================================================================
2868
2869void AIS_InteractiveContext::EnableDrawHiddenLine () const {
2870 myDefaultDrawer->EnableDrawHiddenLine();
2871}
2872
2873//=======================================================================
2874//function : DisableDrawHiddenLine
2875//purpose :
2876//=======================================================================
2877
2878void AIS_InteractiveContext::DisableDrawHiddenLine () const {
2879 myDefaultDrawer->DisableDrawHiddenLine();
2880}
2881
2882//=======================================================================
2883//function : HiddenLineAspect
2884//purpose :
2885//=======================================================================
2886
2887Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect () const {
2888 return myDefaultDrawer->HiddenLineAspect();
2889}
2890
2891//=======================================================================
2892//function : SetHiddenLineAspect
2893//purpose :
2894//=======================================================================
2895
2896void AIS_InteractiveContext::SetHiddenLineAspect ( const Handle(Prs3d_LineAspect)& anAspect) const {
2897 myDefaultDrawer->SetHiddenLineAspect(anAspect);
2898}
2899
2900//=======================================================================
2901//function : SetIsoNumber
2902//purpose :
2903//=======================================================================
2904
2905void AIS_InteractiveContext::SetIsoNumber(const Standard_Integer Nb,const AIS_TypeOfIso Type)
2906{
2907 switch(Type){
2908 case AIS_TOI_IsoU:
2909 myDefaultDrawer->UIsoAspect()->SetNumber(Nb);
2910 break;
2911 case AIS_TOI_IsoV:
2912 myDefaultDrawer->VIsoAspect()->SetNumber(Nb);
2913 break;
2914 case AIS_TOI_Both:
2915 myDefaultDrawer->UIsoAspect()->SetNumber(Nb);
2916 myDefaultDrawer->VIsoAspect()->SetNumber(Nb);
2917 break;
2918
2919 }
2920}
2921//=======================================================================
2922//function : IsoNumber
2923//purpose :
2924//=======================================================================
2925
2926Standard_Integer AIS_InteractiveContext::IsoNumber(const AIS_TypeOfIso Type)
2927{
2928
2929 switch(Type){
2930 case AIS_TOI_IsoU:
2931 return myDefaultDrawer->UIsoAspect()->Number();
2932 case AIS_TOI_IsoV:
2933 return myDefaultDrawer->VIsoAspect()->Number();
2934 case AIS_TOI_Both:
2935 return (myDefaultDrawer->UIsoAspect()->Number()==
2936 myDefaultDrawer->VIsoAspect()->Number()) ?
2937 myDefaultDrawer->UIsoAspect()->Number(): -1;
2938 }
2939 return 0;
2940}
2941
2942//=======================================================================
2943//function : IsoOnPlane
2944//purpose :
2945//=======================================================================
2946
2947void AIS_InteractiveContext::IsoOnPlane(const Standard_Boolean SwitchOn)
2948{
2949 myDefaultDrawer->SetIsoOnPlane(SwitchOn);
2950}
2951
2952//=======================================================================
2953//function : IsoOnPlane
2954//purpose :
2955//=======================================================================
2956
2957Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
2958{
2959 return myDefaultDrawer->IsoOnPlane();
2960}
2961
2962//=======================================================================
2963//function : SetSelectionMode
2964//purpose :
2965//=======================================================================
2966
2967void AIS_InteractiveContext::SetSelectionMode(const Handle_AIS_InteractiveObject&, const Standard_Integer )
2968{
2969}
2970
2971//=======================================================================
2972//function : UnsetSelectionMode
2973//purpose :
2974//=======================================================================
2975
2976void AIS_InteractiveContext::UnsetSelectionMode(const Handle_AIS_InteractiveObject&)
2977{
2978}
2979
2980#ifdef BUC60688
2981//=======================================================================
2982//function : SetSensitivity
2983//purpose :
2984//=======================================================================
2985
2986void AIS_InteractiveContext::SetSensitivity(const Standard_Real aPrecision) {
2987
2988 if( HasOpenedContext() )
2989 myLocalContexts(myCurLocalIndex)->SetSensitivity(aPrecision);
2990 else {
2991 myMainSel->SetSensitivity(aPrecision);
2992 if( !myCollectorSel.IsNull() ) myCollectorSel->SetSensitivity(aPrecision);
2993 }
2994}
2995
2996//=======================================================================
2997//function : SetSensitivity
2998//purpose :
2999//=======================================================================
3000
3001void AIS_InteractiveContext::SetSensitivity(const Standard_Integer aPrecision) {
3002
3003 if( HasOpenedContext() )
3004 myLocalContexts(myCurLocalIndex)->SetSensitivity(aPrecision);
3005 else {
3006 myMainSel->Set(aPrecision);
3007 if( !myCollectorSel.IsNull() ) myCollectorSel->Set(aPrecision);
3008 }
3009}
3010#endif
3011
3012//=======================================================================
3013//function : IsInLocal
3014//purpose :
3015//=======================================================================
3016
3017Standard_Boolean AIS_InteractiveContext::IsInLocal(const Handle_AIS_InteractiveObject& anIObj,
3018 Standard_Integer& TheIndex) const
3019{
3020 if(anIObj.IsNull()) return Standard_False;
81bba717 3021 // if it exists at neutral point 0 index is returned
7fd59977 3022 if(myObjects.IsBound(anIObj)) {
3023 TheIndex = 0;
3024 return Standard_False;
3025 }
3026 for(Standard_Integer I=1;I<=myLocalContexts.Extent();I++){
3027 if(myLocalContexts.IsBound(I)){
3028 if(myLocalContexts(I)->IsIn(anIObj)){
3029 TheIndex = I;
3030 return Standard_True;
3031
3032 }
3033 }
3034 }
3035 TheIndex =-1;
3036 return Standard_False;
3037}
3038
3039//=======================================================================
3040//function : InitAttributes
3041//purpose :
3042//=======================================================================
3043
3044void AIS_InteractiveContext::InitAttributes()
3045{
3046
3047 mgrSelector->Add(myMainSel);
3048 myCurrentName = AIS_Context_NewCurName();
3049 mySelectionName = AIS_Context_NewSelName();
3050
3051 AIS_Selection::CreateSelection(mySelectionName.ToCString());
3052 AIS_Selection::CreateSelection(myCurrentName.ToCString());
3053
3054
3055 myDefaultDrawer->SetShadingAspectGlobal(Standard_False);
3056 Graphic3d_MaterialAspect aMat(Graphic3d_NOM_BRASS);
3057 myDefaultDrawer->ShadingAspect()->SetMaterial(aMat);
3058
3059// myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
3060 Handle (Prs3d_LineAspect) HLA = myDefaultDrawer->HiddenLineAspect();
3061 HLA->SetColor(Quantity_NOC_GRAY20);
3062 HLA->SetWidth(1);
3063 HLA->SetTypeOfLine(Aspect_TOL_DASH);
3064
81bba717 3065 // tolerance to 4 pixels...
7fd59977 3066#ifdef BUC60688
3067 SetSensitivity();
3068#else
3069 myMainSel->Set(4);
3070#endif
3071
3072 // Customizing the drawer for trihedrons and planes...
3073
3074 Handle (Prs3d_DatumAspect) DA = myDefaultDrawer->DatumAspect();
3075 Standard_Real aLength(100.);
3076 DA->SetAxisLength(aLength,aLength,aLength);
3077 Quantity_NameOfColor col = Quantity_NOC_LIGHTSTEELBLUE4;
3078 DA->FirstAxisAspect()->SetColor(col);
3079 DA->SecondAxisAspect()->SetColor(col);
3080 DA->ThirdAxisAspect()->SetColor(col);
3081
3082 Handle(Prs3d_PlaneAspect)PA = myDefaultDrawer->PlaneAspect();
3083 aLength =200.;
3084 PA->SetPlaneLength(aLength,aLength);
3085 PA->EdgesAspect()->SetColor(Quantity_NOC_SKYBLUE);
3086
3087
3088}
3089
3090
3091//=======================================================================
3092//function : TrihedronSize
3093//purpose :
3094//=======================================================================
3095Standard_Real AIS_InteractiveContext::TrihedronSize() const
3096{
3097 return myDefaultDrawer->DatumAspect()->FirstAxisLength();
3098}
3099//=======================================================================
3100//function : SetTrihedronSize
3101//purpose :
3102//=======================================================================
3103void AIS_InteractiveContext::SetTrihedronSize(const Standard_Real aVal,const Standard_Boolean /*updateviewer*/)
3104{
3105 myDefaultDrawer->DatumAspect()->SetAxisLength(aVal,aVal,aVal);
3106 Redisplay(AIS_KOI_Datum,3,Standard_False);
3107 Redisplay(AIS_KOI_Datum,4,Standard_True);
3108}
3109
3110
3111
3112//=======================================================================
3113//function : SetPlaneSize
3114//purpose :
3115//=======================================================================
3116void AIS_InteractiveContext::SetPlaneSize(const Standard_Real aValX,
3117 const Standard_Real aValY,
3118 const Standard_Boolean /*updateviewer*/)
3119{
3120 myDefaultDrawer->PlaneAspect()->SetPlaneLength(aValX,aValY);
3121 Redisplay(AIS_KOI_Datum,7);
3122}
3123
3124//=======================================================================
3125//function : SetPlaneSize
3126//purpose :
3127//=======================================================================
3128
3129void AIS_InteractiveContext::SetPlaneSize(const Standard_Real aVal,
3130 const Standard_Boolean updateviewer)
3131{
3132 SetPlaneSize(aVal,aVal,updateviewer);
3133}
3134
3135//=======================================================================
3136//function : PlaneSize
3137//purpose :
3138//=======================================================================
3139
3140Standard_Boolean AIS_InteractiveContext::PlaneSize(Standard_Real& LX,Standard_Real& LY) const
3141{
3142 LX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
3143 LY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
3144 return (Abs(LX-LY)<=Precision::Confusion());
3145}
3146
3147
3148
3149//=======================================================================
3150//function :
3151//purpose :
3152//=======================================================================
3153void AIS_InteractiveContext::SetAutoActivateSelection( const Standard_Boolean Auto )
3154{
3155 myIsAutoActivateSelMode = Auto;
3156}
3157
3158//=======================================================================
3159//function :
3160//purpose :
3161//=======================================================================
3162Standard_Boolean AIS_InteractiveContext::GetAutoActivateSelection() const
3163{
3164 return myIsAutoActivateSelMode;
3165}
59f45b7c 3166
3167//=======================================================================
3168//function : SetZLayer
3169//purpose :
3170//=======================================================================
3171
3172void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
3173 const Standard_Integer theLayerId)
3174{
3175 if (theIObj.IsNull ())
3176 return;
3177
3178 if (myObjects.IsBound (theIObj))
3179 {
3180 switch (myObjects (theIObj)->GraphicStatus ())
3181 {
3182 case AIS_DS_Displayed:
3183 {
3184 theIObj->SetZLayer (myMainPM, theLayerId);
3185 break;
3186 }
3187 case AIS_DS_Erased:
3188 {
3189 theIObj->SetZLayer (myCollectorPM, theLayerId);
3190 break;
3191 }
3192 default:
3193 break;
3194 }
3195 }
3196 else if (HasOpenedContext ())
3197 {
3198 myLocalContexts (myCurLocalIndex)->SetZLayer (theIObj, theLayerId);
3199 }
3200}
3201
3202//=======================================================================
3203//function : GetZLayer
3204//purpose :
3205//=======================================================================
3206
3207Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
3208{
3209 if (theIObj.IsNull ())
3210 return -1;
3211
3212 if (myObjects.IsBound (theIObj))
71c4f9c6 3213 {
59f45b7c 3214 return theIObj->GetZLayer (myMainPM);
71c4f9c6 3215 }
3216 else if (HasOpenedContext ())
3217 {
3218 return myLocalContexts (myCurLocalIndex)->GetZLayer (theIObj);
3219 }
59f45b7c 3220
71c4f9c6 3221 return -1;
59f45b7c 3222}