0023959: Getting rid of generic classes in Visualization: generic classes were remove...
[occt.git] / src / Prs3d / Prs3d_WFDeflectionRestrictedFace.gxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19 #include <Hatch_Hatcher.hxx>
20 #include <Graphic3d_Group.hxx>
21 #include <gp_Pnt.hxx>
22 #include <gp_Pnt2d.hxx>
23 #include <Prs3d_IsoAspect.hxx>
24 #include <Adaptor2d_Curve2d.hxx>
25 #include <GCPnts_UniformDeflection.hxx>
26 #include <Adaptor3d_IsoCurve.hxx>
27
28
29 //=========================================================================
30 // function: Add
31 // purpose
32 //=========================================================================
33 void Prs3d_WFDeflectionRestrictedFace::Add
34   (const Handle (Prs3d_Presentation)& aPresentation,
35    const Handle(BRepAdaptor_HSurface)& aFace,
36    const Standard_Boolean DrawUIso,
37    const Standard_Boolean DrawVIso,
38    const Quantity_Length Deflection,
39    const Standard_Integer NBUiso,
40    const Standard_Integer NBViso,
41    const Handle(Prs3d_Drawer)& aDrawer,
42    Prs3d_NListOfSequenceOfPnt& Curves) 
43 {
44   RestrictionTool ToolRst (aFace);
45   Standard_Real aLimit = aDrawer->MaximalParameterValue();
46
47   // compute bounds of the restriction
48   Standard_Real UMin,UMax,VMin,VMax;
49   Standard_Real u,v,step;
50   Standard_Integer i,nbPoints = 10;
51   UMin = VMin = RealLast();
52   UMax = VMax = RealFirst();
53   gp_Pnt2d P;
54
55   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
56     Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
57     u = TheRCurve->FirstParameter();
58     v = TheRCurve->LastParameter();
59     if (TheRCurve->GetType() != GeomAbs_Line) {
60       step = ( v - u) / nbPoints;
61       for (i = 0; i <= nbPoints; i++) {
62         TheRCurve->D0(u, P);
63         if (P.X() < UMin) UMin = P.X();
64         if (P.X() > UMax) UMax = P.X();
65         if (P.Y() < VMin) VMin = P.Y();
66         if (P.Y() > VMax) VMax = P.Y();
67         u += step;
68       }
69     }
70     else {
71       TheRCurve->D0(u, P);
72       if (P.X() < UMin) UMin = P.X();
73       if (P.X() > UMax) UMax = P.X();
74       if (P.Y() < VMin) VMin = P.Y();
75       if (P.Y() > VMax) VMax = P.Y();
76
77       TheRCurve->D0(v, P);
78       if (P.X() < UMin) UMin = P.X();
79       if (P.X() > UMax) UMax = P.X();
80       if (P.Y() < VMin) VMin = P.Y();
81       if (P.Y() > VMax) VMax = P.Y();
82     }
83   }
84
85   // load the isos
86   Hatch_Hatcher isobuild(1.e-5,ToolRst.IsOriented());
87   Standard_Boolean UClosed = aFace->IsUClosed();
88   Standard_Boolean VClosed = aFace->IsVClosed();
89
90   if ( ! UClosed ) {
91     UMin = UMin + ( UMax - UMin) /1000.;
92     UMax = UMax - ( UMax - UMin) /1000.; 
93   }
94
95   if ( ! VClosed ) {
96     VMin = VMin + ( VMax - VMin) /1000.;
97     VMax = VMax - ( VMax - VMin) /1000.; 
98   }
99
100   if (DrawUIso){
101     if (NBUiso > 0) {
102       UClosed = Standard_False; // En attendant un hatcher de course.
103       Standard_Real du= UClosed ? (UMax-UMin)/NBUiso : (UMax-UMin)/(1+NBUiso);
104       for (i=1; i<=NBUiso;i++){
105         isobuild.AddXLine(UMin+du*i);
106       }
107     }
108   }
109   if (DrawVIso){
110     if ( NBViso > 0) {
111       VClosed = Standard_False;
112       Standard_Real dv= VClosed ?(VMax-VMin)/NBViso : (VMax-VMin)/(1+NBViso);
113       for (i=1; i<=NBViso;i++){
114         isobuild.AddYLine(VMin+dv*i);
115       }
116     }
117   }
118
119   // trim the isos
120   gp_Pnt2d P1,P2;
121   Standard_Real U1, U2;
122   gp_Pnt dummypnt;
123   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
124     TopAbs_Orientation Orient = ToolRst.Orientation();
125     if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
126       Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
127       if (TheRCurve->GetType() != GeomAbs_Line) {
128         GCPnts_UniformDeflection UDP(*TheRCurve, Deflection, Standard_False);
129         if (UDP.IsDone()) {
130           Standard_Integer NumberOfPoints = UDP.NbPoints();
131           if ( NumberOfPoints >= 2 ) {
132             dummypnt = UDP.Value(1);
133             P2.SetCoord(dummypnt.X(), dummypnt.Y());
134             for (i = 2; i <= NumberOfPoints; i++) {
135               P1 = P2;
136               dummypnt = UDP.Value(i);
137               P2.SetCoord(dummypnt.X(), dummypnt.Y());
138               if(Orient == TopAbs_FORWARD )
139                 isobuild.Trim(P1,P2);
140               else
141                 isobuild.Trim(P2,P1);
142             }
143           }
144         }
145         else {
146           cout << "Cannot evaluate curve on surface"<<endl;
147         }
148       }
149       else {
150         U1 = TheRCurve->FirstParameter();
151         U2 = TheRCurve->LastParameter();
152         P1 = TheRCurve->Value(U1);
153         P2 = TheRCurve->Value(U2);
154         if(Orient == TopAbs_FORWARD )
155           isobuild.Trim(P1,P2);
156         else
157           isobuild.Trim(P2,P1);
158       }
159     }
160   }
161
162   // draw the isos
163   Adaptor3d_IsoCurve anIso;
164   anIso.Load(aFace);
165   Standard_Integer NumberOfLines = isobuild.NbLines();
166
167   for (i = 1; i <= NumberOfLines; i++) {
168     Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
169     Standard_Real Coord = isobuild.Coordinate(i);
170     for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
171       Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
172
173       b1 = b1 == RealFirst() ? - aLimit : b1;
174       b2 = b2 == RealLast()  ?   aLimit : b2;
175
176       if (isobuild.IsXLine(i))
177         anIso.Load(GeomAbs_IsoU,Coord,b1,b2);
178       else
179         anIso.Load(GeomAbs_IsoV,Coord,b1,b2);
180
181       DrawFaceIso::Add(aPresentation,anIso,Deflection, aLimit);
182     }
183   }
184 }
185
186
187 //=========================================================================
188 // function: Match
189 // purpose
190 //=========================================================================
191 Standard_Boolean Prs3d_WFDeflectionRestrictedFace::Match
192   (const Quantity_Length X,
193    const Quantity_Length Y,
194    const Quantity_Length Z,
195    const Quantity_Length aDistance,
196    const Handle(BRepAdaptor_HSurface)& aFace,
197    const Handle(Prs3d_Drawer)& aDrawer,
198    const Standard_Boolean DrawUIso,
199    const Standard_Boolean DrawVIso,
200    const Quantity_Length Deflection,
201    const Standard_Integer NBUiso,
202    const Standard_Integer NBViso)
203 {
204
205    RestrictionTool ToolRst (aFace);
206    const Standard_Real aLimit = aDrawer->MaximalParameterValue();
207
208   // compute bounds of the restriction
209   Standard_Real UMin,UMax,VMin,VMax;
210   Standard_Real u,v,step;
211   Standard_Integer i,nbPoints = 10;
212   UMin = VMin = RealLast();
213   UMax = VMax = RealFirst();
214   
215   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
216     Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
217     u = TheRCurve->FirstParameter();
218     v = TheRCurve->LastParameter();
219     step = ( v - u) / nbPoints;
220     for (i = 0; i <= nbPoints; i++) {
221       gp_Pnt2d P = TheRCurve->Value(u);
222       if (P.X() < UMin) UMin = P.X();
223       if (P.X() > UMax) UMax = P.X();
224       if (P.Y() < VMin) VMin = P.Y();
225       if (P.Y() > VMax) VMax = P.Y();
226       u += step;
227     }
228   }
229   
230   // load the isos
231   Hatch_Hatcher isobuild(1.e-5,ToolRst.IsOriented());
232   Standard_Boolean UClosed = aFace->IsUClosed();
233   Standard_Boolean VClosed = aFace->IsVClosed();
234
235   if ( ! UClosed ) {
236     UMin = UMin + ( UMax - UMin) /1000.;
237     UMax = UMax - ( UMax - UMin) /1000.; 
238   }
239
240   if ( ! VClosed ) {
241     VMin = VMin + ( VMax - VMin) /1000.;
242     VMax = VMax - ( VMax - VMin) /1000.; 
243   }
244
245   if (DrawUIso){
246     if (NBUiso > 0) {
247       UClosed = Standard_False; // En attendant un hatcher de course.
248       Standard_Real du= UClosed ? (UMax-UMin)/NBUiso : (UMax-UMin)/(1+NBUiso);
249       for (i=1; i<=NBUiso;i++){
250         isobuild.AddXLine(UMin+du*i);
251       }
252     }
253   }
254   if (DrawVIso){
255     if ( NBViso > 0) {
256       VClosed = Standard_False;
257       Standard_Real dv= VClosed ?(VMax-VMin)/NBViso : (VMax-VMin)/(1+NBViso);
258       for (i=1; i<=NBViso;i++){
259         isobuild.AddYLine(VMin+dv*i);
260       }
261     }
262   }
263
264   // trim the isos
265   gp_Pnt2d P1,P2;
266   gp_Pnt dummypnt;
267   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
268     TopAbs_Orientation Orient = ToolRst.Orientation();
269     if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
270       Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
271       GCPnts_UniformDeflection UDP(*TheRCurve, Deflection, Standard_False);
272       if (UDP.IsDone()) {
273         Standard_Integer NumberOfPoints = UDP.NbPoints();
274         if ( NumberOfPoints >= 2 ) {
275           dummypnt = UDP.Value(1);
276           P2.SetCoord(dummypnt.X(), dummypnt.Y());
277           for (i = 2; i <= NumberOfPoints; i++) {
278             P1 = P2;
279             dummypnt = UDP.Value(i);
280             P2.SetCoord(dummypnt.X(), dummypnt.Y());
281             if(Orient == TopAbs_FORWARD )
282               isobuild.Trim(P1,P2);
283             else
284               isobuild.Trim(P2,P1);
285           }
286         }
287       }
288       else {
289         cout << "Cannot evaluate curve on surface"<<endl;
290       }
291     }
292   }
293   
294   // draw the isos
295
296   Adaptor3d_IsoCurve anIso;
297   anIso.Load(aFace);
298   Standard_Integer NumberOfLines = isobuild.NbLines();
299
300   for (i = 1; i <= NumberOfLines; i++) {
301     Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
302     Standard_Real Coord = isobuild.Coordinate(i);
303     for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
304       Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
305
306       b1 = b1 == RealFirst() ? - aLimit : b1;
307       b2 = b2 == RealLast()  ?   aLimit : b2;
308
309       if (isobuild.IsXLine(i))
310         anIso.Load(GeomAbs_IsoU,Coord,b1,b2);
311       else
312         anIso.Load(GeomAbs_IsoV,Coord,b1,b2);
313     
314       if (DrawFaceIso::Match(X,Y,Z,aDistance,anIso,Deflection, aLimit))
315           return Standard_True;
316     }
317   }
318   return Standard_False;
319 }
320
321
322 //=========================================================================
323 // function: Add
324 // purpose
325 //=========================================================================
326 void Prs3d_WFDeflectionRestrictedFace::Add
327   (const Handle (Prs3d_Presentation)& aPresentation,
328    const Handle(BRepAdaptor_HSurface)& aFace,
329    const Handle (Prs3d_Drawer)& aDrawer)
330 {
331   Prs3d_WFDeflectionRestrictedFace::Add (  
332                       aPresentation,
333                       aFace,
334                       Standard_True,
335                       Standard_True,
336                       aDrawer->MaximalChordialDeviation(),
337                       aDrawer->UIsoAspect()->Number(),
338                       aDrawer->VIsoAspect()->Number(),
339                       aDrawer);
340 }
341
342
343 //=========================================================================
344 // function: AddUIso
345 // purpose
346 //=========================================================================
347 void Prs3d_WFDeflectionRestrictedFace::AddUIso
348   (const Handle (Prs3d_Presentation)& aPresentation,
349    const Handle(BRepAdaptor_HSurface)& aFace,
350    const Handle (Prs3d_Drawer)& aDrawer)
351 {
352   Prs3d_WFDeflectionRestrictedFace::Add ( 
353                       aPresentation,
354                       aFace,
355                       Standard_True,
356                       Standard_False,
357                       aDrawer->MaximalChordialDeviation(),
358                       aDrawer->UIsoAspect()->Number(),
359                       aDrawer->VIsoAspect()->Number(),
360                       aDrawer);
361 }
362
363
364 //=========================================================================
365 // function: AddVIso
366 // purpose
367 //=========================================================================
368 void Prs3d_WFDeflectionRestrictedFace::AddVIso
369   (const Handle (Prs3d_Presentation)& aPresentation,
370    const Handle(BRepAdaptor_HSurface)& aFace,
371    const Handle (Prs3d_Drawer)& aDrawer)
372 {
373   Prs3d_WFDeflectionRestrictedFace::Add (
374                       aPresentation,
375                       aFace,
376                       Standard_False,
377                       Standard_True,
378                       aDrawer->MaximalChordialDeviation(),
379                       aDrawer->UIsoAspect()->Number(),
380                       aDrawer->VIsoAspect()->Number(),
381                       aDrawer);
382 }
383
384
385 //=========================================================================
386 // function: Match
387 // purpose
388 //=========================================================================
389 Standard_Boolean Prs3d_WFDeflectionRestrictedFace::Match
390   (const Quantity_Length X,
391    const Quantity_Length Y,
392    const Quantity_Length Z,
393    const Quantity_Length aDistance,
394    const Handle(BRepAdaptor_HSurface)& aFace,
395    const Handle (Prs3d_Drawer)& aDrawer)
396 {
397   return Prs3d_WFDeflectionRestrictedFace::Match (  
398                       X,Y,Z,aDistance,
399                       aFace,
400                       aDrawer,
401                       Standard_True,
402                       Standard_True,
403                       aDrawer->MaximalChordialDeviation(),
404                       aDrawer->UIsoAspect()->Number(),
405                       aDrawer->VIsoAspect()->Number());
406 }
407
408
409 //=========================================================================
410 // function: MatchUIso
411 // purpose
412 //=========================================================================
413 Standard_Boolean Prs3d_WFDeflectionRestrictedFace::MatchUIso
414   (const Quantity_Length X,
415    const Quantity_Length Y,
416    const Quantity_Length Z,
417    const Quantity_Length aDistance,
418    const Handle(BRepAdaptor_HSurface)& aFace,
419    const Handle (Prs3d_Drawer)& aDrawer)
420 {
421   Quantity_Length Deflection = aDrawer->MaximalChordialDeviation();
422   Standard_Integer finu = aDrawer->UIsoAspect()->Number();
423   Standard_Integer finv = aDrawer->VIsoAspect()->Number();
424   return Prs3d_WFDeflectionRestrictedFace::Match ( 
425                       X,Y,Z,aDistance,
426                       aFace,
427                       aDrawer,
428                       Standard_True,
429                       Standard_False,
430                       Deflection,
431                       finu,
432                       finv);
433 }
434
435
436 //=========================================================================
437 // function: MatchVIso
438 // purpose
439 //=========================================================================
440 Standard_Boolean Prs3d_WFDeflectionRestrictedFace::MatchVIso
441   (const Quantity_Length X,
442    const Quantity_Length Y,
443    const Quantity_Length Z,
444    const Quantity_Length aDistance,
445    const Handle(BRepAdaptor_HSurface)& aFace,
446    const Handle (Prs3d_Drawer)& aDrawer)
447 {
448   return Prs3d_WFDeflectionRestrictedFace::Match ( 
449                       X,Y,Z,aDistance,
450                       aFace,
451                       aDrawer,
452                       Standard_False,
453                       Standard_True,
454                       aDrawer->MaximalChordialDeviation(),
455                       aDrawer->UIsoAspect()->Number(),
456                       aDrawer->VIsoAspect()->Number());
457 }