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