0023365: Name collision of global IsEqual() leads to overriding user's definition
[occt.git] / src / AIS / AIS_ConnectedShape.cxx
1 // Created on: 1996-04-10
2 // Created by: Guest Design
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21 //              <g_design>
22
23
24 #include <Standard_NotImplemented.hxx>
25
26 #include <AIS_ConnectedShape.ixx>
27
28 #include <AIS_InteractiveContext.hxx>
29 #include <AIS_Drawer.hxx>
30 #include <TopAbs_ShapeEnum.hxx>
31 #include <StdPrs_WFDeflectionShape.hxx>
32 #include <StdPrs_HLRPolyShape.hxx>
33 #include <Prs3d_Drawer.hxx>
34 #include <Aspect_TypeOfDeflection.hxx>
35 #include <BRepTools.hxx>
36 #include <OSD_Timer.hxx>
37 #include <StdSelect_BRepSelectionTool.hxx>
38 #include <StdSelect_BRepOwner.hxx>
39 #include <StdSelect.hxx>
40 #include <TopTools_IndexedMapOfShape.hxx>
41 #include <TopTools_OrientedShapeMapHasher.hxx>
42 #include <TopExp.hxx>
43 #include <Select3D_SensitiveEntity.hxx>
44 #include <SelectMgr_EntityOwner.hxx>
45 #include <SelectBasics_EntityOwner.hxx>
46 #include <AIS_MultipleConnectedShape.hxx>
47 #include <Precision.hxx>
48 #include <NCollection_DataMap.hxx>
49 #include <NCollection_List.hxx>
50
51 //=======================================================================
52 //function : AIS_ConnectedShape
53 //purpose  : 
54 //=======================================================================
55
56 AIS_ConnectedShape::AIS_ConnectedShape (const Handle(AIS_Shape)& TheAISShape,
57                                         const PrsMgr_TypeOfPresentation3d TheType): 
58 AIS_ConnectedInteractive(TheType)
59 {
60   myReference = TheAISShape;
61 }
62
63 AIS_ConnectedShape::AIS_ConnectedShape (const Handle(AIS_ConnectedShape)& TheConnectedShape,
64                                         const PrsMgr_TypeOfPresentation3d TheType): 
65 AIS_ConnectedInteractive(TheType)
66 {
67   myReference = TheConnectedShape;
68 }
69
70
71 //=======================================================================
72 //function : Type
73 //purpose  : 
74 //=======================================================================
75
76 AIS_KindOfInteractive AIS_ConnectedShape::Type() const
77 {return AIS_KOI_Shape;}
78
79 //=======================================================================
80 //function : Signature
81 //purpose  : 
82 //=======================================================================
83 Standard_Integer AIS_ConnectedShape::Signature() const
84 {return 1;}
85
86 //=======================================================================
87 //function : AcceptShapeDecomposition
88 //purpose  : 
89 //=======================================================================
90 Standard_Boolean AIS_ConnectedShape::AcceptShapeDecomposition() const 
91 {return Standard_True;}
92
93 //=======================================================================
94 //function : Compute Hidden Lines
95 //purpose  : 
96 //=======================================================================
97
98 void AIS_ConnectedShape::Compute(const Handle(Prs3d_Projector)& aProjector, 
99                                  const Handle(Prs3d_Presentation)& aPresentation)
100 {
101   UpdateShape(Standard_True);
102   Compute(aProjector,aPresentation,myOwnSh);
103 }
104
105
106 //=======================================================================
107 //function : Compute
108 //purpose  : 
109 //=======================================================================
110 void AIS_ConnectedShape::Compute(const Handle(Prs3d_Projector)& aProjector, 
111                                  const Handle(Geom_Transformation)& TheTrsf,
112                                  const Handle(Prs3d_Presentation)& aPresentation)
113 {
114   UpdateShape(Standard_False);
115   const TopLoc_Location& loc = myOwnSh.Location();
116   TopoDS_Shape shbis = myOwnSh.Located(TopLoc_Location(TheTrsf->Trsf())*loc);
117   Compute(aProjector,aPresentation,shbis);
118 }
119
120
121 //=======================================================================
122 //function : Compute
123 //purpose  : 
124 //=======================================================================
125
126 void AIS_ConnectedShape::Compute(const Handle(Prs3d_Projector)& aProjector, 
127                                  const Handle(Prs3d_Presentation)& aPresentation,
128                                  const TopoDS_Shape& SH)
129 {
130 //  Standard_Boolean recompute = Standard_False;
131 //  Standard_Boolean myFirstCompute = Standard_True;
132   switch (SH.ShapeType()){
133   case TopAbs_VERTEX:
134   case TopAbs_EDGE:
135   case TopAbs_WIRE:
136     {
137       aPresentation->SetDisplayPriority(4);
138       StdPrs_WFDeflectionShape::Add(aPresentation,SH,myDrawer);
139       break;
140     }
141   default:
142     {
143       Handle (Prs3d_Drawer) defdrawer = GetContext()->DefaultDrawer();
144       if (defdrawer->DrawHiddenLine()) 
145         {myDrawer->EnableDrawHiddenLine();}
146       else {myDrawer->DisableDrawHiddenLine();}
147       
148       Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
149       defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
150
151       // process HLRAngle and HLRDeviationCoefficient()
152       Standard_Real prevangl = myDrawer->HLRAngle();
153       Standard_Real newangl = defdrawer->HLRAngle();
154       if (Abs(newangl- prevangl) > Precision::Angular()) {
155 #ifdef DEB
156         cout << "AIS_MultipleConnectedShape : compute"<<endl;
157         cout << "newangl   : " << newangl << " # de " << "prevangl  : " << prevangl << endl;
158 #endif  
159         BRepTools::Clean(SH);
160       }
161       myDrawer->SetHLRAngle(newangl);
162       myDrawer->SetHLRDeviationCoefficient(defdrawer->HLRDeviationCoefficient());
163       StdPrs_HLRPolyShape::Add(aPresentation,SH,myDrawer,aProjector);
164       defdrawer->SetTypeOfDeflection (prevdef);
165     }
166   }
167 }
168
169 //=======================================================================
170 //function : Compute
171 //purpose  : 
172 //=======================================================================
173
174 void AIS_ConnectedShape::Compute(const Handle_PrsMgr_PresentationManager2d& aPresentationManager2d,
175                                  const Handle_Graphic2d_GraphicObject& aGraphicObject,
176                                  const int anInteger)
177 {
178 // Standard_NotImplemented::Raise("AIS_ConnectedShape::Compute(const Handle_PrsMgr_PresentationManager2d&, const Handle_Graphic2d_GraphicObject&, const int)");
179  AIS_ConnectedInteractive::Compute( aPresentationManager2d ,aGraphicObject,anInteger) ; 
180 }
181
182 //=======================================================================
183 //function : ComputeSelection 
184 //purpose  : Attention fragile...
185 //=======================================================================
186
187 void AIS_ConnectedShape::ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, 
188                                            const Standard_Integer aMode)
189 {
190   typedef NCollection_List<Handle(Select3D_SensitiveEntity)> SensitiveList;
191   typedef NCollection_DataMap<TopoDS_Shape, SensitiveList, TopTools_OrientedShapeMapHasher>
192     Shapes2EntitiesMap;
193
194   UpdateShape();
195   aSelection->Clear();
196   // It is checked if there is nothing to do with the reference
197   // of type update...
198   
199   if(!myReference->HasSelection(aMode))
200     myReference->UpdateSelection(aMode);
201   const Handle(SelectMgr_Selection)& aRefSel = myReference->Selection(aMode);
202   if(aRefSel->IsEmpty())
203     myReference->UpdateSelection(aMode);
204
205   if(aRefSel->UpdateStatus()==SelectMgr_TOU_Full)
206     myReference->UpdateSelection(aMode);
207   
208   Handle(StdSelect_BRepOwner) anOwner;
209   TopLoc_Location aBidLoc;
210   Handle(Select3D_SensitiveEntity) aSE, aNewSE;
211   Shapes2EntitiesMap aShapes2EntitiesMap;
212   SensitiveList aSEList;
213   TopoDS_Shape aSubShape;
214
215   // Fill in the map of subshapes and corresponding 
216   // sensitive entities associated with aMode 
217   for(aRefSel->Init(); aRefSel->More(); aRefSel->Next())
218   {
219     aSE = Handle(Select3D_SensitiveEntity)::DownCast(aRefSel->Sensitive()); 
220     if(!aSE.IsNull())
221     {
222       anOwner = Handle(StdSelect_BRepOwner)::DownCast(aSE->OwnerId());
223       if(!anOwner.IsNull())
224       {
225         aSubShape = anOwner->Shape(); 
226         if(!aShapes2EntitiesMap.IsBound(aSubShape))
227         {
228           aShapes2EntitiesMap.Bind(aSubShape, aSEList);
229         }
230         aShapes2EntitiesMap(aSubShape).Append(aSE);
231       }
232     }
233   }
234
235   // Fill in selection from aShapes2EntitiesMap
236   Shapes2EntitiesMap::Iterator aMapIt(aShapes2EntitiesMap);
237   for(; aMapIt.More(); aMapIt.Next())
238   {
239     aSEList = aMapIt.Value();
240     anOwner = new StdSelect_BRepOwner(aMapIt.Key(), 
241                                       this, 
242                                       aSEList.First()->OwnerId()->Priority(), 
243                                       Standard_True);
244     
245     SensitiveList::Iterator aListIt(aSEList);
246     for(; aListIt.More(); aListIt.Next())
247     {
248       aSE = aListIt.Value();
249       if(myLocation.IsIdentity())
250       {
251         aNewSE = aSE->GetConnected(aBidLoc);
252         aNewSE->Set(anOwner);
253         // In case if aSE caches some location-dependent data 
254         // that must be updated after setting anOwner
255         aNewSE->SetLocation(aBidLoc);
256       }
257       else
258       {
259         aNewSE = aSE->GetConnected(myLocation); 
260         aNewSE->Set(anOwner); 
261         // In case if aSE caches some location-dependent data 
262         // that must be updated after setting anOwner
263         aNewSE->SetLocation(myLocation);
264       }
265       aSelection->Add(aNewSE);
266     }
267   }
268
269   StdSelect::SetDrawerForBRepOwner(aSelection,myDrawer);  
270 }
271
272 //=======================================================================
273 //function : Shape
274 //purpose  : 
275 //=======================================================================
276
277 const TopoDS_Shape& AIS_ConnectedShape::Shape()
278
279   UpdateShape(); 
280   return myOwnSh;
281 }
282 AIS_ConnectedShape::AIS_ConnectedShape(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
283 AIS_ConnectedInteractive(aTypeOfPresentation3d)
284 {    
285   SetHilightMode(0);
286 }
287   
288 //=======================================================================
289 //function : UpdateShape
290 //purpose  : if<WithLocation=False> computes only the deducted shape
291 //           from reference; does not put "myLocation"
292 //=======================================================================
293 void AIS_ConnectedShape::UpdateShape(const Standard_Boolean WithTheLocation)
294 {
295   if(myReference.IsNull()) return;
296
297   // attention great line...
298   if(myReference->Type()!=AIS_KOI_Shape) return;
299
300   Standard_Integer Sig = myReference->Signature();
301   
302   TopoDS_Shape S ;
303   switch(Sig){
304   case 0:
305     S = (*((Handle(AIS_Shape)*) &myReference))->Shape();
306     break;
307   case 1:
308     S = (*((Handle(AIS_ConnectedShape)*) &myReference))->Shape();
309     break;
310   case 2:
311     S=(*((Handle(AIS_MultipleConnectedShape)*) &myReference))->Shape();
312     break;
313   default:
314     S = myOwnSh;
315   }
316   if(S.IsNull()) return;
317   if(myLocation.IsIdentity() || !WithTheLocation) 
318     myOwnSh = S;
319   else
320     myOwnSh = S.Moved(myLocation);
321 }
322
323
324 //=======================================================================
325 //function : Connect
326 //purpose  : 
327 //=======================================================================
328 void AIS_ConnectedShape::
329 Connect(const Handle(AIS_InteractiveObject)& anotherIObj)
330 {
331   if(anotherIObj->Type()== AIS_KOI_Shape){
332     Standard_Integer Sig = anotherIObj->Signature();
333     if(Sig <=2)
334       AIS_ConnectedInteractive::Connect(anotherIObj);
335   }
336 }
337
338 //=======================================================================
339 //function : Connect
340 //purpose  : 
341 //=======================================================================
342 void AIS_ConnectedShape::
343 Connect(const Handle(AIS_InteractiveObject)& anotherIObj, 
344         const TopLoc_Location& aLocation)
345 {
346   if(anotherIObj->Type()== AIS_KOI_Shape){
347     Standard_Integer Sig = anotherIObj->Signature();
348     if(Sig <=2)
349       AIS_ConnectedInteractive::Connect(anotherIObj,aLocation);
350   }
351 }
352