a6a81ae4a518bc0ffe500fd6363f9fe9bf2eaa12
[occt.git] / src / AIS / AIS_ConnectedInteractive.cxx
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
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <Standard_NotImplemented.hxx>
18
19 #include <AIS_ConnectedInteractive.ixx>
20 #include <SelectMgr_EntityOwner.hxx>
21 #include <Select3D_SensitiveEntity.hxx>
22 #include <Geom_Transformation.hxx>
23
24 #include <PrsMgr_ModedPresentation.hxx>
25 #include <PrsMgr_Presentation.hxx>
26 #include <OSD_Timer.hxx>
27
28
29 //=======================================================================
30 //function : AIS_ConnectedInteractive
31 //purpose  : 
32 //=======================================================================
33 AIS_ConnectedInteractive::AIS_ConnectedInteractive(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
34 AIS_InteractiveObject(aTypeOfPresentation3d)
35 {    
36   SetHilightMode(0);
37 }
38
39 //=======================================================================
40 //function : Type
41 //purpose  : 
42 //=======================================================================
43 AIS_KindOfInteractive AIS_ConnectedInteractive::Type() const
44 {return AIS_KOI_Object;}
45
46 Standard_Integer AIS_ConnectedInteractive::Signature() const
47 {return 0; }
48
49
50
51
52 //=======================================================================
53 //function : Connect
54 //purpose  : 
55 //=======================================================================
56 void AIS_ConnectedInteractive::
57 Connect(const Handle(AIS_InteractiveObject)& anotherIObj)
58 {
59   // To have the time to Disconnect below, 
60   // the old is kept for a while. 
61   if(myReference==anotherIObj) return;
62   myOldReference = myReference;
63 //Disconnect();
64   myReference = anotherIObj ;
65 }
66
67 //=======================================================================
68 //function : Connect
69 //purpose  : 
70 //=======================================================================
71 void AIS_ConnectedInteractive::
72 Connect(const Handle(AIS_InteractiveObject)& anotherIobj, 
73         const TopLoc_Location& aLocation)
74 {
75   if(myLocation!=aLocation)
76     myLocation = aLocation;
77   if(myReference!=anotherIobj) {
78     myOldReference = myReference; // necessary to disconnect below..
79 //  Disconnect();
80     myReference = anotherIobj;}
81   
82 }
83
84
85 //=======================================================================
86 //function : Disconnect
87 //purpose  :
88 //=======================================================================
89
90 void AIS_ConnectedInteractive::Disconnect()
91 {
92   for(Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
93   {
94     const Handle(PrsMgr_Presentation)& aPrs = myPresentations (aPrsIter).Presentation();
95     if (!aPrs.IsNull())
96     {
97       aPrs->Presentation()->DisconnectAll (Graphic3d_TOC_DESCENDANT);
98     }
99   }
100 }
101 //=======================================================================
102 //function : Compute
103 //purpose  :
104 //=======================================================================
105 void AIS_ConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
106                                         const Handle(Prs3d_Presentation)&           thePrs,
107                                         const Standard_Integer                      theMode)
108 {
109   if (!(HasLocation() || HasConnection()))
110   {
111     return;
112   }
113
114   if (HasConnection())
115   {
116     thePrs->Clear (Standard_False);
117     thePrs->RemoveAll();
118
119     if (!myReference->HasInteractiveContext())
120     {
121       myReference->SetContext (GetContext());
122     }
123     thePrsMgr->Connect (this, myReference, theMode, theMode);
124     if (thePrsMgr->Presentation (myReference, theMode)->MustBeUpdated())
125     {
126       thePrsMgr->Update (myReference, theMode);
127     }
128   }
129
130   if (HasLocation())
131   {
132     Handle(Geom_Transformation) aPrsTrans = new Geom_Transformation (myLocation.Transformation());
133     thePrsMgr->Transform (this, aPrsTrans, theMode);
134   }
135   thePrs->ReCompute();
136 }
137
138 void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation)
139 {
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 ) ;
142 }
143
144 void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)
145 {
146 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)&, const Handle(Prs3d_Presentation)&)");
147  PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
148 }
149
150 //=======================================================================
151 //function : ComputeSelection
152 //purpose  : 
153 //=======================================================================
154
155 void AIS_ConnectedInteractive::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, 
156                                                 const Standard_Integer aMode)
157 {
158   if(!(HasLocation() ||HasConnection())) return;
159   
160   aSel->Clear();
161   if(!myReference->HasSelection(aMode))
162     myReference->UpdateSelection(aMode);
163
164   const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection(aMode);
165   Handle(SelectMgr_EntityOwner) OWN = new SelectMgr_EntityOwner(this);
166   Handle(Select3D_SensitiveEntity) SE3D, SNew;
167   
168   if(TheRefSel->IsEmpty())
169     myReference->UpdateSelection(aMode);
170   for(TheRefSel->Init();TheRefSel->More();TheRefSel->Next())
171   {
172     SE3D = Handle(Select3D_SensitiveEntity)::DownCast(TheRefSel->Sensitive());
173     if(!SE3D.IsNull())
174     {
175       // Get the copy of SE3D
176       SNew = SE3D->GetConnected(myLocation);
177       if(aMode==0)
178       {
179         SNew->Set(OWN);
180         // In case if SE3D caches some location-dependent data
181         // that must be updated after setting OWN
182         SNew->SetLocation(myLocation);
183       }
184       aSel->Add(SNew);
185     }
186   }
187 }
188
189 void AIS_ConnectedInteractive::UpdateLocation()
190 {
191 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation()");
192  SelectMgr_SelectableObject::UpdateLocation() ;
193 }
194 void AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)
195 {
196 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)");
197  SelectMgr_SelectableObject::UpdateLocation(Sel) ;
198 }
199 /*void AIS_ConnectedInteractive::UpdateLocation(const Handle(Prs3d_Presentation)& aPresentation)
200 {
201 // Standard_NotImplemented::Raise("AIS_ConnectedInteractive::UpdateLocation(const Handle(Prs3d_Presentation)&)");
202  SelectMgr_SelectableObject::UpdateLocation(aPresentation) ;
203 }*/