11f117ea39f1ff0ea204cf0fc59f28bc087edf9c
[occt.git] / src / DDataStd / DDataStd_DrawDriver.cxx
1 // Created on: 1998-09-07
2 // Created by: Denis PASCAL
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <DDataStd_DrawDriver.ixx>
24
25 #include <Draw.hxx>
26 #include <Draw_Drawable3D.hxx>
27 #include <DDataStd.hxx>
28 #include <TDF_Label.hxx>
29 #include <TDF_Tool.hxx>
30 #include <TNaming_Tool.hxx>
31 #include <TopoDS.hxx>
32 #include <DBRep.hxx>
33 #include <Draw_Appli.hxx>
34 #include <TNaming_Tool.hxx>
35 #include <TDataStd_Integer.hxx>
36 #include <TDataStd_Real.hxx>
37 #include <BRep_Tool.hxx>
38 #include <Draw_Drawable3D.hxx>
39 #include <Draw_Marker3D.hxx>
40 #include <TCollection_AsciiString.hxx>
41 #include <Geom_CartesianPoint.hxx>
42 #include <BRep_Builder.hxx>
43 #include <TopoDS_Compound.hxx>
44 #include <TDF_Tool.hxx>
45 #include <TCollection_AsciiString.hxx>
46 #include <TDataStd.hxx>
47 #include <gp_Pln.hxx>
48 #include <gp_Ax3.hxx>
49 #include <Geom_Plane.hxx>
50 // attribut affichable
51 #include <TNaming_NamedShape.hxx>
52 #include <TDataStd.hxx>
53 #include <TDataXtd_GeometryEnum.hxx>
54 #include <TDataXtd_Point.hxx>
55 #include <TDataXtd_Axis.hxx>
56 #include <TDataXtd_Plane.hxx>
57 #include <TDataXtd_Geometry.hxx>
58 #include <TDF_ChildIterator.hxx>
59 #include <TDF_LabelList.hxx> 
60 #include <TDF_ListIteratorOfLabelList.hxx>
61 // drawable object
62 #include <DrawTrSurf_Surface.hxx>
63 #include <Draw_Axis3D.hxx>
64 #include <DrawDim_Distance.hxx>
65 #include <DrawDim_Radius.hxx>
66 #include <DrawDim_Angle.hxx>
67 #include <DrawDim_PlanarDistance.hxx>
68 #include <DrawDim_PlanarRadius.hxx>
69 #include <DrawDim_PlanarAngle.hxx>
70 #include <DrawDim_PlanarDiameter.hxx>
71 #include <DBRep_DrawableShape.hxx>
72
73 static Standard_Integer DISCRET    = 100;
74 static Standard_Integer NBISOS     = 10;
75 static Standard_Real    THESIZE       = 1000.;
76
77 // Unused
78 #ifdef DEB
79 static Standard_Real    PLANETHESIZE  = 100.;
80 static Standard_Real    DEFLECTION = 0.0;
81 #endif
82
83 static Handle(DDataStd_DrawDriver) DrawDriver;
84
85
86 Handle(DDataStd_DrawDriver) DDataStd_DrawDriver::Get () {return DrawDriver; }
87 void DDataStd_DrawDriver::Set (const Handle(DDataStd_DrawDriver)& DD) {DrawDriver =  DD; }
88
89 //=======================================================================
90 //function : Displayer
91 //purpose  : 
92 //=======================================================================
93
94 DDataStd_DrawDriver::DDataStd_DrawDriver () {}
95
96
97 //=======================================================================
98 //function : Geometry
99 //purpose  : 
100 //=======================================================================
101
102 static TopoDS_Shape Geometry (const Handle(TDataXtd_Constraint)& A, 
103                               const Standard_Integer i, TopAbs_ShapeEnum T) 
104 {
105   TopoDS_Shape S = TNaming_Tool::GetShape(A->GetGeometry(i));
106   if (!S.IsNull()) {
107     if (T != TopAbs_SHAPE && T != S.ShapeType())
108       S.Nullify();
109   }
110   return S;
111 }
112
113 //=======================================================================
114 //function : Drawable
115 //purpose  : 
116 //=======================================================================
117
118 Handle(Draw_Drawable3D) DDataStd_DrawDriver::Drawable (const TDF_Label& L) const
119
120   // CONSTRAINT
121
122   Handle(TDataXtd_Constraint) CTR;
123   if (L.FindAttribute(TDataXtd_Constraint::GetID(),CTR)) {
124     return DrawableConstraint(CTR);
125   }
126   
127   // OBJECT
128   
129   TopoDS_Shape s;
130
131   //Handle(TDataStd_Object) OBJ;  
132   //if (L.FindAttribute(TDataStd_Object::GetID(),OBJ)) { 
133   //  return DrawableShape (L,Draw_vert);
134   //}  
135
136   // DATUM
137
138
139   Handle(TDataXtd_Point) POINT;
140   if (L.FindAttribute(TDataXtd_Point::GetID(),POINT)) {  
141     return DrawableShape (L,Draw_magenta,Standard_False);
142   }
143   
144   Handle(TDataXtd_Axis) AXIS;
145   if (L.FindAttribute(TDataXtd_Axis::GetID(),AXIS)) {  
146     return DrawableShape (L,Draw_magenta,Standard_False);
147   }
148
149   Handle(TDataXtd_Plane) PLANE;
150   if (L.FindAttribute(TDataXtd_Plane::GetID(),PLANE)) {  
151     return DrawableShape(L,Draw_magenta,Standard_False);
152   }
153
154   // Standard GEOMETRY
155   
156
157   Handle(TDataXtd_Geometry) STD_GEOM;
158   if (L.FindAttribute(TDataXtd_Geometry::GetID(),STD_GEOM)) {  
159     switch (STD_GEOM->GetType()) {
160     case TDataXtd_POINT :
161       {  
162         return DrawableShape(L,Draw_jaune,Standard_False);
163         break;
164       }
165     case TDataXtd_LINE :
166     case TDataXtd_CIRCLE :
167     case TDataXtd_ELLIPSE : 
168     case TDataXtd_SPLINE :
169       {  
170         return DrawableShape(L,Draw_cyan,Standard_False);
171         break;
172       }  
173     case TDataXtd_ANY_GEOM :
174       { 
175         break;
176       }
177       default :
178         {
179           break;
180         }
181     }
182   }
183
184   // PURE SHAPE
185
186   Handle(TNaming_NamedShape) NS;
187   if (L.FindAttribute(TNaming_NamedShape::GetID(),NS)) {   
188     return DrawableShape (NS->Label(),Draw_jaune);
189   }
190
191   Handle(Draw_Drawable3D) D3D;
192   return D3D;
193 }
194
195
196
197
198 //=======================================================================
199 //function : DrawableConstraint
200 //purpose  : 
201 //=======================================================================
202
203 Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableConstraint (const Handle(TDataXtd_Constraint)& A) const
204 {
205   Handle(DrawDim_Dimension) D;
206   
207   switch (A->GetType()) {
208     
209   case TDataXtd_RADIUS:
210     {
211       if (A->IsPlanar()) {
212         D = new DrawDim_PlanarRadius (TNaming_Tool::GetShape(A->GetGeometry(1)));
213       }
214       else {
215         TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE);
216         TopoDS_Face F1 = TopoDS::Face(aLocalShape);
217         // TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE));
218         if (!F1.IsNull()) D = new DrawDim_Radius(F1);
219       }
220     }
221     break;
222
223   case TDataXtd_DIAMETER:
224     if (A->IsPlanar()) {
225       D = new DrawDim_PlanarDiameter (TNaming_Tool::GetShape(A->GetGeometry(1)));
226     }
227     break;
228
229   case TDataXtd_MINOR_RADIUS:
230     break;
231
232   case TDataXtd_MAJOR_RADIUS:
233     break;
234
235   case TDataXtd_TANGENT:
236     break;
237
238   case TDataXtd_PARALLEL:
239     break;
240
241   case TDataXtd_PERPENDICULAR:
242     break;
243
244   case TDataXtd_CONCENTRIC:
245     break;
246
247   case TDataXtd_COINCIDENT:
248     break;
249
250   case TDataXtd_DISTANCE:
251     {
252       if (A->IsPlanar()) {
253         D = new DrawDim_PlanarDistance (TNaming_Tool::GetShape(A->GetGeometry(1)),
254                                         TNaming_Tool::GetShape(A->GetGeometry(2)));
255       }
256       break;
257     }
258   case TDataXtd_ANGLE:
259     {     
260       if (A->IsPlanar()) {
261         Handle(DrawDim_PlanarAngle) DAng = new 
262           DrawDim_PlanarAngle (TNaming_Tool::GetShape(A->GetGeometry(1)),
263                                TNaming_Tool::GetShape(A->GetGeometry(2)));
264         DAng->Sector(A->Reversed(),A->Inverted());
265         TopoDS_Shape aLocalShape = TNaming_Tool::GetShape(A->GetPlane());
266         DAng->SetPlane(TopoDS::Face(aLocalShape));
267 //      DAng->SetPlane(TopoDS::Face(TNaming_Tool::GetShape(A->GetPlane())));
268         D = DAng;
269       }
270       else {
271         TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE);
272         TopoDS_Face F1 = TopoDS::Face(aLocalShape);
273         aLocalShape = Geometry(A,2,TopAbs_FACE);
274         TopoDS_Face F2 = TopoDS::Face(aLocalShape);
275 //      TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE));
276 //      TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE));
277         if (!F1.IsNull() && !F2.IsNull()) D = new DrawDim_Angle(F1,F2);
278       }
279     }
280     break;
281
282   case TDataXtd_EQUAL_RADIUS:
283     {
284
285     }
286     
287     break;
288
289   case TDataXtd_SYMMETRY:
290     break;
291
292   case TDataXtd_MIDPOINT:
293     break;
294
295   case TDataXtd_EQUAL_DISTANCE:
296     break;
297
298   case TDataXtd_FIX:
299     break;
300
301   case TDataXtd_RIGID:
302     break;
303
304   case TDataXtd_FROM:
305     break;
306
307   case TDataXtd_AXIS:
308     break;
309
310   case TDataXtd_MATE:
311     {
312       TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE);
313       TopoDS_Face F1 = TopoDS::Face(aLocalShape);
314       aLocalShape = Geometry(A,2,TopAbs_FACE);
315       TopoDS_Face F2 = TopoDS::Face(aLocalShape);
316 //      TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE));
317 //      TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE));
318       if (!F1.IsNull() && !F2.IsNull())
319         D = new DrawDim_Distance(F1,F2);
320     }
321     break;
322
323   case TDataXtd_ALIGN_FACES:
324     {
325       TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE) ;
326       TopoDS_Face F1 = TopoDS::Face(aLocalShape);
327       aLocalShape = Geometry(A,2,TopAbs_FACE) ;
328       TopoDS_Face F2 = TopoDS::Face(aLocalShape);
329 //      TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE));
330 //      TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE));
331       if (!F1.IsNull() && !F2.IsNull())
332         D = new DrawDim_Distance(F1,F2);
333     }
334     break;
335
336   case TDataXtd_ALIGN_AXES:
337     break;
338
339   case TDataXtd_AXES_ANGLE:
340     break;
341
342   case TDataXtd_FACES_ANGLE:
343     break;
344
345   case TDataXtd_ROUND:
346     break;
347
348   case TDataXtd_OFFSET          :
349     break;
350
351   }
352
353   if (!D.IsNull()) {
354     if (!A->GetValue().IsNull()) {
355       Standard_Real val = A->GetValue()->Get();
356       if (A->GetValue()->GetDimension() == TDataStd_ANGULAR) val = (180.*val)/M_PI;
357       D->SetValue(val);
358     }
359     // unverified constraints are red (default is white)
360     if (!A->Verified()) D->TextColor(Draw_rouge);  
361   }
362   return D;
363 }
364
365 //=======================================================================
366 //function : DrawableShape
367 //purpose  : 
368 //=======================================================================
369
370 Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableShape (const TDF_Label& L,
371                                                               const Draw_ColorKind color,
372                                                               const Standard_Boolean current) const
373 {  
374   Handle(Draw_Drawable3D) DS;
375   Handle(TNaming_NamedShape) NS;
376   if (L.FindAttribute(TNaming_NamedShape::GetID(),NS)) {
377     TopoDS_Shape S;
378     if (current) S = TNaming_Tool::CurrentShape (NS);
379     else S =  TNaming_Tool::GetShape (NS);
380     DS = DrawableShape (S,color);
381   }
382   return DS;
383 }
384
385 //=======================================================================
386 //function : DrawableShape
387 //purpose  : 
388 //=======================================================================
389
390 Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableShape (const TopoDS_Shape& s,
391                                                                  const Draw_ColorKind color)
392 {  
393   Handle(DBRep_DrawableShape) DS;
394   DS = new DBRep_DrawableShape (s,color,color,color,Draw_bleu,THESIZE,NBISOS,DISCRET);
395   return DS;
396 }
397