1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0025174: Provide ShapeCustom and BRepModifier with ProgressIndicator and ReShape features

Conflicts:
	src/TNaming/TNaming_Name.cxx
This commit is contained in:
razmyslovich 2014-08-20 15:17:53 +02:00 committed by bugmaster
parent 2958244411
commit b350f6ee1e
9 changed files with 208 additions and 137 deletions

View File

@ -352,7 +352,7 @@ class BOPTools_CheckCurveOnSurface :
// //
theFVal = -1.0*aP1.SquareDistance(aP2); theFVal = -1.0*aP1.SquareDistance(aP2);
} }
catch(...) { catch(Standard_Failure) {
return Standard_False; return Standard_False;
} }
// //
@ -382,7 +382,7 @@ class BOPTools_CheckCurveOnSurface :
theGrad(1) = -2.0*aP1.XYZ().Dot(aP2.XYZ()); theGrad(1) = -2.0*aP1.XYZ().Dot(aP2.XYZ());
} }
catch(...) { catch(Standard_Failure) {
return Standard_False; return Standard_False;
} }
@ -1260,7 +1260,7 @@ Standard_Boolean BOPTools_AlgoTools::
theMaxDist = sqrt(Abs(theMaxDist)); theMaxDist = sqrt(Abs(theMaxDist));
} }
catch (...) { catch (Standard_Failure) {
return Standard_False; return Standard_False;
} }
// //

View File

@ -644,7 +644,7 @@ void BRepFill_OffsetWire::Perform (const Standard_Real Offset,
PerformWithBiLo(myWorkSpine,Offset,myBilo,myLink,myJoinType,Alt); PerformWithBiLo(myWorkSpine,Offset,myBilo,myLink,myJoinType,Alt);
} }
} }
catch (...)//Every exception was caught. catch (Standard_Failure)//Every exception was caught.
{ {
myShape.Nullify(); myShape.Nullify();
myIsDone = Standard_False; myIsDone = Standard_False;

View File

@ -333,7 +333,7 @@ void BRepOffsetAPI_MakeOffset::Perform(const Standard_Real Offset,
else else
Done(); Done();
} }
catch(...) //Every exception was caught. catch(Standard_Failure) //Every exception was caught.
{ {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
cout<<"An exception was caught in BRepOffsetAPI_MakeOffset::Perform : "; cout<<"An exception was caught in BRepOffsetAPI_MakeOffset::Perform : ";

View File

@ -20,7 +20,8 @@ class Modifier from BRepTools
uses Shape from TopoDS, uses Shape from TopoDS,
Modification from BRepTools, Modification from BRepTools,
DataMapOfShapeShape from TopTools DataMapOfShapeShape from TopTools,
ProgressIndicator from Message
raises NullObject from Standard, raises NullObject from Standard,
NoSuchObject from Standard NoSuchObject from Standard
@ -47,7 +48,7 @@ is
---Purpose: Initializes the modifier with the shape <S>. ---Purpose: Initializes the modifier with the shape <S>.
Perform(me: in out; M: Modification from BRepTools) Perform(me: in out; M: Modification from BRepTools; aProgress: ProgressIndicator from Message = NULL)
---Purpose: Performs the modifications described by <M>. ---Purpose: Performs the modifications described by <M>.
raises NullObject from Standard raises NullObject from Standard
-- if the modifier has not been initialized with a shape. -- if the modifier has not been initialized with a shape.
@ -61,7 +62,7 @@ is
---C++: inline ---C++: inline
returns Boolean from Standard returns Boolean from Standard
is static; is static;
ModifiedShape(me; S: Shape from TopoDS) ModifiedShape(me; S: Shape from TopoDS)
returns Shape from TopoDS returns Shape from TopoDS
@ -82,7 +83,7 @@ is
is static private; is static private;
Rebuild(me: in out; S: Shape from TopoDS; M: Modification from BRepTools) Rebuild(me: in out; S: Shape from TopoDS; M: Modification from BRepTools; aProgress: ProgressIndicator from Message = NULL)
returns Boolean from Standard returns Boolean from Standard
is static private; is static private;

View File

@ -51,6 +51,7 @@
#include <Standard_NullObject.hxx> #include <Standard_NullObject.hxx>
#include <gp_Trsf.hxx> #include <gp_Trsf.hxx>
#include <BRepTools_TrsfModification.hxx> #include <BRepTools_TrsfModification.hxx>
#include <Message_ProgressSentry.hxx>
@ -108,7 +109,7 @@ void BRepTools_Modifier::Init(const TopoDS_Shape& S)
//purpose : //purpose :
//======================================================================= //=======================================================================
void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M) void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M, const Handle(Message_ProgressIndicator) & aProgress)
{ {
if (myShape.IsNull()) { if (myShape.IsNull()) {
Standard_NullObject::Raise(); Standard_NullObject::Raise();
@ -132,7 +133,17 @@ void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M)
} }
*/ */
Rebuild(myShape,M); Message_ProgressSentry aPSentry(aProgress, "Converting Shape", 0, 2, 1);
Rebuild(myShape, M, aProgress);
if (!aPSentry.More())
{
// The processing was broken
return;
}
aPSentry.Next();
if (myShape.ShapeType() == TopAbs_FACE) { if (myShape.ShapeType() == TopAbs_FACE) {
if (myShape.Orientation() == TopAbs_REVERSED) { if (myShape.Orientation() == TopAbs_REVERSED) {
@ -166,8 +177,8 @@ void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M)
if (S.ShapeType() == TopAbs_FACE && !S.IsSame(theIter.Value())) { if (S.ShapeType() == TopAbs_FACE && !S.IsSame(theIter.Value())) {
Tr = BRep_Tool::Triangulation(TopoDS::Face(S),Loc); Tr = BRep_Tool::Triangulation(TopoDS::Face(S),Loc);
if (!Tr.IsNull()) { if (!Tr.IsNull()) {
RecomputeTriangles = Standard_True; RecomputeTriangles = Standard_True;
MaxDeflection = Max(MaxDeflection,Tr->Deflection()); MaxDeflection = Max(MaxDeflection,Tr->Deflection());
} }
} }
else */ if (S.ShapeType() == TopAbs_EDGE && !S.IsSame(theIter.Value())) { else */ if (S.ShapeType() == TopAbs_EDGE && !S.IsSame(theIter.Value())) {
@ -183,22 +194,22 @@ void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M)
it.Initialize(theEFMap.FindFromKey(edg)); it.Initialize(theEFMap.FindFromKey(edg));
TopoDS_Face F1,F2; TopoDS_Face F1,F2;
while (it.More() && F2.IsNull()) { while (it.More() && F2.IsNull()) {
if (F1.IsNull()) { if (F1.IsNull()) {
F1 = TopoDS::Face(it.Value()); F1 = TopoDS::Face(it.Value());
} }
else { else {
F2 = TopoDS::Face(it.Value()); F2 = TopoDS::Face(it.Value());
} }
it.Next(); it.Next();
} }
if (!F2.IsNull()) { if (!F2.IsNull()) {
const TopoDS_Edge& newedg = TopoDS::Edge(myMap(edg)); const TopoDS_Edge& newedg = TopoDS::Edge(myMap(edg));
const TopoDS_Face& newf1 = TopoDS::Face(myMap(F1)); const TopoDS_Face& newf1 = TopoDS::Face(myMap(F1));
const TopoDS_Face& newf2 = TopoDS::Face(myMap(F2)); const TopoDS_Face& newf2 = TopoDS::Face(myMap(F2));
GeomAbs_Shape Newcont = M->Continuity(edg,F1,F2,newedg,newf1,newf2); GeomAbs_Shape Newcont = M->Continuity(edg,F1,F2,newedg,newf1,newf2);
if (Newcont > GeomAbs_C0) { if (Newcont > GeomAbs_C0) {
B.Continuity(newedg,newf1,newf2,Newcont); B.Continuity(newedg,newf1,newf2,Newcont);
} }
} }
} }
theIter.Next(); theIter.Next();
@ -236,7 +247,8 @@ void BRepTools_Modifier::Put(const TopoDS_Shape& S)
Standard_Boolean BRepTools_Modifier::Rebuild Standard_Boolean BRepTools_Modifier::Rebuild
(const TopoDS_Shape& S, (const TopoDS_Shape& S,
const Handle(BRepTools_Modification)& M) const Handle(BRepTools_Modification)& M,
const Handle(Message_ProgressIndicator)& aProgress)
{ {
TopoDS_Shape& result = myMap(S); TopoDS_Shape& result = myMap(S);
// if (!result.IsNull()) return ! S.IsEqual(result); // if (!result.IsNull()) return ! S.IsEqual(result);
@ -325,10 +337,24 @@ Standard_Boolean BRepTools_Modifier::Rebuild
TopoDS_Iterator it; TopoDS_Iterator it;
for (it.Initialize(S, Standard_False); it.More(); it.Next()) { {
// always call Rebuild Standard_Integer aShapeCount = 0;
Standard_Boolean subrebuilt = Rebuild(it.Value(),M); {
rebuild = subrebuilt || rebuild ; for (it.Initialize(S, Standard_False); it.More(); it.Next()) ++aShapeCount;
}
Message_ProgressSentry aPSentry(aProgress, "Converting SubShapes", 0, aShapeCount, 1);
//
for (it.Initialize(S, Standard_False); it.More() && aPSentry.More(); it.Next(), aPSentry.Next()) {
// always call Rebuild
Standard_Boolean subrebuilt = Rebuild(it.Value(), M, aProgress);
rebuild = subrebuilt || rebuild ;
}
if (!aPSentry.More())
{
// The processing was broken
return Standard_False;
}
} }
// make an empty copy // make an empty copy
@ -360,15 +386,14 @@ Standard_Boolean BRepTools_Modifier::Rebuild
TopExp_Explorer ex(face.Oriented(fcor),TopAbs_EDGE); TopExp_Explorer ex(face.Oriented(fcor),TopAbs_EDGE);
for (;ex.More(); ex.Next()) for (;ex.More(); ex.Next())
{ {
const TopoDS_Edge& edge = TopoDS::Edge(ex.Current()); const TopoDS_Edge& edge = TopoDS::Edge(ex.Current());
if (M->NewCurve2d(edge, face,TopoDS::Edge(myMap(ex.Current())), if (M->NewCurve2d(edge, face, TopoDS::Edge(myMap(ex.Current())), TopoDS::Face(result), curve2d, tol))
TopoDS::Face(result),curve2d, tol))
{ {
// rem dub 16/09/97 : Make constant topology or not make at all. // rem dub 16/09/97 : Make constant topology or not make at all.
// Do not make if CopySurface = 1 // Do not make if CopySurface = 1
// Atention, TRUE sewing edges (RealyClosed) // Atention, TRUE sewing edges (RealyClosed)
// stay even if CopySurface is true. // stay even if CopySurface is true.
// check that edge contains two pcurves on this surface: // check that edge contains two pcurves on this surface:
// either it is true seam on the current face, or belongs to two faces // either it is true seam on the current face, or belongs to two faces
@ -407,72 +432,67 @@ Standard_Boolean BRepTools_Modifier::Rebuild
} }
} }
} }
if (isClosed) if (isClosed)
{ {
TopoDS_Edge CurE = TopoDS::Edge(myMap(edge)); TopoDS_Edge CurE = TopoDS::Edge(myMap(edge));
TopoDS_Shape aLocalResult = result; TopoDS_Shape aLocalResult = result;
aLocalResult.Orientation(TopAbs_FORWARD); aLocalResult.Orientation(TopAbs_FORWARD);
TopoDS_Face CurF = TopoDS::Face(aLocalResult); TopoDS_Face CurF = TopoDS::Face(aLocalResult);
Handle(Geom2d_Curve) curve2d1, currcurv; Handle(Geom2d_Curve) curve2d1, currcurv;
Standard_Real f,l; Standard_Real f,l;
if ((!RevWires && fcor != edge.Orientation()) || if ((!RevWires && fcor != edge.Orientation()) ||
( RevWires && fcor == edge.Orientation())) { ( RevWires && fcor == edge.Orientation())) {
CurE.Orientation(TopAbs_FORWARD); CurE.Orientation(TopAbs_FORWARD);
curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l); curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d()); if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
B.UpdateEdge (CurE, curve2d1, curve2d, CurF, 0.); B.UpdateEdge (CurE, curve2d1, curve2d, CurF, 0.);
} }
else { else {
CurE.Orientation(TopAbs_REVERSED); CurE.Orientation(TopAbs_REVERSED);
curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l); curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d()); if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
B.UpdateEdge (CurE, curve2d, curve2d1, CurF, 0.); B.UpdateEdge (CurE, curve2d, curve2d1, CurF, 0.);
} }
currcurv = BRep_Tool::CurveOnSurface(edge,face,f,l); currcurv = BRep_Tool::CurveOnSurface(edge,face,f,l);
B.Range(edge,f,l); B.Range(edge,f,l);
} }
else { else {
B.UpdateEdge(TopoDS::Edge(myMap(ex.Current())), B.UpdateEdge(TopoDS::Edge(myMap(ex.Current())),
curve2d, curve2d,
TopoDS::Face(result), 0.); TopoDS::Face(result), 0.);
} }
TopLoc_Location theLoc; TopLoc_Location theLoc;
Standard_Real theF,theL; Standard_Real theF,theL;
Handle(Geom_Curve) C3D = Handle(Geom_Curve) C3D = BRep_Tool::Curve(TopoDS::Edge(myMap(ex.Current())), theLoc, theF, theL);
BRep_Tool::Curve(TopoDS::Edge(myMap(ex.Current())), if (C3D.IsNull()) { // Update vertices
theLoc,theF,theL); Standard_Real param;
if (C3D.IsNull()) { // Update vertices TopExp_Explorer ex2(edge,TopAbs_VERTEX);
Standard_Real param; while (ex2.More()) {
TopExp_Explorer ex2(edge,TopAbs_VERTEX); const TopoDS_Vertex& vertex = TopoDS::Vertex(ex2.Current());
while (ex2.More()) { if (!M->NewParameter(vertex, edge, param, tol)) {
const TopoDS_Vertex& vertex = TopoDS::Vertex(ex2.Current()); tol = BRep_Tool::Tolerance(vertex);
if (!M->NewParameter(vertex, edge, param, tol)) { param = BRep_Tool::Parameter(vertex,edge);
tol = BRep_Tool::Tolerance(vertex); }
param = BRep_Tool::Parameter(vertex,edge);
}
TopAbs_Orientation vtxrelat = vertex.Orientation(); TopAbs_Orientation vtxrelat = vertex.Orientation();
if (edge.Orientation() == TopAbs_REVERSED) { if (edge.Orientation() == TopAbs_REVERSED) {
// Update considere l'edge FORWARD, et le vertex en relatif // Update considere l'edge FORWARD, et le vertex en relatif
vtxrelat= TopAbs::Reverse(vtxrelat); vtxrelat= TopAbs::Reverse(vtxrelat);
} }
// if (myMap(edge).Orientation() == TopAbs_REVERSED) { //if (myMap(edge).Orientation() == TopAbs_REVERSED) {
// vtxrelat= TopAbs::Reverse(vtxrelat); // vtxrelat= TopAbs::Reverse(vtxrelat);
// } //}
TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
aLocalVertex.Orientation(vtxrelat);
// B.UpdateVertex(TopoDS::Vertex
// (myMap(vertex).Oriented(vtxrelat)),
B.UpdateVertex(aLocalVertex,
param,
TopoDS::Edge(myMap(edge)),
tol);
ex2.Next();
}
}
} TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
aLocalVertex.Orientation(vtxrelat);
//B.UpdateVertex(TopoDS::Vertex
//(myMap(vertex).Oriented(vtxrelat)),
B.UpdateVertex(aLocalVertex, param, TopoDS::Edge(myMap(edge)), tol);
ex2.Next();
}
}
}
} }
} }
@ -486,32 +506,28 @@ Standard_Boolean BRepTools_Modifier::Rebuild
if(edor != TopAbs_REVERSED) edor = TopAbs_FORWARD; if(edor != TopAbs_REVERSED) edor = TopAbs_FORWARD;
TopExp_Explorer ex(edge.Oriented(edor), TopAbs_VERTEX); TopExp_Explorer ex(edge.Oriented(edor), TopAbs_VERTEX);
while (ex.More()) { while (ex.More()) {
const TopoDS_Vertex& vertex = TopoDS::Vertex(ex.Current()); const TopoDS_Vertex& vertex = TopoDS::Vertex(ex.Current());
if (!M->NewParameter(vertex, edge, param, tol)) { if (!M->NewParameter(vertex, edge, param, tol)) {
tol = BRep_Tool::Tolerance(vertex); tol = BRep_Tool::Tolerance(vertex);
param = BRep_Tool::Parameter(vertex,edge); param = BRep_Tool::Parameter(vertex,edge);
} }
TopAbs_Orientation vtxrelat = vertex.Orientation();
if (edor == TopAbs_REVERSED) {
// Update considere l'edge FORWARD, et le vertex en relatif
vtxrelat= TopAbs::Reverse(vtxrelat);
}
TopAbs_Orientation vtxrelat = vertex.Orientation(); //if (result.Orientation() == TopAbs_REVERSED) {
if (edor == TopAbs_REVERSED) { // vtxrelat= TopAbs::Reverse(vtxrelat);
// Update considere l'edge FORWARD, et le vertex en relatif //}
vtxrelat= TopAbs::Reverse(vtxrelat); TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
} aLocalVertex.Orientation(vtxrelat);
// if (result.Orientation() == TopAbs_REVERSED) { //B.UpdateVertex(TopoDS::Vertex(myMap(vertex).Oriented(vtxrelat)),
// vtxrelat= TopAbs::Reverse(vtxrelat); B.UpdateVertex(aLocalVertex, param, TopoDS::Edge(result), tol);
// }
TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
aLocalVertex.Orientation(vtxrelat);
// B.UpdateVertex(TopoDS::Vertex
// (myMap(vertex).Oriented(vtxrelat)),
B.UpdateVertex(aLocalVertex,
param,
TopoDS::Edge(result),
tol);
ex.Next(); ex.Next();
} }
} }

View File

@ -697,7 +697,8 @@ static Standard_Integer DNaming_AttachShape (Draw_Interpretor& di,
TNaming_Selector aSelector(aResultLabel); TNaming_Selector aSelector(aResultLabel);
if(!aSelector.Select(aShape, aCONTEXT, aGeometry, aKeepOrientation)) if(!aSelector.Select(aShape, aCONTEXT, aGeometry, aKeepOrientation))
return 1; return 1;
}catch (...) { }
catch (Standard_Failure) {
cout << "EXCEPTION: SELECTION_IMPOSSIBLE" <<endl; cout << "EXCEPTION: SELECTION_IMPOSSIBLE" <<endl;
} }
@ -773,7 +774,8 @@ static Standard_Integer DNaming_XAttachShape (Draw_Interpretor& di,
TNaming_Selector aSelector(aResultLabel); TNaming_Selector aSelector(aResultLabel);
if(!aSelector.Select(aShape, aCONTEXT, aGeometry, aKeepOrientation)) if(!aSelector.Select(aShape, aCONTEXT, aGeometry, aKeepOrientation))
return 1; return 1;
} catch (...) { }
catch (Standard_Failure) {
cout << "EXCEPTION: SELECTION_IMPOSSIBLE" <<endl; cout << "EXCEPTION: SELECTION_IMPOSSIBLE" <<endl;
} }

View File

@ -41,7 +41,9 @@ uses
BRepTools, BRepTools,
TopTools, TopTools,
TColgp, TColgp,
Precision Precision,
Message,
ShapeBuild
is is
@ -64,7 +66,9 @@ is
ApplyModifier(S : Shape from TopoDS; ApplyModifier(S : Shape from TopoDS;
M : Modification from BRepTools; M : Modification from BRepTools;
context: in out DataMapOfShapeShape from TopTools; context: in out DataMapOfShapeShape from TopTools;
MD : in out Modifier from BRepTools) MD : in out Modifier from BRepTools;
aProgress : ProgressIndicator from Message = NULL;
aReShape : ReShape from ShapeBuild = NULL )
returns Shape from TopoDS; returns Shape from TopoDS;
---Purpose: Applies modifier to shape and checks sharing in the case assemblies. ---Purpose: Applies modifier to shape and checks sharing in the case assemblies.

View File

@ -32,7 +32,11 @@
#include <TopoDS_Iterator.hxx> #include <TopoDS_Iterator.hxx>
#include <BRep_Builder.hxx> #include <BRep_Builder.hxx>
#include <BRepTools_Modifier.hxx> #include <BRepTools_Modifier.hxx>
#include <ShapeBuild_ReShape.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Message_ProgressIndicator.hxx>
#include <Message_ProgressSentry.hxx>
//======================================================================= //=======================================================================
//function : ApplyModifier //function : ApplyModifier
@ -42,7 +46,9 @@
TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S, TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S,
const Handle(BRepTools_Modification) &M, const Handle(BRepTools_Modification) &M,
TopTools_DataMapOfShapeShape &context, TopTools_DataMapOfShapeShape &context,
BRepTools_Modifier& MD ) BRepTools_Modifier& MD,
const Handle(Message_ProgressIndicator) & aProgress,
const Handle(ShapeBuild_ReShape) & aReShape)
{ {
// protect against INTERNAL/EXTERNAL shapes // protect against INTERNAL/EXTERNAL shapes
TopoDS_Shape SF = S.Oriented(TopAbs_FORWARD); TopoDS_Shape SF = S.Oriented(TopAbs_FORWARD);
@ -53,14 +59,23 @@ TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S,
TopoDS_Compound C; TopoDS_Compound C;
BRep_Builder B; BRep_Builder B;
B.MakeCompound ( C ); B.MakeCompound ( C );
for ( TopoDS_Iterator it(SF); it.More(); it.Next() ) {
Standard_Integer aShapeCount = 0;
{
for (TopoDS_Iterator it(SF); it.More(); it.Next()) ++aShapeCount;
}
Message_ProgressSentry aPSentry(aProgress, "Applying Modifier For Solids", 0, aShapeCount, 1);
for ( TopoDS_Iterator it(SF); it.More() && aPSentry.More(); it.Next(), aPSentry.Next() ) {
TopoDS_Shape shape = it.Value(); TopoDS_Shape shape = it.Value();
TopLoc_Location L = shape.Location(), nullLoc; TopLoc_Location L = shape.Location(), nullLoc;
shape.Location ( nullLoc ); shape.Location ( nullLoc );
TopoDS_Shape res; TopoDS_Shape res;
if ( context.IsBound ( shape ) ) if ( context.IsBound ( shape ) )
res = context.Find ( shape ).Oriented ( shape.Orientation() ); res = context.Find ( shape ).Oriented ( shape.Orientation() );
else res = ApplyModifier ( shape, M, context ,MD); else
res = ApplyModifier ( shape, M, context ,MD, aProgress);
if ( ! res.IsSame ( shape ) ) { if ( ! res.IsSame ( shape ) ) {
context.Bind ( shape, res ); context.Bind ( shape, res );
locModified = Standard_True; locModified = Standard_True;
@ -68,17 +83,48 @@ TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S,
res.Location ( L ); res.Location ( L );
B.Add ( C, res ); B.Add ( C, res );
} }
if ( !aPSentry.More() )
{
// Was cancelled
return S;
}
if ( ! locModified ) return S; if ( ! locModified ) return S;
context.Bind ( SF, C ); context.Bind ( SF, C );
return C.Oriented ( S.Orientation() ); return C.Oriented ( S.Orientation() );
} }
Message_ProgressSentry aPSentry(aProgress, "Modify the Shape", 0, 1, 1);
// Modify the shape // Modify the shape
//BRepTools_Modifier Op(SF,M);
MD.Init(SF); MD.Init(SF);
MD.Perform(M); MD.Perform(M, aProgress);
if ( ! MD.IsDone() ) return S; if ( !aPSentry.More() || !MD.IsDone() ) return S;
if ( !aReShape.IsNull() )
{
for(TopoDS_Iterator theIterator(SF,Standard_False);theIterator.More();theIterator.Next())
{
const TopoDS_Shape & current = theIterator.Value();
TopoDS_Shape result;
try
{
OCC_CATCH_SIGNALS
result = MD.ModifiedShape( current );
}
catch (Standard_NoSuchObject)
{
// the sub shape isn't in the map
result.Nullify();
}
if (!result.IsNull() && !current.IsSame(result))
{
aReShape->Replace(current, result);
}
}
}
return MD.ModifiedShape(SF).Oriented(S.Orientation()); return MD.ModifiedShape(SF).Oriented(S.Orientation());
} }

View File

@ -40,6 +40,7 @@
#include <Standard_NotImplemented.hxx> #include <Standard_NotImplemented.hxx>
#include <Standard_ConstructionError.hxx> #include <Standard_ConstructionError.hxx>
#include <Standard_ErrorHandler.hxx>
#include <TopTools_Array1OfShape.hxx> #include <TopTools_Array1OfShape.hxx>
#include <TColStd_Array1OfInteger.hxx> #include <TColStd_Array1OfInteger.hxx>
#include <TopoDS_Wire.hxx> #include <TopoDS_Wire.hxx>
@ -2075,6 +2076,7 @@ Standard_Boolean TNaming_Name::Solve(const TDF_Label& aLab,
PrintEntry(aLab); PrintEntry(aLab);
#endif #endif
try { try {
OCC_CATCH_SIGNALS
switch (myType) { switch (myType) {
case TNaming_UNKNOWN : case TNaming_UNKNOWN :
{ {
@ -2145,7 +2147,7 @@ case TNaming_SHELLIN:
break; break;
} }
} }
} catch (...) { } catch (Standard_Failure) {
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
cout << "Name::Solve: EXCEPTION==> NameType = " << NameTypeToString(myType) << " "; cout << "Name::Solve: EXCEPTION==> NameType = " << NameTypeToString(myType) << " ";
PrintEntry(aLab); PrintEntry(aLab);