1 // File: AIS_ConcentricRelation.cdl
2 // Created: Tue Dec 5 15:09:04 1996
3 // Author: Flore Lantheaume/Odile Olivier
6 #include <Standard_NotImplemented.hxx>
8 #include <AIS_ConcentricRelation.ixx>
10 #include <SelectMgr_EntityOwner.hxx>
11 #include <Select3D_SensitiveCircle.hxx>
12 #include <Select3D_SensitiveSegment.hxx>
14 #include <DsgPrs_ConcentricPresentation.hxx>
18 #include <BRepAdaptor_Curve.hxx>
20 #include <GeomAbs_CurveType.hxx>
21 #include <Geom_Circle.hxx>
29 #include <TopoDS_Vertex.hxx>
32 //=======================================================================
33 //function : Constructor
35 //=======================================================================
37 AIS_ConcentricRelation::AIS_ConcentricRelation(
38 const TopoDS_Shape& aFShape,
39 const TopoDS_Shape& aSShape,
40 const Handle(Geom_Plane)& aPlane)
45 myDir = aPlane->Pln().Axis().Direction();
48 //=======================================================================
51 //=======================================================================
52 void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&,
53 const Handle(Prs3d_Presentation)& aPresentation,
54 const Standard_Integer)
56 aPresentation->Clear();
58 TopAbs_ShapeEnum type2(mySShape.ShapeType());
59 aPresentation->SetInfiniteState(Standard_True);
60 switch (myFShape.ShapeType()) {
63 if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation);
64 else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation);
70 if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation);
71 else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation);
78 void AIS_ConcentricRelation::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Geom_Transformation& aTransformation, const Handle_Prs3d_Presentation& aPresentation)
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 ) ;
84 //=======================================================================
85 //function : ComputeTwoEdgesConcentric
87 //=======================================================================
88 void AIS_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation)
92 if (myFShape.ShapeType() == TopAbs_EDGE) {
93 E = TopoDS::Edge(myFShape);
94 V = TopoDS::Vertex(mySShape);
97 E = TopoDS::Edge(myFShape);
98 V = TopoDS::Vertex(mySShape);
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;
107 AIS::ComputeGeometry(V,P, myPlane, isOnPlanVertex);
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);
120 //=======================================================================
121 //function : ComputeTwoEdgesConcentric
123 //=======================================================================
124 void AIS_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation)
127 V1 = TopoDS::Vertex(myFShape);
128 V2 = TopoDS::Vertex(myFShape);
129 Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True);
131 AIS::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1);
132 AIS::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2);
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);
143 //=======================================================================
144 //function : ComputeTwoEdgesConcentric
146 //=======================================================================
147 void AIS_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation)
149 BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape));
150 BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape));
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),
166 isInfinite1,isInfinite2,
171 const Handle(Geom_Circle)& gcirc1 = (Handle(Geom_Circle)&) geom1;
172 const Handle(Geom_Circle)& gcirc2 = (Handle(Geom_Circle)&) geom2;
174 myCenter = gcirc1->Location();
176 // on choisit le rayon egal a 1/5 ieme du rayon du plus petit des
177 // 2 cercles. On impose une borne sup au rayon( 0.02 au hasard)
178 Standard_Real rad1 = gcirc1->Radius();
179 Standard_Real rad2 = gcirc2->Radius();
180 myRad = (rad1 > rad2 ) ? rad2 : rad1;
182 if (myRad > 15.) myRad =15.;
185 //Calcul d'un point du cercle de rayon myRad
186 gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() );
187 gp_Vec vectrans(vec);
188 myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
190 DsgPrs_ConcentricPresentation::Add(aPresentation,
196 if ( (myExtShape != 0) && !extCurv.IsNull()) {
198 if ( myExtShape == 1 ) {
203 ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl);
210 ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl);
215 //=======================================================================
217 //purpose : to avoid warning
218 //=======================================================================
220 void AIS_ConcentricRelation::Compute(const Handle(Prs3d_Projector)&,
221 const Handle(Prs3d_Presentation)&)
225 //=======================================================================
227 //purpose : to avoid warning
228 //=======================================================================
230 void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager2d)&,
231 const Handle(Graphic2d_GraphicObject)&,
232 const Standard_Integer)
236 //=======================================================================
237 //function : ComputeSelection
239 //=======================================================================
241 void AIS_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
242 const Standard_Integer)
244 Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
246 //Creation de 2 sensitives cercles
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,
253 aSelection->Add(sensit);
255 Circ->SetRadius(myRad/2);
256 sensit = new Select3D_SensitiveCircle (own,
258 aSelection->Add(sensit);
260 //Creation de 2 segments sensitifs pour la croix
261 Handle(Select3D_SensitiveSegment) seg;
262 gp_Pnt otherPnt = myPnt.Mirrored(myCenter);
263 seg = new Select3D_SensitiveSegment(own,
266 aSelection->Add(seg);
268 gp_Ax1 RotateAxis(myCenter, myDir);
269 gp_Pnt FPnt = myCenter.Rotated(RotateAxis, PI/2);
270 gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -PI/2);
271 seg = new Select3D_SensitiveSegment(own,
274 aSelection->Add(seg);