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