0030520: VIS - IVtkTools_ShapePicker::GetPickPosition() returns incorrect point
[occt.git] / src / VrmlConverter / VrmlConverter_WFRestrictedFace.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Adaptor3d_IsoCurve.hxx>
16 #include <Bnd_Box2d.hxx>
17 #include <BndLib_Add2dCurve.hxx>
18 #include <BRepAdaptor_HSurface.hxx>
19 #include <gp_Pnt.hxx>
20 #include <Hatch_Hatcher.hxx>
21 #include <Precision.hxx>
22 #include <StdPrs_ToolRFace.hxx>
23 #include <Vrml_Material.hxx>
24 #include <Vrml_Separator.hxx>
25 #include <VrmlConverter_Curve.hxx>
26 #include <VrmlConverter_Drawer.hxx>
27 #include <VrmlConverter_IsoAspect.hxx>
28 #include <VrmlConverter_WFRestrictedFace.hxx>
29
30 //=========================================================================
31 // function: Add 1
32 // purpose
33 //=========================================================================
34 void VrmlConverter_WFRestrictedFace::Add
35   (Standard_OStream&                   anOStream,
36    const Handle(BRepAdaptor_HSurface)& aFace,
37    const Standard_Boolean              DrawUIso,
38    const Standard_Boolean              DrawVIso,
39    const Standard_Integer              NBUiso,
40    const Standard_Integer              NBViso,
41    const Handle(VrmlConverter_Drawer)& aDrawer)
42 {
43   Standard_Real aLimit = aDrawer->MaximalParameterValue();
44   Standard_Integer nbPoints = aDrawer->Discretisation();
45
46   StdPrs_ToolRFace ToolRst (aFace);
47
48   // compute bounds of the restriction
49   Standard_Real UMin,UMax,VMin,VMax;
50   Standard_Integer i;
51   gp_Pnt2d P1,P2;
52   Bnd_Box2d B;
53   
54   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
55     const Adaptor2d_Curve2d& TheRCurve = ToolRst.Value();
56     BndLib_Add2dCurve::Add(TheRCurve, Precision::PConfusion(), B);
57   }
58
59   B.Get(UMin, VMin, UMax, VMax);
60
61   // load the infinite isos 
62   Hatch_Hatcher isobuild(1.e-5,ToolRst.IsOriented());
63   Standard_Boolean UClosed = aFace->IsUClosed();
64   Standard_Boolean VClosed = aFace->IsVClosed();
65
66   if ( ! UClosed ) {
67     UMin = UMin + ( UMax - UMin) /1000.;
68     UMax = UMax - ( UMax - UMin) /1000.; 
69   }
70
71   if ( ! VClosed ) {
72     VMin = VMin + ( VMax - VMin) /1000.;
73     VMax = VMax - ( VMax - VMin) /1000.; 
74   }
75
76   if (DrawUIso){
77     if (NBUiso > 0) {
78       UClosed = Standard_False; 
79       Standard_Real du= UClosed ? (UMax-UMin)/NBUiso : (UMax-UMin)/(1+NBUiso);
80       for (i=1; i<=NBUiso;i++){
81         isobuild.AddXLine(UMin+du*i);
82       }
83     }
84   }
85   if (DrawVIso){
86     if ( NBViso > 0) {
87       VClosed = Standard_False;
88       Standard_Real dv= VClosed ?(VMax-VMin)/NBViso : (VMax-VMin)/(1+NBViso);
89       for (i=1; i<=NBViso;i++){
90         isobuild.AddYLine(VMin+dv*i);
91       }
92     }
93   }
94
95   // trim the isos
96   Standard_Real U1, U2, U, DU;
97
98   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
99     TopAbs_Orientation Orient = ToolRst.Orientation();
100       const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
101       U1 = TheRCurve->FirstParameter();
102       U2 = TheRCurve->LastParameter();
103       if (TheRCurve->GetType() != GeomAbs_Line) {
104         DU = (U2-U1)/(nbPoints-1);
105         P2 = TheRCurve->Value(U1);
106         for (i = 2; i <= nbPoints; i++) {
107           U = U1 + (i-1)*DU;
108           P1 = P2;
109           P2 = TheRCurve->Value(U);
110           if(Orient == TopAbs_FORWARD )
111             isobuild.Trim(P1,P2);
112           else
113             isobuild.Trim(P2,P1);
114         }
115       }
116       else {
117         P1 = TheRCurve->Value(U1);
118         P2 = TheRCurve->Value(U2);
119         if(Orient == TopAbs_FORWARD )
120           isobuild.Trim(P1,P2);
121         else
122           isobuild.Trim(P2,P1);
123       }
124   }
125
126
127   // draw the isos
128
129
130   Adaptor3d_IsoCurve anIso;
131   anIso.Load(aFace);
132   Standard_Integer NumberOfLines = isobuild.NbLines();
133
134   Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect; 
135   latmp->SetMaterial(aDrawer->LineAspect()->Material());
136   latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
137
138   Handle(VrmlConverter_IsoAspect) iautmp = new VrmlConverter_IsoAspect;
139   iautmp->SetMaterial(aDrawer->UIsoAspect()->Material());
140   iautmp->SetHasMaterial(aDrawer->UIsoAspect()->HasMaterial());
141   iautmp->SetNumber(aDrawer->UIsoAspect()->Number());
142
143   Handle(VrmlConverter_IsoAspect) iavtmp = new VrmlConverter_IsoAspect; 
144   iavtmp->SetMaterial(aDrawer->VIsoAspect()->Material());
145   iavtmp->SetHasMaterial(aDrawer->VIsoAspect()->HasMaterial());
146   iavtmp->SetNumber(aDrawer->VIsoAspect()->Number());
147
148   Handle(VrmlConverter_LineAspect) laU = new VrmlConverter_LineAspect;
149   Handle(VrmlConverter_LineAspect) laV = new VrmlConverter_LineAspect; 
150
151   laU = aDrawer->UIsoAspect();
152   laV = aDrawer->VIsoAspect();
153
154 //     cout << endl;
155
156 //     cout << "Face:aDrawer>UMaterial1 = " << aDrawer->UIsoAspect()->HasMaterial() << endl;
157 //     cout << "Face:aDrawer>VMaterial1 = " << aDrawer->VIsoAspect()->HasMaterial() << endl;
158 //     cout << "Face:aDrawer>LineAspect1 = " << aDrawer->LineAspect()->HasMaterial() << endl;
159 //     cout << "Face:la1 = " << latmp->HasMaterial() << endl;
160 //     cout << "Face:laU1 = " << laU->HasMaterial() << endl;
161 //     cout << "Face:laV1 = " << laV->HasMaterial() << endl;
162 //     cout << "Face:iau1 = " << iautmp->HasMaterial() << endl;
163 //     cout << "Face:iav1 = " << iavtmp->HasMaterial() << endl;
164
165
166 // creation of Vrml objects
167
168 // Separator 1 {
169   Vrml_Separator SE1;
170   Vrml_Separator SE2;
171   Vrml_Separator SE3;
172
173   Standard_Boolean flag = Standard_False; // to check a call of Vrml_Separator.Print(anOStream)
174   
175   SE1.Print(anOStream);
176
177   if (DrawUIso) {
178     if (NBUiso > 0) {
179
180       if (laU->HasMaterial()){
181         
182         Handle(Vrml_Material) MU;
183         MU = laU->Material();
184     
185         MU->Print(anOStream);
186         laU->SetHasMaterial(Standard_False);
187
188         flag = Standard_True;
189         // Separator 2 {
190         SE2.Print(anOStream);
191       }
192       aDrawer->SetLineAspect(laU);
193
194
195       for (i = 1; i <= NumberOfLines; i++) {
196         if (isobuild.IsXLine(i))
197           {
198             Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
199             Standard_Real Coord = isobuild.Coordinate(i);
200             for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
201               Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
202               
203               b1 = b1 == RealFirst() ? - aLimit : b1;
204               b2 = b2 == RealLast()  ?   aLimit : b2;
205               
206               anIso.Load(GeomAbs_IsoU,Coord,b1,b2);
207               
208               VrmlConverter_Curve::Add(anIso, aDrawer, anOStream);
209             }
210           } 
211       } 
212       
213       if (flag){
214     // Separator 2 }
215         SE2.Print(anOStream);
216         flag = Standard_False;
217       }
218     }
219   }
220
221   if (DrawVIso) {
222     if ( NBViso > 0) {
223       if (laV->HasMaterial()){
224         
225         Handle(Vrml_Material) MV;
226         MV = laV->Material();
227         
228         MV->Print(anOStream);
229         laV->SetHasMaterial(Standard_False);
230         flag = Standard_True;
231         
232         // Separator 3 {
233         SE3.Print(anOStream);
234       }
235       
236       aDrawer->SetLineAspect(laV);
237
238       for (i = 1; i <= NumberOfLines; i++) {
239         if (isobuild.IsYLine(i))
240           {
241             Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
242             Standard_Real Coord = isobuild.Coordinate(i);
243             for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
244               Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
245           
246               b1 = b1 == RealFirst() ? - aLimit : b1;
247               b2 = b2 == RealLast()  ?   aLimit : b2;
248               
249               anIso.Load(GeomAbs_IsoV,Coord,b1,b2);
250               
251               VrmlConverter_Curve::Add(anIso, aDrawer, anOStream); 
252             }
253           } 
254       } 
255       
256       if (flag){
257         // Separator 3 }
258         SE3.Print(anOStream);
259         flag = Standard_False;
260       }
261     }
262   }
263
264   // Separator 1 }
265   SE1.Print(anOStream);
266   
267   aDrawer->SetLineAspect(latmp);
268   aDrawer->SetUIsoAspect(iautmp);
269   aDrawer->SetVIsoAspect(iavtmp);
270
271 //     cout << endl;
272
273 //     cout << "Face:aDrawer>UMaterial4 = " << aDrawer->UIsoAspect()->HasMaterial() << endl;
274 //     cout << "Face:aDrawer>VMaterial4 = " << aDrawer->VIsoAspect()->HasMaterial() << endl;
275 //     cout << "Face:aDrawer>LineAspect4 = " << aDrawer->LineAspect()->HasMaterial() << endl;
276 //     cout << "Face:la4 = " << latmp->HasMaterial() << endl;
277 //     cout << "Face:laU4 = " << laU->HasMaterial() << endl;
278 //     cout << "Face:laV4 = " << laV->HasMaterial() << endl;
279 //     cout << "Face:iau4 = " << iautmp->HasMaterial() << endl;
280 //     cout << "Face:iav4 = " << iavtmp->HasMaterial() << endl;
281
282
283
284
285 //=========================================================================
286 // function: Add 2
287 // purpose
288 //=========================================================================
289 void VrmlConverter_WFRestrictedFace::Add
290   (Standard_OStream&                   anOStream,
291    const Handle(BRepAdaptor_HSurface)&    aFace,
292    const Handle (VrmlConverter_Drawer)&       aDrawer){
293
294   Standard_Integer finu = aDrawer->UIsoAspect()->Number();
295   Standard_Integer finv = aDrawer->VIsoAspect()->Number();
296
297   VrmlConverter_WFRestrictedFace::Add (  
298                       anOStream,
299                       aFace,
300                       Standard_True,
301                       Standard_True,
302                       finu,
303                       finv,
304                       aDrawer);
305
306 }
307
308
309 //=========================================================================
310 // function: AddUIso
311 // purpose
312 //=========================================================================
313 void VrmlConverter_WFRestrictedFace::AddUIso
314   (Standard_OStream&                   anOStream,
315    const Handle(BRepAdaptor_HSurface)& aFace,
316    const Handle (VrmlConverter_Drawer)& aDrawer) {
317
318   Standard_Integer finu = aDrawer->UIsoAspect()->Number();
319   Standard_Integer finv = aDrawer->VIsoAspect()->Number();
320
321   VrmlConverter_WFRestrictedFace::Add ( 
322                       anOStream,
323                       aFace,
324                       Standard_True,
325                       Standard_False,
326                       finu,
327                       finv,
328                       aDrawer);
329 }
330
331
332 //=========================================================================
333 // function: AddVIso
334 // purpose
335 //=========================================================================
336 void VrmlConverter_WFRestrictedFace::AddVIso
337   (Standard_OStream&                   anOStream,
338    const Handle(BRepAdaptor_HSurface)& aFace,
339    const Handle (VrmlConverter_Drawer)& aDrawer) {
340
341   Standard_Integer finu = aDrawer->UIsoAspect()->Number();
342   Standard_Integer finv = aDrawer->VIsoAspect()->Number();
343
344   VrmlConverter_WFRestrictedFace::Add ( 
345                       anOStream,
346                       aFace,
347                       Standard_False,
348                       Standard_True,
349                       finu,
350                       finv,
351                       aDrawer);
352 }
353