0022627: Change OCCT memory management defaults
[occt.git] / src / AIS / AIS_ConcentricRelation.cxx
CommitLineData
7fd59977 1// File: AIS_ConcentricRelation.cdl
2// Created: Tue Dec 5 15:09:04 1996
3// Author: Flore Lantheaume/Odile Olivier
4// <ODL>
5
6#include <Standard_NotImplemented.hxx>
7
8#include <AIS_ConcentricRelation.ixx>
9
10#include <SelectMgr_EntityOwner.hxx>
11#include <Select3D_SensitiveCircle.hxx>
12#include <Select3D_SensitiveSegment.hxx>
13
14#include <DsgPrs_ConcentricPresentation.hxx>
15
16#include <TopoDS.hxx>
17
18#include <BRepAdaptor_Curve.hxx>
19
20#include <GeomAbs_CurveType.hxx>
21#include <Geom_Circle.hxx>
22#include <gp_Dir.hxx>
23#include <gp_Vec.hxx>
24#include <gp_Ax2.hxx>
25#include <gp_Ax1.hxx>
26#include <gp_Pnt.hxx>
27#include <gp_Pln.hxx>
28
29#include <TopoDS_Vertex.hxx>
30#include <AIS.hxx>
31
32//=======================================================================
33//function : Constructor
34//purpose :
35//=======================================================================
36
37AIS_ConcentricRelation::AIS_ConcentricRelation(
38 const TopoDS_Shape& aFShape,
39 const TopoDS_Shape& aSShape,
40 const Handle(Geom_Plane)& aPlane)
41{
42 myFShape = aFShape;
43 mySShape = aSShape;
44 myPlane = aPlane;
45 myDir = aPlane->Pln().Axis().Direction();
46}
47
48//=======================================================================
49//function : Compute
50//purpose :
51//=======================================================================
52void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&,
53 const Handle(Prs3d_Presentation)& aPresentation,
54 const Standard_Integer)
55{
56 aPresentation->Clear();
57
58 TopAbs_ShapeEnum type2(mySShape.ShapeType());
59 aPresentation->SetInfiniteState(Standard_True);
60 switch (myFShape.ShapeType()) {
61 case TopAbs_EDGE:
62 {
63 if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation);
64 else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation);
65 }
66 break;
67
68 case TopAbs_VERTEX:
69 {
70 if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation);
71 else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation);
72 }
73 break;
74 default: {return;}
75 }
76}
77
78void AIS_ConcentricRelation::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Geom_Transformation& aTransformation, const Handle_Prs3d_Presentation& aPresentation)
79{
80// Standard_NotImplemented::Raise("AIS_ConcentricRelation::Compute(const Handle_Prs3d_Projector&, const Handle_Geom_Transformation&, const Handle_Prs3d_Presentation&)");
81 PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
82}
83
84//=======================================================================
85//function : ComputeTwoEdgesConcentric
86//purpose :
87//=======================================================================
88void AIS_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation)
89{
90 TopoDS_Edge E;
91 TopoDS_Vertex V;
92 if (myFShape.ShapeType() == TopAbs_EDGE) {
93 E = TopoDS::Edge(myFShape);
94 V = TopoDS::Vertex(mySShape);
95 }
96 else {
97 E = TopoDS::Edge(myFShape);
98 V = TopoDS::Vertex(mySShape);
99 }
100 gp_Pnt p1,p2;
101 Handle(Geom_Curve) C;
102 Handle(Geom_Curve) extCurv;
103 Standard_Boolean isInfinite;
104 Standard_Boolean isOnPlanEdge, isOnPlanVertex;
105 if (!AIS::ComputeGeometry(E,C,p1,p2,extCurv,isInfinite,isOnPlanEdge,myPlane)) return;
106 gp_Pnt P;
107 AIS::ComputeGeometry(V,P, myPlane, isOnPlanVertex);
108
109 const Handle(Geom_Circle)& CIRCLE = (Handle(Geom_Circle)&) C;
110 myCenter = CIRCLE->Location();
111 myRad = Min(CIRCLE->Radius()/5.,15.);
112 gp_Dir vec(p1.XYZ() - myCenter.XYZ() );
113 gp_Vec vectrans(vec);
114 myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
115 DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt);
116 if (!isOnPlanEdge) AIS::ComputeProjEdgePresentation(aPresentation,myDrawer,E,CIRCLE,p1,p2);
117 if (!isOnPlanVertex) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V,P);
118}
119
120//=======================================================================
121//function : ComputeTwoEdgesConcentric
122//purpose :
123//=======================================================================
124void AIS_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation)
125{
126 TopoDS_Vertex V1,V2;
127 V1 = TopoDS::Vertex(myFShape);
128 V2 = TopoDS::Vertex(myFShape);
129 Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True);
130 gp_Pnt P1,P2;
131 AIS::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1);
132 AIS::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2);
133 myCenter = P1;
134 myRad = 15.;
135 gp_Dir vec(myPlane->Pln().Position().XDirection());
136 gp_Vec vectrans(vec);
137 myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
138 DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt);
139 if (!isOnPlanVertex1) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V1,P1);
140 if (!isOnPlanVertex1) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V2,P2);
141}
142
143//=======================================================================
144//function : ComputeTwoEdgesConcentric
145//purpose :
146//=======================================================================
147void AIS_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation)
148{
149 BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape));
150 BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape));
151
152 gp_Pnt ptat11,ptat12,ptat21,ptat22;
153 Handle(Geom_Curve) geom1,geom2;
154 Standard_Boolean isInfinite1,isInfinite2;
155 Handle(Geom_Curve) extCurv;
156 if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape),
157 TopoDS::Edge(mySShape),
158 myExtShape,
159 geom1,
160 geom2,
161 ptat11,
162 ptat12,
163 ptat21,
164 ptat22,
165 extCurv,
166 isInfinite1,isInfinite2,
167 myPlane)) {
168 return;
169 }
170
171 const Handle(Geom_Circle)& gcirc1 = (Handle(Geom_Circle)&) geom1;
172 const Handle(Geom_Circle)& gcirc2 = (Handle(Geom_Circle)&) geom2;
173
174 myCenter = gcirc1->Location();
175
81bba717 176 // choose the radius equal to 1/5 of the smallest radius of
177 // 2 circles. Limit is imposed ( 0.02 by chance)
7fd59977 178 Standard_Real rad1 = gcirc1->Radius();
179 Standard_Real rad2 = gcirc2->Radius();
180 myRad = (rad1 > rad2 ) ? rad2 : rad1;
181 myRad /= 5;
182 if (myRad > 15.) myRad =15.;
183
184
81bba717 185 //Calculate a point of circle of radius myRad
7fd59977 186 gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() );
187 gp_Vec vectrans(vec);
188 myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
189
190 DsgPrs_ConcentricPresentation::Add(aPresentation,
191 myDrawer,
192 myCenter,
193 myRad,
194 myDir,
195 myPnt);
196 if ( (myExtShape != 0) && !extCurv.IsNull()) {
197 gp_Pnt pf, pl;
198 if ( myExtShape == 1 ) {
199 if (!isInfinite1) {
200 pf = ptat11;
201 pl = ptat12;
202 }
203 ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl);
204 }
205 else {
206 if (!isInfinite2) {
207 pf = ptat21;
208 pl = ptat22;
209 }
210 ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl);
211 }
212 }
213}
214
215//=======================================================================
216//function : Compute
217//purpose : to avoid warning
218//=======================================================================
219
220void AIS_ConcentricRelation::Compute(const Handle(Prs3d_Projector)&,
221 const Handle(Prs3d_Presentation)&)
222{
223}
224
225//=======================================================================
226//function : Compute
227//purpose : to avoid warning
228//=======================================================================
229
230void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager2d)&,
231 const Handle(Graphic2d_GraphicObject)&,
232 const Standard_Integer)
233{
234}
235
236//=======================================================================
237//function : ComputeSelection
238//purpose :
239//=======================================================================
240
241void AIS_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
242 const Standard_Integer)
243{
244 Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
245
81bba717 246 //Creation of 2 sensitive circles
247 // the greater
7fd59977 248 gp_Ax2 ax(myCenter, myDir);
249 Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ;
250 Handle(Select3D_SensitiveCircle)
251 sensit = new Select3D_SensitiveCircle (own,
252 Circ);
253 aSelection->Add(sensit);
81bba717 254 // the smaller
7fd59977 255 Circ->SetRadius(myRad/2);
256 sensit = new Select3D_SensitiveCircle (own,
257 Circ);
258 aSelection->Add(sensit);
259
81bba717 260 //Creation of 2 segments sensitive for the cross
7fd59977 261 Handle(Select3D_SensitiveSegment) seg;
262 gp_Pnt otherPnt = myPnt.Mirrored(myCenter);
263 seg = new Select3D_SensitiveSegment(own,
264 otherPnt,
265 myPnt);
266 aSelection->Add(seg);
267
268 gp_Ax1 RotateAxis(myCenter, myDir);
c6541a0c
D
269 gp_Pnt FPnt = myCenter.Rotated(RotateAxis, M_PI/2);
270 gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -M_PI/2);
7fd59977 271 seg = new Select3D_SensitiveSegment(own,
272 FPnt,
273 SPnt);
274 aSelection->Add(seg);
275
276}
277