0030895: Coding Rules - specify std namespace explicitly for std::cout and streams
[occt.git] / src / BRepTest / BRepTest_FillingCommands.cxx
CommitLineData
b311480e 1// Created on: 1996-07-10
2// Created by: Joelle CHAUVET
3// Copyright (c) 1996-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
b311480e 16
7fd59977 17// Modified: Wed Mar 5 09:45:42 1997
18// by: Joelle CHAUVET
19// G1134 : new command "approxplate"
20// Modified: Thu Jun 12 16:51:36 1997
21// by: Jerome LEMONIER
22// Mise a jour suite a la modification des methodes Curves2d
23// et Sense GeomPlate_BuildPlateSurface.
24// Modified: Mon Nov 3 10:24:07 1997
7fd59977 25// utilisation de BRepFill_CurveConstraint
b311480e 26
7fd59977 27
28
29#include <GeometryTest.hxx>
30#include <Draw_Interpretor.hxx>
31#include <Draw_Appli.hxx>
32#include <DrawTrSurf.hxx>
33#include <TopAbs_ShapeEnum.hxx>
34#include <TopoDS.hxx>
35#include <TopoDS_Edge.hxx>
36#include <TopoDS_Face.hxx>
37#include <TopExp_Explorer.hxx>
38#include <TopExp.hxx>
39#include <BRepAdaptor_HSurface.hxx>
40#include <BRepAdaptor_HCurve2d.hxx>
41#include <BRepAdaptor_HCurve.hxx>
42#include <BRepAdaptor_Surface.hxx>
43#include <BRepAdaptor_Curve2d.hxx>
44#include <BRepAdaptor_Curve.hxx>
45#include <BRepTest.hxx>
46#include <DBRep.hxx>
47#include <Adaptor3d_HCurveOnSurface.hxx>
48#include <Adaptor3d_CurveOnSurface.hxx>
49#include <TColStd_HArray1OfInteger.hxx>
50#include <BRep_Tool.hxx>
51
52#include <BRepLib.hxx>
53#include <BRep_Builder.hxx>
54#include <GeomPlate_BuildPlateSurface.hxx>
55#include <GeomPlate_BuildAveragePlane.hxx>
56#include <GeomPlate_Surface.hxx>
57#include <GeomPlate_BuildAveragePlane.hxx>
465e6861 58#include <GeomPlate_HArray1OfHCurve.hxx>
7fd59977 59
60#include <GeomPlate_MakeApprox.hxx>
61#include <GeomPlate_PlateG0Criterion.hxx>
62#include <GeomPlate_PlateG1Criterion.hxx>
63#include <BRepFill_CurveConstraint.hxx>
64#include <GeomPlate_PointConstraint.hxx>
65#include <GeomAdaptor_HSurface.hxx>
66#include <Geom_Surface.hxx>
67
68#include <TopoDS_Wire.hxx>
69#include <BRepBuilderAPI_MakeEdge.hxx>
70#include <BRepBuilderAPI_MakeWire.hxx>
71#include <BRepBuilderAPI_WireError.hxx>
72#include <BRepBuilderAPI_MakeFace.hxx>
73#include <TColGeom2d_HArray1OfCurve.hxx>
74
75#include <AdvApp2Var_ApproxAFunc2Var.hxx>
76#include <AdvApp2Var_Context.hxx>
77#include <AdvApprox_PrefCutting.hxx>
78#include <AdvApprox_Cutting.hxx>
79#include <AdvApprox_DichoCutting.hxx>
80
81#include <Geom_BSplineSurface.hxx>
82
83#include <TColStd_HArray1OfReal.hxx>
84#include <TColStd_HArray2OfReal.hxx>
85
86#include <TColgp_SequenceOfXY.hxx>
87#include <TColgp_SequenceOfXYZ.hxx>
88
89#include <BRepAdaptor_HCurve.hxx>
90#include <Adaptor3d_HIsoCurve.hxx>
91
92#include <Extrema_ExtPS.hxx>
93#include <Extrema_POnSurf.hxx>
94#include <Geom_Plane.hxx>
95#include <BRepOffsetAPI_MakeFilling.hxx>
96#include <TCollection_AsciiString.hxx>
97#include <Geom2d_TrimmedCurve.hxx>
98#include <GeomConvert_ApproxSurface.hxx>
99
100
101#include <stdio.h>
102#include <gp_Pnt.hxx>
103
104// pour mes tests
0797d9d3 105#ifdef OCCT_DEBUG
7fd59977 106#include <OSD_Chronometer.hxx>
107#include <Geom_Line.hxx>
108#endif
109
110const Standard_Integer defDegree = 3;
111const Standard_Integer defNbPtsOnCur = 10;
112const Standard_Integer defNbIter = 3;
113const Standard_Boolean defAnisotropie = Standard_False;
114const Standard_Real defTol2d = 0.00001;
115const Standard_Real defTol3d = 0.0001;
116const Standard_Real defTolAng = 0.01;
117const Standard_Real defTolCurv = 0.1;
118const Standard_Integer defMaxDeg = 8;
119const Standard_Integer defMaxSegments = 9;
120
121Standard_Integer Degree = defDegree;
122Standard_Integer NbPtsOnCur = defNbPtsOnCur ;
123Standard_Integer NbIter = defNbIter;
124Standard_Boolean Anisotropie = defAnisotropie ;
125Standard_Real Tol2d = defTol2d;
126Standard_Real Tol3d = defTol3d;
127Standard_Real TolAng = defTolAng;
128Standard_Real TolCurv = defTolCurv;
129Standard_Integer MaxDeg = defMaxDeg;
130Standard_Integer MaxSegments = defMaxSegments;
131
132////////////////////////////////////////////////////////////////////////////////
133// commande plate : resultat face sur surface plate
134////////////////////////////////////////////////////////////////////////////////
135
136static Standard_Integer plate (Draw_Interpretor & di,Standard_Integer n,const char** a)
137{
138 if (n < 8 ) return 1;
91322f44 139 Standard_Integer NbCurFront=Draw::Atoi(a[3]);
465e6861 140 Handle(GeomPlate_HArray1OfHCurve) Fronts = new GeomPlate_HArray1OfHCurve(1,NbCurFront);
7fd59977 141 Handle(TColStd_HArray1OfInteger) Tang = new TColStd_HArray1OfInteger(1,NbCurFront);
142 Handle(TColStd_HArray1OfInteger) NbPtsCur = new TColStd_HArray1OfInteger(1,NbCurFront);
143 BRep_Builder B;
144
145 GeomPlate_BuildPlateSurface Henri(3,15,2);
146
147 Standard_Integer i;
148 for (i=1; i<=NbCurFront ; i++) {
149 TopoDS_Shape aLocalEdge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
150 TopoDS_Edge E = TopoDS::Edge(aLocalEdge);
151// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
152 if(E.IsNull()) return 1;
153 TopoDS_Shape aLocalFace(DBRep::Get(a[3*i+2],TopAbs_FACE));
154 TopoDS_Face F = TopoDS::Face(aLocalFace);
155// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[3*i+2],TopAbs_FACE));
156 if(F.IsNull()) return 1;
91322f44 157 Standard_Integer T = Draw::Atoi(a[3*i+3]);
7fd59977 158 Tang->SetValue(i,T);
91322f44 159 NbPtsCur->SetValue(i,Draw::Atoi(a[2]));
7fd59977 160 Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
161 S->ChangeSurface().Initialize(F);
162 Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
163 C->ChangeCurve2d().Initialize(E,F);
164 Adaptor3d_CurveOnSurface ConS(C,S);
165 Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
166 Fronts->SetValue(i,HConS);
543a9964 167 Handle(GeomPlate_CurveConstraint) Cont
7fd59977 168 = new BRepFill_CurveConstraint(HConS,
169 Tang->Value(i),
170 NbPtsCur->Value(i));
171 Henri.Add(Cont);
172 }
173
174 Henri.Perform();
175
176 Standard_Real ErrG0 = 1.1*Henri.G0Error();
04232180 177 //std::cout<<" dist. max = "<<Henri.G0Error()<<" ; angle max = "<<Henri.G1Error()<<std::endl;
7fd59977 178 di<<" dist. max = "<<Henri.G0Error()<<" ; angle max = "<<Henri.G1Error()<<"\n";
179
180 BRepBuilderAPI_MakeWire MW;
181 for (i=1 ; i<=NbCurFront ; i++) {
182 Standard_Integer iInOrder=Henri.Order()->Value(i);
183 TopoDS_Edge E;
184 if (Henri.Sense()->Value(iInOrder)==1) {
185 BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
186 Henri.Surface(),
187 Fronts->Value(iInOrder)->LastParameter(),
188 Fronts->Value(iInOrder)->FirstParameter());
189 E = ME.Edge();
190
191 }
192 else {
193 BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
194 Henri.Surface(),
195 Fronts->Value(iInOrder)->FirstParameter(),
196 Fronts->Value(iInOrder)->LastParameter());
197 E = ME.Edge();
198 }
199 B.UpdateVertex(TopExp::FirstVertex(E), ErrG0);
200 B.UpdateVertex(TopExp::LastVertex(E), ErrG0);
201 BRepLib::BuildCurve3d(E);
202 char name[100];
91322f44 203 Sprintf(name,"Edge_%d", i);
7fd59977 204 DBRep::Set(name, E);
205 MW.Add(E);
206 if (MW.IsDone()==Standard_False) {
9775fa61 207 throw Standard_Failure("mkWire is over ");
7fd59977 208 }
209
210 }
211 TopoDS_Wire W;
212 W=MW.Wire();
9775fa61 213 if (!(W.Closed())) throw Standard_Failure("Wire is not closed");
7fd59977 214 BRepBuilderAPI_MakeFace MF(Henri.Surface(),W,Standard_True);
215 DBRep::Set(a[1],MF.Face());
216 return 0;
217}
218
219////////////////////////////////////////////////////////////////////////////////
220// commande gplate : resultat face egale a la surface approchee
221////////////////////////////////////////////////////////////////////////////////
222
223static Standard_Integer gplate (Draw_Interpretor & ,Standard_Integer n,const char** a)
224{
225 if (n < 6 ) return 1;
91322f44 226 Standard_Integer NbCurFront=Draw::Atoi(a[2]),
227 NbPointConstraint=Draw::Atoi(a[3]);
7fd59977 228
229 GeomPlate_BuildPlateSurface Henri(3,15,2);
230
231 Standard_Integer i;
232 Standard_Integer Conti;
233 Standard_Integer Indice=4;
234//Surface d'init
235 TopoDS_Shape aLocalFace(DBRep::Get(a[Indice++],TopAbs_FACE));
236 TopoDS_Face SI = TopoDS::Face(aLocalFace);
237// TopoDS_Face SI = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
238 if(SI.IsNull())
239 Indice--;
240 else
241 { Handle(BRepAdaptor_HSurface) HSI = new BRepAdaptor_HSurface();
242 HSI->ChangeSurface().Initialize(SI);
243 Henri.LoadInitSurface( BRep_Tool::Surface(HSI->ChangeSurface().Face()));
244 }
245 for (i=1; i<=NbCurFront ; i++) {
246 TopoDS_Shape aLocalShape(DBRep::Get(a[Indice++],TopAbs_EDGE));
247 TopoDS_Edge E = TopoDS::Edge(aLocalShape);
248// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[Indice++],TopAbs_EDGE));
249 if(E.IsNull()) return 1;
91322f44 250 Conti=Draw::Atoi(a[Indice++]);
7fd59977 251 if ((Conti==0)||(Conti==-1))
252 { Handle(BRepAdaptor_HCurve) C = new BRepAdaptor_HCurve();
253 C->ChangeCurve().Initialize(E);
543a9964 254 const Handle(Adaptor3d_HCurve)& aC = C; // to avoid ambiguity
255 Handle(GeomPlate_CurveConstraint) Cont= new BRepFill_CurveConstraint(aC,Conti);
7fd59977 256 Henri.Add(Cont);
257 }
258 else
259 {
260 aLocalFace = DBRep::Get(a[Indice++],TopAbs_FACE);
261 TopoDS_Face F = TopoDS::Face(aLocalFace);
262// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
263 if(F.IsNull())
264 return 1;
265 Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
266 S->ChangeSurface().Initialize(F);
267 Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
268 C->ChangeCurve2d().Initialize(E,F);
269 Adaptor3d_CurveOnSurface ConS(C,S);
270 Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
543a9964 271 Handle(GeomPlate_CurveConstraint) Cont= new BRepFill_CurveConstraint(HConS,Conti);
7fd59977 272 Henri.Add(Cont);
273 }
274 }
275
276 for (i=1; i<=NbPointConstraint ; i++)
277 {
278// gp_Pnt P1,P2,P3;
279 gp_Pnt P1;
280// gp_Vec V1,V2,V3,V4,V5;
281
282 if (DrawTrSurf::GetPoint(a[Indice], P1) )
283 { Conti=0;
284 Handle(GeomPlate_PointConstraint) PCont= new GeomPlate_PointConstraint(P1,0);
285 Henri.Add(PCont);
286 Indice++;
287 }
288 else
91322f44 289 { Standard_Real u=Draw::Atof(a[Indice++]),
290 v=Draw::Atof(a[Indice++]);
7fd59977 291
91322f44 292 Conti=Draw::Atoi(a[Indice++]);
7fd59977 293 aLocalFace = DBRep::Get(a[Indice++],TopAbs_FACE);
294 TopoDS_Face F = TopoDS::Face(aLocalFace);
295// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
296 if(F.IsNull())
297 return 1;
298 Handle(BRepAdaptor_HSurface) HF = new BRepAdaptor_HSurface();
299 HF->ChangeSurface().Initialize(F);
300 Handle(GeomPlate_PointConstraint) PCont= new GeomPlate_PointConstraint(u,v,BRep_Tool::Surface(HF->ChangeSurface().Face()),Conti,0.001,0.001,0.001);
301 Henri.Add(PCont);
302 }
303 }
304 Henri.Perform();
305 Standard_Integer nbcarreau=9;
306 Standard_Integer degmax=8;
307 Standard_Real seuil;
308
309 Handle(GeomPlate_Surface) gpPlate = Henri.Surface();
310 TColgp_SequenceOfXY S2d;
311 TColgp_SequenceOfXYZ S3d;
312 S2d.Clear();
313 S3d.Clear();
314 Henri.Disc2dContour(4,S2d);
315 Henri.Disc3dContour(4,0,S3d);
316 seuil = Max(0.0001,10*Henri.G0Error());
317 GeomPlate_PlateG0Criterion critere (S2d,S3d,seuil);
318 GeomPlate_MakeApprox Mapp(gpPlate,critere,0.0001,nbcarreau,degmax);
319 Handle (Geom_Surface) Surf (Mapp.Surface());
320
321 Standard_Real Umin, Umax, Vmin, Vmax;
322
323 Henri.Surface()->Bounds( Umin, Umax, Vmin, Vmax);
324
1c72dff6 325 BRepBuilderAPI_MakeFace MF(Surf, Umin, Umax, Vmin, Vmax, Precision::Confusion());
7fd59977 326
327 DBRep::Set(a[1],MF.Face());
328 return 0;
329}
330
331
332////////////////////////////////////////////////////////////////////////////////
333// commande approxplate : resultat face sur surface approchee
334////////////////////////////////////////////////////////////////////////////////
335
336static Standard_Integer approxplate (Draw_Interpretor & di,Standard_Integer n,const char** a)
337{
338 if (n < 9 ) return 1;
91322f44 339 Standard_Integer NbMedium=Draw::Atoi(a[2]);
340 Standard_Integer NbCurFront=Draw::Atoi(a[3]);
465e6861 341 Handle(GeomPlate_HArray1OfHCurve) Fronts = new GeomPlate_HArray1OfHCurve(1,NbCurFront);
7fd59977 342 Handle(TColStd_HArray1OfInteger) Tang = new TColStd_HArray1OfInteger(1,NbCurFront);
343 Handle(TColStd_HArray1OfInteger) NbPtsCur = new TColStd_HArray1OfInteger(1,NbCurFront);
344
345 GeomPlate_BuildPlateSurface Henri(3,15,2);
346
347 Standard_Integer i;
348 for (i=1; i<=NbCurFront ; i++) {
349 TopoDS_Shape aLocalShape(DBRep::Get(a[3*i+1],TopAbs_EDGE));
350 TopoDS_Edge E = TopoDS::Edge(aLocalShape);
351// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
352 if(E.IsNull()) return 1;
353 TopoDS_Shape aLocalFace(DBRep::Get(a[3*i+2],TopAbs_FACE));
354 TopoDS_Face F = TopoDS::Face(aLocalFace);
355// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[3*i+2],TopAbs_FACE));
356 if(F.IsNull()) return 1;
91322f44 357 Standard_Integer T = Draw::Atoi(a[3*i+3]);
7fd59977 358 Tang->SetValue(i,T);
359 NbPtsCur->SetValue(i,NbMedium);
360 Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
361 S->ChangeSurface().Initialize(F);
362 Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
363 C->ChangeCurve2d().Initialize(E,F);
364 Adaptor3d_CurveOnSurface ConS(C,S);
365 Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
366 Fronts->SetValue(i,HConS);
543a9964 367 Handle(GeomPlate_CurveConstraint) Cont
7fd59977 368 = new BRepFill_CurveConstraint(HConS,
369 Tang->Value(i),
370 NbPtsCur->Value(i));
371 Henri.Add(Cont);
372 }
373
374 Henri.Perform();
375
376 Standard_Real dmax = Henri.G0Error(),
377 anmax = Henri.G1Error();
04232180 378 //std::cout<<" dist. max = "<<dmax<<" ; angle max = "<<anmax<<std::endl;
7fd59977 379 di<<" dist. max = "<<dmax<<" ; angle max = "<<anmax<<"\n";
380
91322f44 381 Tol3d = Draw::Atof(a[3*NbCurFront+4]);
382 Standard_Integer Nbmax = Draw::Atoi(a[3*NbCurFront+5]);
383 Standard_Integer degmax = Draw::Atoi(a[3*NbCurFront+6]);
384 Standard_Integer CritOrder = Draw::Atoi(a[3*NbCurFront+7]);
7fd59977 385 Handle(GeomPlate_Surface) surf = Henri.Surface();
386 Handle(Geom_BSplineSurface) support;
387
388 if (CritOrder==-1) {
389 GeomPlate_MakeApprox MApp(surf,Tol3d,Nbmax,degmax,dmax,-1);
390 support = MApp.Surface();
391 }
392 else if (CritOrder>=0) {
393 TColgp_SequenceOfXY S2d;
394 TColgp_SequenceOfXYZ S3d;
395 S2d.Clear();
396 S3d.Clear();
397 Standard_Real seuil;
398 if (CritOrder==0) {
399 Henri.Disc2dContour(4,S2d);
400 Henri.Disc3dContour(4,0,S3d);
401 seuil = Max(Tol3d,dmax*10);
402 GeomPlate_PlateG0Criterion Crit0(S2d,S3d,seuil);
403 GeomPlate_MakeApprox MApp(surf,Crit0,Tol3d,Nbmax,degmax);
404 support = MApp.Surface();
405 }
406 else if (CritOrder==1) {
407 Henri.Disc2dContour(4,S2d);
408 Henri.Disc3dContour(4,1,S3d);
409 seuil = Max(Tol3d,anmax*10);
410 GeomPlate_PlateG1Criterion Crit1(S2d,S3d,seuil);
411 GeomPlate_MakeApprox MApp(surf,Crit1,Tol3d,Nbmax,degmax);
412 support = MApp.Surface();
413 }
414 }
415
416 BRepBuilderAPI_MakeWire MW;
417 BRep_Builder B;
418 for (i=1 ; i<=NbCurFront ; i++) {
419 Standard_Integer iInOrder=Henri.Order()->Value(i);
420 TopoDS_Edge E;
421 if (Henri.Sense()->Value(iInOrder)==1) {
422 BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
423 support,
424 Fronts->Value(iInOrder)->LastParameter(),
425 Fronts->Value(iInOrder)->FirstParameter());
426 E = ME.Edge();
427 }
428 else {
429 BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
430 support,
431 Fronts->Value(iInOrder)->FirstParameter(),
432 Fronts->Value(iInOrder)->LastParameter());
433 E = ME.Edge();
434 }
435 B.UpdateVertex(TopExp::FirstVertex(E), dmax);
436 B.UpdateVertex(TopExp::LastVertex(E), dmax);
437 BRepLib::BuildCurve3d(E);
438 MW.Add(E);
439 if (MW.IsDone()==Standard_False) {
9775fa61 440 throw Standard_Failure("mkWire is over ");
7fd59977 441 }
442 }
443 TopoDS_Wire W;
444 W=MW.Wire();
9775fa61 445 if (!(W.Closed())) throw Standard_Failure("Wire is not closed");
7fd59977 446 BRepBuilderAPI_MakeFace MF(support,W,Standard_True);
447 DBRep::Set(a[1],MF.Face());
448
449 return 0;
450}
451
452static Standard_Integer filling( Draw_Interpretor & di, Standard_Integer n, const char** a )
453{
0797d9d3 454#ifdef OCCT_DEBUG
7fd59977 455 // Chronmetrage
456 OSD_Chronometer Chrono;
457 Chrono.Reset();
458 Chrono.Start();
459#endif
460
461 if (n < 7) return 1;
91322f44 462 Standard_Integer NbBounds = Draw::Atoi( a[2] );
463 Standard_Integer NbConstraints = Draw::Atoi( a[3] );
464 Standard_Integer NbPoints = Draw::Atoi( a[4] );
7fd59977 465
466 BRepOffsetAPI_MakeFilling MakeFilling( Degree,
467 NbPtsOnCur,
468 NbIter,
469 Anisotropie,
470 Tol2d,
471 Tol3d,
472 TolAng,
473 TolCurv,
474 MaxDeg,
475 MaxSegments );
01697018
J
476 //TopoDS_Shape aLocalFace(DBRep::Get( a[5], TopAbs_FACE ) );
477 //TopoDS_Face InitFace = TopoDS::Face( aLocalFace);
478 TopoDS_Face InitFace = TopoDS::Face( DBRep::Get(a[5], TopAbs_FACE) );
7fd59977 479 if (! InitFace.IsNull())
480 MakeFilling.LoadInitSurface( InitFace );
481
482 Standard_Integer i = (InitFace.IsNull())? 5 : 6, k;
483 TopoDS_Edge E;
484 TopoDS_Face F;
485 gp_Pnt Point;
486 Standard_Integer Order;
487 for (k = 1; k <= NbBounds; k++)
488 {
489 E.Nullify();
490 F.Nullify();
01697018
J
491 //TopoDS_Shape aLocalEdge(DBRep::Get( a[i], TopAbs_EDGE ));
492 //E = TopoDS::Edge(aLocalEdge);
493 E = TopoDS::Edge( DBRep::Get(a[i], TopAbs_EDGE) );
7fd59977 494 if (! E.IsNull())
495 i++;
01697018
J
496 //aLocalFace = DBRep::Get( a[i], TopAbs_FACE ) ;
497 //F = TopoDS::Face(aLocalFace);
498 F = TopoDS::Face( DBRep::Get(a[i], TopAbs_FACE) );
7fd59977 499 if (! F.IsNull())
500 i++;
501
91322f44 502 Order = Draw::Atoi( a[i++] );
7fd59977 503
504 if (! E.IsNull() && ! F.IsNull())
505 MakeFilling.Add( E, F, (GeomAbs_Shape)Order );
506 else if (E.IsNull())
507 {
508 if (F.IsNull())
509 {
04232180 510 //std::cout<<std::endl<<"Wrong parameters"<<std::endl<<std::endl;
586db386 511 di<<"\nWrong parameters\n\n";
7fd59977 512 return 1;
513 }
514 else
515 MakeFilling.Add( F, (GeomAbs_Shape)Order );
516 }
517 else
518 MakeFilling.Add( E, (GeomAbs_Shape)Order );
519 }
520 for (k = 1; k <= NbConstraints; k++)
521 {
522 E.Nullify();
523 F.Nullify();
01697018
J
524 //TopoDS_Shape aLocalEdge(DBRep::Get( a[i++], TopAbs_EDGE ));
525 //E = TopoDS::Edge( aLocalEdge);
526 E = TopoDS::Edge( DBRep::Get(a[i++], TopAbs_EDGE) );
7fd59977 527 if (E.IsNull())
528 {
04232180 529 //std::cout<<"Wrong parameters"<<std::endl;
586db386 530 di<<"Wrong parameters\n";
7fd59977 531 return 1;
532 }
01697018
J
533 //TopoDS_Shape alocalFace(DBRep::Get( a[i], TopAbs_FACE ) );
534 //F = TopoDS::Face( alocalFace);
535 F = TopoDS::Face( DBRep::Get(a[i], TopAbs_FACE) );
7fd59977 536 if (! F.IsNull())
537 i++;
538
91322f44 539 Order = Draw::Atoi( a[i++] );
7fd59977 540
541 if (F.IsNull())
542 MakeFilling.Add( E, (GeomAbs_Shape)Order, Standard_False );
543 else
544 MakeFilling.Add( E, F, (GeomAbs_Shape)Order, Standard_False );
545 }
546 for (k = 1; k <= NbPoints; k++)
547 {
548 if (DrawTrSurf::GetPoint( a[i], Point ))
549 {
550 MakeFilling.Add( Point );
551 i++;
552 }
553 else
554 {
91322f44 555 Standard_Real U = Draw::Atof( a[i++] ), V = Draw::Atof( a[i++] );
01697018
J
556 //aLocalFace = DBRep::Get( a[i++], TopAbs_FACE );
557 //F = TopoDS::Face( aLocalFace);
558 F = TopoDS::Face( DBRep::Get(a[i++], TopAbs_FACE));
7fd59977 559 if (F.IsNull())
560 {
04232180 561 //std::cout<<"Wrong parameters"<<std::endl;
586db386 562 di<<"Wrong parameters\n";
7fd59977 563 return 1;
564 }
91322f44 565 Order = Draw::Atoi( a[i++] );
7fd59977 566
567 MakeFilling.Add( U, V, F, (GeomAbs_Shape)Order );
568 }
569 }
570
571 MakeFilling.Build();
572 if (! MakeFilling.IsDone())
573 {
04232180 574 //std::cout<<"filling failed"<<std::endl;
586db386 575 di<<"filling failed\n";
7fd59977 576 return 0;
577 }
578
579 Standard_Real dmax = MakeFilling.G0Error(),
580 angmax = MakeFilling.G1Error(),
581 curvmax = MakeFilling.G2Error();
04232180 582 //std::cout<<" dist. max = "<<dmax<<" ; angle max = "<<angmax<<" ; diffcurv max = "<<curvmax<<std::endl;
7fd59977 583 di<<" dist. max = "<<dmax<<" ; angle max = "<<angmax<<" ; diffcurv max = "<<curvmax<<"\n";
584
585 TopoDS_Face ResFace= TopoDS::Face( MakeFilling.Shape() );
586 DBRep::Set( a[1], ResFace );
587
0797d9d3 588#ifdef OCCT_DEBUG
7fd59977 589 Chrono.Stop();
590 Standard_Real Tps;
591 Chrono.Show(Tps);
04232180 592 //std::cout<<"*** FIN DE FILLING ***"<<std::endl;
593 //std::cout<<"Temps de calcul : "<<Tps<<std::endl;
586db386 594 di<<"*** FIN DE FILLING ***\n";
7fd59977 595 di<<"Temps de calcul : "<<Tps<<"\n";
596#endif
597
598 return 0;
599}
600
601static Standard_Integer fillingparam( Draw_Interpretor & di, Standard_Integer n, const char** a )
602{
603 if ( n == 1) {
604
04232180 605 //std::cout << "fillingparam : options are" <<std::endl;
606 //std::cout << "-l : to list current values" << std::endl;
607 //std::cout << "-i : to set default values" << std::endl;
608 //std::cout << "-r deg nbPonC nbIt anis : to set filling options" <<std::endl;
609 //std::cout << "-c t2d t3d tang tcur : to set tolerances" << std::endl;
610 //std::cout << "-a maxdeg maxseg : Approximation option" << std::endl;
7fd59977 611 di << "fillingparam : options are" <<"\n";
586db386 612 di << "-l : to list current values\n";
7fd59977 613 di << "-i : to set default values" << "\n";
586db386 614 di << "-r deg nbPonC nbIt anis : to set filling options\n";
615 di << "-c t2d t3d tang tcur : to set tolerances\n";
616 di << "-a maxdeg maxseg : Approximation option\n";
7fd59977 617 }
618 else if (n > 1)
619 {
620 TCollection_AsciiString AS( a[1] );
621 AS.LowerCase();
622 const char* flag = AS.ToCString();
623 if (strcmp( flag, "-l" ) == 0 && n == 2)
624 {
04232180 625 //std::cout<<std::endl;
626 //std::cout<<"Degree = "<<Degree<<std::endl;
627 //std::cout<<"NbPtsOnCur = "<<NbPtsOnCur<<std::endl;
628 //std::cout<<"NbIter = "<<NbIter<<std::endl;
629 //std::cout<<"Anisotropie = "<<Anisotropie<<std::endl<<std::endl;
7fd59977 630 //
04232180 631 //std::cout<<"Tol2d = "<<Tol2d<<std::endl;
632 //std::cout<<"Tol3d = "<<Tol3d<<std::endl;
633 //std::cout<<"TolAng = "<<TolAng<<std::endl;
634 //std::cout<<"TolCurv = "<<TolCurv<<std::endl<<std::endl;
7fd59977 635 //
04232180 636 //std::cout<<"MaxDeg = "<<MaxDeg<<std::endl;
637 //std::cout<<"MaxSegments = "<<MaxSegments<<std::endl<<std::endl;
7fd59977 638 di<<"\n";
639 di<<"Degree = "<<Degree<<"\n";
640 di<<"NbPtsOnCur = "<<NbPtsOnCur<<"\n";
641 di<<"NbIter = "<<NbIter<<"\n";
586db386 642 di<<"Anisotropie = "<< (Standard_Integer) Anisotropie<<"\n\n";
7fd59977 643
644 di<<"Tol2d = "<<Tol2d<<"\n";
645 di<<"Tol3d = "<<Tol3d<<"\n";
646 di<<"TolAng = "<<TolAng<<"\n";
586db386 647 di<<"TolCurv = "<<TolCurv<<"\n\n";
7fd59977 648
649 di<<"MaxDeg = "<<MaxDeg<<"\n";
586db386 650 di<<"MaxSegments = "<<MaxSegments<<"\n\n";
7fd59977 651 }
652 else if (strcmp( flag, "-i" ) == 0 && n == 2)
653 {
654 Degree = defDegree;
655 NbPtsOnCur = defNbPtsOnCur;
656 NbIter = defNbIter;
657 Anisotropie = defAnisotropie;
658
659 Tol2d = defTol2d;
660 Tol3d = defTol3d;
661 TolAng = defTolAng;
662 TolCurv = defTolCurv;
663
664 MaxDeg = defMaxDeg;
665 MaxSegments = defMaxSegments;
666 }
667 else if (strcmp( flag, "-r" ) == 0 && n == 6)
668 {
91322f44 669 Degree = Draw::Atoi( a[2] );
670 NbPtsOnCur = Draw::Atoi( a[3] );
671 NbIter = Draw::Atoi( a[4] );
dde68833 672 Anisotropie = Draw::Atoi( a[5] ) != 0;
7fd59977 673 }
674 else if (strcmp( flag, "-c" ) == 0 && n == 6)
675 {
91322f44 676 Tol2d = Draw::Atof( a[2] );
677 Tol3d = Draw::Atof( a[3] );
678 TolAng = Draw::Atof( a[4] );
679 TolCurv = Draw::Atof( a[5] );
7fd59977 680 }
681 else if (strcmp( flag, "-a" ) == 0 && n == 4)
682 {
91322f44 683 MaxDeg = Draw::Atoi( a[2] );
684 MaxSegments = Draw::Atoi( a[3] );
7fd59977 685 }
686 else
687 {
04232180 688 //std::cout<<"Wrong parameters"<<std::endl;
586db386 689 di<<"Wrong parameters\n";
7fd59977 690 return 1;
691 }
692 }
693 return 0;
694}
695
696
697
698
699void BRepTest::FillingCommands(Draw_Interpretor& theCommands)
700{
701 static Standard_Boolean done = Standard_False;
702 if (done) return;
703 done = Standard_True;
704
705 DBRep::BasicCommands(theCommands);
706 GeometryTest::SurfaceCommands(theCommands);
707
708 const char* g = "Surface filling topology commands";
709 theCommands.Add("plate",
710 "plate result nbrpntoncurve nbrcurfront edge face tang (0:vif;1:tang) ...",
711 __FILE__,
712 plate,
713 g) ;
714
715 theCommands.Add("gplate",
716 "gplate result nbrcurfront nbrpntconst [SurfInit] [edge 0] [edge tang (1:G1;2:G2) surf]... [point] [u v tang (1:G1;2:G2) surf] ...",
717 __FILE__,
718 gplate,
719 g) ;
720
721 theCommands.Add("approxplate",
722 "approxplate result nbrpntoncurve nbrcurfront edge face tang (0:vif;1:tang) ... tol nmax degmax crit",
723 __FILE__,
724 approxplate,
725 g) ;
726
727
728
729 theCommands.Add("filling",
730 "filling result nbB nbC nbP [SurfInit] [edge][face]order... edge[face]order... point/u v face order...",
731 __FILE__,
732 filling,
733 g) ;
734
735 theCommands.Add("fillingparam",
736 "fillingparam : no arg give help",
737 __FILE__,
738 fillingparam,
739 g) ;
740
741}