Update OCCT version up to 6.5.4beta1
[occt.git] / src / SWDRAW / SWDRAW_ShapeUpgrade.cxx
... / ...
CommitLineData
1// Created on: 1999-03-09
2// Created by: data exchange team
3// Copyright (c) 1999-1999 Matra Datavision
4// Copyright (c) 1999-2012 OPEN CASCADE SAS
5//
6// The content of this file is subject to the Open CASCADE Technology Public
7// License Version 6.5 (the "License"). You may not use the content of this file
8// except in compliance with the License. Please obtain a copy of the License
9// at http://www.opencascade.org and read it completely before using this file.
10//
11// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13//
14// The Original Code and all software distributed under the License is
15// distributed on an "AS IS" basis, without warranty of any kind, and the
16// Initial Developer hereby disclaims all such warranties, including without
17// limitation, any warranties of merchantability, fitness for a particular
18// purpose or non-infringement. Please see the License for the specific terms
19// and conditions governing the rights and limitations under the License.
20
21//gka,rln 30.04.99 S4137: new commands for testing ShapeDivide added, some removed
22//abv,pdn 05.05.99 S4174: new commands for testing ShapeDivide added, some removed
23//pdn,gka 10.06.99 S4189: command DT_ShapeConvertRev added
24
25#include <SWDRAW_ShapeUpgrade.ixx>
26
27#include <DBRep.hxx>
28#include <ShapeUpgrade.hxx>
29#include <ShapeUpgrade_SplitCurve3dContinuity.hxx>
30#include <ShapeUpgrade_SplitCurve2dContinuity.hxx>
31#include <ShapeUpgrade_SplitSurfaceContinuity.hxx>
32//#include <ShapeUpgrade_SupportModification.hxx>
33#include <Draw_Interpretor.hxx>
34#include <DrawTrSurf.hxx>
35#include <Geom_Curve.hxx>
36#include <Geom_Plane.hxx>
37#include <Geom_Surface.hxx>
38#include <Geom2d_Curve.hxx>
39#include <TColGeom_HArray1OfCurve.hxx>
40#include <TColGeom_HArray2OfSurface.hxx>
41#include <TColStd_Array1OfReal.hxx>
42#include <TColStd_HArray1OfReal.hxx>
43#include <TColStd_HSequenceOfReal.hxx>
44#include <TopoDS.hxx>
45#include <TopoDS_Edge.hxx>
46#include <TopoDS_Face.hxx>
47#include <TopoDS_Shape.hxx>
48#include <TopoDS_Shell.hxx>
49#include <TopoDS_Wire.hxx>
50#include <TopoDS_Compound.hxx>
51#include <TopExp_Explorer.hxx>
52#include <TColGeom_HArray2OfSurface.hxx>
53#include <TColGeom2d_HArray1OfCurve.hxx>
54#include <BRepBuilderAPI.hxx>
55#include <SWDRAW.hxx>
56#include <ShapeUpgrade_ShapeDivideArea.hxx>
57
58#include <stdio.h>
59//#include <ShapeExtend_WireData.hxx>
60//#include <ShapeAnalysis_Shell.hxx>
61//#include <ShapeAnalysis_WireOrder.hxx>
62//#include <ShapeAnalysis_Wire.hxx>
63//#include <ShapeUpgrade_ShellSewing.hxx>
64#include <Geom2d_Curve.hxx>
65#include <Geom2d_OffsetCurve.hxx>
66#include <Geom_OffsetCurve.hxx>
67#include <ShapeUpgrade_SplitCurve3dContinuity.hxx>
68#include <TopoDS_Iterator.hxx>
69#include <BRep_Tool.hxx>
70#include <ShapeExtend_CompositeSurface.hxx>
71#include <Geom_RectangularTrimmedSurface.hxx>
72#include <TColGeom_HArray2OfSurface.hxx>
73#include <ShapeFix_ComposeShell.hxx>
74#include <Precision.hxx>
75#include <ShapeBuild_ReShape.hxx>
76#include <BRepTools.hxx>
77#include <ShapeFix.hxx>
78#include <ShapeUpgrade_ShapeDivideContinuity.hxx>
79#include <ShapeUpgrade_ShapeDivideAngle.hxx>
80#include <ShapeUpgrade_ShapeConvertToBezier.hxx>
81#include <ShapeCustom.hxx>
82#include <ShapeUpgrade_ShapeDivideClosed.hxx>
83#include <ShapeUpgrade_RemoveInternalWires.hxx>
84#include <ShapeUpgrade_RemoveLocations.hxx>
85#include <BRepBuilderAPI_Transform.hxx>
86
87// the plane (equation z=0) shared by PlaneDividedFaceContinuity and PlaneGridShell
88//static Handle(Geom_Plane) ThePlane= new Geom_Plane(0,0,1,0);
89
90
91//=======================================================================
92//function : DT_ShapeDivide
93//purpose :
94//=======================================================================
95
96static Standard_Integer DT_ShapeDivide (Draw_Interpretor& di,
97 Standard_Integer n, const char** a)
98{
99 // DT_ShapeDivide result Shape Tol
100 // a[1]= result
101 // a[2]= input Face/Surface
102 // a[3] si n>3= Wire/Face
103 // a[n-1]= Tolerance
104
105 if (n<3) {
106 di << "bad number of arguments" <<"\n";
107 return 1;
108 }
109
110 // try to read a shape:
111 TopoDS_Shape inputShape=DBRep::Get(a[2]);
112 if (inputShape.IsNull()) {
113 di << "Unknown shape"<< "\n";
114 return 1;
115 }
116 // a[2] is a shape. managing:
117 // DT_ShapeDivide result Face Tol
118
119 // giving a face is available only in the constructor:
120 // we make the whole and quit.
121 ShapeUpgrade_ShapeDivideContinuity tool(inputShape);
122
123 // tolerance is optional
124 if (n==4) {
125 Standard_Real Tol=atof(a[3]);
126 tool.SetTolerance(Tol);
127 }
128
129 // theTool.SetGlobalCriterion(GeomAbs_C1);
130 tool.Perform();
131 TopoDS_Shape res = tool.Result();
132
133 if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
134 if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
135 if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
136 if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
137 if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
138 if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
139 if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
140 if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
141 if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
142 if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
143 if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
144 if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
145 if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
146 if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
147 if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
148 if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
149 if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
150
151 // fixes
152
153 ShapeFix::SameParameter ( res, Standard_False );
154
155 DBRep::Set(a[1],res);
156 return 0;
157}
158
159static Standard_Integer DT_ShapeConvertRev (Draw_Interpretor& di,
160 Standard_Integer n, const char** a)
161{
162 if (n<5) {
163 di << "bad number of arguments" <<"\n";
164 return 1;
165 }
166
167 // try to read a shape:
168 TopoDS_Shape inputShape=DBRep::Get(a[2]);
169 if (inputShape.IsNull()) {
170 di << "Unknown shape"<< "\n";
171 return 1;
172 }
173
174 Standard_Integer c2d = atoi(a[3]);
175 Standard_Integer c3d = atoi(a[4]);
176 TopoDS_Shape revsh = ShapeCustom::ConvertToRevolution (inputShape);
177 if (revsh.IsNull()) { di<<"NO RESULT"<<"\n"; return 1; }
178 else if (revsh == inputShape) { di<<"No modif"<<"\n";}
179 else di<<"ConvertToRevolution -> Result : "<<"\n";
180
181 ShapeUpgrade_ShapeConvertToBezier tool(revsh);
182 tool.SetSurfaceConversion(Standard_True);
183 if(c2d)
184 tool.Set2dConversion(Standard_True);
185 if(c3d) {
186 tool.Set3dConversion(Standard_True);
187 if(n > 5)
188 tool.Set3dLineConversion(Standard_False);
189 if(n > 6)
190 tool.Set3dCircleConversion(Standard_False);
191 if(n > 7)
192 tool.Set3dConicConversion(Standard_False);
193 }
194 tool.Perform();
195 TopoDS_Shape res = tool.Result();
196
197 if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
198 if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
199 if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
200 if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
201 if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
202 if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
203 if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
204 if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
205 if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
206 if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
207 if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
208 if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
209 if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
210 if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
211 if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
212 if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
213 if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
214
215 // fixes
216
217 ShapeFix::SameParameter ( res, Standard_False );
218
219 DBRep::Set(a[1],res);
220 return 0;
221}
222
223
224/*
225 if (!inputShape.IsNull()) {
226 // a[2] is a shape. managing:
227 // DT_ShapeDivide result Face Tol
228
229 TopoDS_Face inputFace = TopoDS::Face(inputShape);
230 if (inputFace.IsNull()) {
231 di << a[2] << " is not a face" << "\n";
232 return 1;
233 }
234
235 // giving a face is available only in the constructor:
236 // we make the whole and quit.
237 ShapeUpgrade_ShapeDivideContinuity theTool(inputFace);
238
239 // tolerance is optional
240 if (n==4) {
241 Standard_Real Tol=atof(a[n-1]);
242 theTool.SetTolerance(Tol);
243 }
244
245 theTool.SetGlobalCriterion(GeomAbs_C1);
246 theTool.Build();
247 if (!theTool.IsDone()) {
248 ShapeUpgrade_Error theError=theTool.Error();
249 di << "Not done: error=";
250 if (theError==ShapeUpgrade_Done)
251 di << "Done"<<"\n";
252 else if (theError==ShapeUpgrade_NotDone)
253 di << "NotDone"<<"\n";
254 else if (theError==ShapeUpgrade_EmptyShell)
255 di << "EmptyShell"<<"\n";
256 else if (theError==ShapeUpgrade_InvalidCriterion)
257 di << "InvalidCriterion"<<"\n";
258 else if (theError==ShapeUpgrade_InvalidGridSurface)
259 di << "InvalidGridSurface"<<"\n";
260 else if (theError==ShapeUpgrade_DegeneratedEdge)
261 di << "DegeneratedEdge"<<"\n";
262 else if (theError==ShapeUpgrade_NoSurface)
263 di << "NoSurface"<<"\n";
264 else if (theError==ShapeUpgrade_NoTolerance)
265 di << "NoTolerance"<<"\n";
266 return 1;
267 }
268 TopoDS_Shell res = theTool.Shell();
269 DBRep::Set(a[1],res);
270
271 return 0;
272 }
273 else {
274 // not a face: we can use the empty consturctor.
275 ShapeUpgrade_ShapeDivideContinuity theTool;
276 Standard_Real Tol=atof(a[n-1]);
277 theTool.SetTolerance(Tol);
278 theTool.SetGlobalCriterion(GeomAbs_C1);
279
280 // try to read a surface:
281 Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[2]);
282 if (! GS.IsNull()) {
283 // a[2] is a surface. managing the configurations:
284 // DT_ShapeDivide result Surface Tol
285 // DT_ShapeDivide result Surface Face Tol
286 // DT_ShapeDivide result Surface Wire Surf Tol
287
288 theTool.SetSupport(GS);
289
290 // try to read a Wire or a Face:
291 if (n>=5) {
292 TopoDS_Shape inputBoundary=DBRep::Get(a[3]);
293 if (inputBoundary.IsNull()) {
294 di << "Invalid Boundary" << "\n";
295 return 1;
296 }
297 TopoDS_Wire WireBoundary = TopoDS::Wire(inputBoundary);
298 if (!WireBoundary.IsNull()) {
299 // DT_ShapeDivide result Surface Wire Surf Tol
300 Handle(Geom_Surface) WireSupport = DrawTrSurf::GetSurface(a[4]);
301 if (WireSupport.IsNull()) {
302 di << "Invalid Surface supporting the Wire" << "\n";
303 return 1;
304 }
305 theTool.SetBoundary(WireBoundary, WireSupport);
306 }
307 else {
308 TopoDS_Face FaceBoundary = TopoDS::Face(inputBoundary);
309 // DT_ShapeDivide result Surface Face Tol
310 theTool.SetBoundary(FaceBoundary);
311 }
312 }
313 }
314 else {
315 // it must be a grid: managing the configurations:
316 // DT_ShapeDivide result NbU NbV {Surf_u_v...} Tol
317 // DT_ShapeDivide result NbU NbV {Surf_u_v...} Face Tol
318 // DT_ShapeDivide result NbU NbV {Surf_u_v...} Wire Surf Tol
319 if (n<6) {
320 di << "bad number of arguments for grid input" <<"\n";
321 return 1;
322 }
323 // number of surf:
324 Standard_Integer NbU=atoi(a[2]);
325 Standard_Integer NbV=atoi(a[3]);
326 if (n < 4+NbU*NbV+1) {
327 di << "bad number of arguments" <<"\n";
328 return 1;
329 }
330
331 Handle(TColGeom_HArray2OfSurface)
332 TheGridSurf= new TColGeom_HArray2OfSurface(1,NbU,1,NbV);
333
334 for (Standard_Integer iu=1; iu<=NbU; iu++) {
335 for (Standard_Integer jv=1; jv<=NbV; jv++) {
336 Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[4+(iu-1)*NbV+jv-1]);
337 TheGridSurf->SetValue(iu,jv,GS);
338 }
339 }
340 theTool.SetSupport(TheGridSurf,Tol);
341
342 // try to read a Wire or a Face:
343 if (n>=6+NbU*NbV) {
344 TopoDS_Shape inputBoundary=DBRep::Get(a[4+NbU*NbV]);
345 if (inputBoundary.IsNull()) {
346 di << "Invalid Boundary" << "\n";
347 return 1;
348 }
349 TopoDS_Wire WireBoundary = TopoDS::Wire(inputBoundary);
350 if (!WireBoundary.IsNull()) {
351 // DT_ShapeDivide result Surface Wire Surf Tol
352 Handle(Geom_Surface) WireSupport = DrawTrSurf::GetSurface(a[4+NbU*NbV+1]);
353 if (WireSupport.IsNull()) {
354 di << "Invalid Surface supporting the Wire" << "\n";
355 return 1;
356 }
357 theTool.SetBoundary(WireBoundary, WireSupport);
358 }
359 else {
360 TopoDS_Face FaceBoundary = TopoDS::Face(inputBoundary);
361 // DT_ShapeDivide result Surface Face Tol
362 theTool.SetBoundary(FaceBoundary);
363 }
364 }
365 }
366
367 theTool.Build();
368 if (!theTool.IsDone()) {
369 ShapeUpgrade_Error theError=theTool.Error();
370 di << "Not done: error=";
371 if (theError==ShapeUpgrade_Done)
372 di << "Done"<<"\n";
373 else if (theError==ShapeUpgrade_NotDone)
374 di << "NotDone"<<"\n";
375 else if (theError==ShapeUpgrade_EmptyShell)
376 di << "EmptyShell"<<"\n";
377 else if (theError==ShapeUpgrade_InvalidCriterion)
378 di << "InvalidCriterion"<<"\n";
379 else if (theError==ShapeUpgrade_InvalidGridSurface)
380 di << "InvalidGridSurface"<<"\n";
381 else if (theError==ShapeUpgrade_DegeneratedEdge)
382 di << "DegeneratedEdge"<<"\n";
383 else if (theError==ShapeUpgrade_NoSurface)
384 di << "NoSurface"<<"\n";
385 else if (theError==ShapeUpgrade_NoTolerance)
386 di << "NoTolerance"<<"\n";
387 return 1;
388 }
389
390 TopoDS_Shell res = theTool.Shell();
391 DBRep::Set(a[1],res);
392
393 return 0;
394 }
395}
396*/
397static Standard_Integer DT_ShapeConvert (Draw_Interpretor& di,
398 Standard_Integer n, const char** a)
399{
400 if (n<5) {
401 di << "bad number of arguments" <<"\n";
402 return 1;
403 }
404
405 // try to read a shape:
406 TopoDS_Shape inputShape=DBRep::Get(a[2]);
407 if (inputShape.IsNull()) {
408 di << "Unknown shape"<< "\n";
409 return 1;
410 }
411
412 Standard_Integer c2d = atoi(a[3]);
413 Standard_Integer c3d = atoi(a[4]);
414
415 ShapeUpgrade_ShapeConvertToBezier tool(inputShape);
416 tool.SetSurfaceConversion(Standard_True);
417 if(c2d)
418 tool.Set2dConversion(Standard_True);
419 if(c3d)
420 tool.Set3dConversion(Standard_True);
421 tool.Perform();
422 TopoDS_Shape res = tool.Result();
423
424 if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
425 if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
426 if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
427 if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
428 if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
429 if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
430 if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
431 if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
432 if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
433 if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
434 if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
435 if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
436 if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
437 if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
438 if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
439 if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
440 if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
441
442 // fixes
443
444 ShapeFix::SameParameter ( res, Standard_False );
445
446 DBRep::Set(a[1],res);
447 return 0;
448}
449static Standard_Integer DT_SplitAngle(Draw_Interpretor& di,
450 Standard_Integer n, const char** a)
451{
452 if (n<3) {
453 di << "bad number of arguments" <<"\n";
454 return 1;
455 }
456
457 TopoDS_Shape inputShape=DBRep::Get(a[2]);
458 if (inputShape.IsNull()) {
459 di << "Unknown shape"<< "\n";
460 return 1;
461 }
462
463 Standard_Real maxangle = 95;
464 if ( n >3 ) {
465 maxangle = atof ( a[3] );
466 if ( maxangle <1 ) maxangle = 1;
467 }
468
469 ShapeUpgrade_ShapeDivideAngle tool(maxangle * M_PI/180,inputShape);
470 tool.Perform();
471 TopoDS_Shape res = tool.Result();
472
473 if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
474 if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
475 if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
476 if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
477 if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
478 if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
479 if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
480 if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
481 if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
482 if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
483 if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
484 if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
485 if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
486 if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
487 if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
488 if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
489 if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
490
491 // fixes
492
493 ShapeFix::SameParameter ( res, Standard_False );
494
495 DBRep::Set(a[1],res);
496 return 0;
497}
498
499/*
500//=======================================================================
501//function : DT_PlaneDividedFace
502//purpose : Transfer into a plane with boundary divided
503//
504//
505//=======================================================================
506static Standard_Integer DT_PlaneDividedFace (Draw_Interpretor& di,
507 Standard_Integer n, const char** a)
508
509{
510 // a[1]= result
511 // a[2]= input Face
512 // a[3]= Tolerance
513
514 if (n !=4) {
515 di << "bad number of arguments" <<"\n";
516 return 1;
517 }
518
519 Standard_Real Tol=atof(a[3]);
520 TopoDS_Shape inputShape=DBRep::Get(a[2]);
521 TopoDS_Face inputFace = TopoDS::Face(inputShape);
522 if (inputFace.IsNull()) {
523 di << a[2] << " is not a face" << "\n";
524 return 1;
525 }
526
527 ShapeUpgrade_PlaneDividedFace theTool(ThePlane);
528 theTool.Init(inputFace);
529 //theTool.SetBoundaryCriterion(GeomAbs_C1);
530 //theTool.SetTolerance(Tol);
531 theTool.Build();
532 if (!theTool.IsDone()) {
533 di << "Not done" << "\n";
534 return 1;
535 }
536
537 TopoDS_Face res = theTool.Face();
538 DBRep::Set(a[1],res);
539
540 Standard_Real the2d3dFactor=theTool.Get2d3dFactor();
541 di << "2d3dFactor="<<the2d3dFactor<< "\n";
542 return 0;
543}
544
545//=======================================================================
546//function : DT_PlaneGridShell
547//purpose : Create a Plane Grid Shell from U and V knots
548//
549//
550//=======================================================================
551static Standard_Integer DT_PlaneGridShell (Draw_Interpretor& di,
552 Standard_Integer n, const char** a)
553
554{
555
556 if (n < 4) return 1;
557 // a[1]= result
558 // a[2]= NbU >=2
559 // a[3]= NbV >=2
560 // a[4..]= {UKnots}
561 // a[4+NbU...] = {VKnots}
562 // a[4+NbU+NbV+1] = Tol
563
564 // number of knots:
565 Standard_Integer NbU=atoi(a[2]);
566 Standard_Integer NbV=atoi(a[3]);
567 if (n != 4+NbU+NbV+1) {
568 di << "bad number of arguments" <<"\n";
569 return 1;
570 }
571
572 TColStd_Array1OfReal TheUKnots(1,NbU);
573 TColStd_Array1OfReal TheVKnots(1,NbV);
574
575 for (Standard_Integer ii=1; ii<=NbU; ii++) {
576 TheUKnots(ii)=atof(a[4+ii-1]);
577 }
578 for (ii=1; ii<=NbV; ii++) {
579 TheVKnots(ii)=atof(a[4+NbU+ii-1]);
580 }
581
582 Standard_Real Tol=atof(a[4+NbU+NbV]);
583
584 ShapeUpgrade_PlaneGridShell TheGrid(ThePlane,TheUKnots,TheVKnots,Tol);
585
586 TopoDS_Shell res = TheGrid.Shell();
587 DBRep::Set(a[1],res);
588
589 return 0;
590}
591
592//=======================================================================
593//function : DT_PlaneFaceCommon
594//purpose : Common between a plane Face and a Shell whose all Faces are
595// laying in the same plane
596//
597//
598//=======================================================================
599static Standard_Integer DT_PlaneFaceCommon (Draw_Interpretor& di,
600 Standard_Integer n, const char** a)
601
602{
603 // a[1]= result
604 // a[2]= input Face
605 // a[3]= input Shell
606
607 if (n !=4) {
608 di << "bad number of arguments" <<"\n";
609 return 1;
610 }
611
612 TopoDS_Shape inputShape= DBRep::Get(a[2]);
613 TopoDS_Face inputFace = TopoDS::Face(inputShape);
614 if (inputFace.IsNull()) {
615 di << a[2] << " is not a face" << "\n";
616 return 1;
617 }
618
619 inputShape = DBRep::Get(a[3]);
620 TopoDS_Shell inputShell = TopoDS::Shell(inputShape);
621 if (inputShell.IsNull()) {
622 di << a[3] << " is not a shell" << "\n";
623 return 1;
624 }
625
626 ShapeUpgrade_PlaneFaceCommon theTool;
627 theTool.Init(inputFace,inputShell);
628
629 TopoDS_Shell res = theTool.Shell();
630 DBRep::Set(a[1],res);
631
632 return 0;
633}*/
634
635//=======================================================================
636//function : DT_SplitCurve
637//purpose : Splits the curve with C1 criterion
638//
639//
640//=======================================================================
641static Standard_Integer DT_SplitCurve (Draw_Interpretor& di,
642 Standard_Integer n, const char** a)
643
644{
645 // a[1]= input curve. This name is used with a suffix to name the output curves
646 // a[2]= Tolerance
647
648 if (n < 3) {
649 di << "bad number of arguments" <<"\n";
650 return 1;
651 }
652
653 Standard_Real Tol=atof(a[2]);
654 Handle(Geom_Curve) GC = DrawTrSurf::GetCurve(a[1]);
655 if ( GC.IsNull()) return 1;
656 Standard_Integer Split = atoi(a[3]);
657 Handle(ShapeUpgrade_SplitCurve3dContinuity) theTool = new ShapeUpgrade_SplitCurve3dContinuity;
658 theTool->Init(GC);
659 theTool->SetTolerance (Tol);
660 theTool->SetCriterion (GeomAbs_C1);
661 if(Split == 1) {
662 Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
663 for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
664 theTool->SetSplitValues(spval);
665 }
666 theTool->Perform (Standard_True);
667 Handle(TColGeom_HArray1OfCurve) theCurves= theTool->GetCurves();
668 Standard_Integer NbC=theCurves->Length();
669 for (Standard_Integer icurv=1; icurv<=NbC; icurv++) {
670 char name[100];
671 sprintf(name,"%s%s%d",a[1],"_",icurv);
672 char* newname = name;
673 DrawTrSurf::Set(newname, theCurves->Value(icurv));
674 di.AppendElement(newname);
675 }
676 return 0;
677}
678
679
680//=======================================================================
681//function : DT_SplitCurve2d
682//purpose : Splits the curve with C1 criterion
683//
684//
685//=======================================================================
686static Standard_Integer DT_SplitCurve2d (Draw_Interpretor& di,
687 Standard_Integer n, const char** a)
688
689{
690 // a[1]= input 2d curve. This name is used with a suffix to name the output curves
691 // a[2]= Tolerance
692
693 if (n < 3) {
694 di << "bad number of arguments" <<"\n";
695 return 1;
696 }
697
698 Standard_Real Tol=atof(a[2]);
699 Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(a[1]);
700 if ( GC.IsNull()) return 1;
701 Standard_Integer Split = atoi(a[3]);
702 Handle(ShapeUpgrade_SplitCurve2dContinuity) theTool = new ShapeUpgrade_SplitCurve2dContinuity;
703 theTool->Init(GC);
704 theTool->SetTolerance (Tol);
705 theTool->SetCriterion (GeomAbs_C1);
706 if(Split == 1) {
707 Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
708 for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
709 theTool->SetSplitValues(spval);
710 }
711 theTool->Perform (Standard_True);
712 Handle(TColGeom2d_HArray1OfCurve) theCurves= theTool->GetCurves();
713 Standard_Integer NbC=theCurves->Length();
714 for (Standard_Integer icurv=1; icurv<=NbC; icurv++) {
715 char name[100];
716 sprintf(name,"%s%s%d",a[1],"_",icurv);
717 char* newname = name;
718 DrawTrSurf::Set(newname, theCurves->Value(icurv));
719 di.AppendElement(newname);
720 }
721 return 0;
722}
723
724
725//=======================================================================
726//function : DT_SplitSurface
727//purpose : Splits the surface with C1 criterion
728//
729//
730//=======================================================================
731/*
732static Standard_Integer DT_SplitWire (Draw_Interpretor& di,
733 Standard_Integer n, const char** a)
734{
735
736 if (n <3) {
737 di << "bad number of arguments" <<"\n";
738 return 1;
739 }
740
741 TopoDS_Face source = TopoDS::Face(DBRep::Get(a[2]));
742 if(source.IsNull()) {
743 di <<"Shape is not face"<<"\n";
744 return 1;
745 }
746 TopoDS_Iterator wi(source);
747 if(!wi.More()) {
748 di <<"Shape is face without wire"<<"\n";
749 return 1;
750 }
751
752 TopoDS_Wire wire = TopoDS::Wire(wi.Value());
753 Handle(ShapeUpgrade_WireDivideContinuity) tool = new ShapeUpgrade_WireDivideContinuity;
754 tool->Init(wire,source);
755 if(n >=4 ) {
756 Standard_Real Tol=atof(a[3]);
757 }
758 Handle(ShapeBuild_ReShape) context = new ShapeBuild_ReShape;
759 tool->Perform(context);
760 TopoDS_Wire result = tool->Wire();
761 DBRep::Set(a[1],result);
762 return 0;
763}
764*/
765/*
766static Standard_Integer DT_SplitFace (Draw_Interpretor& di,
767 Standard_Integer n, const char** a)
768{
769
770 if (n <3) {
771 di << "bad number of arguments" <<"\n";
772 return 1;
773 }
774
775 TopoDS_Face source = TopoDS::Face(DBRep::Get(a[2]));
776 if(source.IsNull()) {
777 di <<"Shape is not face"<<"\n";
778 return 1;
779 }
780 Handle(ShapeUpgrade_ShapeDivideContinuity) tool = new ShapeUpgrade_FaceDivideContinuity;
781 tool->Init(source);
782 if(n >=4 ) {
783 Standard_Real Tol=atof(a[3]);
784 tool->SetPrecision(Tol);
785 }
786
787 Handle(ShapeBuild_ReShape) context = new ShapeBuild_ReShape;
788 tool->Perform(context);
789 TopoDS_Shape result = tool->Result();
790
791
792 if ( tool->Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
793 if ( tool->Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
794 if ( tool->Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
795 if ( tool->Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
796 if ( tool->Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
797 if ( tool->Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
798 if ( tool->Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
799 if ( tool->Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
800 if ( tool->Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
801 if ( tool->Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
802 if ( tool->Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
803 if ( tool->Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
804 if ( tool->Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
805 if ( tool->Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
806 if ( tool->Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
807 if ( tool->Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
808 if ( tool->Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
809
810 // fixes
811
812 ShapeFix::SameParameter ( result, Standard_False );
813
814 DBRep::Set(a[1],result);
815 return 0;
816}
817*/
818
819static Standard_Integer DT_SplitSurface (Draw_Interpretor& di,
820 Standard_Integer n, const char** a)
821
822{
823 // a[1]= result (used with a suffix to name the output surfaces)
824 // a[2]= input surface.
825 // a[3]= Tolerance
826
827 // a[1]= result
828 // a[2]= nbU
829 // a[3]= nbV
830 // a[3+1]..a[3+nbU*nbV] = Input Surfaces
831 // a[4+nbU*nbV]= Tolerance
832
833 if (n <4) {
834 di << "bad number of arguments" <<"\n";
835 return 1;
836 }
837
838 Handle(ShapeUpgrade_SplitSurfaceContinuity) theTool = new ShapeUpgrade_SplitSurfaceContinuity;//S4137
839
840 Standard_Real Tol=atof(a[3]);
841 Standard_Integer Split = atoi(a[4]);
842 theTool->SetTolerance(Tol);
843 theTool->SetCriterion(GeomAbs_C1);
844 Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[2]);
845/*
846 if ( GS.IsNull()) {
847 // Case of composite grid surface
848 di << "composite surf" << "\n";
849 Standard_Integer nbU=atoi(a[2]);
850 Standard_Integer nbV=atoi(a[3]);
851 if (nbU==0 || nbV==0) return 1;
852 Handle(TColGeom_HArray2OfSurface)
853 theGrid= new TColGeom_HArray2OfSurface(1,nbU,1,nbV);
854 for (Standard_Integer iu=1; iu<=nbU; iu++) {
855 for (Standard_Integer iv=1; iv<=nbV; iv++) {
856 Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[3+(iu-1)*nbV+iv]);
857 theGrid->SetValue(iu,iv,GS);
858 }
859 }
860 di << "appel a SplitSurface::Init" << "\n";
861 theTool->Init(theGrid);
862 }
863 else {*/
864 // Case of single surface
865 di << "single surf" << "\n";
866
867 di << "appel a SplitSurface::Init" << "\n";
868 theTool->Init(GS);
869 if(Split ==1) {
870 Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
871 for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
872 theTool->SetUSplitValues(spval);
873 theTool->SetVSplitValues(spval);
874 }
875
876 di << "appel a SplitSurface::Build" << "\n";
877 theTool->Build(Standard_True);
878
879 di << "appel a SplitSurface::GlobalU/VKnots" << "\n";
880 Handle(ShapeExtend_CompositeSurface) Grid = theTool->ResSurfaces();
881 Handle(TColStd_HArray1OfReal) GlobalU=Grid->UJointValues();
882 Handle(TColStd_HArray1OfReal) GlobalV=Grid->VJointValues();
883 Standard_Integer nbGlU=GlobalU->Length();
884 Standard_Integer nbGlV=GlobalV->Length();
885 di << "nb GlobalU ; nb GlobalV="<<nbGlU<<" "<<nbGlV;
886 for (Standard_Integer iu=1; iu<=nbGlU; iu++)
887 di <<" "<< GlobalU->Value(iu);
888// di <<"\n";
889// di << "nb GlobalV="<<nbGlV;
890 for (Standard_Integer iv=1; iv<=nbGlV; iv++)
891 di <<" "<< GlobalV->Value(iv);
892 di <<"\n";
893
894di << "appel a Surfaces" << "\n";
895 Handle(TColGeom_HArray2OfSurface) theSurfaces= Grid->Patches();
896
897di << "transfert resultat" << "\n";
898 Standard_Integer NbRow=theSurfaces->ColLength();
899 Standard_Integer NbCol=theSurfaces->RowLength();
900 for (Standard_Integer irow=1; irow<=NbRow; irow++) {
901 for (Standard_Integer icol=1; icol<=NbCol; icol++) {
902 char name[100];
903 sprintf(name,"%s%s%d%s%d",a[1],"_",irow,"_",icol);
904 char* newname = name;
905 DrawTrSurf::Set(newname, theSurfaces->Value(irow, icol));
906 di.AppendElement(newname);
907 }
908 }
909 return 0;
910}
911
912
913
914//=======================================================================
915//function : DT_SupportModification
916//purpose : Changes the supports of a Shell
917// The given surface wil support all the faces of the new shell.
918// with the PCurves of the old ones.
919//
920//=======================================================================
921/*static Standard_Integer DT_SupportModification (Draw_Interpretor& di,
922 Standard_Integer n, const char** a)
923
924{
925 // a[1]= result
926 // a[2]= input Shell
927 // a[3]= new Surface
928 // a[4]= 2d3d Scale Factor
929
930 if (n !=5) {
931 di << "bad number of arguments" <<"\n";
932 return 1;
933 }
934
935 TopoDS_Shape inputShape= DBRep::Get(a[2]);
936 TopoDS_Shell inputShell = TopoDS::Shell(inputShape);
937 if (inputShell.IsNull()) {
938 di << a[2] << " is not a shell" << "\n";
939 return 1;
940 }
941
942 Handle(Geom_Surface) theSurf = DrawTrSurf::GetSurface(a[3]);
943 if ( theSurf.IsNull()) {
944 di << a[3] << " is not a surface" << "\n";
945 return 1;
946 }
947
948 ShapeUpgrade_DataMapOfShapeSurface theMap;
949 // Associates thesurf to each face of inputShell.
950 TopExp_Explorer ExpSh;
951 for (ExpSh.Init(inputShell,TopAbs_FACE); ExpSh.More(); ExpSh.Next()){
952 TopoDS_Face theFace= TopoDS::Face(ExpSh.Current());
953 theMap.Bind(theFace,theSurf);
954 }
955
956 Standard_Real the2d3dFactor=atof(a[4]);
957 ShapeUpgrade_SupportModification theTool(inputShell,theMap,the2d3dFactor);
958
959 TopoDS_Shell res = theTool.Shell();
960 DBRep::Set(a[1],res);
961
962 return 0;
963}*/
964
965//=======================================================================
966//function : DT_Debug
967//purpose : activation of the debug mode
968//
969//=======================================================================
970/*
971static Standard_Integer DT_Debug (Draw_Interpretor& di,
972 Standard_Integer n, const char** a)
973
974{
975 // a[1]= 0/1
976
977 if (n !=2) {
978 di << "bad number of arguments" <<"\n";
979 return 1;
980 }
981
982 if (atoi(a[1])==1) {
983 di << "Activation of debug messages"<<"\n";
984 ShapeUpgrade::SetDebug(Standard_True);
985 }
986 else {
987 di << "Desactivation of debug messages"<<"\n";
988 ShapeUpgrade::SetDebug(Standard_False);
989 }
990 return 0;
991}
992*/
993
994/*static Standard_Integer shellsolid
995 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
996{
997 if (argc < 4) {
998 di<<"Donner option + nom de SHAPE + nom de RESULTAT"<<"\n";
999 di<<"Options : a all (sewing sur tous les shells\n"
1000 << " c check (sewing sur shells avec bad edges\n"
1001 <<" b bad edges\n f free edges"<<"\n";
1002 return 1 ;
1003 }
1004 Standard_CString arg1 = argv[1];
1005 Standard_CString arg2 = argv[2];
1006 Standard_CString arg3 = argv[3];
1007
1008 TopoDS_Shape Shape = DBRep::Get(arg2);
1009 if (Shape.IsNull()) { di<<"Shape unknown : "<<arg2<<"\n"; return 1 ; }
1010
1011 ShapeAnalysis_Shell STS;
1012 char opt = arg1[0];
1013 if (opt == 'a') STS.LoadShells (Shape);
1014 else if (opt == 'f') STS.CheckOrientedShells (Shape,Standard_True);
1015 else if (opt == 'b' || opt == 'c') STS.CheckOrientedShells (Shape,Standard_False);
1016
1017 else if (opt == 'o') {
1018
1019// Test WireOrder
1020 Handle(ShapeExtend_WireData) Frees = new ShapeExtend_WireData;//:sw Frees.SetPrecision (BRepBuilderAPI::Precision());
1021 Standard_Integer nbe = 0;
1022 for (TopExp_Explorer edges(Shape,TopAbs_EDGE); edges.More(); edges.Next()) {
1023 Frees->Add (TopoDS::Edge(edges.Current())); nbe ++;
1024 }
1025 ShapeAnalysis_WireOrder WO (Standard_True,BRepBuilderAPI::Precision());
1026 ShapeAnalysis_Wire saw;
1027 saw.Load ( Frees );
1028 saw.SetPrecision ( BRepBuilderAPI::Precision() );
1029 saw.CheckOrder ( WO );
1030
1031 Standard_Integer stat = WO.Status();
1032 di<<"Wire Order Status = "<<stat<<" on "<<nbe<<" Edges"<<"\n";
1033 nbe = WO.NbEdges();
1034 for (Standard_Integer ie = 1; ie <= nbe; ie ++) {
1035 Standard_Integer io = WO.Ordered (ie);
1036 gp_XYZ st3d,en3d;
1037 WO.XYZ (io,st3d,en3d);
1038 di<<ie<<": Edge."<<io<<" Start:"<<st3d.X()<<" "<<st3d.Y()<<" "<<st3d.Z()
1039 <<" End:"<<en3d.X()<<" "<<en3d.Y()<<" "<<en3d.Z()<<"\n";
1040 }
1041// Chainage ?
1042 Standard_Real gap = BRepBuilderAPI::Precision();
1043 WO.SetChains (gap);
1044 Standard_Integer n1,n2,ic, nc = WO.NbChains();
1045 for (ic = 1; ic <= nc; ic ++) {
1046 WO.Chain(ic,n1,n2);
1047 di<<"Chain."<<ic<<" From "<<n1<<" To "<<n2<<"\n";
1048 }
1049 }
1050
1051 else { di<<"Option non reconnue : "<<arg1<<"\n"; return 1; }
1052
1053 TopoDS_Shape res;
1054 if (opt == 'a' || opt == 'c') {
1055 ShapeUpgrade_ShellSewing sew;
1056 res = sew.ApplySewing (Shape);
1057 if (res.IsEqual(Shape)) {
1058 res.Nullify();
1059 di<<"ShellSolid : no sewing done"<<"\n";
1060 }
1061 } else if (opt == 'b') {
1062 if (STS.HasBadEdges()) res = STS.BadEdges();
1063 else di<<"ShellSolid : no bad edge"<<"\n";
1064 } else if (opt == 'f') {
1065 if (STS.HasFreeEdges()) res = STS.FreeEdges();
1066 else di<<"ShellSolid : no free edge"<<"\n";
1067 if (STS.HasConnectedEdges()) di<<"ShellSolid : connected edges"<<"\n";
1068 else di<<"ShellSolid : NO connected edges"<<"\n";
1069 }
1070
1071 if (!res.IsNull()) DBRep::Set (arg3,res);
1072
1073 return 0; // Done
1074}*/
1075//---------------gka
1076//=======================================================================
1077//function : offset2dcurve
1078//purpose :
1079//
1080//=======================================================================
1081static Standard_Integer offset2dcurve
1082 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1083{
1084 if (argc < 4) {
1085 di<<"result + curve + offset"<<"\n";
1086
1087 return 1 /* Error */;
1088 }
1089// Standard_CString arg1 = argv[1];
1090// Standard_CString arg2 = argv[2];
1091 Standard_Real Offset = atof(argv[3]);
1092 Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(argv[2]);
1093 if ( GC.IsNull()) return 1;
1094 Handle(Geom2d_OffsetCurve) offcrv = new Geom2d_OffsetCurve(GC,Offset);
1095 DrawTrSurf::Set(argv[1], offcrv);
1096 return 0;
1097}
1098
1099//=======================================================================
1100//function : offsetcurve
1101//purpose :
1102//
1103//=======================================================================
1104static Standard_Integer offsetcurve
1105 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1106{
1107 if (argc < 5) {
1108 di<<"result + curve + offset + Dir"<<"\n";
1109
1110 return 1 /* Error */;
1111 }
1112// Standard_CString arg1 = argv[1];
1113// Standard_CString arg2 = argv[2];
1114 Standard_Real Offset = atof(argv[3]);
1115 Handle(Geom_Curve) GC = DrawTrSurf::GetCurve(argv[2]);
1116 if ( GC.IsNull()) return 1;
1117 gp_Pnt point;
1118 DrawTrSurf::GetPoint(argv[4],point);
1119 gp_Dir dir(point.XYZ());
1120 Handle(Geom_OffsetCurve) offcrv = new Geom_OffsetCurve(GC,Offset,dir);
1121 DrawTrSurf::Set(argv[1], offcrv);
1122 return 0;
1123}
1124
1125//=======================================================================
1126//function : compose shell
1127//purpose :
1128//=======================================================================
1129static Standard_Integer splitface
1130 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1131{
1132 if (argc < 5) {
1133 di << "Split face: splitface result face [u usplit1 usplit2...] [v vsplit1 vsplit2 ...]" << "\n";
1134 return 1;
1135 }
1136
1137 TopoDS_Shape aLocalShape = DBRep::Get(argv[2]) ;
1138 TopoDS_Face face = TopoDS::Face ( aLocalShape );
1139 if ( face.IsNull() ) {
1140 di << argv[2] << " is not Face" << "\n";
1141 return 1;
1142 }
1143
1144 Handle(Geom_Surface) S = BRep_Tool::Surface ( face );
1145 Standard_Real Uf, Ul, Vf, Vl;
1146 BRepTools::UVBounds ( face, Uf, Ul, Vf, Vl );
1147 Standard_Real Umin, Umax, Vmin, Vmax;
1148 S->Bounds ( Umin, Umax, Vmin, Vmax );
1149 if ( Uf < Umin && ! S->IsUPeriodic() ) Uf = Umin;
1150 else if ( Uf > Umin )
1151 if ( Precision::IsInfinite(Umin) ) Uf -= 100;
1152 else Uf = Umin;
1153 if ( Vf < Vmin && ! S->IsVPeriodic() ) Vf = Vmin;
1154 else if ( Vf > Vmin )
1155 if ( Precision::IsInfinite(Vmin) ) Vf -= 100;
1156 else Vf = Vmin;
1157 if ( Ul > Umax && ! S->IsUPeriodic() ) Ul = Umax;
1158 else if ( Ul < Umax )
1159 if ( Precision::IsInfinite(Umax) ) Ul += 100;
1160 else Ul = Umax;
1161 if ( Vl > Vmax && ! S->IsVPeriodic() ) Vl = Vmax;
1162 else if ( Vl < Vmax )
1163 if ( Precision::IsInfinite(Vmax) ) Vl += 100;
1164 else Vl = Vmax;
1165
1166 TColStd_SequenceOfReal uval;
1167 TColStd_SequenceOfReal vval;
1168
1169 Standard_Boolean byV = Standard_False;
1170 Standard_Integer i; // svv Jan11 2000 : porting on DEC
1171 for ( i=3; i < argc; i++ ) {
1172 if ( argv[i][0] == 'u' ) byV = Standard_False;
1173 else if ( argv[i][0] == 'v' ) byV = Standard_True;
1174 else {
1175 Standard_Real val = atof ( argv[i] );
1176 TColStd_SequenceOfReal &vals = ( byV ? vval : uval );
1177 if ( vals.Length() >0 && val - vals.Last() < Precision::PConfusion() ) {
1178 di << "Values should be sorted in increasing order; skipped" << "\n";
1179 continue;
1180 }
1181 if ( ( byV && ( val < Vf+Precision::PConfusion() ||
1182 val > Vl-Precision::PConfusion() ) ) ||
1183 (!byV && ( val < Uf+Precision::PConfusion() ||
1184 val > Ul-Precision::PConfusion() ) ) ) {
1185 di << "Values should be inside range of surface; skipped" << "\n";
1186 continue;
1187 }
1188 vals.Append ( val );
1189 }
1190 }
1191 if ( uval.Length() <1 && vval.Length() <1 ) {
1192 di << "No splitting defined" << "\n";
1193 return 1;
1194 }
1195 if ( uval.Length() >0 ) {
1196 di << "Splitting by U: ";
1197 for ( Standard_Integer j=1; j <= uval.Length(); j++ ) {
1198 //cout << ( i >j ? ", " : "" ) << uval(j);
1199 if (i >j) {
1200 di << ", ";
1201 } else {
1202 di << "";
1203 }
1204 di << uval(j);
1205 }
1206 di << "\n";
1207 }
1208 if ( vval.Length() >0 ) {
1209 di << "Splitting by V: ";
1210 for ( Standard_Integer j=1; j <= vval.Length(); j++ ) {
1211 //cout << ( j >1 ? ", " : "" ) << vval(j);
1212 if (j >1) {
1213 di << ", ";
1214 } else {
1215 di << "";
1216 }
1217 di << vval(j);
1218 }
1219 di << "\n";
1220 }
1221
1222 Handle(TColGeom_HArray2OfSurface) AS = new TColGeom_HArray2OfSurface ( 1, uval.Length()+1,
1223 1, vval.Length()+1 );
1224 for ( i=0; i <= uval.Length(); i++ ) {
1225 Standard_Real umin = ( i ? uval(i) : Uf );
1226 Standard_Real umax = ( i < uval.Length() ? uval(i+1) : Ul );
1227 for ( Standard_Integer j=0; j <= vval.Length(); j++ ) {
1228 Standard_Real vmin = ( j ? vval(j) : Vf );
1229 Standard_Real vmax = ( j < vval.Length() ? vval(j+1) : Vl );
1230 Handle(Geom_RectangularTrimmedSurface) rect =
1231 new Geom_RectangularTrimmedSurface ( S, umin, umax, vmin, vmax );
1232 AS->SetValue ( i+1, j+1, rect );
1233 }
1234 }
1235
1236 Handle(ShapeExtend_CompositeSurface) Grid = new ShapeExtend_CompositeSurface;
1237 if ( ! Grid->Init ( AS ) ) di << "Grid badly connected!" << "\n";
1238
1239 ShapeFix_ComposeShell SUCS;
1240 TopLoc_Location l;
1241 SUCS.Init ( Grid, l, face, Precision::Confusion() );
1242 Handle(ShapeBuild_ReShape) RS = new ShapeBuild_ReShape;
1243 SUCS.SetContext( RS );
1244 SUCS.Perform ();
1245
1246 if ( SUCS.Status ( ShapeExtend_OK ) ) di << "Status: OK" << "\n";
1247 if ( SUCS.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1" << "\n";
1248 if ( SUCS.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2" << "\n";
1249 if ( SUCS.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3" << "\n";
1250 if ( SUCS.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4" << "\n";
1251 if ( SUCS.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5" << "\n";
1252 if ( SUCS.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6" << "\n";
1253 if ( SUCS.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7" << "\n";
1254 if ( SUCS.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8" << "\n";
1255 if ( SUCS.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1" << "\n";
1256 if ( SUCS.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2" << "\n";
1257 if ( SUCS.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3" << "\n";
1258 if ( SUCS.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4" << "\n";
1259 if ( SUCS.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5" << "\n";
1260 if ( SUCS.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6" << "\n";
1261 if ( SUCS.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7" << "\n";
1262 if ( SUCS.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8" << "\n";
1263
1264 TopoDS_Shape sh = SUCS.Result();
1265 ShapeFix::SameParameter ( sh, Standard_False );
1266 DBRep::Set ( argv[1], sh );
1267 return 0;
1268}
1269
1270static Standard_Integer converttobspline
1271 (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1272{
1273 if (argc<3) {
1274 di << "Use: " << argv[0] << " result shape [options=ero]\n";
1275 di << "where options is combination of letters indicating kinds of\n";
1276 di << "surfaces to be converted:\n";
1277 di << "e - extrusion\n";
1278 di << "r - revolution\n";
1279 di << "o - offset\n";
1280 di << "p - plane";
1281 return 1;
1282 }
1283 const char *options = ( argc > 3 ? argv[3] : "ero" );
1284
1285 TopoDS_Shape inputShape=DBRep::Get(argv[2]);
1286 if (inputShape.IsNull()) {
1287 di << "Unknown shape"<< "\n";
1288 return 1;
1289 }
1290 TopoDS_Shape revsh = ShapeCustom::ConvertToRevolution (inputShape);
1291 TopoDS_Shape res =
1292 ShapeCustom::ConvertToBSpline (revsh, strchr (options, 'e') != 0,
1293 strchr (options, 'r') != 0,
1294 strchr (options, 'o') != 0,
1295 strchr (options, 'p') != 0);
1296 ShapeFix::SameParameter ( res, Standard_False );
1297 DBRep::Set ( argv[1], res );
1298 return 0;
1299}
1300
1301
1302static Standard_Integer splitclosed (Draw_Interpretor& di,
1303 Standard_Integer argc,
1304 const char** argv)
1305{
1306 if (argc<3) {
1307 di << "bad number of arguments" <<"\n";
1308 return 1;
1309 }
1310
1311 TopoDS_Shape inputShape=DBRep::Get(argv[2]);
1312 if (inputShape.IsNull()) {
1313 di << "Unknown shape"<< "\n";
1314 return 1;
1315 }
1316
1317 ShapeUpgrade_ShapeDivideClosed tool (inputShape);
1318 tool.Perform();
1319 TopoDS_Shape res = tool.Result();
1320
1321 ShapeFix::SameParameter ( res, Standard_False );
1322 DBRep::Set ( argv[1], res );
1323 return 0;
1324}
1325
1326static Standard_Integer splitarea (Draw_Interpretor& di,
1327 Standard_Integer argc,
1328 const char** argv)
1329{
1330 if (argc<4) {
1331 di << "bad number of arguments" <<"\n";
1332 return 1;
1333 }
1334
1335 TopoDS_Shape inputShape=DBRep::Get(argv[2]);
1336 if (inputShape.IsNull()) {
1337 di << "Unknown shape"<< "\n";
1338 return 1;
1339 }
1340 Standard_Real aMaxArea = atof(argv[3]);
1341
1342
1343 ShapeUpgrade_ShapeDivideArea tool (inputShape);
1344 if(argc >4) {
1345 Standard_Real prec = atof(argv[4]);
1346 tool.SetPrecision(prec);
1347 }
1348 tool.MaxArea() = aMaxArea;
1349 tool.Perform();
1350 TopoDS_Shape res = tool.Result();
1351
1352 ShapeFix::SameParameter ( res, Standard_False );
1353 DBRep::Set ( argv[1], res );
1354 return 0;
1355}
1356
1357static Standard_Integer removeinternalwires (Draw_Interpretor& di,
1358 Standard_Integer argc,
1359 const char** argv)
1360{
1361 if (argc<4) {
1362 di << "bad number of arguments" <<"\n";
1363 return 1;
1364 }
1365 Standard_Real aMinArea = atof(argv[2]);
1366 TopoDS_Shape inputShape=DBRep::Get(argv[3]);
1367 if (inputShape.IsNull()) {
1368 di << "Unknown shape"<< "\n";
1369 return 1;
1370 }
1371 Handle(ShapeUpgrade_RemoveInternalWires) aTool;
1372 TopTools_SequenceOfShape aSeqShapes;
1373 if(inputShape.ShapeType() < TopAbs_WIRE)
1374 aTool = new ShapeUpgrade_RemoveInternalWires(inputShape);
1375 else {
1376 di<<"Invalid type of first shape: should be FACE,SHELL,SOLID or COMPOUND"<<"\n";
1377 return 1;
1378 }
1379
1380 Standard_Integer k = 4;
1381 Standard_Boolean isShape = Standard_True;
1382 Standard_Boolean aModeRemoveFaces =Standard_True;
1383
1384
1385 for( ; k < argc; k++) {
1386 if(isShape) {
1387 TopoDS_Shape aShape=DBRep::Get(argv[k]);
1388 isShape = !aShape.IsNull();
1389 if(isShape) {
1390 if(aShape.ShapeType() == TopAbs_FACE || aShape.ShapeType() == TopAbs_WIRE)
1391 aSeqShapes.Append(aShape);
1392 }
1393 }
1394 if(!isShape)
1395 aModeRemoveFaces = (atoi(argv[k]) == 1);
1396 }
1397
1398 aTool->MinArea() = aMinArea;
1399 aTool->RemoveFaceMode() = aModeRemoveFaces;
1400 if(aSeqShapes.Length())
1401 aTool->Perform(aSeqShapes);
1402 else
1403 aTool->Perform();
1404 if(aTool->Status(ShapeExtend_FAIL1))
1405 di<<"Initial shape has invalid type"<<"\n";
1406 else if(aTool->Status(ShapeExtend_FAIL2))
1407 di<<"Specified sub-shape is not belonged to whole shape"<<"\n";
1408 if(aTool->Status(ShapeExtend_DONE1)) {
1409 const TopTools_SequenceOfShape& aRemovedWires =aTool->RemovedWires();
1410 di<<aRemovedWires.Length()<<" internal wires were removed"<<"\n";
1411
1412 }
1413 if(aTool->Status(ShapeExtend_DONE2)) {
1414 const TopTools_SequenceOfShape& aRemovedFaces =aTool->RemovedFaces();
1415 di<<aRemovedFaces.Length()<<" small faces were removed"<<"\n";
1416
1417 }
1418 TopoDS_Shape res = aTool->GetResult();
1419
1420
1421 DBRep::Set ( argv[1], res );
1422 return 0;
1423}
1424
1425static Standard_Integer removeloc (Draw_Interpretor& di,
1426 Standard_Integer argc,
1427 const char** argv)
1428{
1429 if (argc<3) {
1430 di << "bad number of arguments. Should be: removeloc res shape" <<"\n";
1431 return 1;
1432 }
1433
1434 TopoDS_Shape aShape = DBRep::Get(argv[2]);
1435 if(aShape.IsNull())
1436 return 1;
1437 ShapeUpgrade_RemoveLocations aRemLoc;
1438 aRemLoc.Remove(aShape);
1439 TopoDS_Shape aNewShape = aRemLoc.GetResult();
1440
1441 DBRep::Set(argv[1],aNewShape);
1442 return 0;
1443}
1444static Standard_Integer copytranslate(Draw_Interpretor& di,
1445 Standard_Integer argc,
1446 const char** argv)
1447{
1448 if (argc<6) {
1449 di << "bad number of arguments. Should be: removeloc res shape dx dyy dz" <<"\n";
1450 return 1;
1451 }
1452 TopoDS_Shape aShape = DBRep::Get(argv[2]);
1453 if(aShape.IsNull())
1454 return 1;
1455 Standard_Real aDx = atof(argv[3]);
1456 Standard_Real aDy = atof(argv[4]);
1457 Standard_Real aDz = atof(argv[5]);
1458 gp_Trsf aTrsf;
1459 aTrsf.SetTranslation(gp_Vec(aDx, aDy, aDz));
1460 BRepBuilderAPI_Transform builderTransform(aTrsf);
1461 builderTransform.Perform (aShape, true);
1462 TopoDS_Shape aNewShape = builderTransform.Shape();
1463 DBRep::Set(argv[1],aNewShape);
1464 return 0;
1465
1466}
1467
1468//=======================================================================
1469//function : InitCommands
1470//purpose :
1471//=======================================================================
1472
1473 void SWDRAW_ShapeUpgrade::InitCommands(Draw_Interpretor& theCommands)
1474{
1475 static Standard_Integer initactor = 0;
1476 if (initactor) return; initactor = 1;
1477
1478 Standard_CString g = SWDRAW::GroupName(); // "Tests of DivideTool";
1479
1480 theCommands.Add("DT_ShapeDivide",
1481 "DT_ShapeDivide Result Shape Tol: Divides shape with C1 Criterion",
1482 __FILE__,
1483 DT_ShapeDivide,g);
1484
1485 theCommands.Add("DT_SplitAngle",
1486 "DT_SplitAngle Result Shape [MaxAngle=95]: Divides revolved surfaces on segments less MaxAngle deg",
1487 __FILE__,
1488 DT_SplitAngle,g);
1489
1490 theCommands.Add("DT_ShapeConvert",
1491 "DT_ShapeConvert Result Shape convert2d convert3d: Converts curves to beziers",
1492 __FILE__,
1493 DT_ShapeConvert,g);
1494
1495 theCommands.Add("DT_ShapeConvertRev",
1496 "DT_ShapeConvert Result Shape convert2d convert3d: Converts curves to beziers",
1497 __FILE__,
1498 DT_ShapeConvertRev,g);
1499/* theCommands.Add("DT_PlaneDividedFace",
1500 "DT_PlaneDividedFace Result Face Tol: Transfer into a plane with boundary divided",
1501 __FILE__,
1502 DT_PlaneDividedFace,g);
1503
1504 theCommands.Add("DT_PlaneGridShell",
1505 "DT_PlaneGridShell Result NbU NbV {UKnots} {VKnots} Tol : Create a plane grid Shell",
1506 __FILE__,
1507 DT_PlaneGridShell,g);
1508
1509 theCommands.Add("DT_PlaneFaceCommon",
1510 "DT_PlaneFaceCommon Result Face Shell: Common between a plane Face and a Shell",
1511 __FILE__,
1512 DT_PlaneFaceCommon,g);*/
1513
1514 theCommands.Add("DT_SplitCurve2d",
1515 "DT_SplitCurve2d Curve Tol: Splits the curve with C1 criterion",
1516 __FILE__,
1517 DT_SplitCurve2d,g);
1518
1519 theCommands.Add("DT_SplitCurve",
1520 "DT_SplitCurve Curve Tol: Splits the curve with C1 criterion",
1521 __FILE__,
1522 DT_SplitCurve,g);
1523
1524 theCommands.Add("DT_SplitSurface",
1525 "DT_SplitSurface Result Surface/GridSurf Tol: Splits the surface with C1 criterion",
1526 __FILE__,
1527 DT_SplitSurface,g);
1528
1529 /*theCommands.Add("DT_SupportModification",
1530 "DT_SupportModification Result Shell Surface 2d3dFactor: Surface will support all the faces",
1531 __FILE__,
1532 DT_SupportModification,g);*/
1533
1534// theCommands.Add("DT_SpltWire","DT_SpltWire Result Wire Tol",
1535// __FILE__,DT_SplitWire,g);
1536
1537// theCommands.Add("DT_SplitFace", "DT_SplitFace Result Face Tol",
1538// __FILE__, DT_SplitFace,g);
1539
1540// theCommands.Add("DT_Debug", "DT_Debug 0/1 : activation/desactivation of the debug messages",
1541// __FILE__, DT_Debug,g);
1542// theCommands.Add ("shellsolid","option[a-b-c-f] shape result",
1543// __FILE__,shellsolid,g);
1544 theCommands.Add ("offset2dcurve","result curve offset",
1545 __FILE__,offset2dcurve,g);
1546
1547 theCommands.Add ("offsetcurve","result curve offset dir",
1548 __FILE__,offsetcurve,g);
1549
1550 theCommands.Add ("splitface","result face [u usplit1 usplit2...] [v vsplit1 vsplit2 ...]",
1551 __FILE__,splitface,g);
1552
1553 theCommands.Add ("DT_ToBspl","result shape [options=erop]",
1554 __FILE__,converttobspline,g);
1555 theCommands.Add ("DT_ClosedSplit","result shape",
1556 __FILE__,splitclosed,g);
1557 theCommands.Add ("DT_SplitByArea","result shape maxarea [preci]",
1558 __FILE__,splitarea,g);
1559
1560 theCommands.Add ("RemoveIntWires","result minarea wholeshape [faces or wires] [moderemoveface ]",
1561 __FILE__,removeinternalwires,g);
1562
1563 theCommands.Add ("removeloc","result shape",__FILE__,removeloc,g);
1564 theCommands.Add ("copytranslate","result shape dx dy dz",__FILE__,copytranslate,g);
1565}