Commit | Line | Data |
---|---|---|
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> | |
58 | #include <GeomPlate_HArray1OfHCurveOnSurface.hxx> | |
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 | ||
110 | const Standard_Integer defDegree = 3; | |
111 | const Standard_Integer defNbPtsOnCur = 10; | |
112 | const Standard_Integer defNbIter = 3; | |
113 | const Standard_Boolean defAnisotropie = Standard_False; | |
114 | const Standard_Real defTol2d = 0.00001; | |
115 | const Standard_Real defTol3d = 0.0001; | |
116 | const Standard_Real defTolAng = 0.01; | |
117 | const Standard_Real defTolCurv = 0.1; | |
118 | const Standard_Integer defMaxDeg = 8; | |
119 | const Standard_Integer defMaxSegments = 9; | |
120 | ||
121 | Standard_Integer Degree = defDegree; | |
122 | Standard_Integer NbPtsOnCur = defNbPtsOnCur ; | |
123 | Standard_Integer NbIter = defNbIter; | |
124 | Standard_Boolean Anisotropie = defAnisotropie ; | |
125 | Standard_Real Tol2d = defTol2d; | |
126 | Standard_Real Tol3d = defTol3d; | |
127 | Standard_Real TolAng = defTolAng; | |
128 | Standard_Real TolCurv = defTolCurv; | |
129 | Standard_Integer MaxDeg = defMaxDeg; | |
130 | Standard_Integer MaxSegments = defMaxSegments; | |
131 | ||
132 | //////////////////////////////////////////////////////////////////////////////// | |
133 | // commande plate : resultat face sur surface plate | |
134 | //////////////////////////////////////////////////////////////////////////////// | |
135 | ||
136 | static 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]); |
7fd59977 | 140 | Handle(GeomPlate_HArray1OfHCurveOnSurface) Fronts = new GeomPlate_HArray1OfHCurveOnSurface(1,NbCurFront); |
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(); | |
177 | //cout<<" dist. max = "<<Henri.G0Error()<<" ; angle max = "<<Henri.G1Error()<<endl; | |
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) { | |
7fd59977 | 207 | Standard_Failure::Raise("mkWire is over "); |
208 | } | |
209 | ||
210 | } | |
211 | TopoDS_Wire W; | |
212 | W=MW.Wire(); | |
213 | if (!(W.Closed())) Standard_Failure::Raise("Wire is not closed"); | |
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 | ||
223 | static 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 | ||
336 | static 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]); | |
7fd59977 | 341 | Handle(GeomPlate_HArray1OfHCurveOnSurface) Fronts = new GeomPlate_HArray1OfHCurveOnSurface(1,NbCurFront); |
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(); | |
378 | //cout<<" dist. max = "<<dmax<<" ; angle max = "<<anmax<<endl; | |
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) { | |
7fd59977 | 440 | Standard_Failure::Raise("mkWire is over "); |
441 | } | |
442 | } | |
443 | TopoDS_Wire W; | |
444 | W=MW.Wire(); | |
445 | if (!(W.Closed())) Standard_Failure::Raise("Wire is not closed"); | |
446 | BRepBuilderAPI_MakeFace MF(support,W,Standard_True); | |
447 | DBRep::Set(a[1],MF.Face()); | |
448 | ||
449 | return 0; | |
450 | } | |
451 | ||
452 | static 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 | { | |
510 | //cout<<endl<<"Wrong parameters"<<endl<<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 | { | |
529 | //cout<<"Wrong parameters"<<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 | { | |
561 | //cout<<"Wrong parameters"<<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 | { | |
574 | //cout<<"filling failed"<<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(); | |
582 | //cout<<" dist. max = "<<dmax<<" ; angle max = "<<angmax<<" ; diffcurv max = "<<curvmax<<endl; | |
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); | |
592 | //cout<<"*** FIN DE FILLING ***"<<endl; | |
593 | //cout<<"Temps de calcul : "<<Tps<<endl; | |
586db386 | 594 | di<<"*** FIN DE FILLING ***\n"; |
7fd59977 | 595 | di<<"Temps de calcul : "<<Tps<<"\n"; |
596 | #endif | |
597 | ||
598 | return 0; | |
599 | } | |
600 | ||
601 | static Standard_Integer fillingparam( Draw_Interpretor & di, Standard_Integer n, const char** a ) | |
602 | { | |
603 | if ( n == 1) { | |
604 | ||
605 | //cout << "fillingparam : options are" <<endl; | |
606 | //cout << "-l : to list current values" << endl; | |
607 | //cout << "-i : to set default values" << endl; | |
608 | //cout << "-r deg nbPonC nbIt anis : to set filling options" <<endl; | |
609 | //cout << "-c t2d t3d tang tcur : to set tolerances" << endl; | |
610 | //cout << "-a maxdeg maxseg : Approximation option" << endl; | |
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 | { | |
625 | //cout<<endl; | |
626 | //cout<<"Degree = "<<Degree<<endl; | |
627 | //cout<<"NbPtsOnCur = "<<NbPtsOnCur<<endl; | |
628 | //cout<<"NbIter = "<<NbIter<<endl; | |
629 | //cout<<"Anisotropie = "<<Anisotropie<<endl<<endl; | |
630 | // | |
631 | //cout<<"Tol2d = "<<Tol2d<<endl; | |
632 | //cout<<"Tol3d = "<<Tol3d<<endl; | |
633 | //cout<<"TolAng = "<<TolAng<<endl; | |
634 | //cout<<"TolCurv = "<<TolCurv<<endl<<endl; | |
635 | // | |
636 | //cout<<"MaxDeg = "<<MaxDeg<<endl; | |
637 | //cout<<"MaxSegments = "<<MaxSegments<<endl<<endl; | |
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] ); | |
672 | Anisotropie = Draw::Atoi( a[5] ); | |
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 | { | |
688 | //cout<<"Wrong parameters"<<endl; | |
586db386 | 689 | di<<"Wrong parameters\n"; |
7fd59977 | 690 | return 1; |
691 | } | |
692 | } | |
693 | return 0; | |
694 | } | |
695 | ||
696 | ||
697 | ||
698 | ||
699 | void 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 | } |