Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, Tol, maxTol,
"write.iges.resource.name",
- "write.iges.sequence", info );
+ "write.iges.sequence", info,
+ FP->GetProgress() );
// modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___
BRepToIGES_BREntity BR0; BR0.SetModel(modl); BR0.SetTransferProcess(FP);
Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
TopoDS_Shape Shape = XSAlgo::AlgoContainer()->ProcessShape( theShape, Tol, maxTol,
"write.iges.resource.name",
- "write.iges.sequence", info );
+ "write.iges.sequence", info,
+ progress );
// modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___
Handle(IGESData_IGESEntity) ent;
BRepToIGES_BREntity B0; B0.SetTransferProcess(theTP); B0.SetModel(themod);
-#include <Standard_ErrorHandler.hxx>
#include <IGESToBRep_Actor.ixx>
-#include <Standard_Failure.hxx>
-
#include <IGESToBRep.hxx>
#include <IGESData_IGESEntity.hxx>
#include <IGESData_IGESModel.hxx>
#include <IGESData_GlobalSection.hxx>
-
#include <IGESToBRep_CurveAndSurface.hxx>
+#include <BRepLib.hxx>
+
+#include <Standard_Failure.hxx>
+#include <Standard_ErrorHandler.hxx>
+#include <ShapeExtend_Explorer.hxx>
+#include <ShapeFix_ShapeTolerance.hxx>
+
#include <Interface_Macros.hxx>
#include <Interface_Static.hxx>
-#include <TopoDS_Shape.hxx>
+#include <Message_ProgressSentry.hxx>
+#include <TopoDS_Shape.hxx>
#include <TransferBRep.hxx>
#include <TransferBRep_ShapeBinder.hxx>
#include <XSAlgo.hxx>
#include <XSAlgo_AlgoContainer.hxx>
-#include <ShapeFix_ShapeTolerance.hxx>
-#include <BRepLib.hxx>
-#include <ShapeExtend_Explorer.hxx>
//=======================================================================
//function : IGESToBRep_Actor
(typnum == 402 && (fornum == 1 || fornum == 7||
fornum == 14 || fornum == 15)) ||
(typnum == 408) || (typnum == 308)) {
+
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(TP->GetProgress(), "Transfer stage", 0, 2, 1);
+
XSAlgo::AlgoContainer()->PrepareForTransfer();
IGESToBRep_CurveAndSurface CAS;
CAS.SetModel(mymodel);
shape.Nullify();
}
}
+
+ // Switch to fix stage.
+ aPSentry.Next();
// fixing shape
-// shape = XSAlgo::AlgoContainer()->PerformFixShape( shape, TP, theeps, CAS.GetMaxTol() );
Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(),
"read.iges.resource.name",
- "read.iges.sequence", info );
+ "read.iges.sequence", info,
+ TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
}
-// if (!shape.IsNull()) TransferBRep::SameParameter (shape,Standard_False,eps);
+
ShapeExtend_Explorer SBE;
if (SBE.ShapeType(shape,Standard_True) != TopAbs_SHAPE) {
if (!shape.IsNull()) {
Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, eps*CAS.GetUnitFactor(), CAS.GetMaxTol(),
"read.iges.resource.name",
- "read.iges.sequence", info );
+ "read.iges.sequence", info,
+ theProc->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(theProc, info, nbTPitems);
ShapeExtend_Explorer SBE;
Handle(Standard_Transient) info;
// IMPORTANT: any fixing on non-manifold topology must be done after the shape is transferred from STEP
TopoDS_Shape fixedResult =
- XSAlgo::AlgoContainer()->ProcessShape(comp, myPrecision, myMaxTol,
- "read.step.resource.name",
- "read.step.sequence", info);
+ XSAlgo::AlgoContainer()->ProcessShape( comp, myPrecision, myMaxTol,
+ "read.step.resource.name",
+ "read.step.sequence", info,
+ TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
BRep_Builder brepBuilder;
}
myShapeBuilder.SetPrecision(myPrecision);
myShapeBuilder.SetMaxTol(myMaxTol);
+
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(TP->GetProgress(), "Transfer stage", 0, 2, 1);
+
try {
OCC_CATCH_SIGNALS
if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) {
TP->Bind(start, shbinder);
return shbinder;
}
+
+ aPSentry.Next();
if (found && myShapeBuilder.IsDone()) {
mappedShape = myShapeBuilder.Value();
if (isManifold) {
Handle(Standard_Transient) info;
mappedShape =
- XSAlgo::AlgoContainer()->ProcessShape(mappedShape, myPrecision, myMaxTol,
- "read.step.resource.name",
- "read.step.sequence", info);
+ XSAlgo::AlgoContainer()->ProcessShape( mappedShape, myPrecision, myMaxTol,
+ "read.step.resource.name",
+ "read.step.sequence", info,
+ TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
}
}
Handle(Standard_Transient) info;
TopoDS_Shape shape = XSAlgo::AlgoContainer()->ProcessShape( S, myPrecision, myMaxTol,
- "read.step.resource.name",
- "read.step.sequence", info );
+ "read.step.resource.name",
+ "read.step.sequence", info,
+ TP->GetProgress() );
// TopoDS_Shape shape = XSAlgo::AlgoContainer()->PerformFixShape( S, TP, myPrecision, myMaxTol );
if ( shape != S )
sb->SetResult ( shape );
if (isManifold)
aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol,
"write.step.resource.name",
- "write.step.sequence", info);
+ "write.step.sequence", info,
+ FP->GetProgress() );
else
aShape = xShape;
#include <XSAlgo.hxx>
#include <XSAlgo_AlgoContainer.hxx>
+#include <Draw_ProgressIndicator.hxx>
+
static int dejadraw = 0;
//=======================================================================
XSAlgo::AlgoContainer()->PrepareForTransfer();
Handle(Standard_Transient) info; // reserved for special uses
+ Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1);
newshape = XSAlgo::AlgoContainer()->ProcessShape
- ( shape, tol, maxtol, argv[3] , argv[4] , info);
+ ( shape, tol, maxtol, argv[3] , argv[4] , info, aProgress);
// WHAT IS MISSING HERE IS MERGING with starting transfer map
if (newshape.IsNull()) {
#include <TopTools_DataMapOfShapeListOfShape.hxx>
#include <TopAbs_State.hxx>
+#include <Draw_ProgressIndicator.hxx>
+
#ifdef AIX
#include <strings.h>
#endif
di << "For enhanced message output, use switch '+?'" << "\n";
return 1;
}
-
- sfs->Perform();
+
+ Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1);
+ sfs->Perform (aProgress);
DBRep::Set (res,sfs->Shape());
-
+
if ( mess ) {
Standard_Integer num = 0;
const ShapeExtend_DataMapOfShapeListOfMsg &map = msg->MapShape();
-- <det@nnov.matra-dtv.fr>
---Copyright: Matra Datavision 1998
-
package ShapeFix
- ---Purpose: This package provides algorithms for fixing
- -- problematic (violating Open CASCADE requirements) shapes.
- -- Tools from package ShapeAnalysis are used for detecting the problems. The
- -- detecting and fixing is done taking in account various
- -- criteria implemented in BRepCheck package.
- -- Each class of package ShapeFix deals with one
+ ---Purpose: This package provides algorithms for fixing
+ -- problematic (violating Open CASCADE requirements) shapes.
+ -- Tools from package ShapeAnalysis are used for detecting the problems. The
+ -- detecting and fixing is done taking in account various
+ -- criteria implemented in BRepCheck package.
+ -- Each class of package ShapeFix deals with one
-- certain type of shapes or with some family of problems.
uses
---Purpose: Fixing different problems on edge
class Wire;
- ---Purpose: Fixing different problems with wires
+ ---Purpose: Fixing different problems with wires
class Face;
---Purpose: Fixing problems with face (orientation of wires and wrong wires)
class FixSmallFace;
- ---Purpose: Fixing face with small size
+ ---Purpose: Fixing face with small size
class WireVertex;
---Purpose: Fixing disconnected edges in the wire
class Wireframe;
- ---Purpose: Provides methods to fix wireframe of shape
+ ---Purpose: Provides methods to fix wireframe of shape
class FreeBounds;
- ---Purpose: Fixing free bounds of the shape (connecting open wires)
+ ---Purpose: Fixing free bounds of the shape (connecting open wires)
class FaceConnect;
- ---Purpose: Rebuilds connectivity between faces in shell
+ ---Purpose: Rebuilds connectivity between faces in shell
class Shell;
---Purpose: Fixing orientation of faces in shell
class Solid;
- ---Purpose: Creating solid from shell and orienting it to have finite volume
+ ---Purpose: Creating solid from shell and orienting it to have finite volume
class ShapeTolerance;
---Purpose: Modifying shape tolerances
class SplitCommonVertex;
---Purpose: Splits vertex which is common for two wires
- -- (for writing into STEP)
+ -- (for writing into STEP)
class WireSegment;
---Purpose: Auxiliary class (data storage) for ComposeShell
class IntersectionTool;
---Purpose: Tool for fixing selfintersecting wire
- -- and intersecting wires
-
- --class OverlappingTool; now it is in package OverlapShape of Products
- ---Purpose: Tool for fixing overlapping
+ -- and intersecting wires
class SplitTool;
---Purpose: Tool for splitting and cutting edges; incudes methods
- -- used in OverlappingTool and IntersectionTool
+ -- used in OverlappingTool and IntersectionTool
class SequenceOfWireSegment instantiates Sequence from TCollection
(WireSegment from ShapeFix);
(Shape from TopoDS, Box2d from Bnd, ShapeMapHasher from TopTools);
- SameParameter (shape : Shape from TopoDS;
- enforce: Boolean;
- preci : Real = 0.0)
+ SameParameter (shape : Shape from TopoDS;
+ enforce : Boolean;
+ preci : Real = 0.0;
+ theProgress : ProgressIndicator from Message = 0)
returns Boolean;
---Purpose : Runs SameParameter from BRepLib with these adaptations :
-- <enforce> forces computations, else they are made only on
-- Tolerance
-- Returns True when done, False if an exception has been raised
-- In case of exception anyway, as many edges as possible have
- -- been processed
+ -- been processed. The passed progress indicator allows user
+ -- to consult the current progress stage and abort algorithm
+ -- if needed.
EncodeRegularity (shape: Shape from TopoDS; tolang: Real = 1.0e-10);
---Purpose : Runs EncodeRegularity from BRepLib taking into account
- -- shared components of assemblies, so that each component
- -- is processed only once
+ -- shared components of assemblies, so that each component
+ -- is processed only once
RemoveSmallEdges (shape: in out Shape from TopoDS; Tolerance: Real; context: in out ReShape from ShapeBuild)
returns Shape from TopoDS;
- ---Purpose: Removes edges which are less than given tolerance from shape
- -- with help of ShapeFix_Wire::FixSmall()
+ ---Purpose: Removes edges which are less than given tolerance from shape
+ -- with help of ShapeFix_Wire::FixSmall()
FixVertexPosition(theshape: in out Shape from TopoDS;
theTolerance: Real;
thecontext: ReShape from ShapeBuild) returns Boolean;
- ---Purpose: Fix position of the vertices having tolerance more tnan specified one.;
+ ---Purpose: Fix position of the vertices having tolerance more tnan specified one.;
LeastEdgeSize(theshape: in out Shape from TopoDS) returns Real;
- ---Purpose: Calculate size of least edge;
+ ---Purpose: Calculate size of least edge;
end ShapeFix;
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopExp.hxx>
+#include <Message_ProgressSentry.hxx>
//=======================================================================
//function : SameParameter
Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
const Standard_Boolean enforce,
- const Standard_Real preci)
+ const Standard_Real preci,
+ const Handle(Message_ProgressIndicator)& theProgress)
{
+ // Calculate number of edges
+ Standard_Integer aNbEdges = 0;
+ for ( TopExp_Explorer anEdgeExp(shape, TopAbs_EDGE); anEdgeExp.More(); anEdgeExp.Next() )
+ ++aNbEdges;
+
+ // Calculate number of faces
+ Standard_Integer aNbFaces = 0;
+ for ( TopExp_Explorer anEdgeExp(shape, TopAbs_FACE); anEdgeExp.More(); anEdgeExp.Next() )
+ ++aNbFaces;
+
BRep_Builder B;
//Standard_Integer nbexcp = 0;
Standard_Integer nbfail = 0, numedge = 0;
Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge;
TopExp_Explorer ex(shape,TopAbs_EDGE);
- while (ex.More()) {
- TopoDS_Edge E;
- while (ex.More()) {
- numedge ++;
- int ierr = 0;
- TopLoc_Location loc; //Standard_Real u0,u1; //szv#4:S4163:12Mar99 moved down unused
- E = TopoDS::Edge (ex.Current());
- ex.Next();
-
- //pdn degenerated edges shuld be samerange and sameparameter.
- //if (BRep_Tool::Degenerated(E)) continue; // ne vaut pas
- if (!iatol) tol = BRep_Tool::Tolerance (E);
- if (enforce) {
- B.SameRange (E,Standard_False);
- B.SameParameter (E,Standard_False);
- }
-//:pdn if (BRep_Tool::SameParameter(E)) continue;
-// Handle(Geom_Curve) crv = BRep_Tool::Curve (E,loc,u0,u1);
-// if (crv.IsNull()) BRepLib::BuildCurve3d (E,tol);
- sfe->FixSameParameter (E); // et non BRepLib:: jusqu a K2-SEP97
- if (!BRep_Tool::SameParameter (E)) { ierr = 1; nbfail ++; }
-
- if (ierr) {
- status = Standard_False;
- B.SameRange (E,Standard_False);
- B.SameParameter (E,Standard_False);
- }
-
- } // -- end while
- }
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Fixing same parameter problem", 0, 2, 1);
- //:i2 abv 21 Aug 98: ProSTEP TR8 Motor.rle face 710:
- // Update tolerance of edges on planes (no pcurves are stored)
- for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More(); exp.Next() ) {
- TopoDS_Face face = TopoDS::Face ( exp.Current() );
- Handle(Geom_Surface) Surf = BRep_Tool::Surface ( face );
-
- Handle(Geom_Plane) plane = Handle(Geom_Plane)::DownCast ( Surf );
- if ( plane.IsNull() ) {
- Handle(Geom_RectangularTrimmedSurface) GRTS =
- Handle(Geom_RectangularTrimmedSurface)::DownCast ( Surf );
- if ( ! GRTS.IsNull() )
- plane = Handle(Geom_Plane)::DownCast ( GRTS->BasisSurface() );
- if ( plane.IsNull() ) continue;
+ {
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Fixing edge", 0, aNbEdges, 1);
+
+ while ( ex.More() )
+ {
+ TopoDS_Edge E;
+ while ( ex.More() && aPSentry.More() )
+ {
+ numedge ++;
+ int ierr = 0;
+ TopLoc_Location loc;
+ E = TopoDS::Edge (ex.Current());
+ ex.Next();
+
+ if (!iatol)
+ tol = BRep_Tool::Tolerance (E);
+ if (enforce)
+ {
+ B.SameRange (E,Standard_False);
+ B.SameParameter (E,Standard_False);
+ }
+
+ sfe->FixSameParameter (E); // K2-SEP97
+
+ if (!BRep_Tool::SameParameter (E)) { ierr = 1; nbfail ++; }
+
+ if (ierr)
+ {
+ status = Standard_False;
+ B.SameRange (E,Standard_False);
+ B.SameParameter (E,Standard_False);
+ }
+
+ // Complete step in current progress scope
+ aPSentry.Next();
+ } // -- end while
+
+ // Halt algorithm in case of user's abort
+ if ( !aPSentry.More() )
+ return Standard_False;
}
-
-// Handle(ShapeConstruct_ProjectCurveOnSurface) Proj = new ShapeConstruct_ProjectCurveOnSurface; //:k2 abv 16 Dec 98: use existing tool //smh#14
-// Handle(ShapeAnalysis_Surface) sas = new ShapeAnalysis_Surface ( plane );
-// Proj->Init ( sas, Precision::Confusion() ); // projection will be analitic
- Handle(GeomAdaptor_HSurface) AS = new GeomAdaptor_HSurface ( plane );
- for ( TopExp_Explorer ed ( face, TopAbs_EDGE ); ed.More(); ed.Next() ) {
- TopoDS_Edge edge = TopoDS::Edge ( ed.Current() );
- Standard_Real f, l;
- Handle(Geom_Curve) crv = BRep_Tool::Curve ( edge, f, l );
- if ( crv.IsNull() ) continue;
-
-// Handle(Geom2d_Curve) c2d;
-// Proj->Perform ( crv, f, l, c2d );
- Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface ( edge, face, f, l );;
- if ( c2d.IsNull() ) continue;
- Handle(Geom2dAdaptor_HCurve) GHPC = new Geom2dAdaptor_HCurve ( c2d, f, l );
- Adaptor3d_CurveOnSurface ACS(GHPC,AS);//sas->Adaptor3d());
-
- Standard_Real tol0 = BRep_Tool::Tolerance ( edge );
- tol = tol0;
- Standard_Real tol2 = tol*tol;
- const Standard_Integer NCONTROL = 23;
- for ( Standard_Integer i=0; i < NCONTROL; i++ ) {
- Standard_Real par = ( f * ( NCONTROL - 1 - i ) + l * i ) / ( NCONTROL - 1 );
- gp_Pnt pnt = crv->Value ( par );
- gp_Pnt prj = ACS.Value( par );
- Standard_Real dist = pnt.SquareDistance(prj);
- if ( tol2 < dist ) tol2 = dist;
+
+ }
+ // Switch to "Update tolerances" step
+ aPSentry.Next();
+
+ {
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Update tolerances", 0, aNbFaces, 1);
+
+ //:i2 abv 21 Aug 98: ProSTEP TR8 Motor.rle face 710:
+ // Update tolerance of edges on planes (no pcurves are stored)
+ for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More() && aPSentry.More(); exp.Next(), aPSentry.Next() )
+ {
+ TopoDS_Face face = TopoDS::Face ( exp.Current() );
+ Handle(Geom_Surface) Surf = BRep_Tool::Surface ( face );
+
+ Handle(Geom_Plane) plane = Handle(Geom_Plane)::DownCast ( Surf );
+ if ( plane.IsNull() ) {
+ Handle(Geom_RectangularTrimmedSurface) GRTS =
+ Handle(Geom_RectangularTrimmedSurface)::DownCast ( Surf );
+ if ( ! GRTS.IsNull() )
+ plane = Handle(Geom_Plane)::DownCast ( GRTS->BasisSurface() );
+ if ( plane.IsNull() )
+ continue;
}
- tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10
- if ( tol >= tol0 ) {
- B.UpdateEdge ( edge, tol );
- for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() ) {
- TopoDS_Shape S = itV.Value();
- B.UpdateVertex ( TopoDS::Vertex ( S ), tol );
- }
+
+ Handle(GeomAdaptor_HSurface) AS = new GeomAdaptor_HSurface ( plane );
+ for ( TopExp_Explorer ed ( face, TopAbs_EDGE ); ed.More(); ed.Next() ) {
+ TopoDS_Edge edge = TopoDS::Edge ( ed.Current() );
+ Standard_Real f, l;
+ Handle(Geom_Curve) crv = BRep_Tool::Curve ( edge, f, l );
+ if ( crv.IsNull() )
+ continue;
+
+ Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface ( edge, face, f, l );;
+ if ( c2d.IsNull() ) continue;
+ Handle(Geom2dAdaptor_HCurve) GHPC = new Geom2dAdaptor_HCurve ( c2d, f, l );
+ Adaptor3d_CurveOnSurface ACS(GHPC,AS);
+
+ Standard_Real tol0 = BRep_Tool::Tolerance(edge);
+ tol = tol0;
+ Standard_Real tol2 = tol*tol;
+ const Standard_Integer NCONTROL = 23;
+ for ( Standard_Integer i = 0; i < NCONTROL; i++ )
+ {
+ Standard_Real par = ( f * ( NCONTROL - 1 - i ) + l * i ) / ( NCONTROL - 1 );
+ gp_Pnt pnt = crv->Value ( par );
+ gp_Pnt prj = ACS.Value( par );
+ Standard_Real dist = pnt.SquareDistance(prj);
+ if ( tol2 < dist )
+ tol2 = dist;
+ }
+ tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10
+ if ( tol >= tol0 )
+ {
+ B.UpdateEdge ( edge, tol );
+ for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() )
+ {
+ TopoDS_Shape S = itV.Value();
+ B.UpdateVertex ( TopoDS::Vertex ( S ), tol );
+ }
+ }
}
+
+ // Halt algorithm in case of user's abort
+ if ( !aPSentry.More() )
+ return Standard_False;
}
}
#ifdef DEB
cout<<"** SameParameter not complete. On "<<numedge<<" Edges:";
if (nbfail > 0) cout<<" "<<nbfail<<" Failed";
- //if (nbexcp > 0) cout<<" "<<nbexcp<<" Raised"; //SK original
cout<<endl;
#endif
}
Edge from ShapeFix,
Status from ShapeExtend,
MapOfShape from TopTools,
- BasicMsgRegistrator from ShapeExtend
-
+ BasicMsgRegistrator from ShapeExtend,
+ ProgressIndicator from Message
+
is
Create returns Shape from ShapeFix;
Init (me: mutable; shape: Shape from TopoDS);
---Purpose: Initislises by shape.
- Perform (me: mutable) returns Boolean;
+ Perform (me : mutable;
+ theProgress : ProgressIndicator from Message = 0) returns Boolean;
---Purpose: Iterates on sub- shape and performs fixes
- SameParameter (me: mutable; shape: Shape from TopoDS; force: Boolean) is protected;
+ SameParameter (me : mutable;
+ shape : Shape from TopoDS;
+ enforce : Boolean;
+ theProgress : ProgressIndicator from Message = 0) is protected;
+ ---Purpose: Fixes same parameterization problem on the passed shape
+ -- by updating tolerances of the corresponding topological
+ -- entitites.
Shape (me) returns Shape from TopoDS;
---Purpose: Returns resulting shape
#include <ShapeFix_Shell.hxx>
#include <ShapeFix_Solid.hxx>
+#include <Message_ProgressSentry.hxx>
+
//=======================================================================
//function : ShapeFix_Shape
//purpose :
//purpose :
//=======================================================================
-Standard_Boolean ShapeFix_Shape::Perform()
+Standard_Boolean ShapeFix_Shape::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Integer savFixSmallAreaWireMode = 0;
- Handle(ShapeFix_Face) fft = Handle(ShapeFix_Face)::DownCast ( FixFaceTool() );
+ Handle(ShapeFix_Face) fft = Handle(ShapeFix_Face)::DownCast( FixFaceTool() );
if ( !fft.IsNull() ) {
savFixSmallAreaWireMode = fft->FixSmallAreaWireMode();
if ( savFixSmallAreaWireMode == -1 &&
ShapeFix::FixVertexPosition(S,Precision(),Context());
st = S.ShapeType();
+
+ // Open progress indication scope for the following fix stages:
+ // - Fix on Solid or Shell;
+ // - Fix same parameterization;
+ Message_ProgressSentry aPSentry(theProgress, "Fixing stage", 0, 2, 1);
+
switch ( st ) {
case TopAbs_COMPOUND:
case TopAbs_COMPSOLID: {
TopoDS_Shape shape = myShape;
Standard_Boolean savFixSameParameterMode = myFixSameParameterMode;
myFixSameParameterMode = Standard_False;
- for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
- myShape = iter.Value();
- if ( Perform() ) status = Standard_True;
+
+ Standard_Integer aShapesNb = 0;
+ for ( TopoDS_Iterator anIter(S); anIter.More(); anIter.Next() )
+ ++aShapesNb;
+
+ // Open progress indication scope for sub-shape fixing
+ Message_ProgressSentry aPSentry(theProgress, "Fixing sub-shape", 0, aShapesNb, 1);
+ for ( TopoDS_Iterator anIter(S); anIter.More() && aPSentry.More(); anIter.Next(), aPSentry.Next() )
+ {
+ myShape = anIter.Value();
+ if ( Perform(theProgress) )
+ status = Standard_True;
}
+ if ( !aPSentry.More() )
+ return Standard_False; // aborted execution
+
myFixSameParameterMode = savFixSameParameterMode;
myShape = shape;
-// myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE5 );
break;
}
case TopAbs_SOLID: {
- if ( ! NeedFix ( myFixSolidMode ) ) break;
+ if ( !NeedFix(myFixSolidMode) )
+ break;
myFixSolid->Init(TopoDS::Solid(S));
myFixSolid->SetContext(Context());
- if(myFixSolid->Perform()) {
-// Context()->Replace(S,myFixSolid->Solid());
+
+ if ( myFixSolid->Perform(theProgress) )
status = Standard_True;
- }
+
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
break;
}
case TopAbs_SHELL: {
- if ( ! NeedFix ( myFixShellMode ) ) break;
+ if ( !NeedFix(myFixShellMode) )
+ break;
Handle(ShapeFix_Shell) sfsh = FixShellTool();
- sfsh->Init(TopoDS::Shell(S));
- sfsh->SetContext(Context());
- if(sfsh->Perform()) {
-// Context()->Replace(S,sfsh->Shell());
+ sfsh->Init( TopoDS::Shell(S) );
+ sfsh->SetContext( Context() );
+
+ if ( sfsh->Perform(theProgress) )
status = Standard_True;
- }
+
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
break;
}
sff->FixWireTool()->ModifyTopologyMode() = Standard_True;
sff->Init(TopoDS::Face(S));
sff->SetContext(Context());
+
if(sff->Perform()) {
-// Context()->Replace(S,sff->Face());
status = Standard_True;
}
sff->FixWireTool()->ModifyTopologyMode() = savTopoMode;
sfw->ModifyTopologyMode() = Standard_True;
if ( ! S.Closed() )
sfw->ClosedWireMode() = Standard_False;
-// sfw->FixEdgeCurvesMode() =0;
sfw->SetFace(TopoDS_Face());
sfw->Load(TopoDS::Wire(S));
sfw->SetContext(Context());
case TopAbs_SHAPE :
default : break;
}
+
+ // Switch to the second progress indication scope if it exists
+ aPSentry.Next();
- myResult = Context()->Apply(S);
- if ( NeedFix ( myFixSameParameterMode ) )
- SameParameter (myResult,Standard_False);
+ myResult = Context()->Apply(S);
+
+ if ( NeedFix(myFixSameParameterMode) )
+ {
+ SameParameter(myResult, Standard_False, theProgress);
+ }
if ( !fft.IsNull() )
fft->FixSmallAreaWireMode() = savFixSmallAreaWireMode;
//purpose :
//=======================================================================
-void ShapeFix_Shape::SameParameter(const TopoDS_Shape& sh, const Standard_Boolean enforce)
+void ShapeFix_Shape::SameParameter(const TopoDS_Shape& sh,
+ const Standard_Boolean enforce,
+ const Handle(Message_ProgressIndicator)& theProgress)
{
- ShapeFix::SameParameter(sh, enforce);
+ ShapeFix::SameParameter(sh, enforce, 0.0, theProgress);
}
//=======================================================================
Shape from TopoDS,
Status from ShapeExtend,
BasicMsgRegistrator from ShapeExtend,
- Face from ShapeFix
+ Face from ShapeFix,
+ ProgressIndicator from Message
+
is
Create returns Shell from ShapeFix;
Init (me: mutable; shell: Shell from TopoDS);
---Purpose: Initializes by shell.
- Perform (me: mutable) returns Boolean;
- ---Purpose: Iterates on subshapes and performs fixes
- -- (for each face calls ShapeFix_Face::Perform and
- -- then calls FixFaceOrientation)
+ Perform (me: mutable;
+ theProgress : ProgressIndicator from Message = 0) returns Boolean;
+ ---Purpose: Iterates on subshapes and performs fixes
+ -- (for each face calls ShapeFix_Face::Perform and
+ -- then calls FixFaceOrientation). The passed progress
+ -- indicator allows user to consult the current progress
+ -- stage and abort algorithm if needed.
FixFaceOrientation (me : mutable; shell : Shell from TopoDS;
isAccountMultiConex : Boolean = Standard_True;
NonManifold : Boolean = Standard_False ) returns Boolean;
- ---Purpose: Fixes orientation of faces in shell.
- -- Changes orientation of face in the shell, if it is oriented opposite
- -- to neigbouring faces. If it is not possible to orient all faces in the
- -- shell (like in case of mebious band), this method orients only subset
- -- of faces. Other faces are stored in Error compound.
- -- Modes :
- -- isAccountMultiConex - mode for account cases of multiconnexity.
- -- If this mode is equal to Standard_True, separate shells will be created
- -- in the cases of multiconnexity. If this mode is equal to Standard_False,
- -- one shell will be created without account of multiconnexity.By defautt - Standard_True;
- -- NonManifold - mode for creation of non-manifold shells.
- -- If this mode is equal to Standard_True one non-manifold will be created from shell
- -- contains multishared edges. Else if this mode is equal to Standard_False only
- -- manifold shells will be created. By default - Standard_False.
- --
- ---Returns: If resulting shell is ok returns TRUE, else returns FALSE.
- ---Status : OK - faces in shall were oriented correcty.
- -- DONE - faces in shell oriented succesfully
- -- FAIL - faces orientation process has been failed
+ ---Purpose: Fixes orientation of faces in shell.
+ -- Changes orientation of face in the shell, if it is oriented opposite
+ -- to neigbouring faces. If it is not possible to orient all faces in the
+ -- shell (like in case of mebious band), this method orients only subset
+ -- of faces. Other faces are stored in Error compound.
+ -- Modes :
+ -- isAccountMultiConex - mode for account cases of multiconnexity.
+ -- If this mode is equal to Standard_True, separate shells will be created
+ -- in the cases of multiconnexity. If this mode is equal to Standard_False,
+ -- one shell will be created without account of multiconnexity.By defautt - Standard_True;
+ -- NonManifold - mode for creation of non-manifold shells.
+ -- If this mode is equal to Standard_True one non-manifold will be created from shell
+ -- contains multishared edges. Else if this mode is equal to Standard_False only
+ -- manifold shells will be created. By default - Standard_False.
+ --
+ ---Returns: If resulting shell is ok returns TRUE, else returns FALSE.
+ ---Status : OK - faces in shall were oriented correcty.
+ -- DONE - faces in shell oriented succesfully
+ -- FAIL - faces orientation process has been failed
Shell(me : mutable) returns Shell from TopoDS;
---Purpose: Returns fixed shell (or subset of oriented faces).
FixFaceTool (me:mutable) returns Face from ShapeFix;
---Purpose: Returns tool for fixing faces.
- ---C++:inline
+ ---C++:inline
SetMsgRegistrator (me: mutable; msgreg: BasicMsgRegistrator from ShapeExtend) is redefined;
- ---Purpose: Sets message registrator
+ ---Purpose: Sets message registrator
SetPrecision (me: mutable; preci: Real) is redefined;
---Purpose: Sets basic precision value (also to FixWireTool)
FixFaceMode (me: mutable) returns Integer;
---C++: return &
- ---C++: inline
- ---Purpose: Returns (modifiable) the mode for applying fixes of
- -- ShapeFix_Face, by default True.
+ ---C++: inline
+ ---Purpose: Returns (modifiable) the mode for applying fixes of
+ -- ShapeFix_Face, by default True.
FixOrientationMode (me: mutable) returns Integer;
---C++: return &
- ---C++: inline
- ---Purpose: Returns (modifiable) the mode for applying
- -- FixFaceOrientation, by default True.
+ ---C++: inline
+ ---Purpose: Returns (modifiable) the mode for applying
+ -- FixFaceOrientation, by default True.
fields
myFixFace : Face from ShapeFix is protected;
myFixFaceMode : Integer is protected;
myFixOrientationMode : Integer is protected;
- myNbShells : Integer is protected;
+ myNbShells : Integer is protected;
+
end Shell;
#include <ShapeExtend.hxx>
#include <ShapeBuild_ReShape.hxx>
#include <Message_Msg.hxx>
+#include <Message_ProgressSentry.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx>
//purpose :
//=======================================================================
-Standard_Boolean ShapeFix_Shell::Perform()
+Standard_Boolean ShapeFix_Shell::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Boolean status = Standard_False;
- if(Context().IsNull())
- SetContext ( new ShapeBuild_ReShape );
+ if ( Context().IsNull() )
+ SetContext(new ShapeBuild_ReShape);
myFixFace->SetContext(Context());
- if ( NeedFix ( myFixFaceMode ) ) {
- TopoDS_Shape S = Context()->Apply ( myShell );
- for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
+
+ if ( NeedFix(myFixFaceMode) )
+ {
+ TopoDS_Shape S = Context()->Apply(myShell);
+
+ // Get the number of faces for progress indication
+ Standard_Integer aNbFaces = 0;
+ for ( TopExp_Explorer aFaceExp(S, TopAbs_FACE); aFaceExp.More(); aFaceExp.Next() )
+ ++aNbFaces;
+
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Fixing face", 0, aNbFaces, 1);
+
+ for( TopoDS_Iterator iter(S); iter.More() && aPSentry.More(); iter.Next(), aPSentry.Next() )
+ {
TopoDS_Shape sh = iter.Value();
TopoDS_Face tmpFace = TopoDS::Face(sh);
myFixFace->Init(tmpFace);
-// myFixFace->SetPrecision(Precision());
- if(myFixFace->Perform()) {
-// if(!Context().IsNull())
-// Context()->Replace(tmpFace,myFixFace->Face());
- status = Standard_True;
- myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
+ if ( myFixFace->Perform() )
+ {
+ status = Standard_True;
+ myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
}
}
+
+ // Halt algorithm in case of user's abort
+ if ( !aPSentry.More() )
+ return Standard_False;
}
TopoDS_Shape newsh = Context()->Apply(myShell);
if ( NeedFix ( myFixOrientationMode) )
Shape from TopoDS,
Shell from ShapeFix,
Status from ShapeExtend,
- BasicMsgRegistrator from ShapeExtend
+ BasicMsgRegistrator from ShapeExtend,
+ ProgressIndicator from Message
is
Create returns Solid from ShapeFix;
Init(me: mutable; solid : Solid from TopoDS) is virtual;
---Purpose: Initializes by solid .
- Perform(me: mutable) returns Boolean is virtual;
+ Perform(me: mutable;
+ theProgress : ProgressIndicator from Message = 0) returns Boolean is virtual;
---Purpose: Iterates on shells and performs fixes
- -- (calls ShapeFix_Shell for each subshell)
+ -- (calls ShapeFix_Shell for each subshell). The passed
+ -- progress indicator allows user to consult the current
+ -- progress stage and abort algorithm if needed.
SolidFromShell (me: mutable; shell: Shell from TopoDS)
returns Solid from TopoDS;
FixShellTool (me) returns Shell from ShapeFix;
---Purpose: Returns tool for fixing shells.
- ---C++:inline
+ ---C++:inline
SetMsgRegistrator (me: mutable; msgreg: BasicMsgRegistrator from ShapeExtend) is redefined;
- ---Purpose: Sets message registrator
+ ---Purpose: Sets message registrator
SetPrecision (me: mutable; preci: Real) is redefined;
---Purpose: Sets basic precision value (also to FixShellTool)
FixShellMode (me: mutable) returns Integer;
---C++: return &
- ---C++: inline
- ---Purpose: Returns (modifiable) the mode for applying fixes of
- -- ShapeFix_Shell, by default True.
+ ---C++: inline
+ ---Purpose: Returns (modifiable) the mode for applying fixes of
+ -- ShapeFix_Shell, by default True.
CreateOpenSolidMode(me: mutable) returns Boolean;
---C++: return &
- ---C++: inline
- ---Purpose: Returns (modifiable) the mode for creation of solids.
- -- If mode myCreateOpenSolidMode is equal to true
- -- solids are created from open shells
- -- else solids are created from closed shells only.
- -- ShapeFix_Shell, by default False.
+ ---C++: inline
+ ---Purpose: Returns (modifiable) the mode for creation of solids.
+ -- If mode myCreateOpenSolidMode is equal to true
+ -- solids are created from open shells
+ -- else solids are created from closed shells only.
+ -- ShapeFix_Shell, by default False.
Shape(me : mutable) returns Shape from TopoDS;
---Purpose: In case of multiconnexity returns compound of fixed solids
-- else returns one solid.
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeShape.hxx>
#include <Message_Msg.hxx>
+#include <Message_ProgressSentry.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx>
#include <Geom_Curve.hxx>
#include <ShapeAnalysis_FreeBounds.hxx>
-
//======================================================
//function : ShapeFix_Solid
//purpose :
//=======================================================================
-Standard_Boolean ShapeFix_Solid::Perform()
+Standard_Boolean ShapeFix_Solid::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Boolean status = Standard_False;
- if(Context().IsNull())
+ if ( Context().IsNull() )
SetContext ( new ShapeBuild_ReShape );
myFixShell->SetContext(Context());
- Standard_Integer NbShells =0;
+
+ Standard_Integer NbShells = 0;
TopoDS_Shape S = Context()->Apply ( myShape );
- if ( NeedFix ( myFixShellMode ) ) {
-
- // call FixShell
- for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
- TopoDS_Shape sh = iter.Value();
- if(sh.ShapeType() != TopAbs_SHELL)
- continue;
- myFixShell->Init(TopoDS::Shell(sh));
- if(myFixShell->Perform()) {
- // Context()->Replace(sh,myFixShell->Shell());
+
+ // Calculate number of underlying shells
+ Standard_Integer aNbShells = 0;
+ for ( TopExp_Explorer aExpSh(S, TopAbs_SHELL); aExpSh.More(); aExpSh.Next() )
+ aNbShells++;
+
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Fixing solid stage", 0, 2, 1);
+
+ if ( NeedFix(myFixShellMode) )
+ {
+ // Start progress scope (no need to check if progress exists -- it is safe)
+ Message_ProgressSentry aPSentry(theProgress, "Fixing shell", 0, aNbShells, 1);
+
+ // Fix shell by shell using ShapeFix_Shell tool
+ for ( TopExp_Explorer aExpSh(S, TopAbs_SHELL); aExpSh.More() && aPSentry.More(); aExpSh.Next(), aPSentry.Next() )
+ {
+ TopoDS_Shape sh = aExpSh.Current();
+
+ myFixShell->Init( TopoDS::Shell(sh) );
+ if ( myFixShell->Perform(theProgress) )
+ {
status = Standard_True;
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
}
NbShells+= myFixShell->NbShells();
}
+
+ // Halt algorithm in case of user's abort
+ if ( !aPSentry.More() )
+ return Standard_False;
}
- else {
- for(TopExp_Explorer aExpSh(myShape,TopAbs_SHELL); aExpSh.More(); aExpSh.Next())
- NbShells++;
+ else
+ {
+ NbShells = aNbShells;
}
- //if(!status) return status;
+
+ // Switch to the second stage
+ aPSentry.Next();
if(NbShells ==1) {
TopoDS_Shape tmpShape = Context()->Apply(myShape);
BRep_Builder aB;
TopoDS_Compound aComp;
aB.MakeCompound(aComp);
- for(Standard_Integer i =1; i <= aMapSolids.Extent(); i++) {
+ Message_ProgressSentry aPSentry(theProgress, "Creating solid",
+ 0, aMapSolids.Extent(), 1);
+ for(Standard_Integer i =1; (i <= aMapSolids.Extent()) && (aPSentry.More());
+ i++, aPSentry.Next())
+ {
TopoDS_Shape aResSh =aMapSolids.FindKey(i);
if(aResShape.ShapeType() == TopAbs_SHELL && myCreateOpenSolidMode) {
aResSh.Closed(Standard_False);
aB.Add(aComp,aResSh);
}
+ if ( !aPSentry.More() )
+ return Standard_False; // aborted execution
Context()->Replace(aResShape,aComp);
}
}
context->SetScope ( oper.ToCString() );
try {
OCC_CATCH_SIGNALS
- op->Perform ( context );
+ if ( !op->Perform(context) )
+ return Standard_False;
}
catch (Standard_Failure) {
Message_Msg SMSG2 ("Sequence.MSG2"); //Operator %s failed with exception %s
uses
- Manager from Resource,
- AsciiString from TCollection,
+ Manager from Resource,
+ AsciiString from TCollection,
HSequenceOfHAsciiString from TColStd,
- Messenger from Message
+ Messenger from Message,
+ ProgressIndicator from Message
is
Messenger (me) returns Messenger from Message;
---Purpose : Returns Messenger used for outputting messages.
+
+ SetProgress (me: mutable; theProgress: ProgressIndicator from Message);
+ ---Purpose : Sets Progress Indicator.
+
+ Progress (me) returns ProgressIndicator from Message;
+ ---Purpose : Returns Progress Indicator.
SetTraceLevel (me: mutable; tracelev: Integer);
---Purpose : Sets trace level used for outputting messages
fields
- myRC: Manager from Resource;
- myScope: HSequenceOfHAsciiString from TColStd;
+ myRC: Manager from Resource;
+ myScope: HSequenceOfHAsciiString from TColStd;
myMessenger: Messenger from Message;
- myTraceLev : Integer;
+ myProgress: ProgressIndicator from Message;
+ myTraceLev: Integer;
end Context;
return myMessenger;
}
+//=======================================================================
+//function : SetProgress
+//purpose :
+//=======================================================================
+
+void ShapeProcess_Context::SetProgress (const Handle(Message_ProgressIndicator)& progress)
+{
+ myProgress = progress;
+}
+
+//=======================================================================
+//function : Progress
+//purpose :
+//=======================================================================
+
+Handle(Message_ProgressIndicator) ShapeProcess_Context::Progress() const
+{
+ return myProgress;
+}
+
//=======================================================================
//function : SetTraceLevel
//purpose :
#include <BRepLib.hxx>
#include <Message_MsgFile.hxx>
+#include <Message_ProgressIndicator.hxx>
+
#include <ShapeExtend_MsgRegistrator.hxx>
#include <ShapeProcess.hxx>
#include <ShapeProcess_UOperator.hxx>
TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, DM, map );
ctx->RecordModification ( map );
ctx->SetResult ( res );
- return 0;
+ return Standard_True;
}
sfw->FixNonAdjacentIntersectingEdgesMode() = ctx->IntegerVal ( "FixNonAdjacentIntersectingEdgesMode", -1 );
sfs->Init(ctx->Result());
- sfs->Perform();
+ sfs->Perform(ctx->Progress());
+
+ if ( !ctx->Progress().IsNull() && ctx->Progress()->UserBreak() )
+ return Standard_False;
+
TopoDS_Shape result = sfs->Shape();
if ( result != ctx->Result() ) {
ctx->RecordModification ( sfs->Context(), msg );
ShapeExtend,
ShapeAnalysis,
ShapeFix,
- Transfer
+ Transfer,
+ Message
is
enumeration Caller is
---Purpose: Identifies the caller of the algorithm
- DEFAULT,
- IGES,
- STEP
+ DEFAULT,
+ IGES,
+ STEP
end Caller;
class ToolContainer;
uses
- Curve from Geom2d,
- Surface from Geom,
- Edge from TopoDS,
- Face from TopoDS,
- Shape from TopoDS,
- Caller from XSAlgo,
- ToolContainer from XSAlgo,
- WireData from ShapeExtend,
- Wire from ShapeAnalysis,
- Wire from ShapeFix,
- TransientProcess from Transfer,
- FinderProcess from Transfer
+ Curve from Geom2d,
+ Surface from Geom,
+ Edge from TopoDS,
+ Face from TopoDS,
+ Shape from TopoDS,
+ Caller from XSAlgo,
+ ToolContainer from XSAlgo,
+ WireData from ShapeExtend,
+ Wire from ShapeAnalysis,
+ Wire from ShapeFix,
+ TransientProcess from Transfer,
+ FinderProcess from Transfer,
+ ProgressIndicator from Message
is
PrepareForTransfer (me) is virtual;
---Purpose: Performs actions necessary for preparing environment
- -- for transfer. Empty in Open version.
+ -- for transfer. Empty in Open version.
--- PerformFixShape (me; shape : Shape from TopoDS;
--- TP : TransientProcess from Transfer;
--- Prec, MaxTol: Real)
--- returns Shape from TopoDS is virtual;
- ---Purpose: Applies fixes to the shape resulting from transfer,
- -- and updates map of entity-shape in TP in accordance with
- -- substitutions made during fixes (if any)
-
- ProcessShape (me; shape: Shape from TopoDS;
- Prec, MaxTol: Real;
- rscfile: CString;
- seq: CString;
- info: out Transient)
+ ProcessShape (me; shape:
+ Shape from TopoDS;
+ Prec, MaxTol: Real;
+ rscfile: CString;
+ seq: CString;
+ info: out Transient;
+ progress: ProgressIndicator from Message = 0)
returns Shape from TopoDS is virtual;
---Purpose: Does shape processing with specified tolerances
-- and returns resulting shape and associated information
- -- in the form of Transient.
- -- This information should be later transmitted to
- -- MergeTransferInfo in order to be recorded in the
- -- translation map
- --
- ---Default behaviour:
- -- Applies sequence with name identified by parameter named
- -- <seq> (see Interface_Static), defined in resource file
- -- identified by parameter with name <rscfile>, to shape,
- -- and keeps info of substitutions made during the process.
- -- The Prec and MaxTol define run-time parameters
- -- Runtime.Tolerance and Runtime.MaxTolerance which can be
- -- referred from the resource file
- -- ("param : &Runtime.Tolerance")
- -- In the info returns ShapeProcess_ShapeContext with recorded
- -- modifications. If info has already this type on input, uses it.
- --
- -- If resource file is not found, or sequence is not defined
- -- there, performs default fixes:
- -- - if <seq> is write.iges.sequence or write.step.sequence, does DirectFaces
- -- - if <seq> is read.iges.sequence or read.step.sequence, performs FixShape
+ -- in the form of Transient.
+ -- This information should be later transmitted to
+ -- MergeTransferInfo in order to be recorded in the
+ -- translation map
+ --
+ ---Default behaviour:
+ -- Applies sequence with name identified by parameter named
+ -- <seq> (see Interface_Static), defined in resource file
+ -- identified by parameter with name <rscfile>, to shape,
+ -- and keeps info of substitutions made during the process.
+ -- The Prec and MaxTol define run-time parameters
+ -- Runtime.Tolerance and Runtime.MaxTolerance which can be
+ -- referred from the resource file
+ -- ("param : &Runtime.Tolerance")
+ -- In the info returns ShapeProcess_ShapeContext with recorded
+ -- modifications. If info has already this type on input, uses it.
+ --
+ -- If resource file is not found, or sequence is not defined
+ -- there, performs default fixes:
+ -- - if <seq> is write.iges.sequence or write.step.sequence, does DirectFaces
+ -- - if <seq> is read.iges.sequence or read.step.sequence, performs FixShape
CheckPCurve (me; edge : Edge from TopoDS;
- face : Face from TopoDS;
- preci : Real;
- isSeam: Boolean)
+ face : Face from TopoDS;
+ preci : Real;
+ isSeam: Boolean)
returns Boolean is virtual;
---Purpose: Checks quality of pcurve of the edge on the given face,
- -- and corrects it if necessary.
- ---Remark : In Open CASCADE does nothing.
+ -- and corrects it if necessary.
+ ---Remark : In Open CASCADE does nothing.
MergeTransferInfo (me; TP : TransientProcess from Transfer;
- info: Transient;
- startTPitem: Integer = 1) is virtual;
+ info: Transient;
+ startTPitem: Integer = 1) is virtual;
MergeTransferInfo (me; FP : FinderProcess from Transfer;
- info: Transient) is virtual;
- ---Purpose: Updates translation map (TP or FP) with information
- -- resulting from ShapeProcessing
- -- Parameter startTPitem can be used for optimisation, to
- -- restrict modifications to entities stored in TP starting
- -- from item startTPitem
+ info: Transient) is virtual;
+ ---Purpose: Updates translation map (TP or FP) with information
+ -- resulting from ShapeProcessing
+ -- Parameter startTPitem can be used for optimisation, to
+ -- restrict modifications to entities stored in TP starting
+ -- from item startTPitem
fields
const Standard_Real maxTol,
const Standard_CString prscfile,
const Standard_CString pseq,
- Handle(Standard_Transient)& info) const
+ Handle(Standard_Transient)& info,
+ const Handle(Message_ProgressIndicator)& progress) const
{
if ( shape.IsNull() ) return shape;
- Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast ( info );
- if ( context.IsNull() ) {
- Standard_CString rscfile = Interface_Static::CVal ( prscfile );
- if ( ! rscfile ) rscfile = prscfile;
- context = new ShapeProcess_ShapeContext (shape, rscfile);
- context->SetDetalisation ( TopAbs_EDGE );
+ Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast(info);
+ if ( context.IsNull() )
+ {
+ Standard_CString rscfile = Interface_Static::CVal(prscfile);
+ if (!rscfile)
+ rscfile = prscfile;
+ context = new ShapeProcess_ShapeContext(shape, rscfile);
+ context->SetDetalisation(TopAbs_EDGE);
+ if ( !progress.IsNull() )
+ context->SetProgress(progress);
}
info = context;
sfs->SetMaxTolerance ( maxTol );
sfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False;
sfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False;
- sfs->Perform();
+ sfs->Perform(progress);
TopoDS_Shape S = sfs->Shape();
if ( ! S.IsNull() && S != shape ) {
// Define runtime tolerances and do Shape Processing
rsc->SetResource ( "Runtime.Tolerance", Prec );
rsc->SetResource ( "Runtime.MaxTolerance", maxTol );
- ShapeProcess::Perform ( context, seq );
-
+
+ if ( !ShapeProcess::Perform(context, seq) )
+ return TopoDS_Shape(); // Null shape
+
return context->Result();
}