0776e7d3f70b754c29d5590d4e000ea9edc01168
[occt.git] / src / AIS / AIS_MultipleConnectedInteractive.cxx
1 // Created on: 1997-04-22
2 // Created by: Guest Design
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 <AIS_MultipleConnectedInteractive.hxx>
18
19 #include <AIS_ConnectedInteractive.hxx>
20 #include <AIS_InteractiveContext.hxx>
21 #include <AIS_InteractiveObject.hxx>
22 #include <Prs3d_Projector.hxx>
23 #include <Select3D_SensitiveEntity.hxx>
24 #include <SelectMgr_EntityOwner.hxx>
25 #include <Standard_NotImplemented.hxx>
26 #include <TopLoc_Location.hxx>
27
28 IMPLEMENT_STANDARD_RTTIEXT(AIS_MultipleConnectedInteractive,AIS_InteractiveObject)
29
30 //=======================================================================
31 //function : AIS_MultipleConnectedInteractive
32 //purpose  :
33 //=======================================================================
34
35 AIS_MultipleConnectedInteractive::AIS_MultipleConnectedInteractive()
36 : AIS_InteractiveObject (PrsMgr_TOP_AllView)
37 {
38   myHasOwnPresentations = Standard_False;
39 }
40
41 //=======================================================================
42 //function : Type
43 //purpose  : 
44 //=======================================================================
45 AIS_KindOfInteractive AIS_MultipleConnectedInteractive::Type() const
46 {
47   return AIS_KOI_Object;
48 }
49
50 //=======================================================================
51 //function : Signature
52 //purpose  : 
53 //=======================================================================
54 Standard_Integer AIS_MultipleConnectedInteractive::Signature() const
55 {
56   return 1;
57 }
58
59 //=======================================================================
60 //function : connect
61 //purpose  :
62 //=======================================================================
63 Handle(AIS_InteractiveObject) AIS_MultipleConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
64                                                                          const Handle(Geom_Transformation)& theTrsf,
65                                                                          const Handle(Graphic3d_TransformPers)& theTrsfPers)
66 {
67   if (myAssemblyOwner.IsNull())
68     myAssemblyOwner = new SelectMgr_EntityOwner (this);
69
70   Handle(AIS_InteractiveObject) anObjectToAdd;
71
72   Handle(AIS_MultipleConnectedInteractive) aMultiConnected = Handle(AIS_MultipleConnectedInteractive)::DownCast (theAnotherObj);
73   if (!aMultiConnected.IsNull())
74   { 
75     Handle(AIS_MultipleConnectedInteractive) aNewMultiConnected = new AIS_MultipleConnectedInteractive();
76     aNewMultiConnected->myAssemblyOwner = myAssemblyOwner;
77     aNewMultiConnected->SetLocalTransformation (aMultiConnected->LocalTransformationGeom());
78
79     // Perform deep copy of instance tree
80     for (PrsMgr_ListOfPresentableObjectsIter anIter (aMultiConnected->Children()); anIter.More(); anIter.Next())
81     {
82       Handle(AIS_InteractiveObject) anInteractive = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
83       if (anInteractive.IsNull())
84       {
85         continue;
86       }
87
88       aNewMultiConnected->Connect (anInteractive);     
89     }
90
91     anObjectToAdd = aNewMultiConnected;
92   }
93   else
94   {
95     Handle(AIS_ConnectedInteractive) aNewConnected = new AIS_ConnectedInteractive();
96     aNewConnected->Connect (theAnotherObj, theAnotherObj->LocalTransformationGeom());
97
98     anObjectToAdd = aNewConnected;
99   }
100
101   anObjectToAdd->SetLocalTransformation (theTrsf);
102   if (!theTrsfPers.IsNull())
103   {
104     anObjectToAdd->SetTransformPersistence (theTrsfPers);
105   }
106   AddChild (anObjectToAdd);
107   return anObjectToAdd;
108 }
109
110 //=======================================================================
111 //function : HasConnection
112 //purpose  : 
113 //=======================================================================
114 Standard_Boolean AIS_MultipleConnectedInteractive::HasConnection() const 
115 {
116   return (Children().Size() != 0);
117 }
118
119 //=======================================================================
120 //function : Disconnect
121 //purpose  : 
122 //=======================================================================
123
124 void AIS_MultipleConnectedInteractive::Disconnect(const Handle(AIS_InteractiveObject)& anotherIObj)
125 {
126   RemoveChild (anotherIObj);
127 }
128
129 //=======================================================================
130 //function : DisconnectAll
131 //purpose  : 
132 //=======================================================================
133
134 void AIS_MultipleConnectedInteractive::DisconnectAll()
135 {
136   Standard_Integer aNbItemsToRemove = Children().Size();
137   for (Standard_Integer anIter = 0; anIter < aNbItemsToRemove; ++anIter)
138   {
139     RemoveChild (Children().First());
140   }
141 }
142
143 //=======================================================================
144 //function : Compute
145 //purpose  :
146 //=======================================================================
147 void AIS_MultipleConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePrsMgr*/,
148                                                 const Handle(Prs3d_Presentation)&           /*thePrs*/,
149                                                 const Standard_Integer                      /*theMode*/)
150 {
151   Handle(AIS_InteractiveContext) aCtx = GetContext();
152   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
153   {
154     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
155     if (!aChild.IsNull())
156     {
157       aChild->SetContext (aCtx);
158     }
159   }
160 }
161
162 //=======================================================================
163 //function : Compute
164 //purpose  : 
165 //=======================================================================
166
167 void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector,
168                                                const Handle(Prs3d_Presentation)& aPresentation)
169 {
170   PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
171 }
172
173 //=======================================================================
174 //function : Compute
175 //purpose  : 
176 //=======================================================================
177
178 void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector,
179                                                const Handle(Geom_Transformation)& aTransformation,
180                                                const Handle(Prs3d_Presentation)& aPresentation)
181 {
182   PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
183 }
184
185 //=======================================================================
186 //function : AcceptShapeDecomposition
187 //purpose  : 
188 //=======================================================================
189 Standard_Boolean AIS_MultipleConnectedInteractive::AcceptShapeDecomposition() const 
190 {
191   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
192   {
193     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
194     if (aChild.IsNull())
195     {
196       continue;
197     }
198
199     if (aChild->AcceptShapeDecomposition())
200     {
201       return Standard_True;
202     }
203   }
204   return Standard_False;
205 }
206
207 //=======================================================================
208 //function : ComputeSelection
209 //purpose  : 
210 //=======================================================================
211 void AIS_MultipleConnectedInteractive::ComputeSelection (const Handle(SelectMgr_Selection)& /*theSelection*/,
212                                                          const Standard_Integer             theMode)
213 {
214   if (theMode == 0)
215   {
216     return;
217   }
218
219   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
220   {
221     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
222     if (aChild.IsNull())
223     {
224       continue;
225     }
226
227     if (!aChild->HasSelection (theMode))
228     {
229       aChild->RecomputePrimitives (theMode);
230     }
231
232     Handle(SelectMgr_Selection) aSelection = new SelectMgr_Selection (theMode);
233     aChild->ComputeSelection (aSelection, theMode);
234   }
235 }
236
237 //=======================================================================
238 //function : SetContext
239 //purpose  :
240 //=======================================================================
241 void AIS_MultipleConnectedInteractive::SetContext (const Handle(AIS_InteractiveContext)& theCtx)
242 {
243   AIS_InteractiveObject::SetContext (theCtx);
244   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
245   {
246     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
247     if (!aChild.IsNull())
248     {
249       aChild->SetContext (theCtx);
250     }
251   }
252 }