From 3282e6d3b3ebc2a33c0ff2ce1dcfb31ae06f6571 Mon Sep 17 00:00:00 2001 From: skv Date: Fri, 24 May 2013 08:52:30 +0000 Subject: [PATCH] 0022179: [CEA 800] Suppress common edges on two continuous faces without using RemoveExtraEdges --- doc/salome/gui/GEOM/images/union_faces.png | Bin 0 -> 23777 bytes doc/salome/gui/GEOM/images/union_faces1.png | Bin 0 -> 22232 bytes doc/salome/gui/GEOM/images/union_faces2.png | Bin 0 -> 21630 bytes .../gui/GEOM/input/repairing_operations.doc | 2 + doc/salome/gui/GEOM/input/tui_test_others.doc | 3 + .../gui/GEOM/input/union_faces_operation.doc | 29 ++ idl/GEOM_Gen.idl | 9 + resources/Makefile.am | 1 + resources/union_faces.png | Bin 0 -> 845 bytes src/GEOMGUI/GEOM_images.ts | 8 + src/GEOMGUI/GEOM_msg_en.ts | 24 ++ src/GEOMGUI/GeometryGUI.cxx | 3 + src/GEOMGUI/GeometryGUI_Operations.h | 1 + src/GEOMImpl/GEOMImpl_BlockDriver.cxx | 13 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 52 +++ src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 2 + src/GEOMImpl/GEOMImpl_Types.hxx | 1 + src/GEOM_I/GEOM_IBlocksOperations_i.cc | 25 ++ src/GEOM_I/GEOM_IBlocksOperations_i.hh | 2 + src/GEOM_SWIG/GEOM_TestOthers.py | 7 +- src/GEOM_SWIG/geomBuilder.py | 34 ++ src/RepairGUI/Makefile.am | 4 + src/RepairGUI/RepairGUI.cxx | 2 + src/RepairGUI/RepairGUI_UnionFacesDlg.cxx | 307 ++++++++++++++++++ src/RepairGUI/RepairGUI_UnionFacesDlg.h | 72 ++++ 25 files changed, 600 insertions(+), 1 deletion(-) create mode 100644 doc/salome/gui/GEOM/images/union_faces.png create mode 100644 doc/salome/gui/GEOM/images/union_faces1.png create mode 100644 doc/salome/gui/GEOM/images/union_faces2.png create mode 100755 doc/salome/gui/GEOM/input/union_faces_operation.doc create mode 100644 resources/union_faces.png create mode 100755 src/RepairGUI/RepairGUI_UnionFacesDlg.cxx create mode 100755 src/RepairGUI/RepairGUI_UnionFacesDlg.h diff --git a/doc/salome/gui/GEOM/images/union_faces.png b/doc/salome/gui/GEOM/images/union_faces.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a620b65da3f079785c59a51332eecc176b439a GIT binary patch literal 23777 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
  • \subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" - removes selected vertices from a given wire in case if adjacent edges are C1 continuous.
  • +
  • \subpage union_faces_operation_page "Union faces" - +unites all faces sharing one surface on a given shape.
  • */ diff --git a/doc/salome/gui/GEOM/input/tui_test_others.doc b/doc/salome/gui/GEOM/input/tui_test_others.doc index e89f89957..701a1b52b 100644 --- a/doc/salome/gui/GEOM/input/tui_test_others.doc +++ b/doc/salome/gui/GEOM/input/tui_test_others.doc @@ -90,6 +90,9 @@ \anchor swig_RemoveExtraEdges \until "freeFacesWithoutExtra" +\anchor swig_UnionFaces +\until "unitedFaces" + \anchor swig_GetSharedShapes \until "sharedEdge_" diff --git a/doc/salome/gui/GEOM/input/union_faces_operation.doc b/doc/salome/gui/GEOM/input/union_faces_operation.doc new file mode 100755 index 000000000..65cbd4307 --- /dev/null +++ b/doc/salome/gui/GEOM/input/union_faces_operation.doc @@ -0,0 +1,29 @@ +/*! + +\page union_faces_operation_page Union Faces + +\n To Union Faces in the Main Menu select +Repair - > Union Faces. +\n This operation unites all faces sharing one surface on a given +shape. + +\n TUI Command: geompy.UnionFaces(theShape), +where theShape is a compound or a single solid. +\n Arguments: Name + one shape + a flag. +\n Advanced option: + \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". + +\image html union_faces.png + +\n Example: + +\image html union_faces1.png +
    Shape with not united faces
    + +\image html union_faces2.png +
    Improved shape
    + +Our TUI Scripts provide you with useful examples of the +\ref swig_UnionFaces "Union Faces" functionality usage. + +*/ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index f8642857c..874f7d606 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2556,6 +2556,15 @@ module GEOM GEOM_Object RemoveExtraEdges (in GEOM_Object theShape, in long theOptimumNbFaces); + /*! + * \brief Performs union faces of \a theShape. + * + * Unite faces sharing one surface. + * \param theShape The compound or single solid that contains faces to perform union. + * \return Improved shape. + */ + GEOM_Object UnionFaces (in GEOM_Object theShape); + /*! * \brief Check, if the given shape is a blocks compound. * diff --git a/resources/Makefile.am b/resources/Makefile.am index dbc53af18..8051b27a0 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -240,6 +240,7 @@ redo.png \ undo.png \ glue2.png \ remove_extra_edges.png \ +union_faces.png \ coordsys.png \ translation.png diff --git a/resources/union_faces.png b/resources/union_faces.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb821e09e66a65d574e7c773b2c54b36466f67a GIT binary patch literal 845 zcmV-T1G4;yP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;!%0LzRCwB~l)a0bRTRd5?`G@*X_F?68-;|R0ntA| zWWlhokrWAohJjs`nAoVKFj}P8g-AdwqGCvt;1@_hL?wk}n{*Zmg3VSUI>k!f*}Ze$ z`*F@a7VpeB>uj^)g~Npl_s8>`^KdFN$>v zThw*U=H@1KT~`y}^jThBwrhtEbN$gpL=Dk`7DG$xM2iuU(j;LRgzwg#qpoX!d7wWx z4eRxK_Q=9T$eEB79|a!;7utImgki|IklFT`Z&y!o;-%Z;?+d`eiNbETYx4`Q5~X0? zXr*5wa4eD(4J9$qCJo zB58MpN!kxDymO5MU;oVF+qckSm>K^>)kXzo1uKdbodu?p$Wq8s_~eZjsh>H*H&@Qg zz|3p{FcnPm?g~W&DaOs$&U1F{1FRIDz5F?MS5MEtOr_0Z4rmH9z|O>SE}UI`kC+t; zft)i>zy2u@Ti^&LDYWqk?LbuGEYLaE<}L{_3oZoQ=5Hf=24<9^SP^st^bh_(C1FK& z2W~eRNr7h2r~Bk9R5>s`iV84Qm<++FsMxr73t)W*a4;BICON_DLG_FUSE_EDGES fuse_collinear_edges.png + + ICON_DLG_UNION_FACES + union_faces.png + ICON_DLG_CHECKSHAPE check.png @@ -1019,6 +1023,10 @@ ICO_FUSE_EDGES fuse_collinear_edges.png + + ICO_UNION_FACES + union_faces.png + ICO_NORMALE normale.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 42cd00013..b35e64ea1 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -4554,6 +4554,30 @@ Please, select face, shell or solid and try again STB_FUSE_EDGES Fuse collinear edges within a wire + + GEOM_UNION_FACES_TITLE + Union faces + + + GEOM_UNION_FACES + Object to unite faces + + + UNION_FACES_NEW_OBJ_NAME + UnionFaces + + + TOP_UNION_FACES + Union faces + + + MEN_UNION_FACES + Union Faces + + + STB_UNION_FACES + Union faces + TOP_NORMALE Normal to a face diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index de3a7b815..4e4517aa7 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -544,6 +544,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES + case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES libName = "RepairGUI"; break; case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES @@ -823,6 +824,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" ); createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" ); createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" ); + createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" ); createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" ); createGeomAction( GEOMOp::OpProperties, "BASIC_PROPS" ); @@ -1053,6 +1055,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpOrientation, repairId, -1 ); createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 ); createMenu( GEOMOp::OpFuseEdges, repairId, -1 ); + createMenu( GEOMOp::OpUnionFaces, repairId, -1 ); int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 ); createMenu( GEOMOp::OpPointCoordinates, measurId, -1 ); diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index d170eec02..e6af05e8b 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -161,6 +161,7 @@ namespace GEOMOp { OpLimitTolerance = 4012, // MENU REPAIR - LIMIT TOLERANCE OpGlueEdges = 4013, // MENU REPAIR - GLUE EDGES OpFuseEdges = 4014, // MENU REPAIR - FUSE COLLINEAR EDGES + OpUnionFaces = 4015, // MENU REPAIR - UNION FACES // MeasureGUI ------------------//-------------------------------- OpProperties = 5000, // MENU MEASURES - PROPERTIES OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS diff --git a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx index b0838a1b0..19aec6cec 100644 --- a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx @@ -39,6 +39,7 @@ #include //#include #include +#include #include "utilities.h" @@ -733,6 +734,18 @@ Standard_Integer GEOMImpl_BlockDriver::Execute(TFunction_Logbook& log) const // Glue faces of the multi-block aShape = GEOMImpl_GlueDriver::GlueFaces(aMulti, aTol, Standard_False); + } else if (aType == BLOCK_UNION_FACES) { + GEOMImpl_IBlockTrsf aCI (aFunction); + Handle(GEOM_Function) aRefShape = aCI.GetOriginal(); + TopoDS_Shape aBlockOrComp = aRefShape->GetValue(); + if (aBlockOrComp.IsNull()) { + Standard_NullObject::Raise("Null Shape given"); + } + + BlockFix_UnionFaces aFaceUnifier; + + aFaceUnifier.GetOptimumNbFaces() = 0; // To force union faces. + aShape = aFaceUnifier.Perform(aBlockOrComp); } else { // unknown function type return 0; } diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 274c82e00..7f6149da3 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -2654,6 +2654,58 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges return aCopy; } +//============================================================================= +/*! + * UnionFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::UnionFaces + (Handle(GEOM_Object) theObject) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be fixed + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_UNION_FACES); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlockTrsf aTI (aFunction); + aTI.SetOriginal(aLastFunction); + + //Compute the fixed shape + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to remove extra edges of the given shape"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.UnionFaces(" + << theObject << ")"; + + SetErrorCode(OK); + return aCopy; +} + //============================================================================= /*! * CheckAndImprove diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index 1ede9b6db..86c8a0380 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -140,6 +140,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, const Standard_Integer theOptimumNbFaces = 6); + Standard_EXPORT Handle(GEOM_Object) UnionFaces (Handle(GEOM_Object) theShape); + Standard_EXPORT Handle(GEOM_Object) CheckAndImprove (Handle(GEOM_Object) theCompound); Standard_EXPORT static void AddBlocksFrom (const TopoDS_Shape& theShape, diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 7a116ddf4..105de5d2a 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -342,6 +342,7 @@ #define BLOCK_COMPOUND_GLUE 8 #define BLOCK_REMOVE_EXTRA 9 #define BLOCK_COMPOUND_IMPROVE 10 +#define BLOCK_UNION_FACES 11 // Marker #define MARKER_CS 1 diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc index b25c0d164..59fd46546 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -801,6 +801,31 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges return GetObject(anObject); } +//============================================================================= +/*! + * UnionFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::UnionFaces + (GEOM::GEOM_Object_ptr theShape) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + if (aShape.IsNull()) return aGEOMObject._retn(); + + //Get the result + Handle(GEOM_Object) anObject = GetOperations()->UnionFaces(aShape); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * CheckAndImprove diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index a66e64458..c6e23ae96 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -127,6 +127,8 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape, CORBA::Long theOptimumNbFaces); + GEOM::GEOM_Object_ptr UnionFaces (GEOM::GEOM_Object_ptr theShape); + GEOM::GEOM_Object_ptr CheckAndImprove (GEOM::GEOM_Object_ptr theCompound); // Extract blocks from blocks compounds diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py index 0a8ab0413..4153bb6a6 100644 --- a/src/GEOM_SWIG/GEOM_TestOthers.py +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -208,7 +208,7 @@ def TestOtherOperations (geompy, math): geompy.addToStudy(MultiRot1Dt, "MakeMultiRotation1DNbTimes") geompy.addToStudy(MultiRot1Ds, "MakeMultiRotation1DByStep") geompy.addToStudy(MultiRot2Dt, "MakeMultiRotation2DNbTimes") - geompy.addToStudy(MultiRot2Ds, "MakeMultiRotation2DByStep") + id_MultiRot2D = geompy.addToStudy(MultiRot2Ds, "MakeMultiRotation2DByStep") # MakeFilletAll radius_fillet = 10. @@ -540,6 +540,11 @@ def TestOtherOperations (geompy, math): geompy.addToStudy(freeFacesWithoutExtra, "freeFacesWithoutExtra") + # UnionFaces + unitedFaces = geompy.UnionFaces(freeFaces) + + geompy.addToStudy(unitedFaces, "unitedFaces") + # GetSharedShapes sharedFaces = geompy.GetSharedShapes(part, freeFaces, geompy.ShapeType["FACE"]) diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 05e3d674f..249379505 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -10740,6 +10740,40 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "removeExtraEdges") return anObj + ## Performs union faces of \a theShape + # Unite faces sharing one surface. It means that + # these faces must have references to one C++ surface object (handle). + # @param theShape The compound or single solid that contains faces + # to perform union. + # @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 Improved shape. + # + # @ref swig_UnionFaces "Example" + def UnionFaces(self, theShape, theName=None): + """ + Performs union faces of theShape. + Unite faces sharing one surface. It means that + these faces must have references to one C++ surface object (handle). + + Parameters: + theShape The compound or single solid that contains faces + to perform union. + 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: + Improved shape. + """ + # Example: see GEOM_TestOthers.py + anObj = self.BlocksOp.UnionFaces(theShape) + RaiseIfFailed("UnionFaces", self.BlocksOp) + self._autoPublish(anObj, theName, "unionFaces") + return anObj + ## Check, if the given shape is a blocks compound. # Fix all detected errors. # \note Single block can be also fixed by this method. diff --git a/src/RepairGUI/Makefile.am b/src/RepairGUI/Makefile.am index f81255c8f..6b267669a 100644 --- a/src/RepairGUI/Makefile.am +++ b/src/RepairGUI/Makefile.am @@ -39,6 +39,7 @@ salomeinclude_HEADERS = \ RepairGUI_GlueDlg.h \ RepairGUI_LimitToleranceDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h \ + RepairGUI_UnionFacesDlg.h \ RepairGUI_FuseEdgesDlg.h # Libraries targets @@ -59,6 +60,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_GlueDlg.h \ RepairGUI_LimitToleranceDlg.h \ RepairGUI_RemoveExtraEdgesDlg.h \ + RepairGUI_UnionFacesDlg.h \ RepairGUI_FuseEdgesDlg.h \ \ RepairGUI.cxx \ @@ -75,6 +77,7 @@ dist_libRepairGUI_la_SOURCES = \ RepairGUI_GlueDlg.cxx \ RepairGUI_LimitToleranceDlg.cxx \ RepairGUI_RemoveExtraEdgesDlg.cxx \ + RepairGUI_UnionFacesDlg.cxx \ RepairGUI_FuseEdgesDlg.cxx MOC_FILES = \ @@ -91,6 +94,7 @@ MOC_FILES = \ RepairGUI_GlueDlg_moc.cxx \ RepairGUI_LimitToleranceDlg_moc.cxx \ RepairGUI_RemoveExtraEdgesDlg_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 5def07491..e2a8dc187 100644 --- a/src/RepairGUI/RepairGUI.cxx +++ b/src/RepairGUI/RepairGUI.cxx @@ -45,6 +45,7 @@ #include "RepairGUI_ChangeOrientationDlg.h" // Method CHANGE ORIENTATION #include "RepairGUI_RemoveExtraEdgesDlg.h" // Method REMOVE EXTRA EDGES #include "RepairGUI_FuseEdgesDlg.h" // Method FUSE COLLINEAR EDGES +#include "RepairGUI_UnionFacesDlg.h" // Method UNION FACES //======================================================================= // function : RepairGUI() @@ -92,6 +93,7 @@ bool RepairGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) case GEOMOp::OpOrientation: aDlg = new RepairGUI_ChangeOrientationDlg (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; default: app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); break; diff --git a/src/RepairGUI/RepairGUI_UnionFacesDlg.cxx b/src/RepairGUI/RepairGUI_UnionFacesDlg.cxx new file mode 100755 index 000000000..e9b4ceabb --- /dev/null +++ b/src/RepairGUI/RepairGUI_UnionFacesDlg.cxx @@ -0,0 +1,307 @@ +// 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_UnionFacesDlg.cxx +// Author : Michael Zorin, Open CASCADE S.A.S. +// +#include "RepairGUI_UnionFacesDlg.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +//================================================================================= +// class : RepairGUI_UnionFacesDlg() +// purpose : Constructs a RepairGUI_UnionFacesDlg 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_UnionFacesDlg::RepairGUI_UnionFacesDlg( 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_UNION_FACES" ) ) ); + QPixmap image1( aResMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + + setWindowTitle( tr( "GEOM_UNION_FACES_TITLE" ) ); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_UNION_FACES_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_UNION_FACES" ) ); + 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( "union_faces_operation_page.html" ); + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_UnionFacesDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_UnionFacesDlg::~RepairGUI_UnionFacesDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_UnionFacesDlg::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( "UNION_FACES_NEW_OBJ_NAME" ) ); + resize(100,100); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_UnionFacesDlg::ClickOnOk() +{ + setIsApplyAndClose( true ); + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_UnionFacesDlg::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_UnionFacesDlg::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_UnionFacesDlg::SetEditCurrentArgument() +{ + if( sender() == GroupPoints->PushButton1 ) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_UnionFacesDlg::LineEditReturnPressed() +{ + if ( sender() == GroupPoints->LineEdit1 ) { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_UnionFacesDlg::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_UnionFacesDlg::enterEvent(QEvent* e) +{ + if ( !mainFrame()->GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : activateSelection +// purpose : activate selection of solids and compounds +//================================================================================= +void RepairGUI_UnionFacesDlg::activateSelection() +{ + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_COMPOUND ); + globalSelection( aTypes ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_UnionFacesDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_UnionFacesDlg::isValid( QString& msg ) +{ + return myOkObject; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_UnionFacesDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_IBlocksOperations_var anOper = GEOM::GEOM_IBlocksOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var anObj = anOper->UnionFaces(myObject); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return true; +} + +//================================================================================= +// function : restoreSubShapes +// purpose : +//================================================================================= +void RepairGUI_UnionFacesDlg::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_UnionFacesDlg.h b/src/RepairGUI/RepairGUI_UnionFacesDlg.h new file mode 100755 index 000000000..ea00f50e6 --- /dev/null +++ b/src/RepairGUI/RepairGUI_UnionFacesDlg.h @@ -0,0 +1,72 @@ +// 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_UnionFacesDlg.h +// Author : Michael ZORIN, Open CASCADE S.A.S. +// +#ifndef REPAIRGUI_UNIONFACESDLG_H +#define REPAIRGUI_UNIONFACESDLG_H + +#include + +class DlgRef_1Sel; + +//================================================================================= +// class : RepairGUI_UnionFacesDlg +// purpose : Unites faces of a given shape. +//================================================================================= +class RepairGUI_UnionFacesDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + RepairGUI_UnionFacesDlg( GeometryGUI*, QWidget* = 0, bool = false ); + ~RepairGUI_UnionFacesDlg(); + +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_UNIONFACESDLG_H