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