1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +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");
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);

View File

@ -101,7 +101,8 @@ Standard_Boolean IGESControl_Writer::AddShape (const TopoDS_Shape& theShape)
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);

View File

@ -1,27 +1,28 @@
#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
@ -144,6 +145,10 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
(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);
@ -176,15 +181,18 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
}
}
// 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()) {

View File

@ -545,7 +545,8 @@ Standard_Boolean IGESToBRep_Reader::Transfer(const Standard_Integer num)
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;

View File

@ -812,7 +812,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
TopoDS_Shape fixedResult =
XSAlgo::AlgoContainer()->ProcessShape( comp, myPrecision, myMaxTol,
"read.step.resource.name",
"read.step.sequence", info);
"read.step.sequence", info,
TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
BRep_Builder brepBuilder;
@ -1187,6 +1188,10 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
}
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))) {
@ -1228,6 +1233,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
return shbinder;
}
aPSentry.Next();
if (found && myShapeBuilder.IsDone()) {
mappedShape = myShapeBuilder.Value();
// Apply ShapeFix (on manifold shapes only. Non-manifold topology is processed separately: ssv; 13.11.2010)
@ -1236,7 +1243,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
mappedShape =
XSAlgo::AlgoContainer()->ProcessShape( mappedShape, myPrecision, myMaxTol,
"read.step.resource.name",
"read.step.sequence", info);
"read.step.sequence", info,
TP->GetProgress() );
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
}
}
@ -1366,7 +1374,8 @@ Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Han
Handle(Standard_Transient) info;
TopoDS_Shape shape = XSAlgo::AlgoContainer()->ProcessShape( S, myPrecision, myMaxTol,
"read.step.resource.name",
"read.step.sequence", info );
"read.step.sequence", info,
TP->GetProgress() );
// TopoDS_Shape shape = XSAlgo::AlgoContainer()->PerformFixShape( S, TP, myPrecision, myMaxTol );
if ( shape != S )
sb->SetResult ( shape );

View File

@ -863,7 +863,8 @@ Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape (const Handle(Tran
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;

View File

@ -32,6 +32,8 @@
#include <XSAlgo.hxx>
#include <XSAlgo_AlgoContainer.hxx>
#include <Draw_ProgressIndicator.hxx>
static int dejadraw = 0;
//=======================================================================
@ -168,8 +170,9 @@ static Standard_Integer NSPApply (Draw_Interpretor& di, Standard_Integer argc, c
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()) {

View File

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

View File

@ -4,7 +4,6 @@
-- <det@nnov.matra-dtv.fr>
---Copyright: Matra Datavision 1998
package ShapeFix
---Purpose: This package provides algorithms for fixing
@ -96,9 +95,6 @@ is
---Purpose: Tool for fixing selfintersecting wire
-- and intersecting wires
--class OverlappingTool; now it is in package OverlapShape of Products
---Purpose: Tool for fixing overlapping
class SplitTool;
---Purpose: Tool for splitting and cutting edges; incudes methods
-- used in OverlappingTool and IntersectionTool
@ -112,7 +108,8 @@ is
SameParameter (shape : Shape from TopoDS;
enforce : Boolean;
preci : Real = 0.0)
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
@ -121,7 +118,9 @@ is
-- 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

View File

@ -59,6 +59,7 @@
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopExp.hxx>
#include <Message_ProgressSentry.hxx>
//=======================================================================
//function : SameParameter
@ -67,8 +68,19 @@
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;
@ -78,40 +90,64 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
Handle(ShapeFix_Edge) sfe = new ShapeFix_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;
while (ex.More()) {
while ( ex.More() && aPSentry.More() )
{
numedge ++;
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());
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) {
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
sfe->FixSameParameter (E); // K2-SEP97
if (!BRep_Tool::SameParameter (E)) { ierr = 1; nbfail ++; }
if (ierr) {
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;
}
}
// 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(); exp.Next() ) {
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 );
@ -121,53 +157,58 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
Handle(Geom_RectangularTrimmedSurface)::DownCast ( Surf );
if ( ! GRTS.IsNull() )
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 );
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;
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());
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++ ) {
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;
if ( tol2 < dist )
tol2 = dist;
}
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 );
for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() ) {
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;
}
}
if (!status) {
#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
}

View File

@ -19,7 +19,8 @@ uses
Edge from ShapeFix,
Status from ShapeExtend,
MapOfShape from TopTools,
BasicMsgRegistrator from ShapeExtend
BasicMsgRegistrator from ShapeExtend,
ProgressIndicator from Message
is
@ -33,10 +34,17 @@ is
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

View File

@ -26,6 +26,8 @@
#include <ShapeFix_Shell.hxx>
#include <ShapeFix_Solid.hxx>
#include <Message_ProgressSentry.hxx>
//=======================================================================
//function : ShapeFix_Shape
//purpose :
@ -81,7 +83,7 @@ void ShapeFix_Shape::Init(const TopoDS_Shape& shape)
//purpose :
//=======================================================================
Standard_Boolean ShapeFix_Shape::Perform()
Standard_Boolean ShapeFix_Shape::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Integer savFixSmallAreaWireMode = 0;
@ -117,41 +119,60 @@ Standard_Boolean ShapeFix_Shape::Perform()
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());
if ( sfsh->Perform(theProgress) )
status = Standard_True;
}
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
break;
}
@ -162,8 +183,8 @@ Standard_Boolean ShapeFix_Shape::Perform()
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;
@ -178,7 +199,6 @@ Standard_Boolean ShapeFix_Shape::Perform()
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());
@ -202,9 +222,15 @@ Standard_Boolean ShapeFix_Shape::Perform()
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);
{
SameParameter(myResult, Standard_False, theProgress);
}
if ( !fft.IsNull() )
fft->FixSmallAreaWireMode() = savFixSmallAreaWireMode;
@ -217,9 +243,11 @@ Standard_Boolean ShapeFix_Shape::Perform()
//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,
Status from ShapeExtend,
BasicMsgRegistrator from ShapeExtend,
Face from ShapeFix
Face from ShapeFix,
ProgressIndicator from Message
is
Create returns Shell from ShapeFix;
@ -29,10 +31,13 @@ is
Init (me: mutable; shell: Shell from TopoDS);
---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
-- (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;
isAccountMultiConex : Boolean = Standard_True;
@ -109,4 +114,5 @@ fields
myFixFaceMode : Integer is protected;
myFixOrientationMode : Integer is protected;
myNbShells : Integer is protected;
end Shell;

View File

@ -33,6 +33,7 @@
#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>
@ -93,26 +94,40 @@ void ShapeFix_Shell::Init(const TopoDS_Shell& shell)
//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);
myFixFace->SetContext(Context());
if ( NeedFix ( myFixFaceMode ) ) {
if ( NeedFix(myFixFaceMode) )
{
TopoDS_Shape S = Context()->Apply(myShell);
for( TopoDS_Iterator iter(S); iter.More(); iter.Next()) {
// 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());
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) )

View File

@ -17,7 +17,8 @@ uses
Shape from TopoDS,
Shell from ShapeFix,
Status from ShapeExtend,
BasicMsgRegistrator from ShapeExtend
BasicMsgRegistrator from ShapeExtend,
ProgressIndicator from Message
is
Create returns Solid from ShapeFix;
@ -29,9 +30,12 @@ is
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;

View File

@ -44,6 +44,7 @@
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeShape.hxx>
#include <Message_Msg.hxx>
#include <Message_ProgressSentry.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
@ -51,7 +52,6 @@
#include <Geom_Curve.hxx>
#include <ShapeAnalysis_FreeBounds.hxx>
//======================================================
//function : ShapeFix_Solid
//purpose :
@ -341,36 +341,55 @@ static Standard_Boolean CreateSolids(const TopoDS_Shape aShape,TopTools_IndexedM
//purpose :
//=======================================================================
Standard_Boolean ShapeFix_Solid::Perform()
Standard_Boolean ShapeFix_Solid::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Boolean status = Standard_False;
if ( Context().IsNull() )
SetContext ( new ShapeBuild_ReShape );
myFixShell->SetContext(Context());
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;
// 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()) {
// Context()->Replace(sh,myFixShell->Shell());
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);
@ -441,7 +460,11 @@ Standard_Boolean ShapeFix_Solid::Perform()
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);
@ -456,6 +479,8 @@ Standard_Boolean ShapeFix_Solid::Perform()
aB.Add(aComp,aResSh);
}
if ( !aPSentry.More() )
return Standard_False; // aborted execution
Context()->Replace(aResShape,aComp);
}
}

View File

@ -118,7 +118,8 @@ Standard_Boolean ShapeProcess::Perform (const Handle(ShapeProcess_Context)& cont
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

View File

@ -19,7 +19,8 @@ uses
Manager from Resource,
AsciiString from TCollection,
HSequenceOfHAsciiString from TColStd,
Messenger from Message
Messenger from Message,
ProgressIndicator from Message
is
@ -76,6 +77,12 @@ 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
-- - 0: no trace at all
@ -92,6 +99,7 @@ fields
myRC: Manager from Resource;
myScope: HSequenceOfHAsciiString from TColStd;
myMessenger: Messenger from Message;
myProgress: ProgressIndicator from Message;
myTraceLev: Integer;
end Context;

View File

@ -353,6 +353,26 @@ Handle(Message_Messenger) ShapeProcess_Context::Messenger () const
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 :

View File

@ -13,6 +13,8 @@
#include <BRepLib.hxx>
#include <Message_MsgFile.hxx>
#include <Message_ProgressIndicator.hxx>
#include <ShapeExtend_MsgRegistrator.hxx>
#include <ShapeProcess.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 );
ctx->RecordModification ( map );
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 );
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 );

View File

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

View File

@ -22,7 +22,8 @@ uses
Wire from ShapeAnalysis,
Wire from ShapeFix,
TransientProcess from Transfer,
FinderProcess from Transfer
FinderProcess from Transfer,
ProgressIndicator from Message
is
@ -42,19 +43,13 @@ is
---Purpose: Performs actions necessary for preparing environment
-- 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;
ProcessShape (me; shape:
Shape from TopoDS;
Prec, MaxTol: Real;
rscfile: CString;
seq: CString;
info: out Transient)
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

View File

@ -80,16 +80,21 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
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() ) {
if ( context.IsNull() )
{
Standard_CString rscfile = Interface_Static::CVal(prscfile);
if ( ! rscfile ) rscfile = prscfile;
if (!rscfile)
rscfile = prscfile;
context = new ShapeProcess_ShapeContext(shape, rscfile);
context->SetDetalisation(TopAbs_EDGE);
if ( !progress.IsNull() )
context->SetProgress(progress);
}
info = context;
@ -123,7 +128,7 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
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 ) {
@ -151,7 +156,9 @@ TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& 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();
}