From b0f59ad9049932701d315cf9d430974106af7997 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 9 Oct 2014 18:34:57 +0400 Subject: [PATCH] 22745: [EDF] Improvement of Sewing operation --- .../examples/repairing_operations_ex06.py | 30 ++++--- doc/salome/gui/GEOM/images/neo-detect2.png | Bin 9935 -> 8954 bytes doc/salome/gui/GEOM/images/repair6.png | Bin 19236 -> 21267 bytes .../gui/GEOM/input/creating_3dsketcher.doc | 2 +- doc/salome/gui/GEOM/input/dependency_tree.doc | 2 +- doc/salome/gui/GEOM/input/import_export.doc | 8 +- .../gui/GEOM/input/managing_dimensions.doc | 2 +- .../gui/GEOM/input/sewing_operation.doc | 17 +++- idl/GEOM_Gen.idl | 8 +- src/GEOM/GEOM_PythonDump.cxx | 17 ++++ src/GEOM/GEOM_PythonDump.hxx | 5 +- src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 31 +++++-- src/GEOMImpl/GEOMImpl_IHealing.hxx | 9 +- src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 79 ++++++++++++------ src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 12 +-- src/GEOM_I/GEOM_IHealingOperations_i.cc | 63 ++++++++------ src/GEOM_I/GEOM_IHealingOperations_i.hh | 10 +-- src/GEOM_SWIG/geomBuilder.py | 44 ++++++---- src/RepairGUI/RepairGUI_FreeBoundDlg.cxx | 5 +- src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx | 5 +- src/RepairGUI/RepairGUI_SewingDlg.cxx | 34 ++++---- src/RepairGUI/RepairGUI_SewingDlg.h | 16 ++-- src/ShHealOper/ShHealOper_Sewing.cxx | 32 +++++-- 23 files changed, 287 insertions(+), 144 deletions(-) mode change 100755 => 100644 doc/salome/gui/GEOM/images/neo-detect2.png mode change 100755 => 100644 doc/salome/gui/GEOM/images/repair6.png diff --git a/doc/salome/examples/repairing_operations_ex06.py b/doc/salome/examples/repairing_operations_ex06.py index 8935962bf..5f6014e74 100644 --- a/doc/salome/examples/repairing_operations_ex06.py +++ b/doc/salome/examples/repairing_operations_ex06.py @@ -1,27 +1,26 @@ # Sewing -import salome +import salome, math salome.salome_init() -import GEOM from salome.geom import geomBuilder + geompy = geomBuilder.New(salome.myStudy) -import math -gg = salome.ImportComponentGUI("GEOM") +gg = salome.ImportComponentGUI("GEOM") # create base points px = geompy.MakeVertex(100., 0., 0.) py = geompy.MakeVertex(0., 100., 0.) pz = geompy.MakeVertex(0., 0., 100.) -# create base geometry 2D & 3D +# create base geometry 2D vector = geompy.MakeVector(px, py) -arc = geompy.MakeArc(py, pz, px) +arc = geompy.MakeArc(py, pz, px) # create base objects angle = 45. * math.pi / 180 -WantPlanarFace = 1 #True -wire = geompy.MakeWire([vector, arc]) -face = geompy.MakeFace(wire, WantPlanarFace) +WantPlanarFace = True +wire = geompy.MakeWire([vector, arc]) +face = geompy.MakeFace(wire, WantPlanarFace) face_rot = geompy.MakeRotation(face, vector, angle) # make sewing @@ -29,9 +28,9 @@ precision = 0.00001 sewing = geompy.MakeSewing([face, face_rot], precision) # add objects in the study -id_face = geompy.addToStudy(face, "Face") +id_face = geompy.addToStudy(face, "Face") id_face_rot = geompy.addToStudy(face_rot, "Face rotation") -id_sewing = geompy.addToStudy(sewing, "Sewing") +id_sewing = geompy.addToStudy(sewing, "Sewing") # display the results gg.createAndDisplayGO(id_face) @@ -40,3 +39,12 @@ gg.createAndDisplayGO(id_face_rot) gg.setDisplayMode(id_face_rot,1) gg.createAndDisplayGO(id_sewing) gg.setDisplayMode(id_sewing,1) + + +# Example 2: make a shell of a multiply translated face +quad = geompy.MakeFaceHW( 10, 20, 1 ) +quadCompound = geompy.MakeMultiTranslation1D( quad, geompy.MakeVectorDXDYDZ(1,0,0), 10, 3) +shell = geompy.Sew( quadCompound, 1e-6 ) + +id_shell = geompy.addToStudy( shell, "3 quads shell") +gg.createAndDisplayGO(id_shell) diff --git a/doc/salome/gui/GEOM/images/neo-detect2.png b/doc/salome/gui/GEOM/images/neo-detect2.png old mode 100755 new mode 100644 index 273d000f22761ed22225d8fe7a3c767de8a25f48..20608c452fafcbe02bc06b3704960fef09ac07d7 GIT binary patch literal 8954 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 M%Bsm!K;8uZ4{Zd8H2?qr literal 9935 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 diff --git a/doc/salome/gui/GEOM/images/repair6.png b/doc/salome/gui/GEOM/images/repair6.png old mode 100755 new mode 100644 index 1816e30ec5decf3d245b184cc5841fc486135835..666ea870844f582a1add58e86a21ee18d2bd1a00 GIT binary patch literal 21267 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 diff --git a/doc/salome/gui/GEOM/input/creating_3dsketcher.doc b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc index 030912ad6..b04c8aa65 100755 --- a/doc/salome/gui/GEOM/input/creating_3dsketcher.doc +++ b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc @@ -25,7 +25,7 @@ By Cartesian coordinates , which can be either: - \b Relative coordinates \b DX, \b DY and \b DZ with respect to the previous applied point, By Angular coordinates, which include: -- the \b Length of the segment and an \b Angle in the chosen plane (OXY for example) in \b Relative mode. The angle is then relative to a local coordinate system with the last point of the sketch as origin. +- the \b Length of the segment and an \b Angle in the chosen plane (OXY for example) in \b Relative mode. The angle is then relative to a local coordinate system with the last point of the sketch as origin. \image html 3dsketch_angle_rel.png diff --git a/doc/salome/gui/GEOM/input/dependency_tree.doc b/doc/salome/gui/GEOM/input/dependency_tree.doc index e44dba400..15a3a7639 100644 --- a/doc/salome/gui/GEOM/input/dependency_tree.doc +++ b/doc/salome/gui/GEOM/input/dependency_tree.doc @@ -103,7 +103,7 @@ Buttons marked with small downward triangles have extended functionality which can be accessed by locking on them with left mouse button. -\image tree_tool_bar +\image html tree_tool_bar.png Dump View - exports an object from the viewer in bmp, png or jpeg image format. diff --git a/doc/salome/gui/GEOM/input/import_export.doc b/doc/salome/gui/GEOM/input/import_export.doc index 93ddcc384..890ce97e6 100644 --- a/doc/salome/gui/GEOM/input/import_export.doc +++ b/doc/salome/gui/GEOM/input/import_export.doc @@ -25,8 +25,8 @@ Our TUI Scripts provide you with useful examples of the use of To import geometrical objects from a BREP, IGES, STEP or STL file: \par -From the \b File menu choose Import/, where is a name -of desirable format. In the Import dialog box select the file to import +From the \b File menu choose Import/\, where \ is a name +of desirable format. In the Import \ dialog box select the file to import and press \b Open. The file will be imported in the module and its contents (geometrical object) will be displayed in the Object Browser. @@ -63,8 +63,8 @@ file: \par Select the object you wish to export, then from the \b File menu choose -Export/, where is a name of desirable format. -In the Export dialog box define the name and the location +Export/\, where \ is a name of desirable format. +In the Export \ dialog box define the name and the location of the file to export and press \b Save. The dialog box to export the file can provide additional advanced parameters. diff --git a/doc/salome/gui/GEOM/input/managing_dimensions.doc b/doc/salome/gui/GEOM/input/managing_dimensions.doc index 13187978b..8b49f3ad1 100644 --- a/doc/salome/gui/GEOM/input/managing_dimensions.doc +++ b/doc/salome/gui/GEOM/input/managing_dimensions.doc @@ -18,7 +18,7 @@ It is possible to show/hide a dimension in the view by checking on/off the box t The buttons to the right of the list provide the following operations:

    -
  • "Add" - opens \ref add_dimension_page "Add Dimension" dialog to define a new fly-out.
  • +
  • "Add" - opens "Add Dimension" dialog to define a new fly-out.
  • "Remove" - removes the selected item from the list.
  • "Show All" / "Hide All" - shows/hides all dimensions existing in the list.
diff --git a/doc/salome/gui/GEOM/input/sewing_operation.doc b/doc/salome/gui/GEOM/input/sewing_operation.doc index 18d95e881..0008dc80a 100644 --- a/doc/salome/gui/GEOM/input/sewing_operation.doc +++ b/doc/salome/gui/GEOM/input/sewing_operation.doc @@ -2,9 +2,24 @@ \page sewing_operation_page Sewing +\b Sewing operation allows uniting several faces (possibly contained +in a shell, solid or compound) into one shell while geometrically +coincident (within a specified tolerance) edges (or parts of edges) of +different faces are replaced by one edge thus producing a shell of +faces with shared boundaries.

+This operation is similar to New Entity - > Build - > Shell +operation, the difference is that with \b Sewing you can specify the +tolerance and can get a non-manifold result.

+Possibility to create a non-manifold shell can be used e.g. to create a +shell forming several closed domains and then to create several solids +with shared boundaries from this shell. + +\note Geometrically coincident faces (or part of faces) won't be +replaced by one face during \b Sewing. + To produce a \b Sewing operation in the Main Menu select Repair - > Sewing. -The \b Result will be a \b GEOM_Object. +The \b Result will be a \b GEOM_Object (shell). \image html repair6.png diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 076f4fed4..01800986e 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3612,7 +3612,7 @@ module GEOM * \param theTolerance Required tolerance value. * \return New GEOM_Object, containing processed shape. */ - GEOM_Object Sew (in GEOM_Object theObject, in double theTolerance); + GEOM_Object Sew (in ListOfGO theObjects, in double theTolerance); /*! * Sewing of the given object. Allows non-manifold sewing. @@ -3620,7 +3620,7 @@ module GEOM * \param theTolerance Required tolerance value. * \return New GEOM_Object, containing processed shape. */ - GEOM_Object SewAllowNonManifold(in GEOM_Object theObject, in double theTolerance); + GEOM_Object SewAllowNonManifold(in ListOfGO theObjects, in double theTolerance); /*! * Rebuild the topology of theCompound of solids by removing @@ -3657,12 +3657,12 @@ module GEOM /*! * \brief Get a list of wires (wrapped in GEOM_Object-s), * that constitute a free boundary of the given shape. - * \param theObject Shape to get free boundary of. + * \param theObject Shapes to get free boundary of. * \param theClosedWires Output. Closed wires on the free boundary of the given shape. * \param theOpenWires Output. Open wires on the free boundary of the given shape. * \return FALSE, if an error(s) occured during the method execution. */ - boolean GetFreeBoundary (in GEOM_Object theObject, + boolean GetFreeBoundary (in ListOfGO theObjects, out ListOfGO theClosedWires, out ListOfGO theOpenWires); diff --git a/src/GEOM/GEOM_PythonDump.cxx b/src/GEOM/GEOM_PythonDump.cxx index 395a3ab72..2a2e498d8 100644 --- a/src/GEOM/GEOM_PythonDump.cxx +++ b/src/GEOM/GEOM_PythonDump.cxx @@ -140,6 +140,23 @@ namespace GEOM } return *this; } + Standard_EXPORT TPythonDump& + TPythonDump::operator<< (const std::list& theObjects) + { + Standard_Integer aLength = theObjects.size(); + if ( aLength > 1 ) { + myStream << "["; + } + std::list::const_iterator obj = theObjects.begin(); + for ( Standard_Integer i = 1; i <= aLength; i++, ++obj ) { + *this << *obj; + if ( i < aLength ) myStream << ", "; + } + if ( aLength > 1 ) { + myStream << "]"; + } + return *this; + } TPythonDump& TPythonDump::operator<< (const GEOM_BaseObject* theObject) { diff --git a/src/GEOM/GEOM_PythonDump.hxx b/src/GEOM/GEOM_PythonDump.hxx index 66b87506e..a9f20190d 100644 --- a/src/GEOM/GEOM_PythonDump.hxx +++ b/src/GEOM/GEOM_PythonDump.hxx @@ -30,6 +30,8 @@ #include +#include + namespace GEOM { class TPythonDump @@ -56,7 +58,8 @@ namespace GEOM Standard_EXPORT TPythonDump& operator<< (const TCollection_AsciiString theArg); Standard_EXPORT TPythonDump& operator<< (const TopAbs_ShapeEnum theArg); Standard_EXPORT TPythonDump& operator<< (const Handle(GEOM_BaseObject)& theObject); - Standard_EXPORT TPythonDump& operator<< (const Handle(TColStd_HSequenceOfTransient)& theObjects); + Standard_EXPORT TPythonDump& operator<< (const Handle(TColStd_HSequenceOfTransient)& objects); + Standard_EXPORT TPythonDump& operator<< (const std::list& theObjects); Standard_EXPORT TPythonDump& operator<< (const GEOM_BaseObject* theObject); }; diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index 09441ab23..0678df2c7 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -425,14 +425,33 @@ Standard_Boolean GEOMImpl_HealingDriver::RemoveHoles (GEOMImpl_IHealing* theHI, //function : Sew //purpose : //======================================================================= -Standard_Boolean GEOMImpl_HealingDriver::Sew (GEOMImpl_IHealing* theHI, +Standard_Boolean GEOMImpl_HealingDriver::Sew (GEOMImpl_IHealing* theHI, const TopoDS_Shape& theOriginalShape, - TopoDS_Shape& theOutShape, - Standard_Boolean isAllowNonManifold) const + TopoDS_Shape& theOutShape, + Standard_Boolean isAllowNonManifold) const { Standard_Real aTol = theHI->GetTolerance(); - ShHealOper_Sewing aHealer (theOriginalShape, aTol); + TopoDS_Compound faceCompound; + BRep_Builder builder; + builder.MakeCompound( faceCompound ); + + TopExp_Explorer faceExp( theOriginalShape, TopAbs_FACE ); + for ( ; faceExp.More(); faceExp.Next() ) + builder.Add( faceCompound, faceExp.Current() ); + + Handle(TColStd_HSequenceOfTransient) otherObjs = theHI->GetShapes(); + for ( int ind = 1; ind <= otherObjs->Length(); ind++) + { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(otherObjs->Value(ind)); + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) + Standard_NullObject::Raise("Null object given"); + for ( faceExp.Init( aShape, TopAbs_FACE ); faceExp.More(); faceExp.Next() ) + builder.Add( faceCompound, faceExp.Current() ); + } + + ShHealOper_Sewing aHealer (faceCompound, aTol); // Set non-manifold mode. aHealer.SetNonManifoldMode(isAllowNonManifold); @@ -606,7 +625,7 @@ void GEOMImpl_HealingDriver::FuseCollinearEdges (const TopoDS_Shape& theOriginal removeAll = true; if (!removeAll) { - for (unsigned int ind = 1; ind <= aVerts->Length(); ind++) { + for ( int ind = 1; ind <= aVerts->Length(); ind++) { Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aVerts->Value(ind)); TopoDS_Shape aShape_i = aRefShape->GetValue(); if (aShape_i.IsNull()) @@ -881,7 +900,7 @@ GetCreationInformation(std::string& theOperationName, case SEWING: case SEWING_NON_MANIFOLD: theOperationName = "SEWING"; - AddParam( theParams, "Selected shape", aCI.GetOriginal() ); + AddParam( theParams, "Selected shapes", aCI.GetOriginalAndShapes() ); AddParam( theParams, "Allow Non Manifold", ( aType == SEWING_NON_MANIFOLD )); AddParam( theParams, "Tolerance", aCI.GetTolerance() ); break; diff --git a/src/GEOMImpl/GEOMImpl_IHealing.hxx b/src/GEOMImpl/GEOMImpl_IHealing.hxx index 8fcbf3110..d21962155 100755 --- a/src/GEOMImpl/GEOMImpl_IHealing.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealing.hxx @@ -55,7 +55,7 @@ public: void SetValues( const Handle(TColStd_HArray1OfExtendedString)& arr ) { if ( !arr.IsNull() ) _func->SetStringArray(ARG_SHAPE_PROCESS_VALUES, arr); } Handle(TColStd_HArray1OfExtendedString) GetValues() { return _func->GetStringArray(ARG_SHAPE_PROCESS_VALUES); } - void SetOriginal( Handle(GEOM_Function)& f ) { _func->SetReference(ARG_ORIGINAL, f); } + void SetOriginal( Handle(GEOM_Function) f ) { _func->SetReference(ARG_ORIGINAL, f); } Handle(GEOM_Function) GetOriginal() { return _func->GetReference(ARG_ORIGINAL); } void SetFaces( const Handle(TColStd_HArray1OfInteger)& arr ) { if ( !arr.IsNull() ) _func->SetIntegerArray(ARG_LIST_ARGUMENTS, arr); } @@ -84,6 +84,13 @@ public: Handle(TColStd_HSequenceOfTransient) GetShapes() { return _func->GetReferenceList(ARG_LIST_SHAPES); } + Handle(TColStd_HSequenceOfTransient) GetOriginalAndShapes() + { + Handle(TColStd_HSequenceOfTransient) funs = GetShapes(); + if ( funs.IsNull() ) funs = new TColStd_HSequenceOfTransient; + funs->Prepend( GetOriginal() ); + return funs; + } private: Handle(GEOM_Function) _func; }; diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index b45374c45..fb04fd1cb 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -28,9 +28,7 @@ #include #include - #include - #include #include #include @@ -40,22 +38,20 @@ #include -#include "utilities.h" +#include #include #include +#include #include - #include - -#include -#include - #include #include #include - #include +#include +#include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -585,27 +581,36 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::FillHoles (Handle(GEOM_Object) * Sew */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObject, - double theTolerance, - bool isAllowNonManifold) +Handle(GEOM_Object) +GEOMImpl_IHealingOperations::Sew (std::list& theObjects, + double theTolerance, + bool isAllowNonManifold) { // set error code, check parameters SetErrorCode(KO); - if (theObject.IsNull()) + if (theObjects.empty()) return NULL; - Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); - if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + Handle(TColStd_HSequenceOfTransient) objects = new TColStd_HSequenceOfTransient; + std::list::iterator it = theObjects.begin(); + for (; it != theObjects.end(); it++) + { + Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL argument shape"); + return NULL; + } + objects->Append(aRefSh); + } // Add a new object Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); //Add the function int aFunctionType = (isAllowNonManifold ? SEWING_NON_MANIFOLD : SEWING); - - aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), aFunctionType); - + Handle(GEOM_Function) aFunction = + aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), aFunctionType); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly @@ -614,7 +619,8 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObj // prepare "data container" class IHealing GEOMImpl_IHealing HI(aFunction); HI.SetTolerance( theTolerance ); - HI.SetOriginal( aLastFunction ); + HI.SetOriginal( theObjects.front()->GetLastFunction() ); objects->Remove(1); + HI.SetShapes( objects ); //Compute the result try { @@ -634,7 +640,7 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObj //Make a Python command GEOM::TPythonDump pd(aFunction); - pd << aNewObject << " = geompy.Sew(" << theObject << ", " << theTolerance; + pd << aNewObject << " = geompy.Sew(" << theObjects << ", " << theTolerance; if (isAllowNonManifold) { pd << ", true"; @@ -835,19 +841,40 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::FuseCollinearEdgesWithinWire * GetFreeBoundary */ //============================================================================= -bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(GEOM_Object) theObject, +bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(TColStd_HSequenceOfTransient)& theObjects, Handle(TColStd_HSequenceOfTransient)& theClosed, Handle(TColStd_HSequenceOfTransient)& theOpen ) { // set error code, check parameters SetErrorCode(KO); - if ( theObject.IsNull() || theClosed.IsNull() || theOpen.IsNull() ) + if ( theObjects.IsNull() || theObjects->Length() == 0 || + theClosed.IsNull() || theOpen.IsNull() ) return false; - TopoDS_Shape aShape = theObject->GetValue(); - if ( aShape.IsNull() ) - return false; + TopoDS_Shape aShape; + TopTools_SequenceOfShape shapes; + for ( int ind = 1; ind <= theObjects->Length(); ind++) + { + Handle(GEOM_Object) aRefShape = Handle(GEOM_Object)::DownCast( theObjects->Value(ind)); + if ( aRefShape.IsNull() ) + return false; + aShape = aRefShape->GetValue(); + if ( aShape.IsNull() ) + return false; + shapes.Append( aShape ); + } + + if ( shapes.Length() > 1 ) + { + TopoDS_Compound compound; + BRep_Builder builder; + builder.MakeCompound( compound ); + for ( int i = 1; i <= shapes.Length(); ++i ) + builder.Add( compound, shapes( i ) ); + + aShape = compound; + } // get free boundary shapes @@ -906,7 +933,7 @@ bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(GEOM_Object) theObject pd << "empty_list"; } - pd << ") = geompy.GetFreeBoundary(" << theObject << ")"; + pd << ") = geompy.GetFreeBoundary(" << theObjects << ")"; } SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index 607ecc4b4..7dd25d87f 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -70,9 +70,9 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) FillHoles( Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theWires); - Standard_EXPORT Handle(GEOM_Object) Sew( Handle(GEOM_Object) theObject, - double theTolerance, - bool isAllowNonManifold); + Standard_EXPORT Handle(GEOM_Object) Sew( std::list & theObject, + double theTolerance, + bool isAllowNonManifold); Standard_EXPORT Handle(GEOM_Object) RemoveInternalFaces (Handle(GEOM_Object) theObject); @@ -88,9 +88,9 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { // this function does not use Function-Driver mechanism, it just computes the free // boundary edges and returns them in the sequence. It is called just for information reasons // and it's not intended for history/undo/redo/etc.. - Standard_EXPORT bool GetFreeBoundary ( Handle(GEOM_Object) theObject, - Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, - Handle(TColStd_HSequenceOfTransient)& theOutOpenWires ); + Standard_EXPORT bool GetFreeBoundary ( Handle(TColStd_HSequenceOfTransient)& theObjects, + Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, + Handle(TColStd_HSequenceOfTransient)& theOutOpenWires ); Standard_EXPORT Handle(GEOM_Object) ChangeOrientation( Handle(GEOM_Object) theObject); Standard_EXPORT Handle(GEOM_Object) ChangeOrientationCopy( Handle(GEOM_Object) theObject); diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc index af7cb5cd4..12cc00a51 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.cc +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -334,8 +334,8 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_pt * Sew */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theTolerance) +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (const GEOM::ListOfGO& theObjects, + CORBA::Double theTolerance) { GEOM::GEOM_Object_var aGEOMObject; @@ -346,14 +346,18 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO if (theTolerance < 0) return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = GetObjectImpl(theObject); - if (anObject.IsNull()) - return aGEOMObject._retn(); + //Get the shapes + std::list objects; + const int aLen = theObjects.length(); + for ( int ind = 0; ind < aLen; ind++) + { + Handle(GEOM_Object) aSh = GetObjectImpl(theObjects[ind]); + if (aSh.IsNull()) return aGEOMObject._retn(); + objects.push_back(aSh); + } // Perform - Handle(GEOM_Object) aNewObject = - GetOperations()->Sew( anObject, theTolerance, false ); + Handle(GEOM_Object) aNewObject = GetOperations()->Sew( objects, theTolerance, false ); if (!GetOperations()->IsDone() || aNewObject.IsNull()) return aGEOMObject._retn(); @@ -365,8 +369,9 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO * SewAllowNonManifold */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theTolerance) +GEOM::GEOM_Object_ptr +GEOM_IHealingOperations_i::SewAllowNonManifold (const GEOM::ListOfGO& theObjects, + CORBA::Double theTolerance) { GEOM::GEOM_Object_var aGEOMObject; @@ -377,14 +382,18 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM if (theTolerance < 0) return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = GetObjectImpl(theObject); - if (anObject.IsNull()) - return aGEOMObject._retn(); + //Get the shapes + std::list objects; + const int aLen = theObjects.length(); + for ( int ind = 0; ind < aLen; ind++) + { + Handle(GEOM_Object) aSh = GetObjectImpl(theObjects[ind]); + if (aSh.IsNull()) return aGEOMObject._retn(); + objects.push_back(aSh); + } // Perform - Handle(GEOM_Object) aNewObject = - GetOperations()->Sew( anObject, theTolerance, true ); + Handle(GEOM_Object) aNewObject = GetOperations()->Sew( objects, theTolerance, true ); if (!GetOperations()->IsDone() || aNewObject.IsNull()) return aGEOMObject._retn(); @@ -491,9 +500,10 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FuseCollinearEdgesWithinWire * GetFreeBoundary */ //============================================================================= -CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_ptr theObject, - GEOM::ListOfGO_out theClosedWires, - GEOM::ListOfGO_out theOpenWires ) +CORBA::Boolean +GEOM_IHealingOperations_i::GetFreeBoundary ( const GEOM::ListOfGO & theObjects, + GEOM::ListOfGO_out theClosedWires, + GEOM::ListOfGO_out theOpenWires ) { theClosedWires = new GEOM::ListOfGO; theOpenWires = new GEOM::ListOfGO; @@ -501,14 +511,19 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt // Set a not done flag GetOperations()->SetNotDone(); - // Get the object itself - Handle(GEOM_Object) anObject = GetObjectImpl(theObject); - if (anObject.IsNull()) - return false; + // Get the objects + Handle(TColStd_HSequenceOfTransient) anObjects = new TColStd_HSequenceOfTransient(); + for ( size_t i = 0; i < theObjects.length(); ++i ) + { + Handle(GEOM_Object) anObject = GetObjectImpl(theObjects[i]); + if (anObject.IsNull()) + return false; + anObjects->Append( anObject ); + } Handle(TColStd_HSequenceOfTransient) aClosed = new TColStd_HSequenceOfTransient(); Handle(TColStd_HSequenceOfTransient) anOpen = new TColStd_HSequenceOfTransient(); - bool res = GetOperations()->GetFreeBoundary( anObject, aClosed, anOpen ); + bool res = GetOperations()->GetFreeBoundary( anObjects, aClosed, anOpen ); if ( !GetOperations()->IsDone() || !res ) return false; diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.hh b/src/GEOM_I/GEOM_IHealingOperations_i.hh index 8b30c9530..2e2f8c665 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.hh +++ b/src/GEOM_I/GEOM_IHealingOperations_i.hh @@ -72,10 +72,10 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i : GEOM::GEOM_Object_ptr FillHoles (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires); - GEOM::GEOM_Object_ptr Sew (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr Sew (const GEOM::ListOfGO & theObject, CORBA::Double theTolerance); - GEOM::GEOM_Object_ptr SewAllowNonManifold (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr SewAllowNonManifold (const GEOM::ListOfGO & theObject, CORBA::Double theTolerance); GEOM::GEOM_Object_ptr RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound); @@ -88,9 +88,9 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i : GEOM::GEOM_Object_ptr FuseCollinearEdgesWithinWire (GEOM::GEOM_Object_ptr theWire, const GEOM::ListOfGO& theVertices); - CORBA::Boolean GetFreeBoundary(GEOM::GEOM_Object_ptr theObject, - GEOM::ListOfGO_out theClosedWires, - GEOM::ListOfGO_out theOpenWires ); + CORBA::Boolean GetFreeBoundary(const GEOM::ListOfGO& theObjects, + GEOM::ListOfGO_out theClosedWires, + GEOM::ListOfGO_out theOpenWires ); GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theObject); GEOM::GEOM_Object_ptr ChangeOrientationCopy (GEOM::GEOM_Object_ptr theObject); diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index c0cd25a60..e3e6a2cf4 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -517,6 +517,14 @@ def EnumToLong(theItem): if hasattr(theItem, "_v"): ret = theItem._v return ret +## Pack an argument into a list +def ToList( arg ): + if isinstance( arg, list ): + return arg + if hasattr( arg, "__getitem__" ): + return list( arg ) + return [ arg ] + ## Information about closed/unclosed state of shell or wire # @ingroup l1_geomBuilder_auxiliary class info: @@ -4518,7 +4526,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created shell. """ # Example: see GEOM_TestAll.py - anObj = self.ShapesOp.MakeShell(theFacesAndShells) + anObj = self.ShapesOp.MakeShell( ToList( theFacesAndShells )) RaiseIfFailed("MakeShell", self.ShapesOp) self._autoPublish(anObj, theName, "shell") return anObj @@ -6298,7 +6306,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "suppressFaces") return anObj - ## Sewing of some shapes into single shape. + ## Sewing of faces into a single shell. # @param ListShape Shapes to be processed. # @param theTolerance Required tolerance value. # @param AllowNonManifold Flag that allows non-manifold sewing. @@ -6306,12 +6314,12 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. # - # @return New GEOM.GEOM_Object, containing processed shape. + # @return New GEOM.GEOM_Object, containing a result shell. # # @ref tui_sewing "Example" def MakeSewing(self, ListShape, theTolerance, AllowNonManifold=False, theName=None): """ - Sewing of some shapes into single shape. + Sewing of faces into a single shell. Parameters: ListShape Shapes to be processed. @@ -6322,30 +6330,29 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): publication is switched on, default value is used for result name. Returns: - New GEOM.GEOM_Object, containing processed shape. + New GEOM.GEOM_Object, containing containing a result shell. """ # Example: see GEOM_TestHealing.py - comp = self.MakeCompound(ListShape) # note: auto-publishing is done in self.Sew() - anObj = self.Sew(comp, theTolerance, AllowNonManifold, theName) + anObj = self.Sew(ListShape, theTolerance, AllowNonManifold, theName) return anObj - ## Sewing of the given object. - # @param theObject Shape to be processed. + ## Sewing of faces into a single shell. + # @param ListShape Shapes to be processed. # @param theTolerance Required tolerance value. # @param AllowNonManifold Flag that allows non-manifold sewing. # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. # - # @return New GEOM.GEOM_Object, containing processed shape. + # @return New GEOM.GEOM_Object, containing a result shell. @ManageTransactions("HealOp") - def Sew(self, theObject, theTolerance, AllowNonManifold=False, theName=None): + def Sew(self, ListShape, theTolerance, AllowNonManifold=False, theName=None): """ - Sewing of the given object. + Sewing of faces into a single shell. Parameters: - theObject Shape to be processed. + ListShape Shapes to be processed. theTolerance Required tolerance value. AllowNonManifold Flag that allows non-manifold sewing. theName Object name; when specified, this parameter is used @@ -6353,17 +6360,18 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): publication is switched on, default value is used for result name. Returns: - New GEOM.GEOM_Object, containing processed shape. + New GEOM.GEOM_Object, containing a result shell. """ # Example: see MakeSewing() above theTolerance,Parameters = ParseParameters(theTolerance) if AllowNonManifold: - anObj = self.HealOp.SewAllowNonManifold(theObject, theTolerance) + anObj = self.HealOp.SewAllowNonManifold( ToList( ListShape ), theTolerance) else: - anObj = self.HealOp.Sew(theObject, theTolerance) + anObj = self.HealOp.Sew( ToList( ListShape ), theTolerance) # To avoid script failure in case of good argument shape + # (Fix of test cases geom/bugs11/L7,L8) if self.HealOp.GetErrorCode() == "ShHealOper_NotError_msg": - return theObject + return anObj RaiseIfFailed("Sew", self.HealOp) anObj.SetParameters(Parameters) self._autoPublish(anObj, theName, "sewed") @@ -6688,7 +6696,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): theOpenWires: Open wires on the free boundary of the given shape. """ # Example: see GEOM_TestHealing.py - anObj = self.HealOp.GetFreeBoundary(theObject) + anObj = self.HealOp.GetFreeBoundary( ToList( theObject )) RaiseIfFailed("GetFreeBoundary", self.HealOp) self._autoPublish(anObj[1], theName, "closedWire") self._autoPublish(anObj[2], theName, "openWire") diff --git a/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx b/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx index 4bb57553f..08ff45edf 100644 --- a/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx +++ b/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx @@ -261,8 +261,11 @@ bool RepairGUI_FreeBoundDlg::execute (ObjectList& objects) { GEOM::ListOfGO_var aClosed, anOpen; + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length(1); + objList[0] = myObj; GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); - bool result = anOper->GetFreeBoundary(myObj, aClosed, anOpen); + bool result = anOper->GetFreeBoundary(objList, aClosed, anOpen); if (result) { myNbClosed = aClosed->length(); diff --git a/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx b/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx index 6206da990..56b5aa004 100644 --- a/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx +++ b/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx @@ -330,8 +330,11 @@ bool RepairGUI_RemoveHolesDlg::execute (ObjectList& objects) // highlight them (add to objects), display message dialog GEOM::ListOfGO_var aClosed, anOpen; + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length(1); + objList[0] = myObject; GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); - aResult = anOper->GetFreeBoundary(myObject, aClosed, anOpen); + aResult = anOper->GetFreeBoundary(objList, aClosed, anOpen); if (aResult) { myClosed = aClosed->length(); diff --git a/src/RepairGUI/RepairGUI_SewingDlg.cxx b/src/RepairGUI/RepairGUI_SewingDlg.cxx index 34cc7ddb6..e26f26157 100644 --- a/src/RepairGUI/RepairGUI_SewingDlg.cxx +++ b/src/RepairGUI/RepairGUI_SewingDlg.cxx @@ -117,7 +117,7 @@ void RepairGUI_SewingDlg::Init() /* init variables */ myEditCurrentArgument = GroupPoints->LineEdit1; - myObject = GEOM::GEOM_Object::_nil(); + myObjects.clear(); //myGeomGUI->SetState( 0 ); initSelection(); @@ -166,7 +166,7 @@ bool RepairGUI_SewingDlg::ClickOnApply() initName(); GroupPoints->LineEdit1->setText( "" ); - myObject = GEOM::GEOM_Object::_nil(); + myObjects.clear(); initSelection(); @@ -182,17 +182,13 @@ void RepairGUI_SewingDlg::SelectionIntoArgument() { erasePreview(); myEditCurrentArgument->setText( "" ); - myObject = GEOM::GEOM_Object::_nil(); + myObjects.clear(); - LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); - SALOME_ListIO aSelList; - aSelMgr->selectedObjects(aSelList); + myObjects = getSelected( TopAbs_SHAPE, -1 ); - if ( aSelList.Extent() == 1 ) { - Handle(SALOME_InteractiveObject) anIO = aSelList.First(); - myObject = GEOMBase::ConvertIOinGEOMObject( anIO ); - if ( !CORBA::is_nil( myObject ) ) - myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + if ( !myObjects.isEmpty() ) { + QString aName = myObjects.count() > 1 ? QString( "%1_objects").arg( myObjects.count() ) : GEOMBase::GetName( myObjects[0].get() ); + myEditCurrentArgument->setText( aName ); } } @@ -235,7 +231,7 @@ void RepairGUI_SewingDlg::ActivateThisDialog() SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); GroupPoints->LineEdit1->setText( "" ); - myObject = GEOM::GEOM_Object::_nil(); + myObjects.clear(); myClosed = -1; myOpen = -1; @@ -273,7 +269,7 @@ bool RepairGUI_SewingDlg::isValid( QString& msg ) { myClosed = -1; bool ok = myTolEdt->isValid( msg, !IsPreview() ); - return !myObject->_is_nil() && ( IsPreview() || myTolEdt->value() > 0. ) && ok; + return !myObjects.isEmpty() && ( IsPreview() || myTolEdt->value() > 0. ) && ok; } //================================================================================= @@ -285,10 +281,15 @@ bool RepairGUI_SewingDlg::execute( ObjectList& objects ) bool aResult = false; GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow( getOperation() ); + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( myObjects.count() ); + for ( int i = 0; i < myObjects.count(); ++i ) + objList[i] = myObjects[i].copy(); + if ( IsPreview() ) { // called from onDetect(): detect free boundary edges, highlight them (add to objects), display message dialog GEOM::ListOfGO_var aClosed, anOpen; - aResult = anOper->GetFreeBoundary( myObject, aClosed, anOpen ); + aResult = anOper->GetFreeBoundary( objList, aClosed, anOpen ); if ( aResult ) { myClosed = aClosed->length(); @@ -306,9 +307,9 @@ bool RepairGUI_SewingDlg::execute( ObjectList& objects ) GEOM::GEOM_Object_var anObj; if (myAllowNonManifoldChk->isChecked()) { - anObj = anOper->SewAllowNonManifold( myObject, myTolEdt->value() ); + anObj = anOper->SewAllowNonManifold( objList, myTolEdt->value() ); } else { - anObj = anOper->Sew( myObject, myTolEdt->value() ); + anObj = anOper->Sew( objList, myTolEdt->value() ); } aResult = !anObj->_is_nil(); @@ -334,6 +335,7 @@ bool RepairGUI_SewingDlg::execute( ObjectList& objects ) void RepairGUI_SewingDlg::initSelection() { TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_FACE ); aTypes.Add( GEOM_SHELL ); aTypes.Add( GEOM_SOLID ); aTypes.Add( GEOM_COMPOUND ); diff --git a/src/RepairGUI/RepairGUI_SewingDlg.h b/src/RepairGUI/RepairGUI_SewingDlg.h index 264a9b6e7..f1945009c 100644 --- a/src/RepairGUI/RepairGUI_SewingDlg.h +++ b/src/RepairGUI/RepairGUI_SewingDlg.h @@ -42,7 +42,7 @@ class RepairGUI_SewingDlg : public GEOMBase_Skeleton { Q_OBJECT -public: + public: RepairGUI_SewingDlg( GeometryGUI*, QWidget* = 0, bool = false ); ~RepairGUI_SewingDlg(); @@ -51,33 +51,33 @@ protected: virtual GEOM::GEOM_IOperations_ptr createOperation(); virtual bool isValid( QString& ); virtual bool execute( ObjectList& ); - + private: void Init(); void enterEvent( QEvent* ); void initSelection(); private: - GEOM::GEOM_Object_var myObject; + QList myObjects; DlgRef_1SelExt* GroupPoints; QCheckBox* myAllowNonManifoldChk; SalomeApp_DoubleSpinBox* myTolEdt; QPushButton* myFreeBoundBtn; - + int myClosed; // Number of free closed boundaries detected. Calculated in execute(), used in onDetect(). int myOpen; // Number of free open boundaries detected. Calculated in execute(), used in onDetect(). - + private slots: void ClickOnOk(); bool ClickOnApply(); - + void ActivateThisDialog(); - + void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); - + void onDetect(); }; diff --git a/src/ShHealOper/ShHealOper_Sewing.cxx b/src/ShHealOper/ShHealOper_Sewing.cxx index 183b17a46..156808c15 100644 --- a/src/ShHealOper/ShHealOper_Sewing.cxx +++ b/src/ShHealOper/ShHealOper_Sewing.cxx @@ -248,15 +248,31 @@ Standard_Boolean ShHealOper_Sewing::getModifications(const TopoDS_Shape& theShap Standard_Boolean ShHealOper_Sewing::isSewed(const TopoDS_Shape& theShape) const { - Standard_Integer nbNewShells =0; - Standard_Integer nbOldShells =0; - TopExp_Explorer aExpShells(theShape,TopAbs_SHELL); - for( ; aExpShells.More(); aExpShells.Next()) - nbNewShells++; - for( aExpShells.Init(myInitShape,TopAbs_SHELL); aExpShells.More(); aExpShells.Next()) - nbOldShells++; - return (nbNewShells != nbOldShells); + // Standard_Integer nbNewShells =0; + // Standard_Integer nbOldShells =0; + // TopExp_Explorer aExpShells(theShape,TopAbs_SHELL); + // for( ; aExpShells.More(); aExpShells.Next()) + // nbNewShells++; + // for( aExpShells.Init(myInitShape,TopAbs_SHELL); aExpShells.More(); aExpShells.Next()) + // nbOldShells++; + // return (nbNewShells != nbOldShells); + + // EAP, 22745: [EDF] Improvement of Sewing operation + // now myInitShape is ALWAYS a compound of faces -> no shells + int nbNew = 0, nbOld = 0; + TopExp_Explorer exp; + for ( exp.Init( theShape, TopAbs_VERTEX ); exp.More(); exp.Next() ) ++nbNew; + for ( exp.Init( myInitShape, TopAbs_VERTEX ); exp.More(); exp.Next() ) ++nbOld; + if ( nbNew != nbOld ) + return true; + for ( exp.Init( theShape, TopAbs_EDGE ); exp.More(); exp.Next() ) ++nbNew; + for ( exp.Init( myInitShape, TopAbs_EDGE ); exp.More(); exp.Next() ) ++nbOld; + if ( nbNew != nbOld ) + return true; + + return false; } + //======================================================================= //function : deleteFreeEdges //purpose : -- 2.39.2