0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / AIS / AIS_ConnectedInteractive.cxx
CommitLineData
b311480e 1// Created on: 1997-01-08
2// Created by: Robert COUBLANC
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
42cf5bc1 18#include <AIS_ConnectedInteractive.hxx>
19#include <AIS_InteractiveContext.hxx>
20#include <AIS_InteractiveObject.hxx>
21#include <AIS_Shape.hxx>
22#include <BRepTools.hxx>
7fd59977 23#include <Geom_Transformation.hxx>
42cf5bc1 24#include <gp_Trsf.hxx>
25#include <NCollection_DataMap.hxx>
26#include <Precision.hxx>
27#include <Prs3d_Drawer.hxx>
28#include <Prs3d_Presentation.hxx>
29#include <Prs3d_Projector.hxx>
7fd59977 30#include <PrsMgr_ModedPresentation.hxx>
af324faa 31#include <PrsMgr_Presentation.hxx>
42cf5bc1 32#include <Select3D_SensitiveEntity.hxx>
33#include <SelectMgr_EntityOwner.hxx>
34#include <SelectMgr_Selection.hxx>
35#include <Standard_NotImplemented.hxx>
36#include <Standard_ProgramError.hxx>
37#include <Standard_Type.hxx>
38#include <StdPrs_HLRPolyShape.hxx>
39#include <StdPrs_WFDeflectionShape.hxx>
0717ddc1 40#include <StdSelect.hxx>
42cf5bc1 41#include <StdSelect_BRepOwner.hxx>
42#include <TopAbs_ShapeEnum.hxx>
43#include <TopoDS_Shape.hxx>
0717ddc1 44#include <TopTools_IndexedMapOfShape.hxx>
45#include <TopTools_OrientedShapeMapHasher.hxx>
46
7fd59977 47//=======================================================================
48//function : AIS_ConnectedInteractive
49//purpose :
50//=======================================================================
51AIS_ConnectedInteractive::AIS_ConnectedInteractive(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
52AIS_InteractiveObject(aTypeOfPresentation3d)
0717ddc1 53{
7fd59977 54 SetHilightMode(0);
55}
56
57//=======================================================================
58//function : Type
59//purpose :
60//=======================================================================
61AIS_KindOfInteractive AIS_ConnectedInteractive::Type() const
0717ddc1 62{
63 return AIS_KOI_Object;
64}
7fd59977 65
66Standard_Integer AIS_ConnectedInteractive::Signature() const
0717ddc1 67{
68 return 0;
69}
7fd59977 70
71
72//=======================================================================
73//function : Connect
74//purpose :
75//=======================================================================
0717ddc1 76void AIS_ConnectedInteractive::Connect (const Handle(AIS_InteractiveObject)& theAnotherObj)
7fd59977 77{
0717ddc1 78 if (myReference == theAnotherObj) return;
79
80 Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (theAnotherObj);
81 if (!aConnected.IsNull())
82 {
83 myReference = aConnected->myReference;
84 }
85 else if (theAnotherObj->HasOwnPresentations())
86 {
87 myReference = theAnotherObj;
88 }
40f70ac9 89 else
90 {
91 Standard_ProgramError::Raise ("AIS_ConnectedInteractive::Connect() - object without own presentation can not be connected");
92 }
0717ddc1 93
94 if (!myReference.IsNull())
95 {
96 myTypeOfPresentation3d = myReference->TypeOfPresentation3d();
97 }
7fd59977 98}
99
100//=======================================================================
101//function : Connect
102//purpose :
103//=======================================================================
0717ddc1 104void AIS_ConnectedInteractive::Connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
105 const gp_Trsf& theLocation)
7fd59977 106{
0717ddc1 107 Connect (theAnotherObj);
108
109 SetLocalTransformation (theLocation);
7fd59977 110}
111
112
113//=======================================================================
114//function : Disconnect
af324faa 115//purpose :
7fd59977 116//=======================================================================
117
118void AIS_ConnectedInteractive::Disconnect()
119{
af324faa 120 for(Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
121 {
122 const Handle(PrsMgr_Presentation)& aPrs = myPresentations (aPrsIter).Presentation();
123 if (!aPrs.IsNull())
7fd59977 124 {
af324faa 125 aPrs->Presentation()->DisconnectAll (Graphic3d_TOC_DESCENDANT);
7fd59977 126 }
af324faa 127 }
7fd59977 128}
129//=======================================================================
130//function : Compute
792c785c 131//purpose :
7fd59977 132//=======================================================================
792c785c 133void AIS_ConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
134 const Handle(Prs3d_Presentation)& thePrs,
135 const Standard_Integer theMode)
7fd59977 136{
792c785c 137 if (HasConnection())
138 {
139 thePrs->Clear (Standard_False);
140 thePrs->RemoveAll();
141
142 if (!myReference->HasInteractiveContext())
143 {
144 myReference->SetContext (GetContext());
145 }
146 thePrsMgr->Connect (this, myReference, theMode, theMode);
147 if (thePrsMgr->Presentation (myReference, theMode)->MustBeUpdated())
148 {
149 thePrsMgr->Update (myReference, theMode);
150 }
151 }
152
0717ddc1 153 if (!thePrs.IsNull())
792c785c 154 {
0717ddc1 155 thePrs->ReCompute();
7fd59977 156 }
7fd59977 157}
158
0717ddc1 159//=======================================================================
160//function : Compute
161//purpose :
162//=======================================================================
163void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
164 const Handle(Geom_Transformation)& theTransformation,
165 const Handle(Prs3d_Presentation)& thePresentation)
7fd59977 166{
0717ddc1 167 updateShape (Standard_False);
168 if (myShape.IsNull())
169 {
170 return;
171 }
172 const TopLoc_Location& aLocation = myShape.Location();
173 TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation);
174 Compute (theProjector, thePresentation, aShape);
7fd59977 175}
176
0717ddc1 177//=======================================================================
178//function : Compute
179//purpose :
180//=======================================================================
857ffd5e 181void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)
7fd59977 182{
0717ddc1 183 updateShape (Standard_True);
184 Compute (aProjector, aPresentation, myShape);
7fd59977 185}
186
7fd59977 187//=======================================================================
0717ddc1 188//function : Compute
189//purpose :
7fd59977 190//=======================================================================
0717ddc1 191void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
192 const Handle(Prs3d_Presentation)& thePresentation,
193 const TopoDS_Shape& theShape)
7fd59977 194{
0717ddc1 195 if (myShape.IsNull())
196 {
197 return;
198 }
ac04d101 199
0717ddc1 200 switch (theShape.ShapeType())
ac04d101 201 {
0717ddc1 202 case TopAbs_VERTEX:
203 case TopAbs_EDGE:
204 case TopAbs_WIRE:
ac04d101 205 {
0717ddc1 206 thePresentation->SetDisplayPriority (4);
207 StdPrs_WFDeflectionShape::Add (thePresentation, theShape, myDrawer);
208 break;
209 }
210 default:
211 {
212 Handle(Prs3d_Drawer) aDefaultDrawer = GetContext()->DefaultDrawer();
213 if (aDefaultDrawer->DrawHiddenLine())
214 {
215 myDrawer->EnableDrawHiddenLine();
216 }
217 else
218 {
219 myDrawer->DisableDrawHiddenLine();
220 }
221
222 Aspect_TypeOfDeflection aPrevDeflection = aDefaultDrawer->TypeOfDeflection();
223 aDefaultDrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
224
225 // process HLRAngle and HLRDeviationCoefficient()
226 Standard_Real aPrevAngle = myDrawer->HLRAngle();
227 Standard_Real aNewAngle = aDefaultDrawer->HLRAngle();
4c513386 228 if (myDrawer->IsAutoTriangulation() &&
229 Abs (aNewAngle - aPrevAngle) > Precision::Angular())
ac04d101 230 {
0717ddc1 231 BRepTools::Clean (theShape);
ac04d101 232 }
0717ddc1 233
234 myDrawer->SetHLRAngle (aNewAngle);
235 myDrawer->SetHLRDeviationCoefficient (aDefaultDrawer->HLRDeviationCoefficient());
236 StdPrs_HLRPolyShape::Add (thePresentation, theShape, myDrawer, theProjector);
237 aDefaultDrawer->SetTypeOfDeflection (aPrevDeflection);
7fd59977 238 }
239 }
7fd59977 240}
241
0717ddc1 242//=======================================================================
243//function : updateShape
244//purpose :
245//=======================================================================
246void AIS_ConnectedInteractive::updateShape (const Standard_Boolean isWithLocation)
7fd59977 247{
0717ddc1 248 Handle(AIS_Shape) anAisShape = Handle(AIS_Shape)::DownCast (myReference);
249 if (anAisShape.IsNull())
250 {
251 return;
252 }
253
254 TopoDS_Shape aShape = anAisShape->Shape();
255 if (aShape.IsNull())
256 {
257 return;
258 }
259
260 if(!isWithLocation)
261 {
262 myShape = aShape;
263 }
264 else
265 {
266 myShape = aShape.Moved (TopLoc_Location (Transformation()));
267 }
7fd59977 268}
0717ddc1 269
270//=======================================================================
271//function : ComputeSelection
272//purpose :
273//=======================================================================
274void AIS_ConnectedInteractive::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
275 const Standard_Integer theMode)
7fd59977 276{
0717ddc1 277 if (!HasConnection())
278 {
279 return;
280 }
281
282 if (theMode != 0 && myReference->AcceptShapeDecomposition())
283 {
284 computeSubShapeSelection (theSelection, theMode);
285 return;
286 }
287
288 if (!myReference->HasSelection (theMode))
289 {
f751596e 290 myReference->RecomputePrimitives (theMode);
0717ddc1 291 }
292
293 const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection (theMode);
294 Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
295 Handle(Select3D_SensitiveEntity) aSensitive, aNewSensitive;
f751596e 296
297 TopLoc_Location aLocation (Transformation());
298 anOwner->SetLocation (aLocation);
299
0717ddc1 300 if (TheRefSel->IsEmpty())
301 {
f751596e 302 myReference->RecomputePrimitives (theMode);
0717ddc1 303 }
304
305 for (TheRefSel->Init(); TheRefSel->More(); TheRefSel->Next())
306 {
f751596e 307 aSensitive = Handle(Select3D_SensitiveEntity)::DownCast (TheRefSel->Sensitive()->BaseSensitive());
0717ddc1 308 if (!aSensitive.IsNull())
309 {
0717ddc1 310 // Get the copy of SE3D
f751596e 311 aNewSensitive = aSensitive->GetConnected();
0717ddc1 312
313 aNewSensitive->Set(anOwner);
0717ddc1 314
315 theSelection->Add (aNewSensitive);
316 }
317 }
7fd59977 318}
0717ddc1 319
320//=======================================================================
321//function : ComputeSubShapeSelection
322//purpose :
323//=======================================================================
324void AIS_ConnectedInteractive::computeSubShapeSelection (const Handle(SelectMgr_Selection)& theSelection,
325 const Standard_Integer theMode)
7fd59977 326{
0717ddc1 327 typedef NCollection_List<Handle(Select3D_SensitiveEntity)> SensitiveList;
328 typedef NCollection_DataMap<TopoDS_Shape, SensitiveList, TopTools_OrientedShapeMapHasher>
329 Shapes2EntitiesMap;
330
331 if (!myReference->HasSelection (theMode))
f751596e 332 myReference->RecomputePrimitives (theMode);
0717ddc1 333
334 const Handle(SelectMgr_Selection)& aRefSel = myReference->Selection (theMode);
335
336 if (aRefSel->IsEmpty() || aRefSel->UpdateStatus() == SelectMgr_TOU_Full)
337 {
f751596e 338 myReference->RecomputePrimitives (theMode);
0717ddc1 339 }
340
341 Handle(StdSelect_BRepOwner) anOwner;
342 TopLoc_Location aDummyLoc;
343
344 Handle(Select3D_SensitiveEntity) aSE, aNewSE;
345 Shapes2EntitiesMap aShapes2EntitiesMap;
346
347 SensitiveList aSEList;
348 TopoDS_Shape aSubShape;
349
350 // Fill in the map of subshapes and corresponding
351 // sensitive entities associated with aMode
352 for (aRefSel->Init(); aRefSel->More(); aRefSel->Next())
353 {
f751596e 354 aSE = Handle(Select3D_SensitiveEntity)::DownCast (aRefSel->Sensitive()->BaseSensitive());
0717ddc1 355 if(!aSE.IsNull())
356 {
357 anOwner = Handle(StdSelect_BRepOwner)::DownCast (aSE->OwnerId());
358 if(!anOwner.IsNull())
359 {
360 aSubShape = anOwner->Shape();
361 if(!aShapes2EntitiesMap.IsBound (aSubShape))
362 {
363 aShapes2EntitiesMap.Bind (aSubShape, aSEList);
364 }
365 aShapes2EntitiesMap (aSubShape).Append (aSE);
366 }
367 }
368 }
369
370 // Fill in selection from aShapes2EntitiesMap
371 for (Shapes2EntitiesMap::Iterator aMapIt (aShapes2EntitiesMap); aMapIt.More(); aMapIt.Next())
372 {
373 aSEList = aMapIt.Value();
374 anOwner = new StdSelect_BRepOwner (aMapIt.Key(),
375 this,
376 aSEList.First()->OwnerId()->Priority(),
377 Standard_True);
f751596e 378 anOwner->SetLocation (Transformation());
0717ddc1 379
380 for (SensitiveList::Iterator aListIt (aSEList); aListIt.More(); aListIt.Next())
f751596e 381 {
0717ddc1 382 aSE = aListIt.Value();
383
f751596e 384 aNewSE = aSE->GetConnected();
0717ddc1 385 aNewSE->Set (anOwner);
0717ddc1 386
387 theSelection->Add (aNewSE);
388 }
389 }
390
391 StdSelect::SetDrawerForBRepOwner (theSelection, myDrawer);
392}