1 // Created on: 1997-01-08
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Standard_NotImplemented.hxx>
19 #include <AIS_ConnectedInteractive.ixx>
20 #include <SelectMgr_EntityOwner.hxx>
21 #include <Select3D_SensitiveEntity.hxx>
22 #include <Geom_Transformation.hxx>
24 #include <PrsMgr_ModedPresentation.hxx>
25 #include <PrsMgr_Presentation.hxx>
26 #include <OSD_Timer.hxx>
29 //=======================================================================
30 //function : AIS_ConnectedInteractive
32 //=======================================================================
33 AIS_ConnectedInteractive::AIS_ConnectedInteractive(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
34 AIS_InteractiveObject(aTypeOfPresentation3d)
39 //=======================================================================
42 //=======================================================================
43 AIS_KindOfInteractive AIS_ConnectedInteractive::Type() const
44 {return AIS_KOI_Object;}
46 Standard_Integer AIS_ConnectedInteractive::Signature() const
52 //=======================================================================
55 //=======================================================================
56 void AIS_ConnectedInteractive::
57 Connect(const Handle(AIS_InteractiveObject)& anotherIObj)
59 // To have the time to Disconnect below,
60 // the old is kept for a while.
61 if(myReference==anotherIObj) return;
62 myOldReference = myReference;
64 myReference = anotherIObj ;
67 //=======================================================================
70 //=======================================================================
71 void AIS_ConnectedInteractive::
72 Connect(const Handle(AIS_InteractiveObject)& anotherIobj,
73 const TopLoc_Location& aLocation)
75 if(myLocation!=aLocation)
76 myLocation = aLocation;
77 if(myReference!=anotherIobj) {
78 myOldReference = myReference; // necessary to disconnect below..
80 myReference = anotherIobj;}
85 //=======================================================================
86 //function : Disconnect
88 //=======================================================================
90 void AIS_ConnectedInteractive::Disconnect()
92 for(Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
94 const Handle(PrsMgr_Presentation)& aPrs = myPresentations (aPrsIter).Presentation();
97 aPrs->Presentation()->DisconnectAll (Graphic3d_TOC_DESCENDANT);
101 //=======================================================================
104 //=======================================================================
105 void AIS_ConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
106 const Handle(Prs3d_Presentation)& thePrs,
107 const Standard_Integer theMode)
109 if (!(HasLocation() || HasConnection()))
116 thePrs->Clear (Standard_False);
119 if (!myReference->HasInteractiveContext())
121 myReference->SetContext (GetContext());
123 thePrsMgr->Connect (this, myReference, theMode, theMode);
124 if (thePrsMgr->Presentation (myReference, theMode)->MustBeUpdated())
126 thePrsMgr->Update (myReference, theMode);
132 Handle(Geom_Transformation) aPrsTrans = new Geom_Transformation (myLocation.Transformation());
133 thePrsMgr->Transform (this, aPrsTrans, theMode);
138 void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation)
140 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)");
141 PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
144 void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)
146 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)&, const Handle(Prs3d_Presentation)&)");
147 PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
150 //=======================================================================
151 //function : ComputeSelection
153 //=======================================================================
155 void AIS_ConnectedInteractive::ComputeSelection(const Handle(SelectMgr_Selection)& aSel,
156 const Standard_Integer aMode)
158 if(!(HasLocation() ||HasConnection())) return;
161 if(!myReference->HasSelection(aMode))
162 myReference->UpdateSelection(aMode);
164 const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection(aMode);
165 Handle(SelectMgr_EntityOwner) OWN = new SelectMgr_EntityOwner(this);
166 Handle(Select3D_SensitiveEntity) SE3D, SNew;
168 if(TheRefSel->IsEmpty())
169 myReference->UpdateSelection(aMode);
170 for(TheRefSel->Init();TheRefSel->More();TheRefSel->Next())
172 SE3D = Handle(Select3D_SensitiveEntity)::DownCast(TheRefSel->Sensitive());
175 // Get the copy of SE3D
176 SNew = SE3D->GetConnected(myLocation);
180 // In case if SE3D caches some location-dependent data
181 // that must be updated after setting OWN
182 SNew->SetLocation(myLocation);
189 void AIS_ConnectedInteractive::UpdateLocation()
191 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation()");
192 SelectMgr_SelectableObject::UpdateLocation() ;
194 void AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)
196 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)");
197 SelectMgr_SelectableObject::UpdateLocation(Sel) ;
199 /*void AIS_ConnectedInteractive::UpdateLocation(const Handle(Prs3d_Presentation)& aPresentation)
201 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle(Prs3d_Presentation)&)");
202 SelectMgr_SelectableObject::UpdateLocation(aPresentation) ;