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_Presentation3d.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 i =1;i<=myPresentations.Length();i++)
94 Handle(PrsMgr_Presentation3d) P = Handle(PrsMgr_Presentation3d)::DownCast(myPresentations(i).Presentation());
96 P->Presentation()->DisconnectAll(Graphic3d_TOC_DESCENDANT);
100 //=======================================================================
103 //=======================================================================
104 void AIS_ConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
105 const Handle(Prs3d_Presentation)& thePrs,
106 const Standard_Integer theMode)
108 if (!(HasLocation() || HasConnection()))
115 thePrs->Clear (Standard_False);
118 if (!myReference->HasInteractiveContext())
120 myReference->SetContext (GetContext());
122 thePrsMgr->Connect (this, myReference, theMode, theMode);
123 if (thePrsMgr->Presentation (myReference, theMode)->MustBeUpdated())
125 thePrsMgr->Update (myReference, theMode);
131 Handle(Geom_Transformation) aPrsTrans = new Geom_Transformation (myLocation.Transformation());
132 thePrsMgr->Transform (this, aPrsTrans, theMode);
137 void AIS_ConnectedInteractive::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Geom_Transformation& aTransformation, const Handle_Prs3d_Presentation& aPresentation)
139 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::Compute(const Handle_Prs3d_Projector&, const Handle_Geom_Transformation&, const Handle_Prs3d_Presentation&)");
140 PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
143 void AIS_ConnectedInteractive::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Prs3d_Presentation& aPresentation)
145 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::Compute(const Handle_Prs3d_Projector&, const Handle_Prs3d_Presentation&)");
146 PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
149 //=======================================================================
150 //function : ComputeSelection
152 //=======================================================================
154 void AIS_ConnectedInteractive::ComputeSelection(const Handle(SelectMgr_Selection)& aSel,
155 const Standard_Integer aMode)
157 if(!(HasLocation() ||HasConnection())) return;
160 if(!myReference->HasSelection(aMode))
161 myReference->UpdateSelection(aMode);
163 const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection(aMode);
164 Handle(SelectMgr_EntityOwner) OWN = new SelectMgr_EntityOwner(this);
165 Handle(Select3D_SensitiveEntity) SE3D, SNew;
167 if(TheRefSel->IsEmpty())
168 myReference->UpdateSelection(aMode);
169 for(TheRefSel->Init();TheRefSel->More();TheRefSel->Next())
171 SE3D = Handle(Select3D_SensitiveEntity)::DownCast(TheRefSel->Sensitive());
174 // Get the copy of SE3D
175 SNew = SE3D->GetConnected(myLocation);
179 // In case if SE3D caches some location-dependent data
180 // that must be updated after setting OWN
181 SNew->SetLocation(myLocation);
188 void AIS_ConnectedInteractive::UpdateLocation()
190 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation()");
191 SelectMgr_SelectableObject::UpdateLocation() ;
193 void AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)
195 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)");
196 SelectMgr_SelectableObject::UpdateLocation(Sel) ;
198 /*void AIS_ConnectedInteractive::UpdateLocation(const Handle_Prs3d_Presentation& aPresentation)
200 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle_Prs3d_Presentation&)");
201 SelectMgr_SelectableObject::UpdateLocation(aPresentation) ;