0029787: Visualization - Avoid in presentation edges of certain continuity class
[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
42cf5bc1 17#include <AIS_ConnectedInteractive.hxx>
1f7f5a90 18
42cf5bc1 19#include <AIS_InteractiveContext.hxx>
42cf5bc1 20#include <AIS_Shape.hxx>
21#include <BRepTools.hxx>
42cf5bc1 22#include <NCollection_DataMap.hxx>
23#include <Precision.hxx>
24#include <Prs3d_Drawer.hxx>
42cf5bc1 25#include <Prs3d_Projector.hxx>
7fd59977 26#include <PrsMgr_ModedPresentation.hxx>
42cf5bc1 27#include <Select3D_SensitiveEntity.hxx>
28#include <SelectMgr_EntityOwner.hxx>
29#include <SelectMgr_Selection.hxx>
30#include <Standard_NotImplemented.hxx>
31#include <Standard_ProgramError.hxx>
32#include <Standard_Type.hxx>
33#include <StdPrs_HLRPolyShape.hxx>
5ad8c033 34#include <StdPrs_WFShape.hxx>
0717ddc1 35#include <StdSelect.hxx>
42cf5bc1 36#include <StdSelect_BRepOwner.hxx>
37#include <TopAbs_ShapeEnum.hxx>
38#include <TopoDS_Shape.hxx>
0717ddc1 39#include <TopTools_IndexedMapOfShape.hxx>
40#include <TopTools_OrientedShapeMapHasher.hxx>
41
92efcf78 42IMPLEMENT_STANDARD_RTTIEXT(AIS_ConnectedInteractive,AIS_InteractiveObject)
43
7fd59977 44//=======================================================================
45//function : AIS_ConnectedInteractive
46//purpose :
47//=======================================================================
48AIS_ConnectedInteractive::AIS_ConnectedInteractive(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
49AIS_InteractiveObject(aTypeOfPresentation3d)
0717ddc1 50{
f838dac4 51 //
7fd59977 52}
53
7fd59977 54//=======================================================================
1f7f5a90 55//function : connect
56//purpose :
7fd59977 57//=======================================================================
1f7f5a90 58void AIS_ConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
59 const Handle(Geom_Transformation)& theLocation)
7fd59977 60{
1f7f5a90 61 if (myReference == theAnotherObj)
62 {
63 setLocalTransformation (theLocation);
64 return;
65 }
0717ddc1 66
67 Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (theAnotherObj);
68 if (!aConnected.IsNull())
69 {
70 myReference = aConnected->myReference;
71 }
72 else if (theAnotherObj->HasOwnPresentations())
73 {
74 myReference = theAnotherObj;
75 }
40f70ac9 76 else
77 {
9775fa61 78 throw Standard_ProgramError("AIS_ConnectedInteractive::Connect() - object without own presentation can not be connected");
40f70ac9 79 }
0717ddc1 80
81 if (!myReference.IsNull())
82 {
83 myTypeOfPresentation3d = myReference->TypeOfPresentation3d();
84 }
1f7f5a90 85 setLocalTransformation (theLocation);
7fd59977 86}
87
7fd59977 88//=======================================================================
89//function : Disconnect
af324faa 90//purpose :
7fd59977 91//=======================================================================
92
93void AIS_ConnectedInteractive::Disconnect()
94{
af324faa 95 for(Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
96 {
97 const Handle(PrsMgr_Presentation)& aPrs = myPresentations (aPrsIter).Presentation();
98 if (!aPrs.IsNull())
7fd59977 99 {
af324faa 100 aPrs->Presentation()->DisconnectAll (Graphic3d_TOC_DESCENDANT);
7fd59977 101 }
af324faa 102 }
7fd59977 103}
104//=======================================================================
105//function : Compute
792c785c 106//purpose :
7fd59977 107//=======================================================================
792c785c 108void AIS_ConnectedInteractive::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
109 const Handle(Prs3d_Presentation)& thePrs,
110 const Standard_Integer theMode)
7fd59977 111{
792c785c 112 if (HasConnection())
113 {
114 thePrs->Clear (Standard_False);
115 thePrs->RemoveAll();
116
117 if (!myReference->HasInteractiveContext())
118 {
119 myReference->SetContext (GetContext());
120 }
121 thePrsMgr->Connect (this, myReference, theMode, theMode);
122 if (thePrsMgr->Presentation (myReference, theMode)->MustBeUpdated())
123 {
124 thePrsMgr->Update (myReference, theMode);
125 }
126 }
127
0717ddc1 128 if (!thePrs.IsNull())
792c785c 129 {
0717ddc1 130 thePrs->ReCompute();
7fd59977 131 }
7fd59977 132}
133
0717ddc1 134//=======================================================================
135//function : Compute
136//purpose :
137//=======================================================================
138void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
139 const Handle(Geom_Transformation)& theTransformation,
140 const Handle(Prs3d_Presentation)& thePresentation)
7fd59977 141{
0717ddc1 142 updateShape (Standard_False);
143 if (myShape.IsNull())
144 {
145 return;
146 }
147 const TopLoc_Location& aLocation = myShape.Location();
148 TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation);
149 Compute (theProjector, thePresentation, aShape);
7fd59977 150}
151
0717ddc1 152//=======================================================================
153//function : Compute
154//purpose :
155//=======================================================================
857ffd5e 156void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)
7fd59977 157{
0717ddc1 158 updateShape (Standard_True);
159 Compute (aProjector, aPresentation, myShape);
7fd59977 160}
161
7fd59977 162//=======================================================================
0717ddc1 163//function : Compute
164//purpose :
7fd59977 165//=======================================================================
0717ddc1 166void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
c7ba4578 167 const Handle(Prs3d_Presentation)& thePrs,
0717ddc1 168 const TopoDS_Shape& theShape)
7fd59977 169{
c7ba4578 170 AIS_Shape::computeHlrPresentation (theProjector, thePrs, theShape, myDrawer);
7fd59977 171}
172
0717ddc1 173//=======================================================================
174//function : updateShape
175//purpose :
176//=======================================================================
177void AIS_ConnectedInteractive::updateShape (const Standard_Boolean isWithLocation)
7fd59977 178{
0717ddc1 179 Handle(AIS_Shape) anAisShape = Handle(AIS_Shape)::DownCast (myReference);
180 if (anAisShape.IsNull())
181 {
182 return;
183 }
184
185 TopoDS_Shape aShape = anAisShape->Shape();
186 if (aShape.IsNull())
187 {
188 return;
189 }
190
191 if(!isWithLocation)
192 {
193 myShape = aShape;
194 }
195 else
196 {
197 myShape = aShape.Moved (TopLoc_Location (Transformation()));
198 }
7fd59977 199}
0717ddc1 200
201//=======================================================================
202//function : ComputeSelection
203//purpose :
204//=======================================================================
205void AIS_ConnectedInteractive::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
206 const Standard_Integer theMode)
7fd59977 207{
0717ddc1 208 if (!HasConnection())
209 {
210 return;
211 }
212
213 if (theMode != 0 && myReference->AcceptShapeDecomposition())
214 {
215 computeSubShapeSelection (theSelection, theMode);
216 return;
217 }
218
219 if (!myReference->HasSelection (theMode))
220 {
f751596e 221 myReference->RecomputePrimitives (theMode);
0717ddc1 222 }
223
224 const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection (theMode);
225 Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
f751596e 226
227 TopLoc_Location aLocation (Transformation());
228 anOwner->SetLocation (aLocation);
229
0717ddc1 230 if (TheRefSel->IsEmpty())
231 {
f751596e 232 myReference->RecomputePrimitives (theMode);
0717ddc1 233 }
234
b5cce1ab 235 for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (TheRefSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
0717ddc1 236 {
834f2897 237 if (Handle(Select3D_SensitiveEntity) aSensitive = Handle(Select3D_SensitiveEntity)::DownCast (aSelEntIter.Value()->BaseSensitive()))
0717ddc1 238 {
0717ddc1 239 // Get the copy of SE3D
834f2897 240 if (Handle(Select3D_SensitiveEntity) aNewSensitive = aSensitive->GetConnected())
241 {
242 aNewSensitive->Set(anOwner);
243 theSelection->Add (aNewSensitive);
244 }
0717ddc1 245 }
246 }
7fd59977 247}
0717ddc1 248
249//=======================================================================
250//function : ComputeSubShapeSelection
251//purpose :
252//=======================================================================
253void AIS_ConnectedInteractive::computeSubShapeSelection (const Handle(SelectMgr_Selection)& theSelection,
254 const Standard_Integer theMode)
7fd59977 255{
0717ddc1 256 typedef NCollection_List<Handle(Select3D_SensitiveEntity)> SensitiveList;
257 typedef NCollection_DataMap<TopoDS_Shape, SensitiveList, TopTools_OrientedShapeMapHasher>
258 Shapes2EntitiesMap;
259
260 if (!myReference->HasSelection (theMode))
b5cce1ab 261 {
f751596e 262 myReference->RecomputePrimitives (theMode);
b5cce1ab 263 }
0717ddc1 264
b5cce1ab 265 const Handle(SelectMgr_Selection)& aRefSel = myReference->Selection (theMode);
0717ddc1 266 if (aRefSel->IsEmpty() || aRefSel->UpdateStatus() == SelectMgr_TOU_Full)
267 {
f751596e 268 myReference->RecomputePrimitives (theMode);
0717ddc1 269 }
0717ddc1 270
b5cce1ab 271 // Fill in the map of subshapes and corresponding sensitive entities associated with aMode
0717ddc1 272 Shapes2EntitiesMap aShapes2EntitiesMap;
b5cce1ab 273 for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aRefSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
0717ddc1 274 {
b5cce1ab 275 if (Handle(Select3D_SensitiveEntity) aSE = Handle(Select3D_SensitiveEntity)::DownCast (aSelEntIter.Value()->BaseSensitive()))
0717ddc1 276 {
b5cce1ab 277 if (Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast (aSE->OwnerId()))
0717ddc1 278 {
b5cce1ab 279 const TopoDS_Shape& aSubShape = anOwner->Shape();
0717ddc1 280 if(!aShapes2EntitiesMap.IsBound (aSubShape))
281 {
b5cce1ab 282 aShapes2EntitiesMap.Bind (aSubShape, SensitiveList());
0717ddc1 283 }
284 aShapes2EntitiesMap (aSubShape).Append (aSE);
285 }
286 }
287 }
288
289 // Fill in selection from aShapes2EntitiesMap
290 for (Shapes2EntitiesMap::Iterator aMapIt (aShapes2EntitiesMap); aMapIt.More(); aMapIt.Next())
291 {
b5cce1ab 292 const SensitiveList& aSEList = aMapIt.Value();
293 Handle(StdSelect_BRepOwner) anOwner = new StdSelect_BRepOwner (aMapIt.Key(), this, aSEList.First()->OwnerId()->Priority(), Standard_True);
f751596e 294 anOwner->SetLocation (Transformation());
0717ddc1 295 for (SensitiveList::Iterator aListIt (aSEList); aListIt.More(); aListIt.Next())
f751596e 296 {
834f2897 297 if (Handle(Select3D_SensitiveEntity) aNewSE = aListIt.Value()->GetConnected())
298 {
299 aNewSE->Set (anOwner);
300 theSelection->Add (aNewSE);
301 }
0717ddc1 302 }
303 }
304
305 StdSelect::SetDrawerForBRepOwner (theSelection, myDrawer);
306}