From 8fc906ac5adbcbd6e2ba22455a005bc622171509 Mon Sep 17 00:00:00 2001 From: jfa Date: Tue, 21 Apr 2009 13:28:59 +0000 Subject: [PATCH] Bug 0020228: [CEA 331] the geompy.RemoveExtraEdges crash with the attached brep shape file. Added a new parameter theOptimumNbFaces to the RemoveExtraEdges functionality. In GUI it is a boolean flag. --- idl/GEOM_Gen.idl | 9 +- src/GEOMAlgo/BlockFix_BlockFixAPI.cxx | 28 ++-- src/GEOMAlgo/BlockFix_BlockFixAPI.hxx | 98 ++++++-------- src/GEOMAlgo/BlockFix_BlockFixAPI.lxx | 19 ++- src/GEOMAlgo/BlockFix_CheckTool.cxx | 6 +- src/GEOMAlgo/BlockFix_UnionFaces.cxx | 120 ++++++++++-------- src/GEOMAlgo/BlockFix_UnionFaces.hxx | 104 +++++++-------- src/GEOMAlgo/GEOMAlgo_Tools.cxx | 65 ++++++---- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_BlockDriver.cxx | 3 +- src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx | 10 +- src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 7 +- src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 5 +- src/GEOM_I/GEOM_IBlocksOperations_i.cc | 7 +- src/GEOM_I/GEOM_IBlocksOperations_i.hh | 5 +- src/GEOM_SWIG/geompyDC.py | 8 +- .../RepairGUI_RemoveExtraEdgesDlg.cxx | 23 +++- src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.h | 8 +- 18 files changed, 284 insertions(+), 245 deletions(-) diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 2be25f963..7c840499a 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -21,7 +21,7 @@ // // File : GEOM_Gen.idl // Author : Sergey RUIN -// + #ifndef __GEOM_GEN__ #define __GEOM_GEN__ @@ -1869,9 +1869,14 @@ module GEOM * Remove all seam and degenerated edges from \a theShape. * Unite faces and edges, sharing one surface. * \param theShape The compound or single solid to remove irregular edges from. + * \param theOptimumNbFaces If more than zero, unite faces only for those solids, + * that have more than theOptimumNbFaces faces. If zero, unite faces always, + * regardsless their quantity in the solid. If negative, do not unite faces at all. + * For blocks repairing recommended value is 6. * \return Improved shape. */ - GEOM_Object RemoveExtraEdges (in GEOM_Object theShape); + GEOM_Object RemoveExtraEdges (in GEOM_Object theShape, + in long theOptimumNbFaces); /*! * Check, if the given shape is a blocks compound. diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx index 62e33fd4e..674a9867e 100644 --- a/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx @@ -19,10 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: BlockFix_BlockFixAPI.cxx -// Created: Tue Dec 7 11:59:05 2004 -// Author: Pavel DURANDIN -// +// File: BlockFix_BlockFixAPI.cxx +// Created: Tue Dec 7 11:59:05 2004 +// Author: Pavel DURANDIN + #include #include #include @@ -31,37 +31,35 @@ //======================================================================= //function : ShapeConvert_CanonicAPI -//purpose : +//purpose : //======================================================================= BlockFix_BlockFixAPI::BlockFix_BlockFixAPI() { myTolerance = Precision::Confusion(); + myOptimumNbFaces = 6; } //======================================================================= //function : Perform -//purpose : +//purpose : //======================================================================= -void BlockFix_BlockFixAPI::Perform() +void BlockFix_BlockFixAPI::Perform() { - // processing spheres with degenerativities TopoDS_Shape aShape = Shape(); myShape = BlockFix::RotateSphereSpace(aShape,myTolerance); - + // faces unification BlockFix_UnionFaces aFaceUnifier; aFaceUnifier.GetTolerance() = myTolerance; - TopoDS_Shape aResult; - aResult = aFaceUnifier.Perform(myShape); - - + aFaceUnifier.GetOptimumNbFaces() = myOptimumNbFaces; + TopoDS_Shape aResult = aFaceUnifier.Perform(myShape); + BlockFix_UnionEdges anEdgeUnifier; myShape = anEdgeUnifier.Perform(aResult,myTolerance); - + TopoDS_Shape aRes = BlockFix::FixRanges(myShape,myTolerance); myShape = aRes; - } diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.hxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.hxx index 9bece72c4..d2511898a 100644 --- a/src/GEOMAlgo/BlockFix_BlockFixAPI.hxx +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.hxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _BlockFix_BlockFixAPI_HeaderFile #define _BlockFix_BlockFixAPI_HeaderFile @@ -41,77 +41,53 @@ #ifndef _MMgt_TShared_HeaderFile #include #endif + class ShapeBuild_ReShape; class TopoDS_Shape; -class BlockFix_BlockFixAPI : public MMgt_TShared { - +class BlockFix_BlockFixAPI : public MMgt_TShared +{ public: - - void* operator new(size_t,void* anAddress) - { - return anAddress; - } - void* operator new(size_t size) - { - return Standard::Allocate(size); - } - void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); - } - // Methods PUBLIC - // -Standard_EXPORT BlockFix_BlockFixAPI(); - void SetShape(const TopoDS_Shape& Shape) ; -Standard_EXPORT void Perform() ; + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // + Standard_EXPORT BlockFix_BlockFixAPI(); + void SetShape(const TopoDS_Shape& Shape); + Standard_EXPORT void Perform(); TopoDS_Shape Shape() const; - Handle_ShapeBuild_ReShape& Context() ; - Standard_Real& Tolerance() ; -Standard_EXPORT ~BlockFix_BlockFixAPI(); - - - - - // Type management - // - Standard_EXPORT friend Handle_Standard_Type& BlockFix_BlockFixAPI_Type_(); - Standard_EXPORT const Handle(Standard_Type)& DynamicType() const; - Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const; - -protected: - - // Methods PROTECTED - // - - - // Fields PROTECTED - // + Handle_ShapeBuild_ReShape& Context(); + Standard_Real& Tolerance(); + Standard_Integer& OptimumNbFaces(); + Standard_EXPORT ~BlockFix_BlockFixAPI(); + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& BlockFix_BlockFixAPI_Type_(); + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const; + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const; private: - - // Methods PRIVATE - // - - - // Fields PRIVATE - // -Handle_ShapeBuild_ReShape myContext; -TopoDS_Shape myShape; -Standard_Real myTolerance; - - + // Fields PRIVATE + // + Handle_ShapeBuild_ReShape myContext; + TopoDS_Shape myShape; + Standard_Real myTolerance; + Standard_Integer myOptimumNbFaces; }; - #include - - -// other Inline functions and methods (like "C++: function call" methods) -// - - #endif diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx index 883e4fec6..e66051950 100644 --- a/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx @@ -18,11 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #include //======================================================================= -//function : Shape +//function : SetShape //purpose : //======================================================================= @@ -40,7 +40,7 @@ inline TopoDS_Shape BlockFix_BlockFixAPI::Shape() const { return myShape; } - + //======================================================================= //function : Context //purpose : @@ -50,7 +50,7 @@ inline Handle(ShapeBuild_ReShape)& BlockFix_BlockFixAPI::Context() { return myContext; } - + //======================================================================= //function : Tolerance //purpose : @@ -60,4 +60,13 @@ inline Standard_Real& BlockFix_BlockFixAPI::Tolerance() { return myTolerance; } - + +//======================================================================= +//function : OptimumNbFaces +//purpose : +//======================================================================= + +inline Standard_Integer& BlockFix_BlockFixAPI::OptimumNbFaces() +{ + return myOptimumNbFaces; +} diff --git a/src/GEOMAlgo/BlockFix_CheckTool.cxx b/src/GEOMAlgo/BlockFix_CheckTool.cxx index d2d6da80a..51532d02c 100644 --- a/src/GEOMAlgo/BlockFix_CheckTool.cxx +++ b/src/GEOMAlgo/BlockFix_CheckTool.cxx @@ -25,9 +25,11 @@ #include +//#include +//#include + #include -#include -#include + #include #include #include diff --git a/src/GEOMAlgo/BlockFix_UnionFaces.cxx b/src/GEOMAlgo/BlockFix_UnionFaces.cxx index a97fab21c..d63b5aaac 100644 --- a/src/GEOMAlgo/BlockFix_UnionFaces.cxx +++ b/src/GEOMAlgo/BlockFix_UnionFaces.cxx @@ -19,10 +19,9 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: BlockFix_UnionFaces.cxx -// Created: Tue Dec 7 17:15:42 2004 -// Author: Pavel DURANDIN -// +// File: BlockFix_UnionFaces.cxx +// Created: Tue Dec 7 17:15:42 2004 +// Author: Pavel DURANDIN #include @@ -59,7 +58,7 @@ #include #include #include -#include +#include #include #include #include @@ -79,21 +78,22 @@ #include #include - + //======================================================================= //function : BlockFix_UnionFaces -//purpose : +//purpose : //======================================================================= BlockFix_UnionFaces::BlockFix_UnionFaces() - : myTolerance(Precision::Confusion()) + : myTolerance(Precision::Confusion()), + myOptimumNbFaces(6) { } //======================================================================= -//function : GetTolearnce -//purpose : +//function : GetTolerance +//purpose : //======================================================================= Standard_Real& BlockFix_UnionFaces::GetTolerance() @@ -102,6 +102,17 @@ Standard_Real& BlockFix_UnionFaces::GetTolerance() } +//======================================================================= +//function : GetOptimumNbFaces +//purpose : +//======================================================================= + +Standard_Integer& BlockFix_UnionFaces::GetOptimumNbFaces() +{ + return myOptimumNbFaces; +} + + //======================================================================= //function : AddOrdinaryEdges //purpose : auxilary @@ -129,22 +140,22 @@ static Standard_Boolean AddOrdinaryEdges(TopTools_SequenceOfShape& edges, for(Standard_Integer i = 1; i <= edges.Length(); i++) { TopoDS_Shape current = edges(i); if(aNewEdges.Contains(current)) { - + aNewEdges.Remove(current); edges.Remove(i); i--; - + if(!isDropped) { isDropped = Standard_True; anIndex = i; } } } - + //add edges to the sequemce for(TopTools_MapIteratorOfMapOfShape anIter(aNewEdges); anIter.More(); anIter.Next()) edges.Append(anIter.Key()); - + return isDropped; } @@ -156,7 +167,7 @@ static Standard_Boolean AddOrdinaryEdges(TopTools_SequenceOfShape& edges, static Handle(Geom_Surface) ClearRts(const Handle(Geom_Surface)& aSurface) { if(aSurface->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { - Handle(Geom_RectangularTrimmedSurface) rts = + Handle(Geom_RectangularTrimmedSurface) rts = Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface); return rts->BasisSurface(); } @@ -166,7 +177,7 @@ static Handle(Geom_Surface) ClearRts(const Handle(Geom_Surface)& aSurface) //======================================================================= //function : Perform -//purpose : +//purpose : //======================================================================= TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) @@ -201,9 +212,12 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) nbf++; } + bool doUnion = ((myOptimumNbFaces == 0) || + ((myOptimumNbFaces > 0) && (nbf > myOptimumNbFaces))); + // processing each face mapF.Clear(); - for (exp.Init(aSolid, TopAbs_FACE); exp.More() && nbf > 6; exp.Next()) { + for (exp.Init(aSolid, TopAbs_FACE); exp.More() && doUnion; exp.Next()) { TopoDS_Face aFace = TopoDS::Face(exp.Current().Oriented(TopAbs_FORWARD)); if (aProcessed.Contains(aFace)) @@ -227,42 +241,42 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) TopoDS_Edge edge = TopoDS::Edge(edges(i)); if (BRep_Tool::Degenerated(edge)) continue; - + const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); TopTools_ListIteratorOfListOfShape anIter(aList); for (; anIter.More(); anIter.Next()) { TopoDS_Face anCheckedFace = TopoDS::Face(anIter.Value().Oriented(TopAbs_FORWARD)); if (anCheckedFace.IsSame(aFace)) continue; - + if (aProcessed.Contains(anCheckedFace)) continue; - + if (IsSameDomain(aFace,anCheckedFace)) { - + if (aList.Extent() != 2) { // non mainfold case is not processed continue; } - + // replacing pcurves TopoDS_Face aMockUpFace; BRep_Builder B; B.MakeFace(aMockUpFace,aBaseSurface,aBaseLocation,0.); MovePCurves(aMockUpFace,anCheckedFace); - + if (AddOrdinaryEdges(edges,aMockUpFace,dummy)) { // sequence edges is modified i = dummy; } - + faces.Append(anCheckedFace); aProcessed.Add(anCheckedFace); break; } } } - + // all faces collected in the sequence. Perform union of faces if (faces.Length() > 1) { NbModif++; @@ -270,26 +284,26 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) BRep_Builder B; B.MakeFace(aResult,aBaseSurface,aBaseLocation,0); Standard_Integer nbWires = 0; - + // connecting wires while (edges.Length()>0) { - + Standard_Boolean isEdge3d = Standard_False; nbWires++; TopTools_MapOfShape aVertices; TopoDS_Wire aWire; B.MakeWire(aWire); - + TopoDS_Edge anEdge = TopoDS::Edge(edges(1)); edges.Remove(1); - + isEdge3d |= !BRep_Tool::Degenerated(anEdge); B.Add(aWire,anEdge); TopoDS_Vertex V1,V2; TopExp::Vertices(anEdge,V1,V2); aVertices.Add(V1); aVertices.Add(V2); - + Standard_Boolean isNewFound = Standard_False; do { isNewFound = Standard_False; @@ -307,10 +321,10 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) } } } while (isNewFound); - + // sorting any type of edges aWire = TopoDS::Wire(aContext->Apply(aWire)); - + TopoDS_Face tmpF = TopoDS::Face(aContext->Apply(faces(1).Oriented(TopAbs_FORWARD))); Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(aWire,tmpF,Precision::Confusion()); sfw->FixReorder(); @@ -357,7 +371,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) sawo.Add(c2d->Value(f).XY(),c2d->Value(l).XY()); } sawo.Perform(); - + // constructind one degenerative edge gp_XY aStart, anEnd, tmp; Standard_Integer nbFirst = sawo.Ordered(1); @@ -367,7 +381,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) TopoDS_Edge E = sbe.CopyReplaceVertices(anOrigE,aDummyV,aDummyV); sawo.XY(nbFirst,aStart,tmp); sawo.XY(sawo.Ordered(aLastEdge),tmp,anEnd); - + gp_XY aVec = anEnd-aStart; Handle(Geom2d_Line) aLine = new Geom2d_Line(aStart,gp_Dir2d(anEnd-aStart)); @@ -397,9 +411,9 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) sff.SetContext(aContext); // Applying the fixes sff.Perform(); - if(sff.Status(ShapeExtend_FAIL)) + if(sff.Status(ShapeExtend_FAIL)) hasFailed = Standard_True; - + // breaking down to several faces TopoDS_Shape theResult = aContext->Apply(aResult); for (TopExp_Explorer aFaceExp (theResult,TopAbs_FACE); aFaceExp.More(); aFaceExp.Next()) { @@ -408,38 +422,38 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) grid->SetValue ( 1, 1, aBaseSurface ); Handle(ShapeExtend_CompositeSurface) G = new ShapeExtend_CompositeSurface ( grid ); ShapeFix_ComposeShell CompShell; - CompShell.Init ( G, aBaseLocation, aCurrent, ::Precision::Confusion() );//myPrecision + CompShell.Init ( G, aBaseLocation, aCurrent, ::Precision::Confusion() );//myPrecision CompShell.SetContext( aContext ); - + TopTools_SequenceOfShape parts; ShapeFix_SequenceOfWireSegment wires; for(TopExp_Explorer W_Exp(aCurrent,TopAbs_WIRE);W_Exp.More();W_Exp.Next()) { - Handle(ShapeExtend_WireData) sbwd = + Handle(ShapeExtend_WireData) sbwd = new ShapeExtend_WireData ( TopoDS::Wire(W_Exp.Current() )); ShapeFix_WireSegment seg ( sbwd, TopAbs_REVERSED ); wires.Append(seg); } - + CompShell.DispatchWires ( parts,wires ); for (Standard_Integer j=1; j <= parts.Length(); j++ ) { ShapeFix_Face aFixOrient(TopoDS::Face(parts(j))); aFixOrient.SetContext(aContext); aFixOrient.FixOrientation(); } - + TopoDS_Shape CompRes; if ( faces.Length() !=1 ) { TopoDS_Shell S; B.MakeShell ( S ); - for ( i=1; i <= parts.Length(); i++ ) + for ( i=1; i <= parts.Length(); i++ ) B.Add ( S, parts(i) ); CompRes = S; } else CompRes = parts(1); - + aContext->Replace(aCurrent,CompRes); } - + // remove the remaining faces for(i = 2; i <= faces.Length(); i++) aContext->Remove(faces(i)); @@ -470,7 +484,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) sfw->SetMinTolerance(myTolerance); sfw->SetMaxTolerance(Max(1.,myTolerance*1000.)); sfw->SetFace(aFace); - for (TopoDS_Iterator iter (aFace,Standard_False); iter.More(); iter.Next()) { + for (TopoDS_Iterator iter (aFace,Standard_False); iter.More(); iter.Next()) { TopoDS_Wire wire = TopoDS::Wire(iter.Value()); sfw->Load(wire); sfw->FixReorder(); @@ -487,7 +501,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) //======================================================================= //function : IsSameDomain -//purpose : +//purpose : //======================================================================= Standard_Boolean BlockFix_UnionFaces::IsSameDomain(const TopoDS_Face& aFace, @@ -496,10 +510,10 @@ Standard_Boolean BlockFix_UnionFaces::IsSameDomain(const TopoDS_Face& aFace, //checking the same handless TopLoc_Location L1, L2; Handle(Geom_Surface) S1, S2; - + S1 = BRep_Tool::Surface(aFace,L1); S2 = BRep_Tool::Surface(aCheckedFace,L2); - + if (S1 == S2 && L1 == L2) return true; @@ -590,7 +604,7 @@ Standard_Boolean BlockFix_UnionFaces::IsSameDomain(const TopoDS_Face& aFace, //======================================================================= //function : MovePCurves -//purpose : +//purpose : //======================================================================= void BlockFix_UnionFaces::MovePCurves(TopoDS_Face& aTarget, @@ -598,17 +612,17 @@ void BlockFix_UnionFaces::MovePCurves(TopoDS_Face& aTarget, { BRep_Builder B; for(TopExp_Explorer wexp(aSource,TopAbs_WIRE);wexp.More();wexp.Next()) { - Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(wexp.Current()), + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(wexp.Current()), aTarget, Precision::Confusion()); sfw->FixReorder(); Standard_Boolean isReoredFailed = sfw->StatusReorder ( ShapeExtend_FAIL ); sfw->FixEdgeCurves(); if(isReoredFailed) continue; - + sfw->FixShifted(); sfw->FixDegenerated(); - + // remove degenerated edges from not degenerated points ShapeAnalysis_Edge sae; Handle(ShapeExtend_WireData) sewd = sfw->WireData(); @@ -619,7 +633,7 @@ void BlockFix_UnionFaces::MovePCurves(TopoDS_Face& aTarget, i--; } } - + TopoDS_Wire ResWire = sfw->Wire(); B.Add(aTarget,ResWire); } diff --git a/src/GEOMAlgo/BlockFix_UnionFaces.hxx b/src/GEOMAlgo/BlockFix_UnionFaces.hxx index 9cf0578d8..afe00c173 100644 --- a/src/GEOMAlgo/BlockFix_UnionFaces.hxx +++ b/src/GEOMAlgo/BlockFix_UnionFaces.hxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _BlockFix_UnionFaces_HeaderFile #define _BlockFix_UnionFaces_HeaderFile @@ -28,10 +28,6 @@ #ifndef _Standard_Boolean_HeaderFile #include #endif -class TopoDS_Shape; -class TopoDS_Face; - - #ifndef _Standard_HeaderFile #include #endif @@ -39,63 +35,55 @@ class TopoDS_Face; #include #endif -class BlockFix_UnionFaces { +class TopoDS_Shape; +class TopoDS_Face; +class BlockFix_UnionFaces +{ public: - - void* operator new(size_t,void* anAddress) - { - return anAddress; - } - void* operator new(size_t size) - { - return Standard::Allocate(size); - } - void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); - } - // Methods PUBLIC - // -Standard_EXPORT BlockFix_UnionFaces(); -Standard_EXPORT Standard_Real& GetTolerance() ; -Standard_EXPORT TopoDS_Shape Perform(const TopoDS_Shape& Shape) ; -Standard_EXPORT virtual Standard_Boolean IsSameDomain(const TopoDS_Face& aFace,const TopoDS_Face& aChekedFace) const; -Standard_EXPORT virtual void MovePCurves(TopoDS_Face& aTarget,const TopoDS_Face& aSource) const; - - - - - -protected: - - // Methods PROTECTED - // - - - // Fields PROTECTED - // - + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // + Standard_EXPORT BlockFix_UnionFaces(); + + Standard_EXPORT Standard_Real& GetTolerance(); + + /* \brief To get/set the OptimumNbFaces parameter + * + * If a being processed solid has less than OptimumNbFaces + * faces, no union will be performed. + * By default this parameter is set to 6 (to correctly + * process blocks - hexahedral solids) + * Special values: 0 - do all possible unions, regardless the faces quantity, + * negative - do not perform any unions, regardless the faces quantity. + * + */ + Standard_EXPORT Standard_Integer& GetOptimumNbFaces(); + + Standard_EXPORT TopoDS_Shape Perform(const TopoDS_Shape& Shape); + + Standard_EXPORT virtual Standard_Boolean IsSameDomain(const TopoDS_Face& aFace, + const TopoDS_Face& aChekedFace) const; + Standard_EXPORT virtual void MovePCurves(TopoDS_Face& aTarget, + const TopoDS_Face& aSource) const; private: - - // Methods PRIVATE - // - - - // Fields PRIVATE - // -Standard_Real myTolerance; - - + // Fields PRIVATE + // + Standard_Real myTolerance; + Standard_Integer myOptimumNbFaces; }; - - - - -// other Inline functions and methods (like "C++: function call" methods) -// - - #endif diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.cxx b/src/GEOMAlgo/GEOMAlgo_Tools.cxx index bad8a3c15..2556e1331 100644 --- a/src/GEOMAlgo/GEOMAlgo_Tools.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Tools.cxx @@ -286,41 +286,58 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1, gp_Pnt& aP2, IntTools_Context& aCtx) { - Standard_Boolean bIsDone=Standard_False; + Standard_Boolean bIsDone = Standard_False; Standard_Real aT2; TopAbs_ShapeEnum aType; // - aType=aS.ShapeType(); - switch(aType) { - case TopAbs_EDGE: { - const TopoDS_Edge& aE2=TopoDS::Edge(aS); - // - bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2); - if (!bIsDone) { - return bIsDone; + aType = aS.ShapeType(); + switch (aType) + { + case TopAbs_EDGE: + { + cout << "$$$ case TopAbs_EDGE" << endl; + const TopoDS_Edge& aE2 = TopoDS::Edge(aS); + // + if (BRep_Tool::Degenerated(aE2)) { // jfa + cout << "$$$ Degenerated" << endl; + return Standard_True; + } + else { + Standard_Real f, l; + Handle(Geom_Curve) aC3D = BRep_Tool::Curve (aE2, f, l); + if (aC3D.IsNull()) { + cout << "$$$ aC3D.IsNull()" << endl; + return Standard_True; + } + bIsDone = aCtx.ProjectPointOnEdge(aP1, aE2, aT2); + } + if (!bIsDone) { + cout << "$$$ !bIsDone" << endl; + return bIsDone; + } + // + GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2); } - // - GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2); - } break; // - case TopAbs_FACE: { - const TopoDS_Face& aF2=TopoDS::Face(aS); - GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2); - // - aProj.Perform(aP1); - bIsDone=aProj.IsDone(); - if (!bIsDone) { - return bIsDone; + case TopAbs_FACE: + { + const TopoDS_Face& aF2 = TopoDS::Face(aS); + GeomAPI_ProjectPointOnSurf& aProj = aCtx.ProjPS(aF2); + // + aProj.Perform(aP1); + bIsDone = aProj.IsDone(); + if (!bIsDone) { + return bIsDone; + } + // + aP2 = aProj.NearestPoint(); } - // - aP2=aProj.NearestPoint(); - } break; // default: break; // Err - } + } return bIsDone; } //======================================================================= diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 7a5d79788..eb6cd5a1c 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -3527,6 +3527,10 @@ Please, select face, shell or solid and try again GEOM_REMOVE_EXTRA_EDGES Object to remove extra edges + + GEOM_RMEE_UNION_FACES + Union faces, laying on common surface + REMOVE_EXTRA_EDGES_NEW_OBJ_NAME NoExtraEdges diff --git a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx index 7a98359ac..880661f70 100644 --- a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #include #include @@ -506,6 +506,7 @@ Standard_Integer GEOMImpl_BlockDriver::Execute(TFunction_Logbook& log) const // 1. Improve solids with seam and/or degenerated edges BlockFix_BlockFixAPI aTool; //aTool.Tolerance() = toler; + aTool.OptimumNbFaces() = aCI.GetOptimumNbFaces(); aTool.SetShape(aBlockOrComp); aTool.Perform(); diff --git a/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx b/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx index b6827133d..f618a2695 100644 --- a/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx @@ -19,8 +19,8 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -//NOTE: This is an interface to a function for the Blocks Multi-Transformations. -// +//NOTE: This is an interface to a functions for the Blocks Multi-Transformations and repairing + #include "GEOM_Function.hxx" #define TRSF_ORIGIN 1 @@ -32,6 +32,8 @@ #define TRSF_FACE_2_V 6 #define TRSF_NBITER_V 7 +#define TRSF_NB_FACES 8 + class GEOMImpl_IBlockTrsf { public: @@ -49,6 +51,8 @@ class GEOMImpl_IBlockTrsf void SetNbIterU (int theNbIter) { _func->SetInteger(TRSF_NBITER_U, theNbIter); } void SetNbIterV (int theNbIter) { _func->SetInteger(TRSF_NBITER_V, theNbIter); } + void SetOptimumNbFaces (int theNbFaces) { _func->SetInteger(TRSF_NB_FACES, theNbFaces); } + int GetFace1U () { return _func->GetInteger(TRSF_FACE_1_U); } int GetFace2U () { return _func->GetInteger(TRSF_FACE_2_U); } int GetFace1V () { return _func->GetInteger(TRSF_FACE_1_V); } @@ -56,6 +60,8 @@ class GEOMImpl_IBlockTrsf int GetNbIterU() { return _func->GetInteger(TRSF_NBITER_U); } int GetNbIterV() { return _func->GetInteger(TRSF_NBITER_V); } + int GetOptimumNbFaces() { return _func->GetInteger(TRSF_NB_FACES); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 590881408..b16bb8b79 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifdef WNT #pragma warning( disable:4786 ) #endif @@ -2309,7 +2309,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges - (Handle(GEOM_Object) theObject) + (Handle(GEOM_Object) theObject, + const Standard_Integer theOptimumNbFaces) { SetErrorCode(KO); @@ -2330,6 +2331,7 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges GEOMImpl_IBlockTrsf aTI (aFunction); aTI.SetOriginal(aLastFunction); + aTI.SetOptimumNbFaces(theOptimumNbFaces); //Compute the fixed shape try { @@ -2382,6 +2384,7 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::CheckAndImprove GEOMImpl_IBlockTrsf aTI (aFunction); aTI.SetOriginal(aLastFunction); + aTI.SetOptimumNbFaces(6); //Compute the fixed shape try { diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index 449c36f51..491a60613 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _GEOMImpl_IBlocksOperations_HXX_ #define _GEOMImpl_IBlocksOperations_HXX_ @@ -125,7 +125,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, const std::list& theErrors); - Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape); + Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, + const Standard_Integer theOptimumNbFaces = 6); Standard_EXPORT Handle(GEOM_Object) CheckAndImprove (Handle(GEOM_Object) theCompound); diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc index 9372c6698..08c2c2cdd 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -687,7 +687,9 @@ char* GEOM_IBlocksOperations_i::PrintBCErrors * RemoveExtraEdges */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape) +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges + (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theOptimumNbFaces) { GEOM::GEOM_Object_var aGEOMObject; @@ -699,8 +701,7 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges (GEOM::GEOM_Obj if (aShape.IsNull()) return aGEOMObject._retn(); //Get the result - Handle(GEOM_Object) anObject = - GetOperations()->RemoveExtraEdges(aShape); + Handle(GEOM_Object) anObject = GetOperations()->RemoveExtraEdges(aShape, theOptimumNbFaces); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index ff6480f8b..49e326ea1 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _GEOM_IBlocksOperations_i_HeaderFile #define _GEOM_IBlocksOperations_i_HeaderFile @@ -112,7 +112,8 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); - GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape); + GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theOptimumNbFaces); GEOM::GEOM_Object_ptr CheckAndImprove (GEOM::GEOM_Object_ptr theCompound); diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index b44e540ab..76d20811f 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -3407,12 +3407,16 @@ class geompyDC(GEOM._objref_GEOM_Gen): # Unite faces and edges, sharing one surface. It means that # this faces must have references to one C++ surface object (handle). # @param theShape The compound or single solid to remove irregular edges from. + # @param theOptimumNbFaces If more than zero, unite faces only for those solids, + # that have more than theOptimumNbFaces faces. If zero, unite faces always, + # regardsless their quantity in the solid. If negative (the default value), + # do not unite faces at all. For blocks repairing recommended value is 6. # @return Improved shape. # # @ref swig_RemoveExtraEdges "Example" - def RemoveExtraEdges(self,theShape): + def RemoveExtraEdges(self,theShape,theOptimumNbFaces=-1): # Example: see GEOM_TestOthers.py - anObj = self.BlocksOp.RemoveExtraEdges(theShape) + anObj = self.BlocksOp.RemoveExtraEdges(theShape,theOptimumNbFaces) RaiseIfFailed("RemoveExtraEdges", self.BlocksOp) return anObj diff --git a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx index 850926fe6..8d7be6e72 100644 --- a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx +++ b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.cxx @@ -22,7 +22,7 @@ // GEOM RepairGUI : GUI for Geometry component // File : RepairGUI_RemoveExtraEdgesDlg.cxx // Author : Michael Zorin, Open CASCADE S.A.S. -// + #include "RepairGUI_RemoveExtraEdgesDlg.h" #include @@ -63,12 +63,15 @@ RepairGUI_RemoveExtraEdgesDlg::RepairGUI_RemoveExtraEdgesDlg( GeometryGUI* theGe mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - GroupPoints = new DlgRef_1Sel( centralWidget() ); + GroupPoints = new DlgRef_1Sel1Check( centralWidget() ); + GroupPoints->GroupBox1->setTitle( tr( "GEOM_REMOVE_EXTRA_EDGES" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) ); GroupPoints->PushButton1->setIcon( image1 ); GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->CheckButton1->setText( tr( "GEOM_RMEE_UNION_FACES" ) ); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupPoints ); @@ -101,6 +104,8 @@ void RepairGUI_RemoveExtraEdgesDlg::Init() myOkObject = false; + GroupPoints->CheckButton1->setChecked( false ); + activateSelection(); mainFrame()->GroupBoxPublish->show(); @@ -278,11 +283,15 @@ bool RepairGUI_RemoveExtraEdgesDlg::isValid( QString& msg ) bool RepairGUI_RemoveExtraEdgesDlg::execute( ObjectList& objects ) { GEOM::GEOM_Object_var anObj; - - anObj = GEOM::GEOM_IBlocksOperations::_narrow( getOperation() )->RemoveExtraEdges( myObject ); - - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); + + int nbFacesOptimum = -1; // -1 means do not union faces + if (GroupPoints->CheckButton1->isChecked()) + nbFacesOptimum = 0; // 0 means union all faces, that possible + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->RemoveExtraEdges + (myObject, nbFacesOptimum); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); return true; } diff --git a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.h b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.h index ffc49ce26..80ad0511f 100644 --- a/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.h +++ b/src/RepairGUI/RepairGUI_RemoveExtraEdgesDlg.h @@ -19,16 +19,16 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// GEOM GEOMGUI : GUI for Geometry component +// GEOM GEOMGUI : GUI for Geometry component // File : RepairGUI_RemoveExtraEdgesDlg.h // Author : Michael ZORIN, Open CASCADE S.A.S. -// + #ifndef REPAIRGUI_REMOVEEXTRAEDGESDLG_H #define REPAIRGUI_REMOVEEXTRAEDGESDLG_H #include -class DlgRef_1Sel; +class DlgRef_1Sel1Check; //================================================================================= // class : RepairGUI_RemoveExtraEdgesDlg @@ -58,7 +58,7 @@ private: GEOM::GEOM_Object_var myObject; bool myOkObject; - DlgRef_1Sel* GroupPoints; + DlgRef_1Sel1Check* GroupPoints; private slots: void ClickOnOk(); -- 2.39.2