From 8fe997ae8897c5945c15e276f82f143dbdfb9321 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 14 Jun 2013 12:20:21 +0000 Subject: [PATCH] Mantis issue 0021934: Delete the internal faces of an object --- doc/salome/examples/Makefile.am | 1 + .../examples/repairing_operations_ex12.py | 26 ++ doc/salome/gui/GEOM/images/remove_webs.png | Bin 0 -> 22004 bytes .../gui/GEOM/input/remove_webs_operation.doc | 27 ++ .../gui/GEOM/input/repairing_operations.doc | 3 + .../GEOM/input/tui_repairing_operations.doc | 4 + idl/GEOM_Gen.idl | 8 + resources/Makefile.am | 3 +- resources/remove_webs.png | Bin 0 -> 859 bytes src/GEOMGUI/GEOM_images.ts | 8 + src/GEOMGUI/GEOM_msg_en.ts | 28 +- src/GEOMGUI/GEOM_msg_fr.ts | 28 +- src/GEOMGUI/GeometryGUI.cxx | 3 + src/GEOMGUI/GeometryGUI_Operations.h | 1 + src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 33 ++ src/GEOMImpl/GEOMImpl_HealingDriver.hxx | 1 + src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 61 +++- src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 2 + src/GEOMImpl/GEOMImpl_Types.hxx | 5 +- src/GEOM_I/GEOM_IHealingOperations_i.cc | 25 ++ src/GEOM_I/GEOM_IHealingOperations_i.hh | 2 + src/GEOM_SWIG/GEOM_TestHealing.py | 20 ++ src/GEOM_SWIG/geomBuilder.py | 30 ++ src/RepairGUI/Makefile.am | 6 +- src/RepairGUI/RepairGUI.cxx | 2 + src/RepairGUI/RepairGUI_RemoveWebsDlg.cxx | 296 ++++++++++++++++++ src/RepairGUI/RepairGUI_RemoveWebsDlg.h | 70 +++++ 27 files changed, 677 insertions(+), 16 deletions(-) create mode 100644 doc/salome/examples/repairing_operations_ex12.py create mode 100644 doc/salome/gui/GEOM/images/remove_webs.png create mode 100644 doc/salome/gui/GEOM/input/remove_webs_operation.doc create mode 100644 resources/remove_webs.png create mode 100755 src/RepairGUI/RepairGUI_RemoveWebsDlg.cxx create mode 100755 src/RepairGUI/RepairGUI_RemoveWebsDlg.h diff --git a/doc/salome/examples/Makefile.am b/doc/salome/examples/Makefile.am index 171c03674..211c7932e 100644 --- a/doc/salome/examples/Makefile.am +++ b/doc/salome/examples/Makefile.am @@ -99,6 +99,7 @@ GOOD_TESTS = \ repairing_operations_ex08.py \ repairing_operations_ex10.py \ repairing_operations_ex11.py \ + repairing_operations_ex12.py \ sketcher.py \ tolerance.py \ topological_geom_objs_ex01.py \ diff --git a/doc/salome/examples/repairing_operations_ex12.py b/doc/salome/examples/repairing_operations_ex12.py new file mode 100644 index 000000000..80a814a30 --- /dev/null +++ b/doc/salome/examples/repairing_operations_ex12.py @@ -0,0 +1,26 @@ +# Remove internal(shared) faces from a compound + +import salome +salome.salome_init() +import GEOM +from salome.geom import geomBuilder +geompy = geomBuilder.New(salome.myStudy) + +# create solids with some coincident faces +Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) +Translation_1 = geompy.MakeTranslation(Box_1, 200, 0, 0) +Translation_2 = geompy.MakeTranslation(Box_1, 200, 200, 0) + +geompy.addToStudy(Box_1, 'Box_1') +geompy.addToStudy(Translation_1, 'Translation_1') +geompy.addToStudy(Translation_2, 'Translation_2') + +# partition three solids to obtain shared faces +Partition_1 = geompy.MakePartition([Box_1, Translation_1, Translation_2]) +geompy.addToStudy(Partition_1, 'Partition_1') + +# remove shared faces to obtain one solid instead of three +Joined_1 = geompy.RemoveInternalFaces(Partition_1) +geompy.addToStudy(Joined_1, 'Joined_1') + +salome.sg.updateObjBrowser(1) diff --git a/doc/salome/gui/GEOM/images/remove_webs.png b/doc/salome/gui/GEOM/images/remove_webs.png new file mode 100644 index 0000000000000000000000000000000000000000..951f5a5c5cf15596f3b527cc6100f8f590e0fb0d GIT binary patch literal 22004 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 internal faces in the Main Menu select +Repair - > Remove internal faces. + +\n This operation removes all shared faces from a compound to obtain +one or more bigger solids from the set of smaller solids. + +\image html remove_webs.png + +\n Arguments: Name + one shape. +\n Advanced option: + \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". + +\note Only shared faces will be removed. Coincident but not shared +faces will stay as is, use GlueFaces or MakePartition before +RemoveInternalFaces if you need to remove them. + +\n TUI Command: geompy.RemoveInternalFaces(theCompound), +where theCompound is a compound of solids. + +\n Our TUI Scripts provide you with useful examples of the +\ref tui_remove_webs "Remove Internal Faces" functionality usage. + +*/ diff --git a/doc/salome/gui/GEOM/input/repairing_operations.doc b/doc/salome/gui/GEOM/input/repairing_operations.doc index cf0239a6f..4cbb1ed1b 100644 --- a/doc/salome/gui/GEOM/input/repairing_operations.doc +++ b/doc/salome/gui/GEOM/input/repairing_operations.doc @@ -25,6 +25,9 @@ to set new tolerance value for the given shape. splits an edge in two.
  • \subpage change_orientation_operation_page "Change orientation" - reverses the normals of the selected faces.
  • +
  • \subpage remove_webs_operation_page "Remove internal faces" - +rebuilds the topology of a compound of solids by removing of the faces +that are shared by several solids.
  • \subpage remove_extra_edges_operation_page "Remove extra edges" - removes seam and degenerated edges from the given shape.
  • \subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" - diff --git a/doc/salome/gui/GEOM/input/tui_repairing_operations.doc b/doc/salome/gui/GEOM/input/tui_repairing_operations.doc index 711800caa..b883afe8a 100644 --- a/doc/salome/gui/GEOM/input/tui_repairing_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_repairing_operations.doc @@ -46,4 +46,8 @@

    Fuse Collinear Edges within a Wire

    \tui_script{repairing_operations_ex11.py} +\anchor tui_remove_webs +

    Remove internal(shared) faces

    +\tui_script{repairing_operations_ex12.py} + */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index edfbc0d77..2ed2f671c 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3331,6 +3331,14 @@ module GEOM */ GEOM_Object SewAllowNonManifold(in GEOM_Object theObject, in double theTolerance); + /*! + * Rebuild the topology of theCompound of solids by removing + * of the faces that are shared by several solids. + * \param theCompound Shape to be processed. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object RemoveInternalFaces (in GEOM_Object theCompound); + /*! * \brief Addition of a point to a given edge object. * \param theObject Shape to be processed. diff --git a/resources/Makefile.am b/resources/Makefile.am index ee3fe1bff..b36757b3b 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -239,8 +239,9 @@ propagate.png \ redo.png \ undo.png \ glue2.png \ +remove_webs.png \ remove_extra_edges.png \ -union_faces.png \ +union_faces.png \ coordsys.png \ translation.png diff --git a/resources/remove_webs.png b/resources/remove_webs.png new file mode 100644 index 0000000000000000000000000000000000000000..80b4b4758f7e1f74a85266685128026b0ea97882 GIT binary patch literal 859 zcmV-h1ElPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2i*n^ z3JNsaC%!8H00P@dL_t(I%dM14Xq{CM$A4cFZy#2YZZt%6p)JN$A5^L$#f7CJBDXen z5wJFJg_hDlT?k6)!a@j^v|Wkq!UqU~P*JfeTCku9<*Kw8a8sxVh6IBBa=+Jk%^VlG zx#T8USjfO|4h-|-|L4q^B*w^E#yZwG)*RTocuA6^tI%jPB7lf=QdJ2dP*oLWS<-5? zNYj+LxjE7_O}c=~VGr*arq(xrmxzcW8arv6P`N;10$0WlkftfXqrl7x%cG;CaoheA zI3E@oZJ@A$+yqJ+D2yjJo~-m-89%_Tqn|9cJ`W6ZDI6IYiCg!N;et{cPtW>*b%GZ~ zB%(1ABvQG+H{*4lIQ}WV$`{+W0-KY?v8mVVv8Sg8RmC|+S(ap3Mo|T1q2695f4vCS(t7DZzW(ZM z0Op^)kI#4)uS%uLBS5Ljn?tXlu3~U-km>2^ZeUrKL}S2OVmmuE5d?6m#eIF`<1_NAY{+~aQ;D{mJoZhr9t>o;$qcJCGd?%C8wZBsvgU%$-k?CiA_ z3R|rf-sIf*>n2aX-ay>^f*lDEl^q9PK&6Fx1Aw@STR(mPa1F?T86fWfV~qTJ`*$|> z58{e>#8-&7LICON_DLG_CHANGE_DIRECTION change_direction.png + + ICON_DLG_REMOVE_WEBS + remove_webs.png + ICON_DLG_REMOVE_EXTRA_EDGES remove_extra_edges.png @@ -1015,6 +1019,10 @@ ICO_PLANE plane.png + + ICO_REMOVE_WEBS + remove_webs.png + ICO_REMOVE_EXTRA_EDGES remove_extra_edges.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 0c5eef603..a9fd206ed 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1576,10 +1576,6 @@ Please, select face, shell or solid and try again GEOM_REMOVE_INTERNAL_WIRES_TITLE Suppress internal wires - - GEOM_REMOVE_WEBS - Remove webs - GEOM_REQUIRED_DEGREE Required degree @@ -4508,6 +4504,30 @@ Please, select face, shell or solid and try again GEOM_CENTER_2POINTS Center and two points + + GEOM_REMOVE_WEBS_TITLE + Remove internal faces + + + GEOM_REMOVE_WEBS + Compound of solids + + + REMOVE_WEBS_NEW_OBJ_NAME + NoInternalFaces + + + TOP_REMOVE_WEBS + Remove internal faces + + + MEN_REMOVE_WEBS + Remove Internal Faces + + + STB_REMOVE_WEBS + Remove internal faces + GEOM_REMOVE_EXTRA_EDGES_TITLE Remove extra edges diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 677b77742..2a5a9ce62 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -1574,10 +1574,6 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_REMOVE_INTERNAL_WIRES_TITLE Supprimer les contours internes - - GEOM_REMOVE_WEBS - Supprimer les toiles - GEOM_REQUIRED_DEGREE Degré nécessaire @@ -4506,6 +4502,30 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_CENTER_2POINTS Centre et deux points + + GEOM_REMOVE_WEBS_TITLE + Remove internal faces + + + GEOM_REMOVE_WEBS + Compound of solids + + + REMOVE_WEBS_NEW_OBJ_NAME + NoInternalFaces + + + TOP_REMOVE_WEBS + Remove internal faces + + + MEN_REMOVE_WEBS + Remove Internal Faces + + + STB_REMOVE_WEBS + Remove internal faces + GEOM_REMOVE_EXTRA_EDGES_TITLE Supprimer les arêtes inutiles diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 19f277735..4404927c4 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -542,6 +542,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE + case GEOMOp::OpRemoveWebs: // MENU REPAIR - REMOVE INTERNAL FACES case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES @@ -823,6 +824,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpFreeBoundaries, "CHECK_FREE_BNDS" ); createGeomAction( GEOMOp::OpFreeFaces, "CHECK_FREE_FACES" ); createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" ); + createGeomAction( GEOMOp::OpRemoveWebs, "REMOVE_WEBS" ); createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" ); createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" ); createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" ); @@ -1055,6 +1057,7 @@ void GeometryGUI::initialize( CAM_Application* app ) //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 ); //createMenu( GEOMOp::OpFreeFaces, repairId, -1 ); createMenu( GEOMOp::OpOrientation, repairId, -1 ); + createMenu( GEOMOp::OpRemoveWebs, repairId, -1 ); createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 ); createMenu( GEOMOp::OpFuseEdges, repairId, -1 ); createMenu( GEOMOp::OpUnionFaces, repairId, -1 ); diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index bdfed0980..04b339917 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -162,6 +162,7 @@ namespace GEOMOp { OpGlueEdges = 4013, // MENU REPAIR - GLUE EDGES OpFuseEdges = 4014, // MENU REPAIR - FUSE COLLINEAR EDGES OpUnionFaces = 4015, // MENU REPAIR - UNION FACES + OpRemoveWebs = 4016, // MENU REPAIR - REMOVE INTERNAL FACES // MeasureGUI ------------------//-------------------------------- OpProperties = 5000, // MENU MEASURES - PROPERTIES OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index d77e25f20..7010b0e33 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -30,6 +30,9 @@ #include #include +#include +#include + #include #include #include @@ -138,6 +141,9 @@ Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const case SEWING_NON_MANIFOLD: Sew(&HI, anOriginalShape, aShape, true); break; + case REMOVE_INTERNAL_FACES: + RemoveInternalFaces(anOriginalShape, aShape); + break; case DIVIDE_EDGE: AddPointOnEdge(&HI, anOriginalShape, aShape); break; @@ -441,6 +447,33 @@ Standard_Boolean GEOMImpl_HealingDriver::Sew (GEOMImpl_IHealing* theHI, return aResult; } +//======================================================================= +//function : RemoveInternalFaces +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::RemoveInternalFaces (const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + GEOMAlgo_RemoverWebs aTool; + aTool.SetShape(theOriginalShape); + aTool.Perform(); + + if (aTool.ErrorStatus() != 0) + StdFail_NotDone::Raise("GEOMAlgo_RemoverWebs failed!"); + + theOutShape = aTool.Result(); + + // as GEOMAlgo_RemoverWebs always produces compound, lets simplify it + // for the case, if it contains only one sub-shape + TopTools_ListOfShape listShapeRes; + GEOMUtils::AddSimpleShapes(theOutShape, listShapeRes); + if (listShapeRes.Extent() == 1) { + theOutShape = listShapeRes.First(); + } + + return Standard_True; +} + //======================================================================= //function : AddPointOnEdge //purpose : diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx index d75796612..83dacd6fa 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx @@ -172,6 +172,7 @@ private: Standard_Boolean RemoveIntWires( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape&, Standard_Boolean ) const; + Standard_Boolean RemoveInternalFaces ( const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean ChangeOrientation( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; void LimitTolerance( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index 98f56bf19..e0dd6ba6e 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -626,7 +626,7 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObj HI.SetTolerance( theTolerance ); HI.SetOriginal( aLastFunction ); - //Compute the translation + //Compute the result try { #if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; @@ -637,9 +637,8 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObj return NULL; } } - catch (Standard_Failure) - { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } @@ -659,6 +658,60 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObj return aNewObject; } +//============================================================================= +/*! + * RemoveInternalFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveInternalFaces (Handle(GEOM_Object) theObject) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + 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 + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), REMOVE_INTERNAL_FACES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI (aFunction); + HI.SetOriginal(aLastFunction); + + //Compute the result + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.RemoveInternalFaces(" << theObject << ")"; + + SetErrorCode(OK); + return aNewObject; +} + //============================================================================= /*! * DivideEdge diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index 37f1b90f4..b194c61e4 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -74,6 +74,8 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { double theTolerance, bool isAllowNonManifold); + Standard_EXPORT Handle(GEOM_Object) RemoveInternalFaces (Handle(GEOM_Object) theObject); + Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject, int theIndex, double theValue, diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 2a4a2e91f..77b8a880e 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -301,8 +301,9 @@ #define DIVIDE_EDGE 7 #define CHANGE_ORIENTATION 8 #define LIMIT_TOLERANCE 9 -#define FUSE_COLLINEAR_EDGES 10 -#define SEWING_NON_MANIFOLD 11 +#define FUSE_COLLINEAR_EDGES 10 +#define SEWING_NON_MANIFOLD 11 +#define REMOVE_INTERNAL_FACES 12 #define BASIC_FILLING 1 diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc index 195b4a3a0..c7363fe9e 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.cc +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -394,6 +394,31 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM return GetObject(aNewObject); } +//============================================================================= +/*! + * RemoveInternalFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object + Handle(GEOM_Object) anObject = GetObjectImpl(theCompound); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(anObject); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + //============================================================================= /*! * DivideEdge diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.hh b/src/GEOM_I/GEOM_IHealingOperations_i.hh index 45a85df62..929028005 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.hh +++ b/src/GEOM_I/GEOM_IHealingOperations_i.hh @@ -78,6 +78,8 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i : GEOM::GEOM_Object_ptr SewAllowNonManifold (GEOM::GEOM_Object_ptr theObject, CORBA::Double theTolerance); + GEOM::GEOM_Object_ptr RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound); + GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, CORBA::Short theIndex, CORBA::Double theValue, diff --git a/src/GEOM_SWIG/GEOM_TestHealing.py b/src/GEOM_SWIG/GEOM_TestHealing.py index e503ab297..9d711ed68 100644 --- a/src/GEOM_SWIG/GEOM_TestHealing.py +++ b/src/GEOM_SWIG/GEOM_TestHealing.py @@ -368,6 +368,25 @@ def TestFuseEdges (geompy): ii = ii + 1 pass +def TestRemoveWebs (geompy): + + # create solids with some coincident faces + Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) + Translation_1 = geompy.MakeTranslation(Box_1, 200, 0, 0) + Translation_2 = geompy.MakeTranslation(Box_1, 200, 200, 0) + + geompy.addToStudy(Box_1, 'Box_1') + geompy.addToStudy(Translation_1, 'Translation_1') + geompy.addToStudy(Translation_2, 'Translation_2') + + # partition three solids to obtain shared faces + Partition_1 = geompy.MakePartition([Box_1, Translation_1, Translation_2]) + geompy.addToStudy(Partition_1, 'Partition_1') + + # remove shared faces to obtain one solid instead of three + Joined_1 = geompy.RemoveInternalFaces(Partition_1) + geompy.addToStudy(Joined_1, 'Joined_1') + def TestHealingOperations (geompy, math): TestMakeSewing(geompy, math) @@ -378,3 +397,4 @@ def TestHealingOperations (geompy, math): TestSuppressFaces(geompy) TestProcessShape(geompy) TestFuseEdges(geompy) + TestRemoveWebs(geompy) diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index b60b70532..7f309b0f2 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -5996,6 +5996,36 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "sewed") return anObj + ## Rebuild the topology of theCompound of solids by removing + # of the faces that are shared by several solids. + # @param theCompound Shape to be processed. + # @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. + # + # @ref tui_remove_webs "Example" + def RemoveInternalFaces (self, theCompound, theName=None): + """ + Rebuild the topology of theCompound of solids by removing + of the faces that are shared by several solids. + + Parameters: + theCompound Shape to be processed. + 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. + + Returns: + New GEOM.GEOM_Object, containing processed shape. + """ + # Example: see GEOM_TestHealing.py + anObj = self.HealOp.RemoveInternalFaces(theCompound) + RaiseIfFailed("RemoveInternalFaces", self.HealOp) + self._autoPublish(anObj, theName, "removeWebs") + return anObj + ## Remove internal wires and edges from the given object (face). # @param theObject Shape to be processed. # @param theWires Indices of wires to be removed, if EMPTY then the method diff --git a/src/RepairGUI/Makefile.am b/src/RepairGUI/Makefile.am index 6b267669a..adec8540e 100644 --- a/src/RepairGUI/Makefile.am +++ b/src/RepairGUI/Makefile.am @@ -38,6 +38,7 @@ salomeinclude_HEADERS = \ RepairGUI_ChangeOrientationDlg.h \ RepairGUI_GlueDlg.h \ RepairGUI_LimitToleranceDlg.h \ + RepairGUI_RemoveWebsDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h \ RepairGUI_UnionFacesDlg.h \ RepairGUI_FuseEdgesDlg.h @@ -59,6 +60,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_ChangeOrientationDlg.h \ RepairGUI_GlueDlg.h \ RepairGUI_LimitToleranceDlg.h \ + RepairGUI_RemoveWebsDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h \ RepairGUI_UnionFacesDlg.h \ RepairGUI_FuseEdgesDlg.h \ @@ -76,6 +78,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_ChangeOrientationDlg.cxx \ RepairGUI_GlueDlg.cxx \ RepairGUI_LimitToleranceDlg.cxx \ + RepairGUI_RemoveWebsDlg.cxx \ RepairGUI_RemoveExtraEdgesDlg.cxx \ RepairGUI_UnionFacesDlg.cxx \ RepairGUI_FuseEdgesDlg.cxx @@ -93,8 +96,9 @@ MOC_FILES = \ RepairGUI_ChangeOrientationDlg_moc.cxx \ RepairGUI_GlueDlg_moc.cxx \ RepairGUI_LimitToleranceDlg_moc.cxx \ + RepairGUI_RemoveWebsDlg_moc.cxx \ RepairGUI_RemoveExtraEdgesDlg_moc.cxx \ - RepairGUI_UnionFacesDlg_moc.cxx \ + RepairGUI_UnionFacesDlg_moc.cxx \ RepairGUI_FuseEdgesDlg_moc.cxx nodist_libRepairGUI_la_SOURCES = \ diff --git a/src/RepairGUI/RepairGUI.cxx b/src/RepairGUI/RepairGUI.cxx index e2a8dc187..860459574 100644 --- a/src/RepairGUI/RepairGUI.cxx +++ b/src/RepairGUI/RepairGUI.cxx @@ -43,6 +43,7 @@ #include "RepairGUI_GlueDlg.h" // Method GLUE FACES #include "RepairGUI_LimitToleranceDlg.h" // Method LIMIT TOLERANCE #include "RepairGUI_ChangeOrientationDlg.h" // Method CHANGE ORIENTATION +#include "RepairGUI_RemoveWebsDlg.h" // Method REMOVE INTERNAL FACES #include "RepairGUI_RemoveExtraEdgesDlg.h" // Method REMOVE EXTRA EDGES #include "RepairGUI_FuseEdgesDlg.h" // Method FUSE COLLINEAR EDGES #include "RepairGUI_UnionFacesDlg.h" // Method UNION FACES @@ -91,6 +92,7 @@ bool RepairGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) case GEOMOp::OpFreeBoundaries: aDlg = new RepairGUI_FreeBoundDlg (getGeometryGUI(), parent); break; case GEOMOp::OpFreeFaces: aDlg = new RepairGUI_FreeFacesDlg (getGeometryGUI(), parent); break; case GEOMOp::OpOrientation: aDlg = new RepairGUI_ChangeOrientationDlg (getGeometryGUI(), parent); break; + case GEOMOp::OpRemoveWebs: aDlg = new RepairGUI_RemoveWebsDlg (getGeometryGUI(), parent); break; case GEOMOp::OpRemoveExtraEdges: aDlg = new RepairGUI_RemoveExtraEdgesDlg (getGeometryGUI(), parent); break; case GEOMOp::OpFuseEdges: aDlg = new RepairGUI_FuseEdgesDlg (getGeometryGUI(), parent); break; case GEOMOp::OpUnionFaces: aDlg = new RepairGUI_UnionFacesDlg (getGeometryGUI(), parent); break; diff --git a/src/RepairGUI/RepairGUI_RemoveWebsDlg.cxx b/src/RepairGUI/RepairGUI_RemoveWebsDlg.cxx new file mode 100755 index 000000000..56fcf6d50 --- /dev/null +++ b/src/RepairGUI/RepairGUI_RemoveWebsDlg.cxx @@ -0,0 +1,296 @@ +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +// GEOM RepairGUI : GUI for Geometry component +// File : RepairGUI_RemoveWebsDlg.cxx + +#include "RepairGUI_RemoveWebsDlg.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +//================================================================================= +// class : RepairGUI_RemoveWebsDlg() +// purpose : Constructs a RepairGUI_RemoveWebsDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_RemoveWebsDlg::RepairGUI_RemoveWebsDlg (GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal) +{ + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_REMOVE_WEBS"))); + QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setWindowTitle(tr("GEOM_REMOVE_WEBS_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_REMOVE_WEBS_TITLE")); + mainFrame()->RadioButton1->setIcon( image0 ); + mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton3->close(); + + GroupPoints = new DlgRef_1Sel( centralWidget() ); + + GroupPoints->GroupBox1->setTitle( tr( "GEOM_REMOVE_WEBS" ) ); + GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) ); + GroupPoints->PushButton1->setIcon( image1 ); + GroupPoints->LineEdit1->setReadOnly( true ); + + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); + layout->setMargin( 0 ); layout->setSpacing( 6 ); + layout->addWidget( GroupPoints ); + + /***************************************************************/ + + setHelpFileName( "remove_webs_operation_page.html" ); + + Init(); +} + +//================================================================================= +// function : ~RepairGUI_RemoveWebsDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_RemoveWebsDlg::~RepairGUI_RemoveWebsDlg() +{ +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_RemoveWebsDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myOkObject = false; + + activateSelection(); + + mainFrame()->GroupBoxPublish->show(); + //Hide preview checkbox + mainFrame()->CheckBoxPreview->hide(); + + /* signals and slots connections */ + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + initName(tr("REMOVE_WEBS_NEW_OBJ_NAME")); + resize(100,100); + SelectionIntoArgument(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_RemoveWebsDlg::ClickOnOk() +{ + setIsApplyAndClose(true); + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_RemoveWebsDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + myOkObject = false; + + activateSelection(); + + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void RepairGUI_RemoveWebsDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText( "" ); + QString aName; + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (myEditCurrentArgument == GroupPoints->LineEdit1) { + if (aSelList.Extent() != 1) { + if (myEditCurrentArgument == GroupPoints->LineEdit1) + myOkObject = false; + return; + } + } + + // nbSel == 1 + GEOM::GEOM_Object_ptr aSelectedObject = + GEOMBase::ConvertIOinGEOMObject(aSelList.First()); + + if (CORBA::is_nil(aSelectedObject)) + return; + + if (myEditCurrentArgument == GroupPoints->LineEdit1) { + myObject = aSelectedObject; + myOkObject = true; + } + + myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject)); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_RemoveWebsDlg::SetEditCurrentArgument() +{ + if (sender() == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + SelectionIntoArgument(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_RemoveWebsDlg::LineEditReturnPressed() +{ + if (sender() == GroupPoints->LineEdit1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_RemoveWebsDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + activateSelection(); +} + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_RemoveWebsDlg::enterEvent (QEvent* e) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : activateSelection +// purpose : activate selection of solids and compounds +//================================================================================= +void RepairGUI_RemoveWebsDlg::activateSelection() +{ + TColStd_MapOfInteger aTypes; + //aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_COMPOUND ); + globalSelection( aTypes ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_RemoveWebsDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_RemoveWebsDlg::isValid (QString& msg) +{ + return myOkObject; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_RemoveWebsDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var anObj = anOper->RemoveInternalFaces(myObject); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return true; +} + +//================================================================================= +// function : restoreSubShapes +// purpose : +//================================================================================= +void RepairGUI_RemoveWebsDlg::restoreSubShapes (SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) +{ + if (mainFrame()->CheckBoxRestoreSS->isChecked()) { + // empty list of arguments means that all arguments should be restored + getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(), + /*theFindMethod=*/GEOM::FSM_GetInPlace, // ? GetInPlaceByHistory + /*theInheritFirstArg=*/true, + mainFrame()->CheckBoxAddPrefix->isChecked()); + } +} diff --git a/src/RepairGUI/RepairGUI_RemoveWebsDlg.h b/src/RepairGUI/RepairGUI_RemoveWebsDlg.h new file mode 100755 index 000000000..9aee4d9ae --- /dev/null +++ b/src/RepairGUI/RepairGUI_RemoveWebsDlg.h @@ -0,0 +1,70 @@ +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +// GEOM GEOMGUI : GUI for Geometry component +// File : RepairGUI_RemoveWebsDlg.h + +#ifndef REPAIRGUI_REMOVEWEBSDLG_H +#define REPAIRGUI_REMOVEWEBSDLG_H + +#include + +class DlgRef_1Sel; + +//================================================================================= +// class : RepairGUI_RemoveWebsDlg +// purpose : Unites faces of a given shape. +//================================================================================= +class RepairGUI_RemoveWebsDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + RepairGUI_RemoveWebsDlg (GeometryGUI*, QWidget* = 0, bool = false); + ~RepairGUI_RemoveWebsDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual void restoreSubShapes (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); + +private: + void Init(); + void enterEvent (QEvent*); + void activateSelection(); + +private: + GEOM::GEOM_Object_var myObject; + bool myOkObject; + + DlgRef_1Sel* GroupPoints; + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + + void ActivateThisDialog(); + + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); +}; + +#endif // REPAIRGUI_REMOVEWEBSDLG_H