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