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 <Graphic3d_ArrayOfSegments.hxx>
32 #include <gp_Circ.hxx>
35 #include <Graphic3d_Group.hxx>
36 #include <Precision.hxx>
37 #include <Prs3d_DimensionAspect.hxx>
38 #include <Prs3d_Drawer.hxx>
39 #include <Prs3d_LineAspect.hxx>
40 #include <Prs3d_PointAspect.hxx>
41 #include <Prs3d_Presentation.hxx>
42 #include <Prs3d_TextAspect.hxx>
43 #include <Quantity_Color.hxx>
44 #include <Standard_Type.hxx>
45 #include <StdPrs_Point.hxx>
46 #include <StdPrs_WFShape.hxx>
47 #include <TCollection_ExtendedString.hxx>
50 #include <TopoDS_Edge.hxx>
51 #include <TopoDS_Shape.hxx>
52 #include <TopoDS_Vertex.hxx>
54 IMPLEMENT_STANDARD_RTTIEXT(AIS_Relation,AIS_InteractiveObject)
56 //=======================================================================
57 //function : AIS_Relation
59 //=======================================================================
60 AIS_Relation::AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
61 :AIS_InteractiveObject(aTypeOfPresentation3d),
64 myArrowSize( myVal / 10. ),
65 myAutomaticPosition(Standard_True),
67 myFirstOffset(0.),mySecondOffset(0.),
68 myIsSetBndBox( Standard_False ),
69 myArrowSizeIsDefined( Standard_False)
75 //=======================================================================
76 //function : ComputeProjEdgePresentation
78 //=======================================================================
80 void AIS_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs,
81 const TopoDS_Edge& anEdge,
82 const Handle(Geom_Curve)& ProjCurv,
85 const Quantity_NameOfColor aColor,
86 const Standard_Real width,
87 const Aspect_TypeOfLine aProjTOL,
88 const Aspect_TypeOfLine aCallTOL) const
90 if (!myDrawer->HasOwnWireAspect()){
91 myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));}
93 const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
95 li->SetTypeOfLine(aProjTOL);
101 Handle(Geom_Curve) curve;
102 Standard_Boolean isInfinite;
103 curve = BRep_Tool::Curve(anEdge,loc,pf,pl);
104 isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl));
108 // Calcul de la presentation de l'edge
109 if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) {
110 Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv));
112 pf = ElCLib::Parameter(gl->Lin(),FirstP);
113 pl = ElCLib::Parameter(gl->Lin(),LastP);
114 BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl);
118 BRepBuilderAPI_MakeEdge MakEd(gl->Lin());
122 else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) {
123 Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv));
124 pf = ElCLib::Parameter(gc->Circ(),FirstP);
125 pl = ElCLib::Parameter(gc->Circ(),LastP);
126 BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl);
129 StdPrs_WFShape::Add (aPrs, E, myDrawer);
131 //Calcul de la presentation des lignes de raccord
132 myDrawer->WireAspect()->SetTypeOfLine(aCallTOL);
135 ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge)));
136 ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge)));
137 if (FirstP.Distance (ppf) > gp::Resolution())
139 BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf);
140 StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer);
144 BRepBuilderAPI_MakeVertex MakVert1 (FirstP);
145 StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer);
147 if (LastP.Distance (ppl) > gp::Resolution())
149 BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl);
150 StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer);
154 BRepBuilderAPI_MakeVertex MakVert2 (LastP);
155 StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer);
158 BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf);
159 StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer);
160 BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl);
161 StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer);
167 //=======================================================================
168 //function : ComputeProjVertexPresentation
170 //=======================================================================
172 void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs,
173 const TopoDS_Vertex& aVertex,
174 const gp_Pnt& ProjPoint,
175 const Quantity_NameOfColor aColor,
176 const Standard_Real width,
177 const Aspect_TypeOfMarker aProjTOM,
178 const Aspect_TypeOfLine aCallTOL) const
180 if (!myDrawer->HasOwnPointAspect()){
181 myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));}
183 const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect();
184 pa->SetColor(aColor);
185 pa->SetTypeOfMarker(aProjTOM);
189 Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
190 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
191 anArrayOfPoints->AddVertex (ProjPoint);
192 aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect());
193 aGroup->AddPrimitiveArray (anArrayOfPoints);
196 if (!myDrawer->HasOwnWireAspect()){
197 myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));}
199 const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
200 li->SetColor(aColor);
201 li->SetTypeOfLine(aCallTOL);
205 // Si les points ne sont pas confondus...
206 if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion()))
208 Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
209 Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2);
210 anArrayOfLines->AddVertex (ProjPoint);
211 anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex));
212 aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect());
213 aGroup->AddPrimitiveArray (anArrayOfLines);
217 //=======================================================================
218 //function : SetColor
220 //=======================================================================
221 void AIS_Relation::SetColor(const Quantity_Color &aCol)
223 if(hasOwnColor && myDrawer->Color() == aCol) return;
225 if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect());
226 hasOwnColor=Standard_True;
227 myDrawer->SetColor (aCol);
228 myDrawer->TextAspect()->SetColor(aCol);
230 Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ?
231 AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.;
232 if (!myDrawer->HasOwnLineAspect()) {
233 myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
235 if (!myDrawer->HasOwnDimensionAspect()) {
236 myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect);
239 myDrawer->LineAspect()->SetColor(aCol);
240 const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect();
241 const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect();
242 const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect();
244 DIMENSION->SetLineAspect(LINE);
245 DIMENSION->SetTextAspect(TEXT);
248 //=======================================================================
249 //function : UnsetColor
251 //=======================================================================
252 void AIS_Relation::UnsetColor()
254 if (!hasOwnColor) return;
255 hasOwnColor = Standard_False;
256 const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect();
257 Quantity_Color CC = Quantity_NOC_YELLOW;
258 if (myDrawer->HasLink())
260 AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
261 myDrawer->SetTextAspect(myDrawer->Link()->TextAspect());
264 myDrawer->DimensionAspect()->SetLineAspect(LA);
267 //=======================================================================
268 //function : AcceptDisplayMode
270 //=======================================================================
272 Standard_Boolean AIS_Relation::
273 AcceptDisplayMode(const Standard_Integer aMode) const
277 //=======================================================================
278 //function : SetFirstShape
280 //=======================================================================
282 void AIS_Relation::SetFirstShape(const TopoDS_Shape& aFShape)
288 //=======================================================================
289 //function : SetSecondShape
291 //=======================================================================
293 void AIS_Relation::SetSecondShape(const TopoDS_Shape& aSShape)
298 //=======================================================================
299 //function : KindOfDimension
301 //=======================================================================
302 AIS_KindOfDimension AIS_Relation::KindOfDimension() const
303 {return AIS_KOD_NONE;}
305 //=======================================================================
306 //function : IsMovable
308 //=======================================================================
309 Standard_Boolean AIS_Relation::IsMovable() const
310 {return Standard_False;}