Integration of OCCT 6.5.0 from SVN
[occt.git] / src / TestTopOpeDraw / TestTopOpeDraw_DrawableSHA.cxx
1 // File:        TestTopOpeDraw_DrawableSHA.cxx
2 // Created:     Mon Oct 24 17:36:19 1994
3 // Author:      Jean Yves LEBEY
4 //              <jyl@bravox>
5
6 #include <TestTopOpeDraw_DrawableSHA.ixx>
7 #include <TestTopOpeDraw_DrawableSUR.hxx>
8 #include <TestTopOpeDraw_DrawableC3D.hxx>
9 #include <TestTopOpeDraw_DrawableP3D.hxx>
10
11 #include <TopoDS.hxx>
12 #include <TopExp_Explorer.hxx>
13 #include <TopoDS_Iterator.hxx>
14 #include <TopoDS_Face.hxx>
15 #include <BRep_Tool.hxx>
16 #include <BRepTools.hxx>
17 #include <BRepAdaptor_Surface.hxx>
18 #include <BRepAdaptor_Curve.hxx>
19 #include <Geom_Surface.hxx>
20 #include <Geom_TrimmedCurve.hxx>
21 #include <Geom_RectangularTrimmedSurface.hxx>
22 #include <Precision.hxx>
23 #include <gp_Vec.hxx>
24 #include <gp_Pnt.hxx>
25 #include <Draw_Color.hxx>
26 #include <Draw_Segment3D.hxx>
27 #include <gp.hxx>
28
29 Draw_Color DBRep_ColorOrientation (const TopAbs_Orientation);
30
31 //=======================================================================
32 //function : TestTopOpeDraw_DrawableSHA
33 //purpose  : 
34 //=======================================================================
35
36 TestTopOpeDraw_DrawableSHA::TestTopOpeDraw_DrawableSHA
37 (const TopoDS_Shape& aShape,
38  const Draw_Color& FreeCol,
39  const Draw_Color& ConnCol,
40  const Draw_Color& EdgeCol,
41  const Draw_Color& IsosCol,
42  const Standard_Real size,
43  const Standard_Integer nbisos,
44  const Standard_Integer discret,
45  const Standard_CString Text,
46  const Draw_Color& TextColor,
47  const Standard_Boolean DisplayGeometry) :
48  DBRep_DrawableShape(aShape,FreeCol,ConnCol,EdgeCol,IsosCol,size,nbisos,discret),
49  myTol(0.0), myPar(-1.0)
50 {
51   myDisplayGeometry = DisplayGeometry;
52   myText = new Draw_Text3D(Pnt(),Text,TextColor);
53   myTextColor = TextColor;
54 }
55
56
57 //=======================================================================
58 //function : Pnt
59 //purpose  : 
60 //=======================================================================
61
62 gp_Pnt TestTopOpeDraw_DrawableSHA::Pnt() const
63 {
64   gp_Pnt P(0,0,0);
65   Standard_Real u1,u2,v1,v2;
66   TopExp_Explorer ex;
67
68   TopoDS_Shape S = Shape();
69   TopAbs_ShapeEnum T = S.ShapeType();
70   Standard_Real facpar = 0.;
71
72   while ( T == TopAbs_COMPOUND ) {
73     TopoDS_Iterator ti(S);
74     if ( ti.More() ) {
75       S = ti.Value(); T = S.ShapeType();
76     }
77     else {
78       break;
79     }
80   }
81   // si S final = compound --> P = 0 0 0 
82
83   switch (T) {
84     
85   case TopAbs_VERTEX : 
86     P = BRep_Tool::Pnt(TopoDS::Vertex(S)); 
87     break;
88
89   case TopAbs_WIRE : 
90     T = TopAbs_EDGE; 
91     ex.Init(S,T); S = ex.Current();
92     facpar = 0.33;
93     // no break, in order to execute EDGE case
94
95   case TopAbs_EDGE : 
96     {
97     BRepAdaptor_Curve CU(TopoDS::Edge(S));
98     u1 = CU.FirstParameter(); u2 = CU.LastParameter();
99     if (facpar == 0.) facpar = 0.20;
100     if (myPar != -1.0) facpar = myPar;
101     Standard_Real p = u1 + (u2-u1)*facpar;
102     P = CU.Value(p);
103     }
104     break;
105
106   case TopAbs_SHELL : case TopAbs_SOLID : case TopAbs_COMPSOLID :
107     T = TopAbs_FACE; 
108     ex.Init(S,T); S = ex.Current();
109     facpar = 0.33;
110     // no break, in order to execute FACE case
111
112   case TopAbs_FACE : 
113     {
114     BRepAdaptor_Surface SU(TopoDS::Face(S));
115     BRepTools::UVBounds(TopoDS::Face(S),u1,u2,v1,v2);
116     if (facpar == 0.) facpar = 0.20;
117     Standard_Real u = u1 + (u2-u1)*facpar;
118     Standard_Real v = v1 + (v2-v1)*facpar;
119     P = SU.Value(u,v);
120     }
121     break;
122 #ifndef DEB
123   default:
124     break;
125 #endif
126   }
127
128   return P;
129 }
130
131 //=======================================================================
132 //function : SetDisplayGeometry
133 //purpose  : 
134 //=======================================================================
135
136 void TestTopOpeDraw_DrawableSHA::SetDisplayGeometry(const Standard_Boolean b)
137 {
138   myDisplayGeometry = b;
139 }
140
141 //=======================================================================
142 //function : SetTol
143 //purpose  : 
144 //=======================================================================
145
146 void TestTopOpeDraw_DrawableSHA::SetTol(const Standard_Real t)
147 {
148   myTol = t;
149   if(myTol != 0.0) 
150     myDM3d = new Draw_Marker3D(Pnt(), Draw_CircleZoom , Draw_rouge, myTol);
151 }
152
153
154 //=======================================================================
155 //function : SetPar
156 //purpose  : 
157 //=======================================================================
158
159 void TestTopOpeDraw_DrawableSHA::SetPar(const Standard_Real t)
160 {
161   myPar = t;
162   myText->SetPnt(Pnt());
163 }
164
165
166 //=======================================================================
167 //function : DrawOn
168 //purpose  : 
169 //=======================================================================
170
171 void TestTopOpeDraw_DrawableSHA::DrawOn(Draw_Display& dis) const
172 {
173   if(myDM3d.IsNull()) 
174     DBRep_DrawableShape::DrawOn(dis);
175   else 
176     myDM3d->DrawOn(dis);
177   myText->DrawOn(dis);
178   if (myDisplayGeometry) DisplayGeometry(dis);
179 }
180
181 //=======================================================================
182 //function : DisplayGeometry
183 //purpose  : 
184 //=======================================================================
185
186 void TestTopOpeDraw_DrawableSHA::DisplayGeometry(Draw_Display& dis) const 
187 {
188   const TopoDS_Shape& aShape = Shape();
189   const TopAbs_ShapeEnum t = aShape.ShapeType();
190
191   if ( t == TopAbs_FACE ) {
192     const TopoDS_Face& F = TopoDS::Face(aShape);
193     TopLoc_Location loc;
194     Handle(Geom_Surface) GS = BRep_Tool::Surface(F,loc);
195     if ( GS.IsNull() ) return;
196     Standard_Real u1,u2,v1,v2; BRepTools::UVBounds(F,u1,u2,v1,v2);
197     GS = Handle(Geom_Surface)::DownCast(GS->Transformed(loc.Transformation()));
198     Handle(Geom_RectangularTrimmedSurface) GRTS;
199     GRTS = new Geom_RectangularTrimmedSurface(GS,u1,u2,v1,v2);
200     Handle(TestTopOpeDraw_DrawableSUR) D;
201     D = new TestTopOpeDraw_DrawableSUR(GRTS,Draw_bleu);
202     Draw_Color norcol = DBRep_ColorOrientation(aShape.Orientation());
203     D->NormalColor(norcol);
204     D->DrawNormale(dis);
205   }
206
207   else if ( t == TopAbs_EDGE ) {
208     const TopoDS_Edge& E = TopoDS::Edge(aShape);
209     TopLoc_Location loc; Standard_Real f,l;
210     Handle(Geom_Curve) GC = BRep_Tool::Curve(E,loc,f,l);
211     if ( GC.IsNull() ) return;    
212     GC = Handle(Geom_Curve)::DownCast(GC->Transformed(loc.Transformation()));
213     Handle(Geom_TrimmedCurve) GTC = new Geom_TrimmedCurve(GC,f,l);
214     Handle(TestTopOpeDraw_DrawableC3D) D;
215     D = new TestTopOpeDraw_DrawableC3D(GTC,myTextColor);
216     D->DrawOn(dis);
217   }
218
219   else if ( t == TopAbs_VERTEX ) {
220     const TopoDS_Vertex& V = TopoDS::Vertex(aShape);
221     gp_Pnt P = BRep_Tool::Pnt(V);
222     Handle(TestTopOpeDraw_DrawableP3D) D;
223     D = new TestTopOpeDraw_DrawableP3D(P,myTextColor);
224     D->DrawOn(dis);
225   }
226
227 }