---C++: inline
---Purpose: Returns (modifiable) the mode for applying
-- ShapeFix::FixVertexPosition before all fixes, by default False.
+
+ FixVertexTolMode (me: mutable) returns Integer;
+ ---C++: return &
+ ---C++: inline
+ ---Purpose: Returns (modifiable) the mode for fixing tolerances of vertices on whole shape
+ -- after performing all fixes
fields
myResult : Shape from TopoDS is protected;
myFixWireMode : Integer is protected;
myFixSameParameterMode : Integer is protected;
myFixVertexPositionMode : Integer is protected;
+ myFixVertexTolMode : Integer is protected;
myStatus : Integer is protected;
end Shape;
myFixWireMode = -1;
myFixSameParameterMode = -1;
myFixVertexPositionMode =0;
+ myFixVertexTolMode = -1;
myFixSolid = new ShapeFix_Solid;
}
myFixSameParameterMode = -1;
myFixSolid = new ShapeFix_Solid;
myFixVertexPositionMode =0;
+ myFixVertexTolMode = -1;
Init(shape);
}
Standard_Boolean ShapeFix_Shape::Perform(const Handle(Message_ProgressIndicator)& theProgress)
{
Standard_Integer savFixSmallAreaWireMode = 0;
-
+ Standard_Integer savFixVertexTolMode = myFixVertexTolMode;
Handle(ShapeFix_Face) fft = Handle(ShapeFix_Face)::DownCast( FixFaceTool() );
if ( !fft.IsNull() ) {
savFixSmallAreaWireMode = fft->FixSmallAreaWireMode();
TopoDS_Shape shape = myShape;
Standard_Boolean savFixSameParameterMode = myFixSameParameterMode;
myFixSameParameterMode = Standard_False;
-
+ myFixVertexTolMode = Standard_False;
Standard_Integer aShapesNb = 0;
for ( TopoDS_Iterator anIter(S); anIter.More(); anIter.Next() )
++aShapesNb;
return Standard_False; // aborted execution
myFixSameParameterMode = savFixSameParameterMode;
+ myFixVertexTolMode = savFixVertexTolMode;
myShape = shape;
break;
}
{
SameParameter(myResult, Standard_False, theProgress);
}
+ if( NeedFix( myFixVertexTolMode))
+ {
+ Standard_Integer nbF = 0;
+ TopExp_Explorer anExpF(myResult, TopAbs_FACE);
+ for( ; anExpF.More() && nbF <= 1; anExpF.Next())
+ nbF++;
+ if( nbF > 1)
+ {
+ //fix for bug 0025455
+ // for case when vertex belong to the different faces it is necessary to check vertices tolerances
+ //after all fixes.
+ //This fix it should be performed for example for case when cutting edge was performed.
+
+ Handle(ShapeFix_Edge) sfe = FixEdgeTool();
+ TopExp_Explorer anExpE (myResult, TopAbs_EDGE);
+ for ( ; anExpE.More(); anExpE.Next())
+ sfe->FixVertexTolerance( TopoDS::Edge (anExpE.Current()));
+
+ }
+ }
if ( !fft.IsNull() )
fft->FixSmallAreaWireMode() = savFixSmallAreaWireMode;
{
return myFixVertexPositionMode;
}
+
+//=======================================================================
+//function : FixVertexTolMode
+//purpose :
+//=======================================================================
+
+inline Standard_Integer& ShapeFix_Shape::FixVertexTolMode()
+{
+ return myFixVertexTolMode;
+}
\ No newline at end of file
--- /dev/null
+puts "============"
+puts "OCC25455"
+puts "============"
+puts ""
+######################################################
+# fixshape works at the second attempt
+######################################################
+
+restore [locate_data_file bug25455_rx.brep] rx
+
+fixshape rx rx
+
+set info [checkshape rx]
+
+# Resume
+puts ""
+if { [regexp {This shape seems to be valid} ${info}] } {
+ puts "OK: fixshape works properly"
+} else {
+ puts "Error: fixshape works bad"
+}