0025695: Visualization, AIS_InteractiveContext - define default HilightMode
[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 <PrsMgr_ModedPresentation.hxx>
24 #include <Select3D_SensitiveEntity.hxx>
25 #include <SelectMgr_EntityOwner.hxx>
26 #include <Standard_NotImplemented.hxx>
27 #include <TopLoc_Location.hxx>
28
29 IMPLEMENT_STANDARD_RTTIEXT(AIS_MultipleConnectedInteractive,AIS_InteractiveObject)
30
31 namespace
32 {
33   //! SelectMgr_AssemblyEntityOwner replaces original owners in sensitive entities
34   //! copied from reference objects to AIS_MultipleConnectedInteractive in order to
35   //! redirect all selection queries to multiply connected (assembly).
36   class SelectMgr_AssemblyEntityOwner : public SelectMgr_EntityOwner
37   {
38
39   public:
40
41     // Copies another SelectMgr_EntityOwner.
42     SelectMgr_AssemblyEntityOwner (const Handle(SelectMgr_EntityOwner) theOwner,
43                                    SelectMgr_SelectableObject* theAssembly);
44
45     void SetAssembly (SelectMgr_SelectableObject* theAssembly)
46     {
47       myAssembly = theAssembly;
48     }
49
50     //! Selectable() method modified to return myAssembly.
51     virtual Handle(SelectMgr_SelectableObject) Selectable() const Standard_OVERRIDE
52     {
53       return myAssembly;
54     }
55
56     virtual Standard_Boolean IsHilighted (const Handle(PrsMgr_PresentationManager)& PM,const Standard_Integer aMode) const Standard_OVERRIDE;
57
58     virtual void HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM,
59                                    const Handle(Prs3d_Drawer)& theStyle,
60                                    const Standard_Integer theMode) Standard_OVERRIDE;
61
62     virtual void Unhilight (const Handle(PrsMgr_PresentationManager)& PM, const Standard_Integer aMode) Standard_OVERRIDE;
63
64   private:
65
66     SelectMgr_SelectableObject* myAssembly;
67   };
68
69 }
70
71 //=======================================================================
72 //function : SelectMgr_AssemblyEntityOwner
73 //purpose  : 
74 //=======================================================================
75 SelectMgr_AssemblyEntityOwner::SelectMgr_AssemblyEntityOwner (const Handle(SelectMgr_EntityOwner) theOwner,
76                                                               SelectMgr_SelectableObject* theAssembly)
77 :
78   SelectMgr_EntityOwner (theOwner),
79   myAssembly (theAssembly)
80 {
81 }
82
83 //=======================================================================
84 //function : IsHilighted
85 //purpose  : 
86 //=======================================================================
87 Standard_Boolean SelectMgr_AssemblyEntityOwner::IsHilighted (const Handle(PrsMgr_PresentationManager)& PM,
88                                                              const Standard_Integer aMode) const 
89 {
90   if (HasSelectable())
91   {
92    return PM->IsHighlighted (myAssembly, aMode);
93   }
94
95   return Standard_False;
96 }
97
98 //=======================================================================
99 //function : HilightWithColor
100 //purpose  : 
101 //=======================================================================
102 void SelectMgr_AssemblyEntityOwner::HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM,
103                                                       const Handle(Prs3d_Drawer)& theStyle,
104                                                       const Standard_Integer theMode)
105 {
106   if (HasSelectable())
107   {
108     if (IsAutoHilight())
109     {
110       thePM->Color (myAssembly, theStyle, theMode);
111     }
112     else
113     {
114       myAssembly->HilightOwnerWithColor (thePM, theStyle, this);
115     }
116   }
117 }
118
119 //=======================================================================
120 //function : Unhilight
121 //purpose  : 
122 //=======================================================================
123 void SelectMgr_AssemblyEntityOwner::Unhilight (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
124                                                const Standard_Integer )
125 {
126   if (HasSelectable())
127   {
128     thePrsMgr->Unhighlight (myAssembly);
129   }
130 }
131
132
133 //=======================================================================
134 //function : AIS_MultipleConnectedInteractive
135 //purpose  : 
136 //=======================================================================
137
138 AIS_MultipleConnectedInteractive::AIS_MultipleConnectedInteractive()
139   : AIS_InteractiveObject (PrsMgr_TOP_AllView)
140 {
141   myHasOwnPresentations = Standard_False;
142   myAssemblyOwner = NULL;
143 }
144
145 //=======================================================================
146 //function : Type
147 //purpose  : 
148 //=======================================================================
149 AIS_KindOfInteractive AIS_MultipleConnectedInteractive::Type() const
150 {
151   return AIS_KOI_Object;
152 }
153
154 //=======================================================================
155 //function : Signature
156 //purpose  : 
157 //=======================================================================
158 Standard_Integer AIS_MultipleConnectedInteractive::Signature() const
159 {
160   return 1;
161 }
162
163 //=======================================================================
164 //function : connect
165 //purpose  :
166 //=======================================================================
167 Handle(AIS_InteractiveObject) AIS_MultipleConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
168                                                                          const Handle(Geom_Transformation)& theTrsf,
169                                                                          const Handle(Graphic3d_TransformPers)& theTrsfPers)
170 {
171   if (myAssemblyOwner.IsNull())
172     myAssemblyOwner = new SelectMgr_EntityOwner (this);
173
174   Handle(AIS_InteractiveObject) anObjectToAdd;
175
176   Handle(AIS_MultipleConnectedInteractive) aMultiConnected = Handle(AIS_MultipleConnectedInteractive)::DownCast (theAnotherObj);
177   if (!aMultiConnected.IsNull())
178   { 
179     Handle(AIS_MultipleConnectedInteractive) aNewMultiConnected = new AIS_MultipleConnectedInteractive();
180     aNewMultiConnected->myAssemblyOwner = myAssemblyOwner;
181     aNewMultiConnected->SetLocalTransformation (aMultiConnected->LocalTransformationGeom());
182
183     // Perform deep copy of instance tree
184     for (PrsMgr_ListOfPresentableObjectsIter anIter (aMultiConnected->Children()); anIter.More(); anIter.Next())
185     {
186       Handle(AIS_InteractiveObject) anInteractive = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
187       if (anInteractive.IsNull())
188       {
189         continue;
190       }
191
192       aNewMultiConnected->Connect (anInteractive);     
193     }
194
195     anObjectToAdd = aNewMultiConnected;
196   }
197   else
198   {
199     Handle(AIS_ConnectedInteractive) aNewConnected = new AIS_ConnectedInteractive();
200     aNewConnected->Connect (theAnotherObj, theAnotherObj->LocalTransformationGeom());
201
202     anObjectToAdd = aNewConnected;
203   }
204
205   anObjectToAdd->SetLocalTransformation (theTrsf);
206   if (!theTrsfPers.IsNull())
207   {
208     anObjectToAdd->SetTransformPersistence (theTrsfPers);
209   }
210   AddChild (anObjectToAdd);
211   return anObjectToAdd;
212 }
213
214 //=======================================================================
215 //function : HasConnection
216 //purpose  : 
217 //=======================================================================
218 Standard_Boolean AIS_MultipleConnectedInteractive::HasConnection() const 
219 {
220   return (Children().Size() != 0);
221 }
222
223 //=======================================================================
224 //function : Disconnect
225 //purpose  : 
226 //=======================================================================
227
228 void AIS_MultipleConnectedInteractive::Disconnect(const Handle(AIS_InteractiveObject)& anotherIObj)
229 {
230   RemoveChild (anotherIObj);
231 }
232
233 //=======================================================================
234 //function : DisconnectAll
235 //purpose  : 
236 //=======================================================================
237
238 void AIS_MultipleConnectedInteractive::DisconnectAll()
239 {
240   Standard_Integer aNbItemsToRemove = Children().Size();
241   for (Standard_Integer anIter = 0; anIter < aNbItemsToRemove; ++anIter)
242   {
243     RemoveChild (Children().First());
244   }
245 }
246
247 //=======================================================================
248 //function : Compute
249 //purpose  :
250 //=======================================================================
251 void AIS_MultipleConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePrsMgr*/,
252                                                 const Handle(Prs3d_Presentation)&           /*thePrs*/,
253                                                 const Standard_Integer                      /*theMode*/)
254 {
255   Handle(AIS_InteractiveContext) aCtx = GetContext();
256   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
257   {
258     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
259     if (!aChild.IsNull())
260     {
261       aChild->SetContext (aCtx);
262     }
263   }
264 }
265
266 //=======================================================================
267 //function : Compute
268 //purpose  : 
269 //=======================================================================
270
271 void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector,
272                                                const Handle(Prs3d_Presentation)& aPresentation)
273 {
274   PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
275 }
276
277 //=======================================================================
278 //function : Compute
279 //purpose  : 
280 //=======================================================================
281
282 void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector,
283                                                const Handle(Geom_Transformation)& aTransformation,
284                                                const Handle(Prs3d_Presentation)& aPresentation)
285 {
286   PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
287 }
288
289 //=======================================================================
290 //function : AcceptShapeDecomposition
291 //purpose  : 
292 //=======================================================================
293 Standard_Boolean AIS_MultipleConnectedInteractive::AcceptShapeDecomposition() const 
294 {
295   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
296   {
297     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
298     if (aChild.IsNull())
299     {
300       continue;
301     }
302
303     if (aChild->AcceptShapeDecomposition())
304     {
305       return Standard_True;
306     }
307   }
308   return Standard_False;
309 }
310
311 //=======================================================================
312 //function : ComputeSelection
313 //purpose  : 
314 //=======================================================================
315 void AIS_MultipleConnectedInteractive::ComputeSelection (const Handle(SelectMgr_Selection)& /*theSelection*/,
316                                                          const Standard_Integer             theMode)
317 {
318   if (theMode != 0)
319   {
320     for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
321     {
322       Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
323       if (aChild.IsNull())
324       {
325         continue;
326       }
327
328       if (!aChild->HasSelection (theMode))
329       {
330         aChild->RecomputePrimitives (theMode);
331       }
332
333       Handle(SelectMgr_Selection) aSelection = new SelectMgr_Selection (theMode);
334       aChild->ComputeSelection (aSelection, theMode);
335     }
336   }
337 }
338
339 //=======================================================================
340 //function : GlobalSelOwner
341 //purpose  :
342 //=======================================================================
343 Handle(SelectMgr_EntityOwner) AIS_MultipleConnectedInteractive::GlobalSelOwner() const
344 {
345   return myAssemblyOwner;
346 }
347
348 //=======================================================================
349 //function : HasSelection
350 //purpose  :
351 //=======================================================================
352 Standard_Boolean AIS_MultipleConnectedInteractive::HasSelection (const Standard_Integer theMode) const
353 {
354   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
355   {
356     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
357     if (aChild.IsNull())
358       continue;
359
360     if (!aChild->HasSelection (theMode))
361       return Standard_False;
362   }
363
364   return Standard_True;
365 }
366
367 //=======================================================================
368 //function : SetContext
369 //purpose  :
370 //=======================================================================
371 void AIS_MultipleConnectedInteractive::SetContext (const Handle(AIS_InteractiveContext)& theCtx)
372 {
373   AIS_InteractiveObject::SetContext (theCtx);
374   for (PrsMgr_ListOfPresentableObjectsIter anIter (Children()); anIter.More(); anIter.Next())
375   {
376     Handle(AIS_InteractiveObject) aChild = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
377     if (!aChild.IsNull())
378     {
379       aChild->SetContext (theCtx);
380     }
381   }
382 }