1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00

0022746: Progress indicator in ShapeHealing

This commit is contained in:
KGV and DBV 2011-11-18 14:51:14 +00:00 committed by bugmaster
parent ffe74e4685
commit b485ee79ca
23 changed files with 515 additions and 324 deletions

View File

@ -53,7 +53,8 @@ Handle(Transfer_Binder) IGESControl_ActorWrite::Transfer
Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val"); Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, Tol, maxTol, shape = XSAlgo::AlgoContainer()->ProcessShape( shape, Tol, maxTol,
"write.iges.resource.name", "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___ // modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___
BRepToIGES_BREntity BR0; BR0.SetModel(modl); BR0.SetTransferProcess(FP); BRepToIGES_BREntity BR0; BR0.SetModel(modl); BR0.SetTransferProcess(FP);

View File

@ -101,7 +101,8 @@ Standard_Boolean IGESControl_Writer::AddShape (const TopoDS_Shape& theShape)
Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val"); Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val");
TopoDS_Shape Shape = XSAlgo::AlgoContainer()->ProcessShape( theShape, Tol, maxTol, TopoDS_Shape Shape = XSAlgo::AlgoContainer()->ProcessShape( theShape, Tol, maxTol,
"write.iges.resource.name", "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___ // modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___
Handle(IGESData_IGESEntity) ent; Handle(IGESData_IGESEntity) ent;
BRepToIGES_BREntity B0; B0.SetTransferProcess(theTP); B0.SetModel(themod); BRepToIGES_BREntity B0; B0.SetTransferProcess(theTP); B0.SetModel(themod);

View File

@ -1,27 +1,28 @@
#include <Standard_ErrorHandler.hxx>
#include <IGESToBRep_Actor.ixx> #include <IGESToBRep_Actor.ixx>
#include <Standard_Failure.hxx>
#include <IGESToBRep.hxx> #include <IGESToBRep.hxx>
#include <IGESData_IGESEntity.hxx> #include <IGESData_IGESEntity.hxx>
#include <IGESData_IGESModel.hxx> #include <IGESData_IGESModel.hxx>
#include <IGESData_GlobalSection.hxx> #include <IGESData_GlobalSection.hxx>
#include <IGESToBRep_CurveAndSurface.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_Macros.hxx>
#include <Interface_Static.hxx> #include <Interface_Static.hxx>
#include <TopoDS_Shape.hxx> #include <Message_ProgressSentry.hxx>
#include <TopoDS_Shape.hxx>
#include <TransferBRep.hxx> #include <TransferBRep.hxx>
#include <TransferBRep_ShapeBinder.hxx> #include <TransferBRep_ShapeBinder.hxx>
#include <XSAlgo.hxx> #include <XSAlgo.hxx>
#include <XSAlgo_AlgoContainer.hxx> #include <XSAlgo_AlgoContainer.hxx>
#include <ShapeFix_ShapeTolerance.hxx>
#include <BRepLib.hxx>
#include <ShapeExtend_Explorer.hxx>
//======================================================================= //=======================================================================
//function : IGESToBRep_Actor //function : IGESToBRep_Actor
@ -144,6 +145,10 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
(typnum == 402 && (fornum == 1 || fornum == 7|| (typnum == 402 && (fornum == 1 || fornum == 7||
fornum == 14 || fornum == 15)) || fornum == 14 || fornum == 15)) ||
(typnum == 408) || (typnum == 308)) { (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(); XSAlgo::AlgoContainer()->PrepareForTransfer();
IGESToBRep_CurveAndSurface CAS; IGESToBRep_CurveAndSurface CAS;
CAS.SetModel(mymodel); CAS.SetModel(mymodel);
@ -176,15 +181,18 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
} }
} }
// Switch to fix stage.
aPSentry.Next();
// fixing shape // fixing shape
// shape = XSAlgo::AlgoContainer()->PerformFixShape( shape, TP, theeps, CAS.GetMaxTol() );
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(), shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(),
"read.iges.resource.name", "read.iges.resource.name",
"read.iges.sequence", info ); "read.iges.sequence", info,
TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
} }
// if (!shape.IsNull()) TransferBRep::SameParameter (shape,Standard_False,eps);
ShapeExtend_Explorer SBE; ShapeExtend_Explorer SBE;
if (SBE.ShapeType(shape,Standard_True) != TopAbs_SHAPE) { if (SBE.ShapeType(shape,Standard_True) != TopAbs_SHAPE) {
if (!shape.IsNull()) { if (!shape.IsNull()) {

View File

@ -545,7 +545,8 @@ Standard_Boolean IGESToBRep_Reader::Transfer(const Standard_Integer num)
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, eps*CAS.GetUnitFactor(), CAS.GetMaxTol(), shape = XSAlgo::AlgoContainer()->ProcessShape( shape, eps*CAS.GetUnitFactor(), CAS.GetMaxTol(),
"read.iges.resource.name", "read.iges.resource.name",
"read.iges.sequence", info ); "read.iges.sequence", info,
theProc->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(theProc, info, nbTPitems); XSAlgo::AlgoContainer()->MergeTransferInfo(theProc, info, nbTPitems);
ShapeExtend_Explorer SBE; ShapeExtend_Explorer SBE;

View File

@ -810,9 +810,10 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
// IMPORTANT: any fixing on non-manifold topology must be done after the shape is transferred from STEP // IMPORTANT: any fixing on non-manifold topology must be done after the shape is transferred from STEP
TopoDS_Shape fixedResult = TopoDS_Shape fixedResult =
XSAlgo::AlgoContainer()->ProcessShape(comp, myPrecision, myMaxTol, XSAlgo::AlgoContainer()->ProcessShape( comp, myPrecision, myMaxTol,
"read.step.resource.name", "read.step.resource.name",
"read.step.sequence", info); "read.step.sequence", info,
TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
BRep_Builder brepBuilder; BRep_Builder brepBuilder;
@ -1187,6 +1188,10 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
} }
myShapeBuilder.SetPrecision(myPrecision); myShapeBuilder.SetPrecision(myPrecision);
myShapeBuilder.SetMaxTol(myMaxTol); 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 { try {
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) { if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) {
@ -1228,15 +1233,18 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
return shbinder; return shbinder;
} }
aPSentry.Next();
if (found && myShapeBuilder.IsDone()) { if (found && myShapeBuilder.IsDone()) {
mappedShape = myShapeBuilder.Value(); mappedShape = myShapeBuilder.Value();
// Apply ShapeFix (on manifold shapes only. Non-manifold topology is processed separately: ssv; 13.11.2010) // Apply ShapeFix (on manifold shapes only. Non-manifold topology is processed separately: ssv; 13.11.2010)
if (isManifold) { if (isManifold) {
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
mappedShape = mappedShape =
XSAlgo::AlgoContainer()->ProcessShape(mappedShape, myPrecision, myMaxTol, XSAlgo::AlgoContainer()->ProcessShape( mappedShape, myPrecision, myMaxTol,
"read.step.resource.name", "read.step.resource.name",
"read.step.sequence", info); "read.step.sequence", info,
TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
} }
} }
@ -1366,7 +1374,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
TopoDS_Shape shape = XSAlgo::AlgoContainer()->ProcessShape( S, myPrecision, myMaxTol, TopoDS_Shape shape = XSAlgo::AlgoContainer()->ProcessShape( S, myPrecision, myMaxTol,
"read.step.resource.name", "read.step.resource.name",
"read.step.sequence", info ); "read.step.sequence", info,
TP->GetProgress() );
// TopoDS_Shape shape = XSAlgo::AlgoContainer()->PerformFixShape( S, TP, myPrecision, myMaxTol ); // TopoDS_Shape shape = XSAlgo::AlgoContainer()->PerformFixShape( S, TP, myPrecision, myMaxTol );
if ( shape != S ) if ( shape != S )
sb->SetResult ( shape ); sb->SetResult ( shape );

View File

@ -863,7 +863,8 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape (const Handle(Tran
if (isManifold) if (isManifold)
aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol, aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol,
"write.step.resource.name", "write.step.resource.name",
"write.step.sequence", info); "write.step.sequence", info,
FP->GetProgress() );
else else
aShape = xShape; aShape = xShape;

View File

@ -32,6 +32,8 @@
#include <XSAlgo.hxx> #include <XSAlgo.hxx>
#include <XSAlgo_AlgoContainer.hxx> #include <XSAlgo_AlgoContainer.hxx>
#include <Draw_ProgressIndicator.hxx>
static int dejadraw = 0; static int dejadraw = 0;
//======================================================================= //=======================================================================
@ -168,8 +170,9 @@ static Standard_Integer NSPApply (Draw_Interpretor& di, Standard_Integer argc, c
XSAlgo::AlgoContainer()->PrepareForTransfer(); XSAlgo::AlgoContainer()->PrepareForTransfer();
Handle(Standard_Transient) info; // reserved for special uses Handle(Standard_Transient) info; // reserved for special uses
Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1);
newshape = XSAlgo::AlgoContainer()->ProcessShape 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 // WHAT IS MISSING HERE IS MERGING with starting transfer map
if (newshape.IsNull()) { if (newshape.IsNull()) {

View File

@ -44,6 +44,8 @@
#include <TopTools_DataMapOfShapeListOfShape.hxx> #include <TopTools_DataMapOfShapeListOfShape.hxx>
#include <TopAbs_State.hxx> #include <TopAbs_State.hxx>
#include <Draw_ProgressIndicator.hxx>
#ifdef AIX #ifdef AIX
#include <strings.h> #include <strings.h>
#endif #endif
@ -438,7 +440,8 @@ static Standard_Integer fixshape (Draw_Interpretor& di, Standard_Integer argc, c
return 1; return 1;
} }
sfs->Perform(); Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1);
sfs->Perform (aProgress);
DBRep::Set (res,sfs->Shape()); DBRep::Set (res,sfs->Shape());
if ( mess ) { if ( mess ) {

View File

@ -4,7 +4,6 @@
-- <det@nnov.matra-dtv.fr> -- <det@nnov.matra-dtv.fr>
---Copyright: Matra Datavision 1998 ---Copyright: Matra Datavision 1998
package ShapeFix package ShapeFix
---Purpose: This package provides algorithms for fixing ---Purpose: This package provides algorithms for fixing
@ -96,9 +95,6 @@ is
---Purpose: Tool for fixing selfintersecting wire ---Purpose: Tool for fixing selfintersecting wire
-- and intersecting wires -- and intersecting wires
--class OverlappingTool; now it is in package OverlapShape of Products
---Purpose: Tool for fixing overlapping
class SplitTool; class SplitTool;
---Purpose: Tool for splitting and cutting edges; incudes methods ---Purpose: Tool for splitting and cutting edges; incudes methods
-- used in OverlappingTool and IntersectionTool -- used in OverlappingTool and IntersectionTool
@ -111,8 +107,9 @@ is
SameParameter (shape : Shape from TopoDS; SameParameter (shape : Shape from TopoDS;
enforce: Boolean; enforce : Boolean;
preci : Real = 0.0) preci : Real = 0.0;
theProgress : ProgressIndicator from Message = 0)
returns Boolean; returns Boolean;
---Purpose : Runs SameParameter from BRepLib with these adaptations : ---Purpose : Runs SameParameter from BRepLib with these adaptations :
-- <enforce> forces computations, else they are made only on -- <enforce> forces computations, else they are made only on
@ -121,7 +118,9 @@ is
-- Tolerance -- Tolerance
-- Returns True when done, False if an exception has been raised -- Returns True when done, False if an exception has been raised
-- In case of exception anyway, as many edges as possible have -- 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); EncodeRegularity (shape: Shape from TopoDS; tolang: Real = 1.0e-10);
---Purpose : Runs EncodeRegularity from BRepLib taking into account ---Purpose : Runs EncodeRegularity from BRepLib taking into account

View File

@ -59,6 +59,7 @@
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx> #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopExp.hxx> #include <TopExp.hxx>
#include <Message_ProgressSentry.hxx>
//======================================================================= //=======================================================================
//function : SameParameter //function : SameParameter
@ -67,8 +68,19 @@
Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape, Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
const Standard_Boolean enforce, 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; BRep_Builder B;
//Standard_Integer nbexcp = 0; //Standard_Integer nbexcp = 0;
Standard_Integer nbfail = 0, numedge = 0; Standard_Integer nbfail = 0, numedge = 0;
@ -78,40 +90,64 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge; Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge;
TopExp_Explorer ex(shape,TopAbs_EDGE); TopExp_Explorer ex(shape,TopAbs_EDGE);
while (ex.More()) { // Start progress scope (no need to check if progress exists -- it is safe)
Message_ProgressSentry aPSentry(theProgress, "Fixing same parameter problem", 0, 2, 1);
{
// 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; TopoDS_Edge E;
while (ex.More()) { while ( ex.More() && aPSentry.More() )
{
numedge ++; numedge ++;
int ierr = 0; int ierr = 0;
TopLoc_Location loc; //Standard_Real u0,u1; //szv#4:S4163:12Mar99 moved down unused TopLoc_Location loc;
E = TopoDS::Edge (ex.Current()); E = TopoDS::Edge (ex.Current());
ex.Next(); ex.Next();
//pdn degenerated edges shuld be samerange and sameparameter. if (!iatol)
//if (BRep_Tool::Degenerated(E)) continue; // ne vaut pas tol = BRep_Tool::Tolerance (E);
if (!iatol) tol = BRep_Tool::Tolerance (E); if (enforce)
if (enforce) { {
B.SameRange (E,Standard_False); B.SameRange (E,Standard_False);
B.SameParameter (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); sfe->FixSameParameter (E); // K2-SEP97
// 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 (!BRep_Tool::SameParameter (E)) { ierr = 1; nbfail ++; }
if (ierr) { if (ierr)
{
status = Standard_False; status = Standard_False;
B.SameRange (E,Standard_False); B.SameRange (E,Standard_False);
B.SameParameter (E,Standard_False); B.SameParameter (E,Standard_False);
} }
// Complete step in current progress scope
aPSentry.Next();
} // -- end while } // -- end while
// Halt algorithm in case of user's abort
if ( !aPSentry.More() )
return Standard_False;
} }
}
// 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: //:i2 abv 21 Aug 98: ProSTEP TR8 Motor.rle face 710:
// Update tolerance of edges on planes (no pcurves are stored) // Update tolerance of edges on planes (no pcurves are stored)
for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More(); exp.Next() ) { for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More() && aPSentry.More(); exp.Next(), aPSentry.Next() )
{
TopoDS_Face face = TopoDS::Face ( exp.Current() ); TopoDS_Face face = TopoDS::Face ( exp.Current() );
Handle(Geom_Surface) Surf = BRep_Tool::Surface ( face ); Handle(Geom_Surface) Surf = BRep_Tool::Surface ( face );
@ -121,53 +157,58 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
Handle(Geom_RectangularTrimmedSurface)::DownCast ( Surf ); Handle(Geom_RectangularTrimmedSurface)::DownCast ( Surf );
if ( ! GRTS.IsNull() ) if ( ! GRTS.IsNull() )
plane = Handle(Geom_Plane)::DownCast ( GRTS->BasisSurface() ); plane = Handle(Geom_Plane)::DownCast ( GRTS->BasisSurface() );
if ( plane.IsNull() ) continue; if ( plane.IsNull() )
continue;
} }
// 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 ); Handle(GeomAdaptor_HSurface) AS = new GeomAdaptor_HSurface ( plane );
for ( TopExp_Explorer ed ( face, TopAbs_EDGE ); ed.More(); ed.Next() ) { for ( TopExp_Explorer ed ( face, TopAbs_EDGE ); ed.More(); ed.Next() ) {
TopoDS_Edge edge = TopoDS::Edge ( ed.Current() ); TopoDS_Edge edge = TopoDS::Edge ( ed.Current() );
Standard_Real f, l; Standard_Real f, l;
Handle(Geom_Curve) crv = BRep_Tool::Curve ( edge, f, l ); Handle(Geom_Curve) crv = BRep_Tool::Curve ( edge, f, l );
if ( crv.IsNull() ) continue; 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 );; Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface ( edge, face, f, l );;
if ( c2d.IsNull() ) continue; if ( c2d.IsNull() ) continue;
Handle(Geom2dAdaptor_HCurve) GHPC = new Geom2dAdaptor_HCurve ( c2d, f, l ); Handle(Geom2dAdaptor_HCurve) GHPC = new Geom2dAdaptor_HCurve ( c2d, f, l );
Adaptor3d_CurveOnSurface ACS(GHPC,AS);//sas->Adaptor3d()); Adaptor3d_CurveOnSurface ACS(GHPC,AS);
Standard_Real tol0 = BRep_Tool::Tolerance ( edge ); Standard_Real tol0 = BRep_Tool::Tolerance(edge);
tol = tol0; tol = tol0;
Standard_Real tol2 = tol*tol; Standard_Real tol2 = tol*tol;
const Standard_Integer NCONTROL = 23; const Standard_Integer NCONTROL = 23;
for ( Standard_Integer i=0; i < NCONTROL; i++ ) { for ( Standard_Integer i = 0; i < NCONTROL; i++ )
{
Standard_Real par = ( f * ( NCONTROL - 1 - i ) + l * i ) / ( NCONTROL - 1 ); Standard_Real par = ( f * ( NCONTROL - 1 - i ) + l * i ) / ( NCONTROL - 1 );
gp_Pnt pnt = crv->Value ( par ); gp_Pnt pnt = crv->Value ( par );
gp_Pnt prj = ACS.Value( par ); gp_Pnt prj = ACS.Value( par );
Standard_Real dist = pnt.SquareDistance(prj); Standard_Real dist = pnt.SquareDistance(prj);
if ( tol2 < dist ) tol2 = dist; if ( tol2 < dist )
tol2 = dist;
} }
tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10 tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10
if ( tol >= tol0 ) { if ( tol >= tol0 )
{
B.UpdateEdge ( edge, tol ); B.UpdateEdge ( edge, tol );
for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() ) { for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() )
{
TopoDS_Shape S = itV.Value(); TopoDS_Shape S = itV.Value();
B.UpdateVertex ( TopoDS::Vertex ( S ), tol ); B.UpdateVertex ( TopoDS::Vertex ( S ), tol );
} }
} }
} }
// Halt algorithm in case of user's abort
if ( !aPSentry.More() )
return Standard_False;
}
} }
if (!status) { if (!status) {
#ifdef DEB #ifdef DEB
cout<<"** SameParameter not complete. On "<<numedge<<" Edges:"; cout<<"** SameParameter not complete. On "<<numedge<<" Edges:";
if (nbfail > 0) cout<<" "<<nbfail<<" Failed"; if (nbfail > 0) cout<<" "<<nbfail<<" Failed";
//if (nbexcp > 0) cout<<" "<<nbexcp<<" Raised"; //SK original
cout<<endl; cout<<endl;
#endif #endif
} }

View File

@ -19,7 +19,8 @@ uses
Edge from ShapeFix, Edge from ShapeFix,
Status from ShapeExtend, Status from ShapeExtend,
MapOfShape from TopTools, MapOfShape from TopTools,
BasicMsgRegistrator from ShapeExtend BasicMsgRegistrator from ShapeExtend,
ProgressIndicator from Message
is is
@ -33,10 +34,17 @@ is
Init (me: mutable; shape: Shape from TopoDS); Init (me: mutable; shape: Shape from TopoDS);
---Purpose: Initislises by shape. ---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 ---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; Shape (me) returns Shape from TopoDS;
---Purpose: Returns resulting shape ---Purpose: Returns resulting shape

View File

@ -26,6 +26,8 @@
#include <ShapeFix_Shell.hxx> #include <ShapeFix_Shell.hxx>
#include <ShapeFix_Solid.hxx> #include <ShapeFix_Solid.hxx>
#include <Message_ProgressSentry.hxx>
//======================================================================= //=======================================================================
//function : ShapeFix_Shape //function : ShapeFix_Shape
//purpose : //purpose :
@ -81,11 +83,11 @@ void ShapeFix_Shape::Init(const TopoDS_Shape& shape)
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean ShapeFix_Shape::Perform() Standard_Boolean ShapeFix_Shape::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{ {
Standard_Integer savFixSmallAreaWireMode = 0; 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() ) { if ( !fft.IsNull() ) {
savFixSmallAreaWireMode = fft->FixSmallAreaWireMode(); savFixSmallAreaWireMode = fft->FixSmallAreaWireMode();
if ( savFixSmallAreaWireMode == -1 && if ( savFixSmallAreaWireMode == -1 &&
@ -117,41 +119,60 @@ Standard_Boolean ShapeFix_Shape::Perform()
ShapeFix::FixVertexPosition(S,Precision(),Context()); ShapeFix::FixVertexPosition(S,Precision(),Context());
st = S.ShapeType(); 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 ) { switch ( st ) {
case TopAbs_COMPOUND: case TopAbs_COMPOUND:
case TopAbs_COMPSOLID: { case TopAbs_COMPSOLID: {
TopoDS_Shape shape = myShape; TopoDS_Shape shape = myShape;
Standard_Boolean savFixSameParameterMode = myFixSameParameterMode; Standard_Boolean savFixSameParameterMode = myFixSameParameterMode;
myFixSameParameterMode = Standard_False; myFixSameParameterMode = Standard_False;
for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
myShape = iter.Value(); Standard_Integer aShapesNb = 0;
if ( Perform() ) status = Standard_True; 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; myFixSameParameterMode = savFixSameParameterMode;
myShape = shape; myShape = shape;
// myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE5 );
break; break;
} }
case TopAbs_SOLID: { case TopAbs_SOLID: {
if ( ! NeedFix ( myFixSolidMode ) ) break; if ( !NeedFix(myFixSolidMode) )
break;
myFixSolid->Init(TopoDS::Solid(S)); myFixSolid->Init(TopoDS::Solid(S));
myFixSolid->SetContext(Context()); myFixSolid->SetContext(Context());
if(myFixSolid->Perform()) {
// Context()->Replace(S,myFixSolid->Solid()); if ( myFixSolid->Perform(theProgress) )
status = Standard_True; status = Standard_True;
}
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 ); myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
break; break;
} }
case TopAbs_SHELL: { case TopAbs_SHELL: {
if ( ! NeedFix ( myFixShellMode ) ) break; if ( !NeedFix(myFixShellMode) )
break;
Handle(ShapeFix_Shell) sfsh = FixShellTool(); Handle(ShapeFix_Shell) sfsh = FixShellTool();
sfsh->Init(TopoDS::Shell(S)); sfsh->Init( TopoDS::Shell(S) );
sfsh->SetContext(Context()); sfsh->SetContext( Context() );
if(sfsh->Perform()) {
// Context()->Replace(S,sfsh->Shell()); if ( sfsh->Perform(theProgress) )
status = Standard_True; status = Standard_True;
}
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 ); myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
break; break;
} }
@ -162,8 +183,8 @@ Standard_Boolean ShapeFix_Shape::Perform()
sff->FixWireTool()->ModifyTopologyMode() = Standard_True; sff->FixWireTool()->ModifyTopologyMode() = Standard_True;
sff->Init(TopoDS::Face(S)); sff->Init(TopoDS::Face(S));
sff->SetContext(Context()); sff->SetContext(Context());
if(sff->Perform()) { if(sff->Perform()) {
// Context()->Replace(S,sff->Face());
status = Standard_True; status = Standard_True;
} }
sff->FixWireTool()->ModifyTopologyMode() = savTopoMode; sff->FixWireTool()->ModifyTopologyMode() = savTopoMode;
@ -178,7 +199,6 @@ Standard_Boolean ShapeFix_Shape::Perform()
sfw->ModifyTopologyMode() = Standard_True; sfw->ModifyTopologyMode() = Standard_True;
if ( ! S.Closed() ) if ( ! S.Closed() )
sfw->ClosedWireMode() = Standard_False; sfw->ClosedWireMode() = Standard_False;
// sfw->FixEdgeCurvesMode() =0;
sfw->SetFace(TopoDS_Face()); sfw->SetFace(TopoDS_Face());
sfw->Load(TopoDS::Wire(S)); sfw->Load(TopoDS::Wire(S));
sfw->SetContext(Context()); sfw->SetContext(Context());
@ -202,9 +222,15 @@ Standard_Boolean ShapeFix_Shape::Perform()
default : break; default : break;
} }
// Switch to the second progress indication scope if it exists
aPSentry.Next();
myResult = Context()->Apply(S); myResult = Context()->Apply(S);
if ( NeedFix ( myFixSameParameterMode ) )
SameParameter (myResult,Standard_False); if ( NeedFix(myFixSameParameterMode) )
{
SameParameter(myResult, Standard_False, theProgress);
}
if ( !fft.IsNull() ) if ( !fft.IsNull() )
fft->FixSmallAreaWireMode() = savFixSmallAreaWireMode; fft->FixSmallAreaWireMode() = savFixSmallAreaWireMode;
@ -217,9 +243,11 @@ Standard_Boolean ShapeFix_Shape::Perform()
//purpose : //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);
} }
//======================================================================= //=======================================================================

View File

@ -16,7 +16,9 @@ uses
Shape from TopoDS, Shape from TopoDS,
Status from ShapeExtend, Status from ShapeExtend,
BasicMsgRegistrator from ShapeExtend, BasicMsgRegistrator from ShapeExtend,
Face from ShapeFix Face from ShapeFix,
ProgressIndicator from Message
is is
Create returns Shell from ShapeFix; Create returns Shell from ShapeFix;
@ -29,10 +31,13 @@ is
Init (me: mutable; shell: Shell from TopoDS); Init (me: mutable; shell: Shell from TopoDS);
---Purpose: Initializes by shell. ---Purpose: Initializes by shell.
Perform (me: mutable) returns Boolean; Perform (me: mutable;
theProgress : ProgressIndicator from Message = 0) returns Boolean;
---Purpose: Iterates on subshapes and performs fixes ---Purpose: Iterates on subshapes and performs fixes
-- (for each face calls ShapeFix_Face::Perform and -- (for each face calls ShapeFix_Face::Perform and
-- then calls FixFaceOrientation) -- 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; FixFaceOrientation (me : mutable; shell : Shell from TopoDS;
isAccountMultiConex : Boolean = Standard_True; isAccountMultiConex : Boolean = Standard_True;
@ -109,4 +114,5 @@ fields
myFixFaceMode : Integer is protected; myFixFaceMode : Integer is protected;
myFixOrientationMode : Integer is protected; myFixOrientationMode : Integer is protected;
myNbShells : Integer is protected; myNbShells : Integer is protected;
end Shell; end Shell;

View File

@ -33,6 +33,7 @@
#include <ShapeExtend.hxx> #include <ShapeExtend.hxx>
#include <ShapeBuild_ReShape.hxx> #include <ShapeBuild_ReShape.hxx>
#include <Message_Msg.hxx> #include <Message_Msg.hxx>
#include <Message_ProgressSentry.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx> #include <TopTools_DataMapOfShapeInteger.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx> #include <TopTools_DataMapOfShapeInteger.hxx>
#include <TopTools_DataMapOfShapeInteger.hxx> #include <TopTools_DataMapOfShapeInteger.hxx>
@ -93,26 +94,40 @@ void ShapeFix_Shell::Init(const TopoDS_Shell& shell)
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean ShapeFix_Shell::Perform() Standard_Boolean ShapeFix_Shell::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{ {
Standard_Boolean status = Standard_False; Standard_Boolean status = Standard_False;
if(Context().IsNull()) if ( Context().IsNull() )
SetContext ( new ShapeBuild_ReShape ); SetContext(new ShapeBuild_ReShape);
myFixFace->SetContext(Context()); myFixFace->SetContext(Context());
if ( NeedFix ( myFixFaceMode ) ) {
TopoDS_Shape S = Context()->Apply ( myShell ); if ( NeedFix(myFixFaceMode) )
for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) { {
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_Shape sh = iter.Value();
TopoDS_Face tmpFace = TopoDS::Face(sh); TopoDS_Face tmpFace = TopoDS::Face(sh);
myFixFace->Init(tmpFace); myFixFace->Init(tmpFace);
// myFixFace->SetPrecision(Precision()); if ( myFixFace->Perform() )
if(myFixFace->Perform()) { {
// if(!Context().IsNull())
// Context()->Replace(tmpFace,myFixFace->Face());
status = Standard_True; status = Standard_True;
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 ); 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); TopoDS_Shape newsh = Context()->Apply(myShell);
if ( NeedFix ( myFixOrientationMode) ) if ( NeedFix ( myFixOrientationMode) )

View File

@ -17,7 +17,8 @@ uses
Shape from TopoDS, Shape from TopoDS,
Shell from ShapeFix, Shell from ShapeFix,
Status from ShapeExtend, Status from ShapeExtend,
BasicMsgRegistrator from ShapeExtend BasicMsgRegistrator from ShapeExtend,
ProgressIndicator from Message
is is
Create returns Solid from ShapeFix; Create returns Solid from ShapeFix;
@ -29,9 +30,12 @@ is
Init(me: mutable; solid : Solid from TopoDS) is virtual; Init(me: mutable; solid : Solid from TopoDS) is virtual;
---Purpose: Initializes by solid . ---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 ---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) SolidFromShell (me: mutable; shell: Shell from TopoDS)
returns Solid from TopoDS; returns Solid from TopoDS;

View File

@ -44,6 +44,7 @@
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeShape.hxx> #include <TopTools_IndexedDataMapOfShapeShape.hxx>
#include <Message_Msg.hxx> #include <Message_Msg.hxx>
#include <Message_ProgressSentry.hxx>
#include <TopoDS_Vertex.hxx> #include <TopoDS_Vertex.hxx>
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
@ -51,7 +52,6 @@
#include <Geom_Curve.hxx> #include <Geom_Curve.hxx>
#include <ShapeAnalysis_FreeBounds.hxx> #include <ShapeAnalysis_FreeBounds.hxx>
//====================================================== //======================================================
//function : ShapeFix_Solid //function : ShapeFix_Solid
//purpose : //purpose :
@ -341,36 +341,55 @@ static Standard_Boolean CreateSolids(const TopoDS_Shape aShape,TopTools_IndexedM
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean ShapeFix_Solid::Perform() Standard_Boolean ShapeFix_Solid::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{ {
Standard_Boolean status = Standard_False; Standard_Boolean status = Standard_False;
if(Context().IsNull()) if ( Context().IsNull() )
SetContext ( new ShapeBuild_ReShape ); SetContext ( new ShapeBuild_ReShape );
myFixShell->SetContext(Context()); myFixShell->SetContext(Context());
Standard_Integer NbShells =0;
TopoDS_Shape S = Context()->Apply ( myShape );
if ( NeedFix ( myFixShellMode ) ) {
// call FixShell Standard_Integer NbShells = 0;
for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) { TopoDS_Shape S = Context()->Apply ( myShape );
TopoDS_Shape sh = iter.Value();
if(sh.ShapeType() != TopAbs_SHELL) // Calculate number of underlying shells
continue; Standard_Integer aNbShells = 0;
myFixShell->Init(TopoDS::Shell(sh)); for ( TopExp_Explorer aExpSh(S, TopAbs_SHELL); aExpSh.More(); aExpSh.Next() )
if(myFixShell->Perform()) { aNbShells++;
// Context()->Replace(sh,myFixShell->Shell());
// 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; status = Standard_True;
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 ); myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
} }
NbShells+= myFixShell->NbShells(); NbShells+= myFixShell->NbShells();
} }
// Halt algorithm in case of user's abort
if ( !aPSentry.More() )
return Standard_False;
} }
else { else
for(TopExp_Explorer aExpSh(myShape,TopAbs_SHELL); aExpSh.More(); aExpSh.Next()) {
NbShells++; NbShells = aNbShells;
} }
//if(!status) return status;
// Switch to the second stage
aPSentry.Next();
if(NbShells ==1) { if(NbShells ==1) {
TopoDS_Shape tmpShape = Context()->Apply(myShape); TopoDS_Shape tmpShape = Context()->Apply(myShape);
@ -441,7 +460,11 @@ Standard_Boolean ShapeFix_Solid::Perform()
BRep_Builder aB; BRep_Builder aB;
TopoDS_Compound aComp; TopoDS_Compound aComp;
aB.MakeCompound(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); TopoDS_Shape aResSh =aMapSolids.FindKey(i);
if(aResShape.ShapeType() == TopAbs_SHELL && myCreateOpenSolidMode) { if(aResShape.ShapeType() == TopAbs_SHELL && myCreateOpenSolidMode) {
aResSh.Closed(Standard_False); aResSh.Closed(Standard_False);
@ -456,6 +479,8 @@ Standard_Boolean ShapeFix_Solid::Perform()
aB.Add(aComp,aResSh); aB.Add(aComp,aResSh);
} }
if ( !aPSentry.More() )
return Standard_False; // aborted execution
Context()->Replace(aResShape,aComp); Context()->Replace(aResShape,aComp);
} }
} }

View File

@ -118,7 +118,8 @@ Standard_Boolean ShapeProcess::Perform (const Handle(ShapeProcess_Context)& cont
context->SetScope ( oper.ToCString() ); context->SetScope ( oper.ToCString() );
try { try {
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
op->Perform ( context ); if ( !op->Perform(context) )
return Standard_False;
} }
catch (Standard_Failure) { catch (Standard_Failure) {
Message_Msg SMSG2 ("Sequence.MSG2"); //Operator %s failed with exception %s Message_Msg SMSG2 ("Sequence.MSG2"); //Operator %s failed with exception %s

View File

@ -19,7 +19,8 @@ uses
Manager from Resource, Manager from Resource,
AsciiString from TCollection, AsciiString from TCollection,
HSequenceOfHAsciiString from TColStd, HSequenceOfHAsciiString from TColStd,
Messenger from Message Messenger from Message,
ProgressIndicator from Message
is is
@ -76,6 +77,12 @@ is
Messenger (me) returns Messenger from Message; Messenger (me) returns Messenger from Message;
---Purpose : Returns Messenger used for outputting messages. ---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); SetTraceLevel (me: mutable; tracelev: Integer);
---Purpose : Sets trace level used for outputting messages ---Purpose : Sets trace level used for outputting messages
-- - 0: no trace at all -- - 0: no trace at all
@ -92,6 +99,7 @@ fields
myRC: Manager from Resource; myRC: Manager from Resource;
myScope: HSequenceOfHAsciiString from TColStd; myScope: HSequenceOfHAsciiString from TColStd;
myMessenger: Messenger from Message; myMessenger: Messenger from Message;
myTraceLev : Integer; myProgress: ProgressIndicator from Message;
myTraceLev: Integer;
end Context; end Context;

View File

@ -353,6 +353,26 @@ Handle(Message_Messenger) ShapeProcess_Context::Messenger () const
return myMessenger; 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 //function : SetTraceLevel
//purpose : //purpose :

View File

@ -13,6 +13,8 @@
#include <BRepLib.hxx> #include <BRepLib.hxx>
#include <Message_MsgFile.hxx> #include <Message_MsgFile.hxx>
#include <Message_ProgressIndicator.hxx>
#include <ShapeExtend_MsgRegistrator.hxx> #include <ShapeExtend_MsgRegistrator.hxx>
#include <ShapeProcess.hxx> #include <ShapeProcess.hxx>
#include <ShapeProcess_UOperator.hxx> #include <ShapeProcess_UOperator.hxx>
@ -109,7 +111,7 @@ static Standard_Boolean directfaces (const Handle(ShapeProcess_Context)& context
TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, DM, map ); TopoDS_Shape res = ShapeProcess_OperLibrary::ApplyModifier ( ctx->Result(), ctx, DM, map );
ctx->RecordModification ( map ); ctx->RecordModification ( map );
ctx->SetResult ( res ); ctx->SetResult ( res );
return 0; return Standard_True;
} }
@ -623,7 +625,11 @@ static Standard_Boolean fixshape (const Handle(ShapeProcess_Context)& context)
sfw->FixNonAdjacentIntersectingEdgesMode() = ctx->IntegerVal ( "FixNonAdjacentIntersectingEdgesMode", -1 ); sfw->FixNonAdjacentIntersectingEdgesMode() = ctx->IntegerVal ( "FixNonAdjacentIntersectingEdgesMode", -1 );
sfs->Init(ctx->Result()); 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(); TopoDS_Shape result = sfs->Shape();
if ( result != ctx->Result() ) { if ( result != ctx->Result() ) {
ctx->RecordModification ( sfs->Context(), msg ); ctx->RecordModification ( sfs->Context(), msg );

View File

@ -18,7 +18,8 @@ uses
ShapeExtend, ShapeExtend,
ShapeAnalysis, ShapeAnalysis,
ShapeFix, ShapeFix,
Transfer Transfer,
Message
is is

View File

@ -22,7 +22,8 @@ uses
Wire from ShapeAnalysis, Wire from ShapeAnalysis,
Wire from ShapeFix, Wire from ShapeFix,
TransientProcess from Transfer, TransientProcess from Transfer,
FinderProcess from Transfer FinderProcess from Transfer,
ProgressIndicator from Message
is is
@ -42,19 +43,13 @@ is
---Purpose: Performs actions necessary for preparing environment ---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; ProcessShape (me; shape:
-- TP : TransientProcess from Transfer; Shape from TopoDS;
-- 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; Prec, MaxTol: Real;
rscfile: CString; rscfile: CString;
seq: CString; seq: CString;
info: out Transient) info: out Transient;
progress: ProgressIndicator from Message = 0)
returns Shape from TopoDS is virtual; returns Shape from TopoDS is virtual;
---Purpose: Does shape processing with specified tolerances ---Purpose: Does shape processing with specified tolerances
-- and returns resulting shape and associated information -- and returns resulting shape and associated information

View File

@ -80,16 +80,21 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
const Standard_Real maxTol, const Standard_Real maxTol,
const Standard_CString prscfile, const Standard_CString prscfile,
const Standard_CString pseq, const Standard_CString pseq,
Handle(Standard_Transient)& info) const Handle(Standard_Transient)& info,
const Handle(Message_ProgressIndicator)& progress) const
{ {
if ( shape.IsNull() ) return shape; if ( shape.IsNull() ) return shape;
Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast ( info ); Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast(info);
if ( context.IsNull() ) { if ( context.IsNull() )
Standard_CString rscfile = Interface_Static::CVal ( prscfile ); {
if ( ! rscfile ) rscfile = prscfile; Standard_CString rscfile = Interface_Static::CVal(prscfile);
context = new ShapeProcess_ShapeContext (shape, rscfile); if (!rscfile)
context->SetDetalisation ( TopAbs_EDGE ); rscfile = prscfile;
context = new ShapeProcess_ShapeContext(shape, rscfile);
context->SetDetalisation(TopAbs_EDGE);
if ( !progress.IsNull() )
context->SetProgress(progress);
} }
info = context; info = context;
@ -123,7 +128,7 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
sfs->SetMaxTolerance ( maxTol ); sfs->SetMaxTolerance ( maxTol );
sfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False; sfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False;
sfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False; sfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False;
sfs->Perform(); sfs->Perform(progress);
TopoDS_Shape S = sfs->Shape(); TopoDS_Shape S = sfs->Shape();
if ( ! S.IsNull() && S != shape ) { if ( ! S.IsNull() && S != shape ) {
@ -151,7 +156,9 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
// Define runtime tolerances and do Shape Processing // Define runtime tolerances and do Shape Processing
rsc->SetResource ( "Runtime.Tolerance", Prec ); rsc->SetResource ( "Runtime.Tolerance", Prec );
rsc->SetResource ( "Runtime.MaxTolerance", maxTol ); rsc->SetResource ( "Runtime.MaxTolerance", maxTol );
ShapeProcess::Perform ( context, seq );
if ( !ShapeProcess::Perform(context, seq) )
return TopoDS_Shape(); // Null shape
return context->Result(); return context->Result();
} }