b311480e |
1 | // Created on: 2000-08-31 |
2 | // Created by: Andrey BETENEV |
973c2be1 |
3 | // Copyright (c) 2000-2014 OPEN CASCADE SAS |
b311480e |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
b311480e |
6 | // |
d5f74e42 |
7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
973c2be1 |
9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
11 | // distribution for complete text of the license and disclaimer of any warranty. |
b311480e |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
7fd59977 |
15 | |
7fd59977 |
16 | |
7fd59977 |
17 | #include <BRep_Builder.hxx> |
18 | #include <BRepLib.hxx> |
42cf5bc1 |
19 | #include <BRepTools_Modifier.hxx> |
7e785937 |
20 | #include <Message_ProgressScope.hxx> |
42cf5bc1 |
21 | #include <Precision.hxx> |
22 | #include <ShapeBuild_ReShape.hxx> |
7fd59977 |
23 | #include <ShapeCustom_BSplineRestriction.hxx> |
42cf5bc1 |
24 | #include <ShapeCustom_ConvertToBSpline.hxx> |
7fd59977 |
25 | #include <ShapeCustom_ConvertToRevolution.hxx> |
42cf5bc1 |
26 | #include <ShapeCustom_DirectModification.hxx> |
27 | #include <ShapeCustom_RestrictionParameters.hxx> |
7fd59977 |
28 | #include <ShapeCustom_SweptToElementary.hxx> |
42cf5bc1 |
29 | #include <ShapeExtend_MsgRegistrator.hxx> |
30 | #include <ShapeFix.hxx> |
7fd59977 |
31 | #include <ShapeFix_FixSmallFace.hxx> |
8422b578 |
32 | #include <ShapeFix_FixSmallSolid.hxx> |
42cf5bc1 |
33 | #include <ShapeFix_Shape.hxx> |
34 | #include <ShapeFix_ShapeTolerance.hxx> |
7fd59977 |
35 | #include <ShapeFix_SplitCommonVertex.hxx> |
42cf5bc1 |
36 | #include <ShapeFix_Wire.hxx> |
37 | #include <ShapeFix_Wireframe.hxx> |
38 | #include <ShapeProcess.hxx> |
39 | #include <ShapeProcess_OperLibrary.hxx> |
40 | #include <ShapeProcess_ShapeContext.hxx> |
41 | #include <ShapeProcess_UOperator.hxx> |
42 | #include <ShapeUpgrade_ShapeConvertToBezier.hxx> |
43 | #include <ShapeUpgrade_ShapeDivideAngle.hxx> |
44 | #include <ShapeUpgrade_ShapeDivideClosed.hxx> |
45 | #include <ShapeUpgrade_ShapeDivideClosedEdges.hxx> |
46 | #include <ShapeUpgrade_ShapeDivideContinuity.hxx> |
47 | #include <TopoDS_Compound.hxx> |
48 | #include <TopoDS_Iterator.hxx> |
49 | #include <TopoDS_Shape.hxx> |
7fd59977 |
50 | |
51 | //======================================================================= |
52 | //function : ApplyModifier |
53 | //purpose : Applies BRepTools_Modification to a shape, |
54 | // taking into account sharing of components of compounds |
55 | //======================================================================= |
7fd59977 |
56 | TopoDS_Shape ShapeProcess_OperLibrary::ApplyModifier (const TopoDS_Shape &S, |
57 | const Handle(ShapeProcess_ShapeContext)& context, |
58 | const Handle(BRepTools_Modification) &M, |
da2db6a7 |
59 | TopTools_DataMapOfShapeShape &map, |
b47bcd7e |
60 | const Handle(ShapeExtend_MsgRegistrator) &msg, |
61 | Standard_Boolean theMutableInput) |
7fd59977 |
62 | { |
63 | // protect against INTERNAL/EXTERNAL shapes |
64 | TopoDS_Shape SF = S.Oriented(TopAbs_FORWARD); |
65 | |
66 | // Process COMPOUNDs separately in order to handle sharing in assemblies |
67 | if ( SF.ShapeType() == TopAbs_COMPOUND ) { |
68 | Standard_Boolean locModified = Standard_False; |
69 | TopoDS_Compound C; |
70 | BRep_Builder B; |
71 | B.MakeCompound ( C ); |
72 | for ( TopoDS_Iterator it(SF); it.More(); it.Next() ) { |
73 | TopoDS_Shape shape = it.Value(); |
74 | TopLoc_Location L = shape.Location(), nullLoc; |
75 | shape.Location ( nullLoc ); |
76 | TopoDS_Shape res; |
77 | if(map.IsBound ( shape )) |
78 | res = map.Find ( shape ).Oriented ( shape.Orientation() ); |
79 | |
80 | else { |
b47bcd7e |
81 | res = ApplyModifier (shape, context, M, map, 0, theMutableInput ); |
7fd59977 |
82 | map.Bind ( shape, res ); |
83 | } |
84 | if ( ! res.IsSame ( shape ) ) locModified = Standard_True; |
9592ae24 |
85 | res.Location ( L, Standard_False ); |
7fd59977 |
86 | B.Add ( C, res ); |
87 | } |
88 | if ( ! locModified ) return S; |
89 | |
90 | map.Bind ( SF, C ); |
91 | return C.Oriented ( S.Orientation() ); |
92 | } |
93 | |
94 | // Modify the shape |
b47bcd7e |
95 | BRepTools_Modifier MD(SF); |
96 | MD.SetMutableInput(theMutableInput); |
97 | MD.Perform(M); |
da2db6a7 |
98 | context->RecordModification ( SF, MD, msg ); |
7fd59977 |
99 | return MD.ModifiedShape(SF).Oriented(S.Orientation()); |
100 | } |
101 | |
102 | |
103 | //======================================================================= |
104 | //function : directfaces |
105 | //purpose : |
106 | //======================================================================= |
107 | |
7e785937 |
108 | static Standard_Boolean directfaces (const Handle(ShapeProcess_Context)& context, |
109 | const Message_ProgressRange&) |
7fd59977 |
110 | { |
111 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
112 | if ( ctx.IsNull() ) return Standard_False; |
113 | |
da2db6a7 |
114 | // activate message mechanism if it is supported by context |
115 | Handle(ShapeExtend_MsgRegistrator) msg; |
116 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
117 | |
7fd59977 |
118 | Handle(ShapeCustom_DirectModification) DM = new ShapeCustom_DirectModification; |
da2db6a7 |
119 | DM->SetMsgRegistrator( msg ); |
7fd59977 |
120 | TopTools_DataMapOfShapeShape map; |
b47bcd7e |
121 | TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, DM, map, msg, Standard_True ); |
da2db6a7 |
122 | ctx->RecordModification ( map, msg ); |
7fd59977 |
123 | ctx->SetResult ( res ); |
b485ee79 |
124 | return Standard_True; |
7fd59977 |
125 | } |
126 | |
127 | |
128 | //======================================================================= |
129 | //function : sameparam |
da2db6a7 |
130 | //purpose : |
7fd59977 |
131 | //======================================================================= |
132 | |
7e785937 |
133 | static Standard_Boolean sameparam (const Handle(ShapeProcess_Context)& context, |
134 | const Message_ProgressRange&) |
7fd59977 |
135 | { |
136 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
137 | if ( ctx.IsNull() ) return Standard_False; |
da2db6a7 |
138 | |
139 | // activate message mechanism if it is supported by context |
140 | Handle(ShapeExtend_MsgRegistrator) msg; |
141 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
142 | |
143 | ShapeFix::SameParameter ( ctx->Result(), |
dde68833 |
144 | ctx->BooleanVal ( "Force", Standard_False ), |
da2db6a7 |
145 | ctx->RealVal ( "Tolerance3d", Precision::Confusion() /* -1 */), |
7e785937 |
146 | Message_ProgressRange(), msg ); |
da2db6a7 |
147 | |
148 | if ( !msg.IsNull() ) |
149 | { |
150 | // WARNING: not FULL update of context yet! |
151 | Handle(ShapeBuild_ReShape) reshape = new ShapeBuild_ReShape; |
152 | ctx->RecordModification( reshape, msg ); |
153 | } |
7fd59977 |
154 | return Standard_True; |
155 | } |
156 | |
157 | |
158 | //======================================================================= |
159 | //function : settol |
160 | //purpose : |
161 | //======================================================================= |
162 | |
7e785937 |
163 | static Standard_Boolean settol (const Handle(ShapeProcess_Context)& context, |
164 | const Message_ProgressRange&) |
7fd59977 |
165 | { |
166 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
167 | if ( ctx.IsNull() ) return Standard_False; |
168 | |
169 | Standard_Real val; |
170 | if ( ctx->IntegerVal ( "Mode", 0 ) >0 && ctx->GetReal ( "Value", val ) ) { |
171 | Standard_Real rat = ctx->RealVal ( "Ratio", 1. ); |
172 | if ( rat >= 1 ) { |
173 | ShapeFix_ShapeTolerance SFST; |
174 | SFST.LimitTolerance (ctx->Result(), val/rat, val*rat); |
175 | } |
176 | } |
177 | |
178 | BRepLib::UpdateTolerances (ctx->Result(),Standard_True); |
179 | |
180 | Standard_Real reg; |
181 | if ( ctx->GetReal ("Regularity", reg) ) |
182 | BRepLib::EncodeRegularity (ctx->Result(), reg); |
183 | |
184 | // WARNING: no update of context yet! |
185 | return Standard_True; |
186 | } |
187 | |
188 | |
189 | //======================================================================= |
190 | //function : splitangle |
da2db6a7 |
191 | //purpose : |
7fd59977 |
192 | //======================================================================= |
193 | |
7e785937 |
194 | static Standard_Boolean splitangle (const Handle(ShapeProcess_Context)& context, |
195 | const Message_ProgressRange&) |
7fd59977 |
196 | { |
197 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
198 | if ( ctx.IsNull() ) return Standard_False; |
da2db6a7 |
199 | |
200 | // activate message mechanism if it is supported by context |
201 | Handle(ShapeExtend_MsgRegistrator) msg; |
202 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
203 | |
c6541a0c |
204 | ShapeUpgrade_ShapeDivideAngle SDA ( ctx->RealVal ( "Angle", 2*M_PI ), ctx->Result() ); |
7fd59977 |
205 | SDA.SetMaxTolerance ( ctx->RealVal ( "MaxTolerance", 1. ) ); |
da2db6a7 |
206 | SDA.SetMsgRegistrator ( msg ); |
207 | |
7fd59977 |
208 | if ( ! SDA.Perform() && SDA.Status (ShapeExtend_FAIL) ) { |
0797d9d3 |
209 | #ifdef OCCT_DEBUG |
04232180 |
210 | std::cout<<"ShapeDivideAngle failed"<<std::endl; |
7fd59977 |
211 | #endif |
212 | return Standard_False; |
213 | } |
da2db6a7 |
214 | |
215 | ctx->RecordModification ( SDA.GetContext(), msg ); |
7fd59977 |
216 | ctx->SetResult ( SDA.Result() ); |
217 | return Standard_True; |
218 | } |
219 | |
220 | |
221 | //======================================================================= |
222 | //function : bsplinerestriction |
223 | //purpose : |
224 | //======================================================================= |
225 | |
7e785937 |
226 | static Standard_Boolean bsplinerestriction (const Handle(ShapeProcess_Context)& context, |
227 | const Message_ProgressRange&) |
7fd59977 |
228 | { |
229 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
230 | if ( ctx.IsNull() ) return Standard_False; |
231 | |
da2db6a7 |
232 | // activate message mechanism if it is supported by context |
233 | Handle(ShapeExtend_MsgRegistrator) msg; |
234 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
235 | |
dde68833 |
236 | Standard_Boolean ModeSurf = ctx->BooleanVal ( "SurfaceMode", Standard_True ); |
237 | Standard_Boolean ModeC3d = ctx->BooleanVal ( "Curve3dMode", Standard_True ); |
238 | Standard_Boolean ModeC2d = ctx->BooleanVal ( "Curve2dMode", Standard_True ); |
7fd59977 |
239 | |
240 | Standard_Real aTol3d = ctx->RealVal ( "Tolerance3d", 0.01 ); |
241 | Standard_Real aTol2d = ctx->RealVal ( "Tolerance2d", 1e-06 ); |
242 | |
243 | GeomAbs_Shape aCont3d = ctx->ContinuityVal ( "Continuity3d", GeomAbs_C1 ); |
244 | GeomAbs_Shape aCont2d = ctx->ContinuityVal ( "Continuity2d", GeomAbs_C2 ); |
245 | |
246 | Standard_Integer aMaxDeg = ctx->IntegerVal ( "RequiredDegree", 9 ); |
247 | Standard_Integer aMaxSeg = ctx->IntegerVal ( "RequiredNbSegments", 10000 ); |
248 | |
dde68833 |
249 | Standard_Boolean ModeDeg = ctx->BooleanVal ( "PreferDegree", Standard_True ); |
250 | Standard_Boolean Rational = ctx->BooleanVal ( "RationalToPolynomial", Standard_False ); |
7fd59977 |
251 | |
252 | Handle(ShapeCustom_RestrictionParameters) aParameters = new ShapeCustom_RestrictionParameters; |
253 | ctx->GetInteger ( "MaxDegree", aParameters->GMaxDegree() ); |
254 | ctx->GetInteger ( "MaxNbSegments", aParameters->GMaxSeg() ); |
255 | ctx->GetBoolean ( "OffsetSurfaceMode", aParameters->ConvertOffsetSurf() ); |
256 | ctx->GetBoolean ( "OffsetCurve3dMode", aParameters->ConvertOffsetCurv3d() ); |
257 | ctx->GetBoolean ( "OffsetCurve2dMode", aParameters->ConvertOffsetCurv2d() ); |
258 | ctx->GetBoolean ( "LinearExtrusionMode",aParameters->ConvertExtrusionSurf() ); |
259 | ctx->GetBoolean ( "RevolutionMode", aParameters->ConvertRevolutionSurf() ); |
260 | ctx->GetBoolean ( "SegmentSurfaceMode", aParameters->SegmentSurfaceMode() ); |
261 | ctx->GetBoolean ( "ConvCurve3dMode", aParameters->ConvertCurve3d() ); |
262 | ctx->GetBoolean ( "ConvCurve2dMode", aParameters->ConvertCurve2d() ); |
263 | ctx->GetBoolean ( "BezierMode", aParameters->ConvertBezierSurf() ); |
264 | //modes to convert elementary surfaces |
265 | ctx->GetBoolean ( "PlaneMode", aParameters->ConvertPlane() ); |
266 | //ctx->GetBoolean ("ElementarySurfMode", aParameters->ConvertElementarySurf()); |
267 | ctx->GetBoolean ( "ConicalSurfMode", aParameters->ConvertConicalSurf()); |
268 | ctx->GetBoolean ( "CylindricalSurfMode", aParameters->ConvertCylindricalSurf()); |
269 | ctx->GetBoolean ( "ToroidalSurfMode", aParameters->ConvertToroidalSurf()); |
270 | ctx->GetBoolean ( "SphericalSurfMode", aParameters->ConvertSphericalSurf()); |
271 | |
272 | Handle(ShapeCustom_BSplineRestriction) LD = |
273 | new ShapeCustom_BSplineRestriction ( ModeSurf, ModeC3d, ModeC2d, |
274 | aTol3d, aTol2d, aCont3d, aCont2d, |
275 | aMaxDeg, aMaxSeg, ModeDeg, Rational, aParameters ); |
da2db6a7 |
276 | LD->SetMsgRegistrator( msg ); |
7fd59977 |
277 | TopTools_DataMapOfShapeShape map; |
b47bcd7e |
278 | TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, LD, map, msg, Standard_True ); |
da2db6a7 |
279 | ctx->RecordModification ( map, msg ); |
7fd59977 |
280 | ctx->SetResult ( res ); |
281 | return Standard_True; |
282 | } |
283 | |
284 | |
285 | //======================================================================= |
286 | //function : torevol |
287 | //purpose : |
288 | //======================================================================= |
289 | |
7e785937 |
290 | static Standard_Boolean torevol (const Handle(ShapeProcess_Context)& context, |
291 | const Message_ProgressRange&) |
7fd59977 |
292 | { |
293 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
294 | if ( ctx.IsNull() ) return Standard_False; |
295 | |
da2db6a7 |
296 | // activate message mechanism if it is supported by context |
297 | Handle(ShapeExtend_MsgRegistrator) msg; |
298 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
299 | |
300 | Handle(ShapeCustom_ConvertToRevolution) CR = new ShapeCustom_ConvertToRevolution(); |
301 | CR->SetMsgRegistrator( msg ); |
7fd59977 |
302 | TopTools_DataMapOfShapeShape map; |
b47bcd7e |
303 | TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, CR, map, msg, Standard_True ); |
da2db6a7 |
304 | ctx->RecordModification ( map, msg ); |
7fd59977 |
305 | ctx->SetResult ( res ); |
306 | return Standard_True; |
307 | } |
308 | |
309 | |
310 | //======================================================================= |
311 | //function : swepttoelem |
312 | //purpose : |
313 | //======================================================================= |
314 | |
7e785937 |
315 | static Standard_Boolean swepttoelem (const Handle(ShapeProcess_Context)& context, |
316 | const Message_ProgressRange&) |
7fd59977 |
317 | { |
318 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
319 | if ( ctx.IsNull() ) return Standard_False; |
320 | |
da2db6a7 |
321 | // activate message mechanism if it is supported by context |
322 | Handle(ShapeExtend_MsgRegistrator) msg; |
323 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
324 | |
7fd59977 |
325 | Handle(ShapeCustom_SweptToElementary) SE = new ShapeCustom_SweptToElementary(); |
da2db6a7 |
326 | SE->SetMsgRegistrator( msg ); |
7fd59977 |
327 | TopTools_DataMapOfShapeShape map; |
b47bcd7e |
328 | TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, SE, map, msg, Standard_True ); |
da2db6a7 |
329 | ctx->RecordModification ( map, msg ); |
7fd59977 |
330 | ctx->SetResult ( res ); |
331 | return Standard_True; |
332 | } |
333 | |
334 | |
335 | //======================================================================= |
336 | //function : shapetobezier |
337 | //purpose : |
338 | //======================================================================= |
339 | |
7e785937 |
340 | static Standard_Boolean shapetobezier (const Handle(ShapeProcess_Context)& context, |
341 | const Message_ProgressRange&) |
7fd59977 |
342 | { |
343 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
344 | if ( ctx.IsNull() ) return Standard_False; |
345 | |
da2db6a7 |
346 | // activate message mechanism if it is supported by context |
347 | Handle(ShapeExtend_MsgRegistrator) msg; |
348 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
349 | |
7fd59977 |
350 | Standard_Boolean ModeC3d = ctx->BooleanVal ( "Curve3dMode", Standard_False ); |
351 | Standard_Boolean ModeC2d = ctx->BooleanVal ( "Curve2dMode", Standard_False ); |
352 | Standard_Boolean ModeSurf = ctx->BooleanVal ( "SurfaceMode", Standard_False ); |
353 | Standard_Boolean ModeLine3d = ctx->BooleanVal ( "Line3dMode", Standard_True ); |
354 | Standard_Boolean ModeCircle3d = ctx->BooleanVal ( "Circle3dMode", Standard_True ); |
355 | Standard_Boolean ModeConic3d = ctx->BooleanVal ( "Conic3dMode", Standard_True ); |
356 | Standard_Boolean SegmentMode = ctx->BooleanVal ( "SegmentSurfaceMode", Standard_True ); |
357 | Standard_Boolean PlaneMode = ctx->BooleanVal ( "PlaneMode", Standard_True ); |
358 | Standard_Boolean RevolutionMode = ctx->BooleanVal ( "RevolutionMode", Standard_True ); |
359 | Standard_Boolean ExtrusionMode = ctx->BooleanVal ( "ExtrusionMode", Standard_True ); |
360 | Standard_Boolean BSplineMode = ctx->BooleanVal ( "BSplineMode", Standard_True ); |
361 | |
362 | ShapeUpgrade_ShapeConvertToBezier SCB (ctx->Result()); |
da2db6a7 |
363 | SCB.SetMsgRegistrator( msg ); |
7fd59977 |
364 | SCB.SetSurfaceSegmentMode(SegmentMode); |
365 | SCB.SetSurfaceConversion (ModeSurf); |
366 | SCB.Set2dConversion (ModeC2d); |
367 | SCB.Set3dConversion (ModeC3d); |
368 | if(ModeC3d) { |
369 | SCB.Set3dLineConversion (ModeLine3d); |
370 | SCB.Set3dCircleConversion (ModeCircle3d); |
371 | SCB.Set3dConicConversion (ModeConic3d); |
372 | } |
373 | if(ModeSurf) { |
374 | SCB.SetPlaneMode(PlaneMode); |
375 | SCB.SetRevolutionMode(RevolutionMode); |
376 | SCB.SetExtrusionMode(ExtrusionMode); |
377 | SCB.SetBSplineMode(BSplineMode); |
378 | } |
379 | |
380 | Standard_Real maxTol, minTol; |
381 | if ( ctx->GetReal ( "MaxTolerance", maxTol ) ) SCB.SetMaxTolerance(maxTol); |
382 | if ( ctx->GetReal ( "MinCurveLength", minTol ) ) SCB.SetMinTolerance(minTol); |
383 | |
384 | Standard_Boolean EdgeMode; |
385 | if ( ctx->GetBoolean ( "EdgeMode", EdgeMode ) ) SCB.SetEdgeMode(EdgeMode); |
386 | |
387 | if ( ! SCB.Perform() && SCB.Status (ShapeExtend_FAIL) ) { |
0797d9d3 |
388 | #ifdef OCCT_DEBUG |
04232180 |
389 | std::cout<<"Shape::ShapeConvertToBezier failed"<<std::endl; // !!!! |
7fd59977 |
390 | #endif |
391 | return Standard_False; |
392 | } |
393 | |
da2db6a7 |
394 | ctx->RecordModification ( SCB.GetContext(), msg ); |
7fd59977 |
395 | ctx->SetResult ( SCB.Result() ); |
396 | return Standard_True; |
397 | } |
398 | |
399 | |
400 | //======================================================================= |
401 | //function : converttobspline |
402 | //purpose : |
403 | //======================================================================= |
404 | |
7e785937 |
405 | static Standard_Boolean converttobspline (const Handle(ShapeProcess_Context)& context, |
406 | const Message_ProgressRange&) |
7fd59977 |
407 | { |
408 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
409 | if ( ctx.IsNull() ) return Standard_False; |
410 | |
da2db6a7 |
411 | // activate message mechanism if it is supported by context |
412 | Handle(ShapeExtend_MsgRegistrator) msg; |
413 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
414 | |
7fd59977 |
415 | Standard_Boolean extrMode = ctx->BooleanVal ( "LinearExtrusionMode", Standard_True ); |
416 | Standard_Boolean revolMode = ctx->BooleanVal ( "RevolutionMode", Standard_True ); |
417 | Standard_Boolean offsetMode = ctx->BooleanVal ( "OffsetMode", Standard_True ); |
418 | |
419 | Handle(ShapeCustom_ConvertToBSpline) CBspl = new ShapeCustom_ConvertToBSpline(); |
420 | CBspl->SetExtrusionMode(extrMode); |
421 | CBspl->SetRevolutionMode(revolMode); |
422 | CBspl->SetOffsetMode(offsetMode); |
da2db6a7 |
423 | CBspl->SetMsgRegistrator( msg ); |
7fd59977 |
424 | |
425 | TopTools_DataMapOfShapeShape map; |
b47bcd7e |
426 | TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier( ctx->Result(), ctx, CBspl, map, msg, Standard_True ); |
da2db6a7 |
427 | ctx->RecordModification ( map, msg ); |
7fd59977 |
428 | ctx->SetResult ( res ); |
429 | return Standard_True; |
430 | } |
431 | |
432 | |
433 | //======================================================================= |
434 | //function : splitcontinuity |
435 | //purpose : Split by Continuity |
436 | //======================================================================= |
437 | |
7e785937 |
438 | static Standard_Boolean splitcontinuity (const Handle(ShapeProcess_Context)& context, |
439 | const Message_ProgressRange&) |
7fd59977 |
440 | { |
441 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
442 | if ( ctx.IsNull() ) return Standard_False; |
443 | |
da2db6a7 |
444 | // activate message mechanism if it is supported by context |
445 | Handle(ShapeExtend_MsgRegistrator) msg; |
446 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
447 | |
7fd59977 |
448 | Standard_Real aTol = ctx->RealVal ( "Tolerance3d", 1.e-7 ); |
449 | Standard_Real aTol2D = ctx->RealVal ( "Tolerance2d", 1.e-9 ); |
450 | GeomAbs_Shape aCrvCont = ctx->ContinuityVal ( "CurveContinuity", GeomAbs_C1 ); |
451 | GeomAbs_Shape aSrfCont = ctx->ContinuityVal ( "SurfaceContinuity", GeomAbs_C1 ); |
452 | GeomAbs_Shape aCrv2dCont = ctx->ContinuityVal ( "Curve2dContinuity", GeomAbs_C1 ); |
453 | ShapeUpgrade_ShapeDivideContinuity tool (ctx->Result()); |
454 | tool.SetBoundaryCriterion(aCrvCont); |
455 | tool.SetSurfaceCriterion(aSrfCont); |
456 | tool.SetPCurveCriterion(aCrv2dCont); |
457 | tool.SetTolerance(aTol); |
458 | tool.SetTolerance2d(aTol2D); |
da2db6a7 |
459 | |
460 | tool.SetMsgRegistrator( msg ); |
461 | |
7fd59977 |
462 | Standard_Real maxTol; |
463 | if ( ctx->GetReal ( "MaxTolerance", maxTol ) ) tool.SetMaxTolerance(maxTol); |
464 | |
465 | if ( ! tool.Perform() && tool.Status (ShapeExtend_FAIL) ) { |
0797d9d3 |
466 | #ifdef OCCT_DEBUG |
04232180 |
467 | std::cout<<"SplitContinuity failed"<<std::endl; |
7fd59977 |
468 | #endif |
469 | return Standard_False; |
470 | } |
471 | |
da2db6a7 |
472 | ctx->RecordModification ( tool.GetContext(), msg ); |
7fd59977 |
473 | ctx->SetResult ( tool.Result() ); |
474 | return Standard_True; |
475 | } |
476 | |
477 | |
478 | //======================================================================= |
479 | //function : splitclosedfaces |
480 | //purpose : |
481 | //======================================================================= |
482 | |
7e785937 |
483 | static Standard_Boolean splitclosedfaces (const Handle(ShapeProcess_Context)& context, |
484 | const Message_ProgressRange&) |
7fd59977 |
485 | { |
486 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
487 | if ( ctx.IsNull() ) return Standard_False; |
488 | |
da2db6a7 |
489 | // activate message mechanism if it is supported by context |
490 | Handle(ShapeExtend_MsgRegistrator) msg; |
491 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
492 | |
7fd59977 |
493 | ShapeUpgrade_ShapeDivideClosed tool ( ctx->Result() ); |
da2db6a7 |
494 | tool.SetMsgRegistrator( msg ); |
7fd59977 |
495 | |
496 | Standard_Real closeTol; |
497 | if ( ctx->GetReal ( "CloseTolerance", closeTol ) ) tool.SetPrecision(closeTol); |
498 | |
499 | Standard_Real maxTol; |
500 | if ( ctx->GetReal ( "MaxTolerance", maxTol ) ) tool.SetMaxTolerance(maxTol); |
501 | |
502 | Standard_Integer num = ctx->IntegerVal ( "NbSplitPoints", 1 ); |
503 | Standard_Boolean hasSeg = Standard_True; |
504 | ctx->GetBoolean ( "SegmentSurfaceMode", hasSeg); |
505 | |
506 | tool.SetNbSplitPoints(num); |
507 | tool.SetSurfaceSegmentMode(hasSeg); |
508 | if ( ! tool.Perform() && tool.Status (ShapeExtend_FAIL) ) { |
0797d9d3 |
509 | #ifdef OCCT_DEBUG |
04232180 |
510 | std::cout<<"Splitting of closed faces failed"<<std::endl; |
7fd59977 |
511 | #endif |
512 | return Standard_False; |
513 | } |
514 | |
da2db6a7 |
515 | ctx->RecordModification ( tool.GetContext(), msg ); |
7fd59977 |
516 | ctx->SetResult ( tool.Result() ); |
517 | return Standard_True; |
518 | } |
519 | |
520 | |
521 | //======================================================================= |
522 | //function : fixfacesize |
523 | //purpose : |
524 | //======================================================================= |
525 | |
7e785937 |
526 | static Standard_Boolean fixfacesize (const Handle(ShapeProcess_Context)& context, |
527 | const Message_ProgressRange&) |
7fd59977 |
528 | { |
529 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
530 | if ( ctx.IsNull() ) return Standard_False; |
531 | |
da2db6a7 |
532 | // activate message mechanism if it is supported by context |
533 | Handle(ShapeExtend_MsgRegistrator) msg; |
534 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
535 | |
7fd59977 |
536 | Handle(ShapeBuild_ReShape) reshape = new ShapeBuild_ReShape; |
537 | ShapeFix_FixSmallFace FSC; |
538 | FSC.SetContext(reshape); |
539 | FSC.Init(ctx->Result()); |
da2db6a7 |
540 | FSC.SetMsgRegistrator ( msg ); |
7fd59977 |
541 | |
542 | Standard_Real aTol; |
543 | if ( ctx->GetReal ( "Tolerance", aTol ) ) FSC.SetPrecision (aTol); |
544 | |
545 | FSC.Perform(); |
546 | TopoDS_Shape newsh = FSC.Shape(); |
547 | |
548 | if ( newsh != ctx->Result() ) { |
da2db6a7 |
549 | ctx->RecordModification ( reshape, msg ); |
7fd59977 |
550 | ctx->SetResult ( newsh ); |
551 | } |
552 | |
553 | return Standard_True; |
554 | } |
555 | |
556 | |
557 | //======================================================================= |
558 | //function : fixwgaps |
559 | //purpose : |
560 | //======================================================================= |
561 | |
7e785937 |
562 | static Standard_Boolean fixwgaps (const Handle(ShapeProcess_Context)& context, |
563 | const Message_ProgressRange&) |
7fd59977 |
564 | { |
565 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
566 | if ( ctx.IsNull() ) return Standard_False; |
567 | |
da2db6a7 |
568 | // activate message mechanism if it is supported by context |
569 | Handle(ShapeExtend_MsgRegistrator) msg; |
570 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
571 | |
7fd59977 |
572 | Standard_Real aTol3d = ctx->RealVal ( "Tolerance3d", Precision::Confusion() ); |
573 | |
574 | Handle(ShapeBuild_ReShape) reshape = new ShapeBuild_ReShape; |
575 | Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe(ctx->Result()); |
da2db6a7 |
576 | sfwf->SetMsgRegistrator( msg ); |
7fd59977 |
577 | sfwf->SetContext(reshape); |
578 | sfwf->SetPrecision(aTol3d); |
579 | sfwf->FixWireGaps(); |
580 | TopoDS_Shape result = sfwf->Shape(); |
581 | |
582 | if ( result != ctx->Result() ) { |
da2db6a7 |
583 | ctx->RecordModification ( reshape, msg ); |
7fd59977 |
584 | ctx->SetResult ( result ); |
585 | } |
586 | return Standard_True; |
587 | } |
588 | |
8422b578 |
589 | //======================================================================= |
590 | //function : dropsmallsolids |
591 | //purpose : |
592 | //======================================================================= |
593 | |
7e785937 |
594 | static Standard_Boolean dropsmallsolids (const Handle(ShapeProcess_Context)& context, |
595 | const Message_ProgressRange&) |
8422b578 |
596 | { |
597 | Handle(ShapeProcess_ShapeContext) ctx = |
598 | Handle(ShapeProcess_ShapeContext)::DownCast (context); |
599 | if (ctx.IsNull()) return Standard_False; |
600 | |
7c8996f4 |
601 | // activate message mechanism if it is supported by context |
602 | Handle(ShapeExtend_MsgRegistrator) msg; |
603 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
604 | |
8422b578 |
605 | ShapeFix_FixSmallSolid FSS; |
7c8996f4 |
606 | FSS.SetMsgRegistrator( msg ); |
8422b578 |
607 | |
608 | Standard_Real aThreshold; |
df515f16 |
609 | Standard_Integer aMode; |
610 | if (ctx->GetInteger ("FixMode", aMode)) |
611 | FSS.SetFixMode (aMode); |
8422b578 |
612 | if (ctx->GetReal ("VolumeThreshold", aThreshold)) |
613 | FSS.SetVolumeThreshold (aThreshold); |
614 | if (ctx->GetReal ("WidthFactorThreshold", aThreshold)) |
615 | FSS.SetWidthFactorThreshold (aThreshold); |
616 | |
617 | Standard_Boolean aMerge = Standard_False; |
618 | ctx->GetBoolean ("MergeSolids", aMerge); |
619 | |
620 | Handle(ShapeBuild_ReShape) aReShape = new ShapeBuild_ReShape; |
621 | |
622 | TopoDS_Shape aResult; |
623 | if (aMerge) |
624 | aResult = FSS.Merge (ctx->Result(), aReShape); |
625 | else |
626 | aResult = FSS.Remove (ctx->Result(), aReShape); |
627 | |
628 | if (aResult != ctx->Result()) |
629 | { |
7c8996f4 |
630 | ctx->RecordModification (aReShape, msg); |
8422b578 |
631 | ctx->SetResult (aResult); |
632 | } |
633 | |
634 | return Standard_True; |
635 | } |
636 | |
7fd59977 |
637 | /* |
638 | //======================================================================= |
639 | //function : |
640 | //purpose : |
641 | //======================================================================= |
642 | |
643 | static Standard_Boolean dropsmalledges (const Handle(ShapeProcess_Context)& context) |
644 | { |
645 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
646 | if ( ctx.IsNull() ) return Standard_False; |
647 | |
648 | //Handle(ShapeBuild_ReShape) ctx = new ShapeBuild_ReShape; |
649 | Handle(MoniFrame_Element) elem = astep->Operand(); |
650 | TopoDS_Shape Shape = MoniShape::Shape(elem); |
651 | Standard_Real aTol3d = Precision::Confusion(); |
652 | Handle(MoniFrame_TypedValue) ptol3d = aproc->StackParam("Tolerance3d",Standard_True); |
653 | if (ptol3d->IsSetValue()) aTol3d = ptol3d->RealValue(); |
654 | Handle(ShapeBuild_ReShape) context; |
655 | TopoDS_Shape result = ShapeFix::RemoveSmallEdges(Shape,aTol3d,context); |
656 | if (result == Shape) astep->AddTouched (aproc->Infos(),MoniShape::Element(Shape)); |
657 | else |
658 | MoniShapeSW::UpdateFromReShape (aproc->Infos(), astep, Shape, context, TopAbs_FACE); |
659 | return 0; |
660 | } |
661 | */ |
662 | |
663 | |
664 | //======================================================================= |
665 | //function : mergesmalledges |
666 | //purpose : |
667 | //======================================================================= |
668 | |
7e785937 |
669 | static Standard_Boolean mergesmalledges (const Handle(ShapeProcess_Context)& context, |
670 | const Message_ProgressRange&) |
7fd59977 |
671 | { |
672 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
673 | if ( ctx.IsNull() ) return Standard_False; |
674 | |
da2db6a7 |
675 | // activate message mechanism if it is supported by context |
676 | Handle(ShapeExtend_MsgRegistrator) msg; |
677 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
678 | |
7fd59977 |
679 | Standard_Real aTol3d = ctx->RealVal ( "Tolerance3d", Precision::Confusion() ); |
680 | |
681 | Handle(ShapeBuild_ReShape) reshape = new ShapeBuild_ReShape; |
682 | ShapeFix_Wireframe ShapeFixWireframe(ctx->Result()); |
683 | ShapeFixWireframe.SetContext(reshape); |
684 | ShapeFixWireframe.SetPrecision(aTol3d); |
da2db6a7 |
685 | ShapeFixWireframe.SetMsgRegistrator( msg ); |
7fd59977 |
686 | |
687 | if ( ShapeFixWireframe.FixSmallEdges() ) { |
da2db6a7 |
688 | ctx->RecordModification ( reshape, msg ); |
7fd59977 |
689 | } |
690 | return Standard_True; |
691 | } |
692 | |
693 | |
694 | //======================================================================= |
695 | //function : fixshape |
696 | //purpose : |
697 | //======================================================================= |
698 | |
7e785937 |
699 | static Standard_Boolean fixshape (const Handle(ShapeProcess_Context)& context, |
700 | const Message_ProgressRange& theProgress) |
7fd59977 |
701 | { |
702 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
703 | if ( ctx.IsNull() ) return Standard_False; |
704 | |
705 | // activate message mechanism if it is supported by context |
706 | Handle(ShapeExtend_MsgRegistrator) msg; |
707 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
708 | |
709 | Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape; |
a9dde4a3 |
710 | Handle(ShapeFix_Face) sff = sfs->FixFaceTool(); |
711 | Handle(ShapeFix_Wire) sfw = sfs->FixWireTool(); |
da2db6a7 |
712 | sfs->SetMsgRegistrator( msg ); |
7fd59977 |
713 | |
714 | sfs->SetPrecision ( ctx->RealVal ( "Tolerance3d", Precision::Confusion() ) ); |
715 | sfs->SetMinTolerance ( ctx->RealVal ( "MinTolerance3d", Precision::Confusion() ) ); |
716 | sfs->SetMaxTolerance ( ctx->RealVal ( "MaxTolerance3d", Precision::Confusion() ) ); |
717 | |
718 | sfs->FixFreeShellMode() = ctx->IntegerVal ( "FixFreeShellMode", -1 ); |
719 | sfs->FixFreeFaceMode() = ctx->IntegerVal ( "FixFreeFaceMode", -1 ); |
720 | sfs->FixFreeWireMode() = ctx->IntegerVal ( "FixFreeWireMode", -1 ); |
721 | sfs->FixSameParameterMode() = ctx->IntegerVal ( "FixSameParameterMode", -1 ); |
722 | sfs->FixSolidMode() = ctx->IntegerVal ( "FixSolidMode", -1 ); |
723 | sfs->FixVertexPositionMode() = ctx->IntegerVal ( "FixVertexPositionMode", 0 ); |
bf961e3c |
724 | sfs->FixVertexTolMode() = ctx->IntegerVal ( "FixVertexToleranceMode", -1 ); |
7fd59977 |
725 | |
726 | sfs->FixSolidTool()->FixShellMode() = ctx->IntegerVal ( "FixShellMode", -1 ); |
bf961e3c |
727 | sfs->FixSolidTool()->FixShellOrientationMode() = ctx->IntegerVal ( "FixShellOrientationMode", -1 ); |
dde68833 |
728 | sfs->FixSolidTool()->CreateOpenSolidMode() = ctx->BooleanVal ( "CreateOpenSolidMode", Standard_True ); |
7fd59977 |
729 | |
730 | sfs->FixShellTool()->FixFaceMode() = ctx->IntegerVal ( "FixFaceMode", -1 ); |
2bc6f715 |
731 | sfs->FixShellTool()->SetNonManifoldFlag(ctx->IsNonManifold()); |
732 | sfs->FixShellTool()->FixOrientationMode() = ctx->IntegerVal("FixFaceOrientationMode", -1); |
7fd59977 |
733 | |
734 | //parameters for ShapeFix_Face |
735 | sff->FixWireMode() = ctx->IntegerVal ( "FixWireMode", -1 ); |
736 | sff->FixOrientationMode() = ctx->IntegerVal ( "FixOrientationMode", -1 ); |
737 | sff->FixAddNaturalBoundMode() = ctx->IntegerVal ( "FixAddNaturalBoundMode", -1 ); |
738 | sff->FixMissingSeamMode() = ctx->IntegerVal ( "FixMissingSeamMode", -1 ); |
739 | sff->FixSmallAreaWireMode() = ctx->IntegerVal ( "FixSmallAreaWireMode", -1 ); |
56a9db93 |
740 | sff->RemoveSmallAreaFaceMode() = ctx->IntegerVal ( "RemoveSmallAreaFaceMode", -1 ); |
7fd59977 |
741 | sff->FixIntersectingWiresMode() = ctx->IntegerVal ( "FixIntersectingWiresMode", -1 ); |
742 | sff->FixLoopWiresMode() = ctx->IntegerVal ( "FixLoopWiresMode", -1 ); |
743 | sff->FixSplitFaceMode() = ctx->IntegerVal ( "FixSplitFaceMode", -1 ); |
744 | |
745 | //parameters for ShapeFix_Wire |
746 | sfw->ModifyTopologyMode() = ctx->BooleanVal ( "ModifyTopologyMode", Standard_False ); |
747 | sfw->ModifyGeometryMode() = ctx->BooleanVal ( "ModifyGeometryMode", Standard_True ); |
748 | sfw->ClosedWireMode() = ctx->BooleanVal ( "ClosedWireMode", Standard_True ); |
749 | sfw->PreferencePCurveMode() = ctx->BooleanVal ( "PreferencePCurveMode", Standard_True ); |
750 | sfw->FixReorderMode() = ctx->IntegerVal ( "FixReorderMode", -1 ); |
751 | sfw->FixSmallMode() = ctx->IntegerVal ( "FixSmallMode", -1 ); |
752 | sfw->FixConnectedMode() = ctx->IntegerVal ( "FixConnectedMode", -1 ); |
753 | sfw->FixEdgeCurvesMode() = ctx->IntegerVal ( "FixEdgeCurvesMode", -1 ); |
754 | sfw->FixDegeneratedMode() = ctx->IntegerVal ( "FixDegeneratedMode", -1 ); |
755 | sfw->FixLackingMode() = ctx->IntegerVal ( "FixLackingMode", -1 ); |
756 | sfw->FixSelfIntersectionMode() = ctx->IntegerVal ( "FixSelfIntersectionMode", -1 ); |
757 | sfw->ModifyRemoveLoopMode() = ctx->IntegerVal ( "RemoveLoopMode", -1); |
758 | sfw->FixReversed2dMode() = ctx->IntegerVal ( "FixReversed2dMode", -1 ); |
759 | sfw->FixRemovePCurveMode() = ctx->IntegerVal ( "FixRemovePCurveMode", -1 ); |
760 | sfw->FixRemoveCurve3dMode() = ctx->IntegerVal ( "FixRemoveCurve3dMode", -1 ); |
761 | sfw->FixAddPCurveMode() = ctx->IntegerVal ( "FixAddPCurveMode", -1 ); |
762 | sfw->FixAddCurve3dMode() = ctx->IntegerVal ( "FixAddCurve3dMode", -1 ); |
763 | sfw->FixShiftedMode() = ctx->IntegerVal ( "FixShiftedMode", -1 ); |
764 | sfw->FixSeamMode() = ctx->IntegerVal ( "FixSeamMode", -1 ); |
765 | sfw->FixSameParameterMode() = ctx->IntegerVal ( "FixEdgeSameParameterMode", -1 ); |
766 | sfw->FixNotchedEdgesMode() = ctx->IntegerVal ( "FixNotchedEdgesMode", -1 ); |
fbf3becf |
767 | sfw->FixTailMode() = ctx->IntegerVal("FixTailMode", 0); |
768 | sfw->SetMaxTailAngle(ctx->RealVal("MaxTailAngle", 0) * (M_PI / 180)); |
769 | sfw->SetMaxTailWidth(ctx->RealVal("MaxTailWidth", -1)); |
7fd59977 |
770 | sfw->FixSelfIntersectingEdgeMode() = ctx->IntegerVal ( "FixSelfIntersectingEdgeMode", -1 ); |
771 | sfw->FixIntersectingEdgesMode() = ctx->IntegerVal ( "FixIntersectingEdgesMode", -1 ); |
772 | sfw->FixNonAdjacentIntersectingEdgesMode() = ctx->IntegerVal ( "FixNonAdjacentIntersectingEdgesMode", -1 ); |
7e785937 |
773 | Message_ProgressScope aPS(theProgress, NULL, 2); |
fbf3becf |
774 | if (sfw->FixTailMode() == 1) |
775 | { |
776 | sfw->FixTailMode() = 0; |
777 | sfs->Init(ctx->Result()); |
7e785937 |
778 | sfs->Perform (aPS.Next()); |
fbf3becf |
779 | sfw->FixTailMode() = 1; |
7e785937 |
780 | if (aPS.UserBreak()) |
fbf3becf |
781 | { |
782 | return Standard_False; |
783 | } |
784 | |
785 | TopoDS_Shape result = sfs->Shape(); |
786 | if (result != ctx->Result() || |
787 | (!msg.IsNull() && !msg->MapShape().IsEmpty())) |
788 | { |
789 | ctx->RecordModification(sfs->Context(), msg); |
790 | ctx->SetResult(result); |
791 | } |
792 | } |
793 | |
7fd59977 |
794 | sfs->Init(ctx->Result()); |
7e785937 |
795 | sfs->Perform (aPS.Next()); |
796 | if (aPS.UserBreak()) |
fbf3becf |
797 | { |
b485ee79 |
798 | return Standard_False; |
fbf3becf |
799 | } |
b485ee79 |
800 | |
7fd59977 |
801 | TopoDS_Shape result = sfs->Shape(); |
da2db6a7 |
802 | if (( result != ctx->Result() ) || |
803 | ( !msg.IsNull() && !msg->MapShape().IsEmpty())) |
804 | { |
7fd59977 |
805 | ctx->RecordModification ( sfs->Context(), msg ); |
806 | ctx->SetResult ( result ); |
807 | } |
808 | return Standard_True; |
809 | } |
810 | |
811 | |
812 | //======================================================================= |
813 | //function : spltclosededges |
814 | //purpose : |
815 | //======================================================================= |
816 | |
7e785937 |
817 | static Standard_Boolean spltclosededges (const Handle(ShapeProcess_Context)& context, |
818 | const Message_ProgressRange&) |
7fd59977 |
819 | { |
820 | Handle(ShapeProcess_ShapeContext) ctx = |
821 | Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
822 | if ( ctx.IsNull() ) return Standard_False; |
823 | |
da2db6a7 |
824 | // activate message mechanism if it is supported by context |
825 | Handle(ShapeExtend_MsgRegistrator) msg; |
826 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
827 | |
7fd59977 |
828 | Standard_Integer nbSplits = ctx->IntegerVal ( "NbSplitPoints", 1 ); |
829 | |
830 | ShapeUpgrade_ShapeDivideClosedEdges tool (ctx->Result()); |
831 | tool.SetNbSplitPoints(nbSplits); |
da2db6a7 |
832 | tool.SetMsgRegistrator( msg ); |
7fd59977 |
833 | |
834 | if ( ! tool.Perform() && tool.Status (ShapeExtend_FAIL) ) { |
0797d9d3 |
835 | #ifdef OCCT_DEBUG |
04232180 |
836 | std::cout<<"Splitting of closed edges failed"<<std::endl; |
7fd59977 |
837 | #endif |
838 | return Standard_False; |
839 | } |
840 | |
da2db6a7 |
841 | ctx->RecordModification ( tool.GetContext(), msg ); |
7fd59977 |
842 | ctx->SetResult ( tool.Result() ); |
843 | return Standard_True; |
844 | } |
845 | |
846 | |
847 | //======================================================================= |
848 | //function : splitcommonvertex |
849 | //purpose : Two wires have common vertex - this case is valid in BRep model |
850 | // and isn't valid in STEP => before writing into STEP it is necessary |
851 | // to split this vertex (each wire must has one vertex) |
852 | //======================================================================= |
7e785937 |
853 | static Standard_Boolean splitcommonvertex (const Handle(ShapeProcess_Context)& context, |
854 | const Message_ProgressRange&) |
7fd59977 |
855 | { |
856 | Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); |
857 | if ( ctx.IsNull() ) return Standard_False; |
858 | |
da2db6a7 |
859 | // activate message mechanism if it is supported by context |
860 | Handle(ShapeExtend_MsgRegistrator) msg; |
861 | if ( ! ctx->Messages().IsNull() ) msg = new ShapeExtend_MsgRegistrator; |
862 | |
7fd59977 |
863 | Handle(ShapeBuild_ReShape) reshape = new ShapeBuild_ReShape; |
864 | ShapeFix_SplitCommonVertex SCV; |
865 | SCV.SetContext(reshape); |
866 | SCV.Init(ctx->Result()); |
867 | |
da2db6a7 |
868 | SCV.SetMsgRegistrator( msg ); |
869 | |
7fd59977 |
870 | SCV.Perform(); |
871 | TopoDS_Shape newsh = SCV.Shape(); |
872 | |
873 | if ( newsh != ctx->Result() ) { |
da2db6a7 |
874 | ctx->RecordModification ( reshape, msg ); |
7fd59977 |
875 | ctx->SetResult ( newsh ); |
876 | } |
877 | |
878 | return Standard_True; |
879 | } |
880 | |
881 | |
882 | //======================================================================= |
883 | //function : Init |
884 | //purpose : Register standard operators |
885 | //======================================================================= |
886 | |
887 | void ShapeProcess_OperLibrary::Init () |
888 | { |
889 | static Standard_Boolean done = Standard_False; |
890 | if ( done ) return; |
891 | done = Standard_True; |
892 | |
893 | ShapeExtend::Init(); |
7fd59977 |
894 | |
895 | ShapeProcess::RegisterOperator ( "DirectFaces", new ShapeProcess_UOperator ( directfaces ) ); |
896 | ShapeProcess::RegisterOperator ( "SameParameter", new ShapeProcess_UOperator ( sameparam ) ); |
897 | ShapeProcess::RegisterOperator ( "SetTolerance", new ShapeProcess_UOperator ( settol ) ); |
898 | ShapeProcess::RegisterOperator ( "SplitAngle", new ShapeProcess_UOperator ( splitangle ) ); |
899 | ShapeProcess::RegisterOperator ( "BSplineRestriction", new ShapeProcess_UOperator ( bsplinerestriction ) ); |
900 | ShapeProcess::RegisterOperator ( "ElementaryToRevolution",new ShapeProcess_UOperator ( torevol ) ); |
901 | ShapeProcess::RegisterOperator ( "SweptToElementary", new ShapeProcess_UOperator ( swepttoelem ) ); |
902 | ShapeProcess::RegisterOperator ( "SurfaceToBSpline", new ShapeProcess_UOperator ( converttobspline ) ); |
903 | ShapeProcess::RegisterOperator ( "ToBezier", new ShapeProcess_UOperator ( shapetobezier ) ); |
904 | ShapeProcess::RegisterOperator ( "SplitContinuity", new ShapeProcess_UOperator ( splitcontinuity ) ); |
905 | ShapeProcess::RegisterOperator ( "SplitClosedFaces", new ShapeProcess_UOperator ( splitclosedfaces ) ); |
906 | ShapeProcess::RegisterOperator ( "FixWireGaps", new ShapeProcess_UOperator ( fixwgaps ) ); |
907 | ShapeProcess::RegisterOperator ( "FixFaceSize", new ShapeProcess_UOperator ( fixfacesize ) ); |
8422b578 |
908 | ShapeProcess::RegisterOperator ( "DropSmallSolids", new ShapeProcess_UOperator ( dropsmallsolids ) ); |
7fd59977 |
909 | ShapeProcess::RegisterOperator ( "DropSmallEdges", new ShapeProcess_UOperator ( mergesmalledges ) ); |
910 | ShapeProcess::RegisterOperator ( "FixShape", new ShapeProcess_UOperator ( fixshape ) ); |
911 | ShapeProcess::RegisterOperator ( "SplitClosedEdges", new ShapeProcess_UOperator ( spltclosededges ) ); |
912 | ShapeProcess::RegisterOperator ( "SplitCommonVertex", new ShapeProcess_UOperator ( splitcommonvertex ) ); |
913 | } |