1 // Created on: 1996-12-05
2 // Created by: Odile Olivier
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
19 #include <AIS_GraphicTool.hxx>
20 #include <AIS_Relation.hxx>
21 #include <BRep_Tool.hxx>
22 #include <BRepBuilderAPI_MakeEdge.hxx>
23 #include <BRepBuilderAPI_MakeVertex.hxx>
25 #include <Geom_CartesianPoint.hxx>
26 #include <Geom_Circle.hxx>
27 #include <Geom_Curve.hxx>
28 #include <Geom_Line.hxx>
29 #include <Geom_Plane.hxx>
30 #include <Geom_Surface.hxx>
31 #include <gp_Circ.hxx>
34 #include <Graphic3d_Group.hxx>
35 #include <Precision.hxx>
36 #include <Prs3d_DimensionAspect.hxx>
37 #include <Prs3d_Drawer.hxx>
38 #include <Prs3d_LineAspect.hxx>
39 #include <Prs3d_PointAspect.hxx>
40 #include <Prs3d_Presentation.hxx>
41 #include <Prs3d_TextAspect.hxx>
42 #include <Quantity_Color.hxx>
43 #include <Standard_Type.hxx>
44 #include <StdPrs_Point.hxx>
45 #include <StdPrs_WFShape.hxx>
46 #include <TCollection_ExtendedString.hxx>
49 #include <TopoDS_Edge.hxx>
50 #include <TopoDS_Shape.hxx>
51 #include <TopoDS_Vertex.hxx>
53 IMPLEMENT_STANDARD_RTTIEXT(AIS_Relation,AIS_InteractiveObject)
55 //=======================================================================
56 //function : AIS_Relation
58 //=======================================================================
59 AIS_Relation::AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
60 :AIS_InteractiveObject(aTypeOfPresentation3d),
63 myArrowSize( myVal / 10. ),
64 myAutomaticPosition(Standard_True),
66 myFirstOffset(0.),mySecondOffset(0.),
67 myIsSetBndBox( Standard_False ),
68 myArrowSizeIsDefined( Standard_False)
74 //=======================================================================
75 //function : ComputeProjEdgePresentation
77 //=======================================================================
79 void AIS_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs,
80 const TopoDS_Edge& anEdge,
81 const Handle(Geom_Curve)& ProjCurv,
84 const Quantity_NameOfColor aColor,
85 const Standard_Real width,
86 const Aspect_TypeOfLine aProjTOL,
87 const Aspect_TypeOfLine aCallTOL) const
89 if (!myDrawer->HasOwnWireAspect()){
90 myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));}
92 const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
94 li->SetTypeOfLine(aProjTOL);
100 Handle(Geom_Curve) curve;
101 Standard_Boolean isInfinite;
102 curve = BRep_Tool::Curve(anEdge,loc,pf,pl);
103 isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl));
107 // Calcul de la presentation de l'edge
108 if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) {
109 Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv));
111 pf = ElCLib::Parameter(gl->Lin(),FirstP);
112 pl = ElCLib::Parameter(gl->Lin(),LastP);
113 BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl);
117 BRepBuilderAPI_MakeEdge MakEd(gl->Lin());
121 else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) {
122 Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv));
123 pf = ElCLib::Parameter(gc->Circ(),FirstP);
124 pl = ElCLib::Parameter(gc->Circ(),LastP);
125 BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl);
128 StdPrs_WFShape::Add (aPrs, E, myDrawer);
130 //Calcul de la presentation des lignes de raccord
131 myDrawer->WireAspect()->SetTypeOfLine(aCallTOL);
134 ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge)));
135 ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge)));
136 if (FirstP.Distance (ppf) > gp::Resolution())
138 BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf);
139 StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer);
143 BRepBuilderAPI_MakeVertex MakVert1 (FirstP);
144 StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer);
146 if (LastP.Distance (ppl) > gp::Resolution())
148 BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl);
149 StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer);
153 BRepBuilderAPI_MakeVertex MakVert2 (LastP);
154 StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer);
157 BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf);
158 StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer);
159 BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl);
160 StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer);
166 //=======================================================================
167 //function : ComputeProjVertexPresentation
169 //=======================================================================
171 void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs,
172 const TopoDS_Vertex& aVertex,
173 const gp_Pnt& ProjPoint,
174 const Quantity_NameOfColor aColor,
175 const Standard_Real width,
176 const Aspect_TypeOfMarker aProjTOM,
177 const Aspect_TypeOfLine aCallTOL) const
179 if (!myDrawer->HasOwnPointAspect()){
180 myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));}
182 const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect();
183 pa->SetColor(aColor);
184 pa->SetTypeOfMarker(aProjTOM);
188 StdPrs_Point::Add(aPrs, new Geom_CartesianPoint(ProjPoint), myDrawer);
190 if (!myDrawer->HasOwnWireAspect()){
191 myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));}
193 const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
194 li->SetColor(aColor);
195 li->SetTypeOfLine(aCallTOL);
199 // Si les points ne sont pas confondus...
200 if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) {
201 // calcul des lignes de rappel
202 BRepBuilderAPI_MakeEdge MakEd (ProjPoint,BRep_Tool::Pnt(aVertex));
203 StdPrs_WFShape::Add (aPrs, MakEd.Edge(), myDrawer);
207 //=======================================================================
208 //function : SetColor
210 //=======================================================================
212 void AIS_Relation::SetColor(const Quantity_NameOfColor aCol)
214 SetColor(Quantity_Color(aCol));
217 void AIS_Relation::SetColor(const Quantity_Color &aCol)
219 if(hasOwnColor && myOwnColor==aCol) return;
221 if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect());
222 hasOwnColor=Standard_True;
224 myDrawer->TextAspect()->SetColor(aCol);
226 Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ?
227 AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.;
228 if (!myDrawer->HasOwnLineAspect()) {
229 myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
231 if (!myDrawer->HasOwnDimensionAspect()) {
232 myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect);
235 myDrawer->LineAspect()->SetColor(aCol);
236 const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect();
237 const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect();
238 const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect();
240 DIMENSION->SetLineAspect(LINE);
241 DIMENSION->SetTextAspect(TEXT);
244 //=======================================================================
245 //function : UnsetColor
247 //=======================================================================
248 void AIS_Relation::UnsetColor()
250 if (!hasOwnColor) return;
251 hasOwnColor = Standard_False;
252 const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect();
253 Quantity_Color CC = Quantity_NOC_YELLOW;
254 if (myDrawer->HasLink())
256 AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
257 myDrawer->SetTextAspect(myDrawer->Link()->TextAspect());
260 myDrawer->DimensionAspect()->SetLineAspect(LA);
263 //=======================================================================
264 //function : AcceptDisplayMode
266 //=======================================================================
268 Standard_Boolean AIS_Relation::
269 AcceptDisplayMode(const Standard_Integer aMode) const
273 //=======================================================================
274 //function : SetFirstShape
276 //=======================================================================
278 void AIS_Relation::SetFirstShape(const TopoDS_Shape& aFShape)
284 //=======================================================================
285 //function : SetSecondShape
287 //=======================================================================
289 void AIS_Relation::SetSecondShape(const TopoDS_Shape& aSShape)
294 //=======================================================================
295 //function : KindOfDimension
297 //=======================================================================
298 AIS_KindOfDimension AIS_Relation::KindOfDimension() const
299 {return AIS_KOD_NONE;}
301 //=======================================================================
302 //function : IsMovable
304 //=======================================================================
305 Standard_Boolean AIS_Relation::IsMovable() const
306 {return Standard_False;}