0025695: Visualization, AIS_InteractiveContext - define default HilightMode
[occt.git] / src / AIS / AIS_Relation.cxx
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
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <AIS.hxx>
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>
24 #include <ElCLib.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>
32 #include <gp_Lin.hxx>
33 #include <gp_Pnt.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>
47 #include <TopExp.hxx>
48 #include <TopoDS.hxx>
49 #include <TopoDS_Edge.hxx>
50 #include <TopoDS_Shape.hxx>
51 #include <TopoDS_Vertex.hxx>
52
53 IMPLEMENT_STANDARD_RTTIEXT(AIS_Relation,AIS_InteractiveObject)
54
55 //=======================================================================
56 //function : AIS_Relation
57 //purpose  : 
58 //=======================================================================
59 AIS_Relation::AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
60 :AIS_InteractiveObject(aTypeOfPresentation3d),
61  myVal(1.),
62  myPosition(0.,0.,0.),
63  myArrowSize( myVal / 10. ),
64  myAutomaticPosition(Standard_True),
65  myExtShape(0),
66  myFirstOffset(0.),mySecondOffset(0.),
67  myIsSetBndBox( Standard_False ),
68  myArrowSizeIsDefined( Standard_False)
69 {
70 }
71
72
73
74 //=======================================================================
75 //function : ComputeProjEdgePresentation
76 //purpose  : 
77 //=======================================================================
78
79 void AIS_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs, 
80                                                const TopoDS_Edge& anEdge,
81                                                const Handle(Geom_Curve)& ProjCurv, 
82                                                const gp_Pnt& FirstP, 
83                                                const gp_Pnt& LastP, 
84                                                const Quantity_NameOfColor aColor,
85                                                const Standard_Real width,
86                                                const Aspect_TypeOfLine aProjTOL,
87                                                const Aspect_TypeOfLine aCallTOL) const 
88 {
89   if (!myDrawer->HasOwnWireAspect()){
90     myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));}
91   else {
92     const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
93     li->SetColor(aColor);
94     li->SetTypeOfLine(aProjTOL);
95     li->SetWidth(width);
96   }
97
98   Standard_Real pf, pl;
99   TopLoc_Location loc;
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));
104
105   TopoDS_Edge E;
106
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));
110     if ( !isInfinite) {
111       pf = ElCLib::Parameter(gl->Lin(),FirstP);
112       pl = ElCLib::Parameter(gl->Lin(),LastP);
113       BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl);
114       E = MakEd.Edge();
115     }
116     else {
117       BRepBuilderAPI_MakeEdge MakEd(gl->Lin());
118       E = MakEd.Edge();
119     }
120   }
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);
126     E = MakEd.Edge();
127   }
128   StdPrs_WFShape::Add (aPrs, E, myDrawer);
129
130   //Calcul de la presentation des lignes de raccord
131   myDrawer->WireAspect()->SetTypeOfLine(aCallTOL);
132   if (!isInfinite) {
133     gp_Pnt ppf, ppl;
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())
137     {
138       BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf);
139       StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer);
140     }
141     else
142     {
143       BRepBuilderAPI_MakeVertex MakVert1 (FirstP);
144       StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer);
145     }
146     if (LastP.Distance (ppl) > gp::Resolution())
147     {
148       BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl);
149       StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer);
150     }
151     else
152     {
153       BRepBuilderAPI_MakeVertex MakVert2 (LastP);
154       StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer);
155     }
156 /*
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);
161 */
162   }
163 }
164
165
166 //=======================================================================
167 //function : ComputeProjVertexPresentation
168 //purpose  : 
169 //=======================================================================
170
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 
178 {
179   if (!myDrawer->HasOwnPointAspect()){
180     myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));}
181   else {
182     const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect();
183     pa->SetColor(aColor);
184     pa->SetTypeOfMarker(aProjTOM);
185   }
186   
187   // calcul du projete
188   StdPrs_Point::Add(aPrs, new Geom_CartesianPoint(ProjPoint), myDrawer);
189
190   if (!myDrawer->HasOwnWireAspect()){
191     myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));}
192   else {
193     const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect();
194     li->SetColor(aColor);
195     li->SetTypeOfLine(aCallTOL);
196     li->SetWidth(width);
197   }
198   
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);
204   }
205 }
206
207 //=======================================================================
208 //function : SetColor
209 //purpose  : 
210 //=======================================================================
211
212 void AIS_Relation::SetColor(const Quantity_NameOfColor aCol)
213 {
214   SetColor(Quantity_Color(aCol));
215 }
216
217 void AIS_Relation::SetColor(const Quantity_Color &aCol)
218 {
219   if(hasOwnColor && myDrawer->Color() == aCol) return;
220
221   if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect());
222   hasOwnColor=Standard_True;
223   myDrawer->SetColor (aCol);
224   myDrawer->TextAspect()->SetColor(aCol);
225
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));
230   }
231   if (!myDrawer->HasOwnDimensionAspect()) {
232      myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect);
233   }
234
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();
239
240   DIMENSION->SetLineAspect(LINE);
241   DIMENSION->SetTextAspect(TEXT); 
242 }
243
244 //=======================================================================
245 //function : UnsetColor
246 //purpose  : 
247 //=======================================================================
248 void AIS_Relation::UnsetColor()
249 {
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())
255   {
256     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
257     myDrawer->SetTextAspect(myDrawer->Link()->TextAspect());
258   }
259   LA->SetColor(CC);
260   myDrawer->DimensionAspect()->SetLineAspect(LA);
261 }
262
263 //=======================================================================
264 //function : AcceptDisplayMode
265 //purpose  : 
266 //=======================================================================
267
268  Standard_Boolean  AIS_Relation::
269 AcceptDisplayMode(const Standard_Integer aMode) const
270 {return aMode == 0;}
271
272
273 //=======================================================================
274 //function : SetFirstShape
275 //purpose  : 
276 //=======================================================================
277
278 void AIS_Relation::SetFirstShape(const TopoDS_Shape& aFShape)
279 {
280   myFShape = aFShape;
281 }
282
283
284 //=======================================================================
285 //function : SetSecondShape
286 //purpose  : 
287 //=======================================================================
288
289 void AIS_Relation::SetSecondShape(const TopoDS_Shape& aSShape)
290 {
291   mySShape = aSShape;
292 }
293
294 //=======================================================================
295 //function : KindOfDimension
296 //purpose  : 
297 //=======================================================================
298 AIS_KindOfDimension AIS_Relation::KindOfDimension() const 
299 {return AIS_KOD_NONE;}
300
301 //=======================================================================
302 //function : IsMovable
303 //purpose  : 
304 //=======================================================================
305 Standard_Boolean AIS_Relation::IsMovable() const 
306 {return Standard_False;}
307
308