From 58b6d007bceec500c219b94e16c7c62d76458012 Mon Sep 17 00:00:00 2001 From: skv Date: Mon, 16 Mar 2015 17:23:18 +0300 Subject: [PATCH] 0022666: EDF 7253 GEOM: Add thickness to a shell and integrate BrepOffsetAPI_MakeThickSolid --- doc/salome/examples/CMakeLists.txt | 1 + doc/salome/examples/complex_objs_ex11.py | 39 ++ doc/salome/gui/GEOM/images/thickness.png | Bin 0 -> 22725 bytes .../gui/GEOM/images/thickness_result.png | Bin 0 -> 3962 bytes doc/salome/gui/GEOM/images/thicksolid.png | Bin 0 -> 25130 bytes .../gui/GEOM/images/thicksolid_result.png | Bin 0 -> 7627 bytes .../gui/GEOM/input/creating_complex_obj.doc | 1 + .../GEOM/input/creating_thickness_page.doc | 46 ++ .../gui/GEOM/input/tui_complex_objs.doc | 4 + doc/salome/gui/GEOM/input/tui_test_all.doc | 2 +- idl/GEOM_Gen.idl | 18 +- resources/CMakeLists.txt | 2 + resources/thickness.png | Bin 0 -> 471 bytes resources/thickness2.png | Bin 0 -> 798 bytes src/GEOMGUI/GEOM_images.ts | 12 + src/GEOMGUI/GEOM_msg_en.ts | 28 +- src/GEOMGUI/GeometryGUI.cxx | 4 + src/GEOMGUI/GeometryGUI_Operations.h | 1 + src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 54 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 8 +- src/GEOMImpl/GEOMImpl_IOffset.hxx | 8 + src/GEOMImpl/GEOMImpl_OffsetDriver.cxx | 106 +++- src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 26 +- src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 7 +- src/GEOM_SWIG/GEOM_TestAll.py | 9 + src/GEOM_SWIG/geomBuilder.py | 69 ++- src/GenerationGUI/CMakeLists.txt | 3 + src/GenerationGUI/GenerationGUI.cxx | 12 +- src/GenerationGUI/GenerationGUI_PrismDlg.cxx | 7 +- .../GenerationGUI_ThicknessDlg.cxx | 467 ++++++++++++++++++ .../GenerationGUI_ThicknessDlg.h | 83 ++++ 31 files changed, 926 insertions(+), 91 deletions(-) create mode 100755 doc/salome/examples/complex_objs_ex11.py create mode 100644 doc/salome/gui/GEOM/images/thickness.png create mode 100644 doc/salome/gui/GEOM/images/thickness_result.png create mode 100644 doc/salome/gui/GEOM/images/thicksolid.png create mode 100644 doc/salome/gui/GEOM/images/thicksolid_result.png create mode 100644 doc/salome/gui/GEOM/input/creating_thickness_page.doc create mode 100644 resources/thickness.png create mode 100644 resources/thickness2.png mode change 100755 => 100644 src/GEOM_SWIG/geomBuilder.py create mode 100644 src/GenerationGUI/GenerationGUI_ThicknessDlg.cxx create mode 100644 src/GenerationGUI/GenerationGUI_ThicknessDlg.h diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 5ba409fb9..6a0baa09a 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -67,6 +67,7 @@ SET(GOOD_TESTS complex_objs_ex08.py complex_objs_ex09.py complex_objs_ex10.py + complex_objs_ex11.py free_boundaries.py free_faces.py GEOM_box.py diff --git a/doc/salome/examples/complex_objs_ex11.py b/doc/salome/examples/complex_objs_ex11.py new file mode 100755 index 000000000..63242331a --- /dev/null +++ b/doc/salome/examples/complex_objs_ex11.py @@ -0,0 +1,39 @@ +# Apply thickness for shell + +import salome +salome.salome_init() +import GEOM +from salome.geom import geomBuilder +geompy = geomBuilder.New(salome.myStudy) +gg = salome.ImportComponentGUI("GEOM") + +# create box +box = geompy.MakeBoxDXDYDZ(100, 100, 100) + +# get the list of faces +faces = geompy.SubShapeAllSortedCentres(box, geompy.ShapeType["FACE"]) + +# get the list of face IDs +faceIDs = geompy.SubShapeAllSortedCentresIDs(box, geompy.ShapeType["FACE"]) + +# make a shell from 3 faces +shell = geompy.MakeShell([faces[0], faces[1], faces[2]]) + +# apply thickness +solid = geompy.MakeThickSolid(shell, 30.) + +# create box +hsolid = geompy.MakeBoxDXDYDZ(100, 100, 100) + +# make hollowed solid +geompy.Thicken(hsolid, 30., [faceIDs[0], faceIDs[1]]) + +# add objects in the study +id_shell = geompy.addToStudy(shell, "Shell") +id_solid = geompy.addToStudy(solid, "Solid") +id_hsolid = geompy.addToStudy(hsolid, "Hollowed Solid") + +# display the shell and the result thicknen solid and hollowed solid +gg.createAndDisplayGO(id_shell) +gg.createAndDisplayGO(id_solid) +gg.createAndDisplayGO(id_hsolid) diff --git a/doc/salome/gui/GEOM/images/thickness.png b/doc/salome/gui/GEOM/images/thickness.png new file mode 100644 index 0000000000000000000000000000000000000000..5277857624aba3b21a4aaad98281084676c27914 GIT binary patch literal 22725 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
00x9Vsob|-CxS_K> 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/thickness_result.png b/doc/salome/gui/GEOM/images/thickness_result.png new file mode 100644 index 0000000000000000000000000000000000000000..47ec5a002c64cfcda932d90a1f913d4fcffb35f0 GIT binary patch literal 3962 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/thicksolid.png b/doc/salome/gui/GEOM/images/thicksolid.png new file mode 100644 index 0000000000000000000000000000000000000000..079a75499c8c131361a9469f80d741d9e6d2df34 GIT binary patch literal 25130 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/thicksolid_result.png b/doc/salome/gui/GEOM/images/thicksolid_result.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6087a4c8e430f6059ee569e51d6f713c81366c GIT binary patch literal 7627 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
-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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/creating_complex_obj.doc b/doc/salome/gui/GEOM/input/creating_complex_obj.doc index a5c6a090f..6630dfa72 100644 --- a/doc/salome/gui/GEOM/input/creating_complex_obj.doc +++ b/doc/salome/gui/GEOM/input/creating_complex_obj.doc @@ -15,6 +15,7 @@ axis, creating a body of revolution.
  • \subpage create_extrusion_alongpath_page "Extrude an object along a path", creating a more complex trajectory object.
  • \subpage create_pipe_path_page "Restore Path" of a pipe-like shape.
  • +
  • \subpage create_thickness_page "Thickness" operation that allows to add a thickness to objects.
  • New entity -> Advanced sub-menu allows creating new geometric diff --git a/doc/salome/gui/GEOM/input/creating_thickness_page.doc b/doc/salome/gui/GEOM/input/creating_thickness_page.doc new file mode 100644 index 000000000..140c02fc1 --- /dev/null +++ b/doc/salome/gui/GEOM/input/creating_thickness_page.doc @@ -0,0 +1,46 @@ +/*! + +\page create_thickness_page Thickness Construction + +To add a \b Thickness to a shape in the Main Menu select New Entity - > Generation - > Thickness +\n +It is possible to create a Solid from a Face or a Shell by applying a +\b Thickness. To do it you should define an \b Object that is a Face or a +Shell, \b Thickness and to define the thickness direction by means of +Thicken towards the inside check box. + +\image html thickness.png + +Example: + +\image html thickness_result.png "Thickness of Shell" + +It is possible to apply \b Thickness to a Solid. The result of this operation +is the hollowed Solid. To do it you should define an \b Object that is a Solid, +\b Faces to be removed from result, \b Thickness and the thickness direction by +means of Thicken towards the inside check box. + +\image html thicksolid.png + +Example: + +\image html thicksolid_result.png "Thickness of Solid" + +\n TUI Commands: +\n +geompy.MakeThickSolid(theShape, theThickness, theFacesIDs=[]) - +Makes a thick solid from a shape; +\n +geompy.Thicken(theShape, theThickness, theFacesIDs=[]) - +Modifies a shape to make it a thick solid. + +Arguments: Name + 1 shape (face, shell or solid) + thickness + +the list of face IDs. +\n If the shape is face or shell the list of face IDs is not used. +The thickness can be positive or negative for thicken towards the inside. +\n\n Advanced options \ref preview_anchor "Preview" + +Our TUI Scripts provide you with useful examples of creation of +\ref tui_creation_thickness "Complex Geometric Objects". + +*/ diff --git a/doc/salome/gui/GEOM/input/tui_complex_objs.doc b/doc/salome/gui/GEOM/input/tui_complex_objs.doc index 61ce18b5a..3ced40bca 100644 --- a/doc/salome/gui/GEOM/input/tui_complex_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_complex_objs.doc @@ -42,4 +42,8 @@

    Creation of Tangent Plane On Face

    \tui_script{complex_objs_ex10.py} +\anchor tui_creation_thickness +

    Applying a Thickness to Face, Shell or Solid

    +\tui_script{complex_objs_ex11.py} + */ diff --git a/doc/salome/gui/GEOM/input/tui_test_all.doc b/doc/salome/gui/GEOM/input/tui_test_all.doc index 1718afb00..b1f915ea2 100644 --- a/doc/salome/gui/GEOM/input/tui_test_all.doc +++ b/doc/salome/gui/GEOM/input/tui_test_all.doc @@ -49,7 +49,7 @@ \until Line3 \anchor swig_all_advanced -\until MakeSewing +\until Thicken \anchor swig_MakeCopy \until MakeCopy diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 4b54e4ddd..9bdfda2b2 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1829,16 +1829,24 @@ module GEOM /*! - * \brief Make a thick solid from a surface shape (face or shell) - * \param theObject Surface from which the thick solid is made + * \brief Make a thick solid from a shape. + * + * If the input is a surface shape (face or shell) the result is + * a thick solid. If an input shape is a solid the result is a hollowed + * solid with removed faces. + * \param theObject face or shell to get thick solid or solid to get + * hollowed solid. + * \param theFacesIDs the list of face IDs to be removed from the result. + * It can be empty. * \param theThickness Value of the thickness - * \param isCopy To make a copy of \a theObject ot to modify \a theObject. + * \param isCopy To make a copy of \a theObject or to modify \a theObject * \return New GEOM_Object, containing the created pipe if isCopy = true * or the modified object if isCopy = false */ GEOM_Object MakeThickening (in GEOM_Object theObject, - in double theThickness, - in boolean isCopy); + in ListOfLong theFacesIDs, + in double theThickness, + in boolean isCopy); /*! diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 87d7e929a..3a1bb3200 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -180,6 +180,8 @@ SET( _res_files supressHolesOnFaceShell.png supressface.png supresshole.png + thickness.png + thickness2.png tolerance.png torus.png torusdxyz.png diff --git a/resources/thickness.png b/resources/thickness.png new file mode 100644 index 0000000000000000000000000000000000000000..bee29286b03d0a9bef39b17ef20d61bb9920b8fc GIT binary patch literal 471 zcmV;|0Vw{7P)Px#32;bRa{vGi!~g&di2>5OfeHWs00(qQO+^Ra0}TuYDDZ<&PXGV`X-PyuR5;76 z)V)r^P!z!NKNK|)FD%$aLL_!D8kRmp;~O~X;$txL80?I?HQii{Q)6OefrQCHbmIC! zFnC>h$!#eGlAh`I+~(KQ`*9%WD5NDjuB*)Fb{JNGZ(zO-ET&1dfzAQqslGMC`u5z>H`CkGeUC=qu<04$y5jmwwgm z`!Q%J1nn@q0^Ur}ib`&ETsKIPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01b%&(z<~P00007bV*G`2j2q? z3Nbt2x6Ky-00N##L_t(I%e9nGNYp_T$3L@fe5q&u|gZ`~pKt1!*A0W;0?Xp0&fUf*><+qTV4Bs%v{wi=<1q}Ij%7wg8?uG?QL>s$6tdP_nCQFPK=8Y-BKiK7G;1P>0Zw)$71F0GD;)c2Po;S$XKPTEY`y2Hk~;<(UcM z`MOCq8@qdtlVN3fLMgQhkP#UlSa8)et;@HMs-nfGAS;h(elc?7C7JV|i53(y=gMWy zE%E3P<_;c3cD2SkZpfVZNHiL4jzl7>NjkJDYRcvOWWV literal 0 HcmV?d00001 diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 84876a3b7..489aaa5aa 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -555,6 +555,14 @@ ICON_DLG_PRISM_DXDYDZ prism3.png + + ICON_DLG_THICKNESS + thickness.png + + + ICON_DLG_THICKNESS_HOLLOWED + thickness2.png + ICON_DLG_PROPAGATE propagate.png @@ -1011,6 +1019,10 @@ ICO_EXTRUSION prism.png + + ICO_THICKNESS + thickness.png + ICO_FACE build_face.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index d5bdf3e5f..3d0ebd610 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -675,6 +675,18 @@ Please, select face, shell or solid and try again GEOM_EXTRUSION_TITLE Construction by Extrusion + + GEOM_THICKNESS_TITLE + Thickness Construction + + + GEOM_THICKNESS_NAME + Thickness + + + GEOM_TOWARDS_INSIDE + Thicken towards the inside + GEOM_SCALE_PRISM Scale the face opposite to the base @@ -2852,6 +2864,10 @@ Please, select face, shell or solid and try again MEN_PIPE_PATH Restore Path + + MEN_THICKNESS + Thickness + MEN_PLANE Plane @@ -3800,6 +3816,10 @@ Please, select face, shell or solid and try again STB_PIPE_PATH Restore path from a pipe-like shape + + STB_THICKNESS + Make a thick solid + STB_PLANE Create a plane @@ -4416,6 +4436,10 @@ Please, select face, shell or solid and try again TOP_PIPE_PATH Restore path + + TOP_THICKNESS + Thickness + TOP_PLANE Create a plane @@ -6039,10 +6063,6 @@ Number of sketch points too small GEOM_ADD_THICKNESS Add thickness (edges or wires only) - - GEOM_TOWARDS_INSIDE - Thicken towards the inside - GroupGUI diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 013b9abc0..526eeaac5 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -548,6 +548,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpFilling: // MENU GENERATION - FILLING case GEOMOp::OpPipe: // MENU GENERATION - PIPE case GEOMOp::OpPipePath: // MENU GENERATION - RESTORE PATH + case GEOMOp::OpThickness: // MENU GENERATION - THICKNESS libName = "GenerationGUI"; break; case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER @@ -921,6 +922,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpFilling, "FILLING" ); createGeomAction( GEOMOp::OpPipe, "PIPE" ); createGeomAction( GEOMOp::OpPipePath, "PIPE_PATH" ); + createGeomAction( GEOMOp::OpThickness, "THICKNESS" ); createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" ); createGeomAction( GEOMOp::OpGroupEdit, "GROUP_EDIT" ); @@ -1144,6 +1146,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpFilling, genId, -1 ); createMenu( GEOMOp::OpPipe, genId, -1 ); createMenu( GEOMOp::OpPipePath, genId, -1 ); + createMenu( GEOMOp::OpThickness, genId, -1 ); //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 ); //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 ); @@ -1372,6 +1375,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpFilling, genTbId ); createTool( GEOMOp::OpPipe, genTbId ); createTool( GEOMOp::OpPipePath, genTbId ); + createTool( GEOMOp::OpThickness, genTbId ); int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ), QString( "GEOMTransformation" ) ); createTool( GEOMOp::OpTranslate, transTbId ); diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index f7b545c98..2acdd53f4 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -111,6 +111,7 @@ namespace GEOMOp { OpFilling = 3202, // MENU NEW ENTITY - GENERATION - FILLING OpPipe = 3203, // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH OpPipePath = 3204, // MENU NEW ENTITY - GENERATION - RESTORE PATH + OpThickness = 3205, // MENU NEW ENTITY - GENERATION - THICKNESS // EntityGUI -------------------//-------------------------------- Op2dSketcher = 3300, // MENU NEW ENTITY - SKETCHER Op3dSketcher = 3301, // MENU NEW ENTITY - 3D SKETCHER diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 55c46b26f..6cc3e28d9 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -2287,9 +2287,11 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han * MakeThickening */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Object) theObject, - double theOffset, - bool copy = true) +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening + (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger) &theFacesIDs, + double theOffset, + bool isCopy) { SetErrorCode(KO); @@ -2301,7 +2303,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Objec //Add a new Offset function Handle(GEOM_Function) aFunction; Handle(GEOM_Object) aCopy; - if (copy) + if (isCopy) { //Add a new Copy object aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); @@ -2319,6 +2321,10 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Objec aTI.SetShape(anOriginal); aTI.SetValue(theOffset); + if (theFacesIDs.IsNull() == Standard_False) { + aTI.SetFaceIDs(theFacesIDs); + } + //Compute the offset try { OCC_CATCH_SIGNALS; @@ -2334,20 +2340,36 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Objec } //Make a Python command - if(copy) - { - GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeThickSolid(" - << theObject << ", " << theOffset << ")"; - SetErrorCode(OK); - return aCopy; + GEOM::TPythonDump pd (aFunction); + Handle(GEOM_Object) aResult; + + if (isCopy) { + pd << aCopy << " = geompy.MakeThickSolid(" + << theObject << ", " << theOffset; + aResult = aCopy; + } else { + pd << "geompy.Thicken(" << theObject << ", " << theOffset; + aResult = theObject; } - else - { - GEOM::TPythonDump(aFunction) << "geompy.Thicken(" - << theObject << ", " << theOffset << ")"; - SetErrorCode(OK); - return theObject; + + if (theFacesIDs.IsNull() == Standard_False) { + // Dump faces IDs. + Standard_Integer i; + + pd << ", ["; + + for (i = theFacesIDs->Lower(); i < theFacesIDs->Upper(); ++i) { + pd << theFacesIDs->Value(i) << ", "; + } + + // Dump the last value. + pd << theFacesIDs->Value(i) << "]"; } + + pd << ")"; + SetErrorCode(OK); + + return aResult; } //============================================================================= diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index 21040faa4..3de3f3240 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -144,9 +144,11 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Handle(GEOM_Object) thePath, Handle(GEOM_Object) theVec); - Standard_EXPORT Handle(GEOM_Object) MakeThickening (Handle(GEOM_Object) theObject, - double theOffset, - bool isCopy); + Standard_EXPORT Handle(GEOM_Object) MakeThickening + (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger) &theFacesIDs, + double theOffset, + bool isCopy); Standard_EXPORT Handle(GEOM_Object) RestorePath (Handle(GEOM_Object) theShape, Handle(GEOM_Object) theBase1, diff --git a/src/GEOMImpl/GEOMImpl_IOffset.hxx b/src/GEOMImpl/GEOMImpl_IOffset.hxx index 9d7796844..dfddeb2b2 100644 --- a/src/GEOMImpl/GEOMImpl_IOffset.hxx +++ b/src/GEOMImpl/GEOMImpl_IOffset.hxx @@ -23,9 +23,11 @@ //NOTE: This is an intreface to a function for the Offset creation. // #include "GEOM_Function.hxx" +#include #define OFF_ARG_SHAPE 1 #define OFF_ARG_VALUE 2 +#define OFF_ARG_IDS 3 class GEOMImpl_IOffset { @@ -41,6 +43,12 @@ class GEOMImpl_IOffset double GetValue() { return _func->GetReal(OFF_ARG_VALUE); } + void SetFaceIDs(const Handle(TColStd_HArray1OfInteger)& theFaceIDs) + { _func->SetIntegerArray(OFF_ARG_IDS, theFaceIDs); } + + Handle(TColStd_HArray1OfInteger) GetFaceIDs() + { return _func->GetIntegerArray(OFF_ARG_IDS); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx index 818ce4ece..495d6294e 100644 --- a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx @@ -29,8 +29,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -95,31 +97,78 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const } else if (aType == OFFSET_THICKENING || aType == OFFSET_THICKENING_COPY) { - BRepClass3d_SolidClassifier aClassifier = BRepClass3d_SolidClassifier(aShapeBase); - aClassifier.PerformInfinitePoint(Precision::Confusion()); - if (aClassifier.State()==TopAbs_IN) - { - // If the generated pipe faces normals are oriented towards the inside, the offset is negative - // so that the thickening is still towards outside - anOffset=-anOffset; - } - - BRepOffset_MakeOffset myOffsetShape(aShapeBase, anOffset, aTol, BRepOffset_Skin, - Standard_False, Standard_False, GeomAbs_Intersection, Standard_True); - - if (!myOffsetShape.IsDone()) - { - StdFail_NotDone::Raise("Thickening construction failed"); - } - aShape = myOffsetShape.Shape(); - - // Control the solid orientation. This is mostly done to fix a bug in case of extrusion - // of a circle. The built solid is then badly oriented - BRepClass3d_SolidClassifier anotherClassifier = BRepClass3d_SolidClassifier(aShape); - anotherClassifier.PerformInfinitePoint(Precision::Confusion()); - if (anotherClassifier.State()==TopAbs_IN) - { - aShape.Reverse(); + const TopAbs_ShapeEnum aType = aShapeBase.ShapeType(); + + if (aType == TopAbs_FACE || aType == TopAbs_SHELL) { + // Create a thick solid. + BRepClass3d_SolidClassifier aClassifier = BRepClass3d_SolidClassifier(aShapeBase); + aClassifier.PerformInfinitePoint(Precision::Confusion()); + if (aClassifier.State()==TopAbs_IN) + { + // If the generated pipe faces normals are oriented towards the inside, the offset is negative + // so that the thickening is still towards outside + anOffset=-anOffset; + } + + BRepOffset_MakeOffset myOffsetShape(aShapeBase, anOffset, aTol, BRepOffset_Skin, + Standard_False, Standard_False, GeomAbs_Intersection, Standard_True); + + if (!myOffsetShape.IsDone()) + { + StdFail_NotDone::Raise("Thickening construction failed"); + } + aShape = myOffsetShape.Shape(); + + // Control the solid orientation. This is mostly done to fix a bug in case of extrusion + // of a circle. The built solid is then badly oriented + BRepClass3d_SolidClassifier anotherClassifier = BRepClass3d_SolidClassifier(aShape); + anotherClassifier.PerformInfinitePoint(Precision::Confusion()); + if (anotherClassifier.State()==TopAbs_IN) + { + aShape.Reverse(); + } + } else if (aType == TopAbs_SOLID) { + // Create a hollowed solid. + Handle(TColStd_HArray1OfInteger) aFacesIDs = aCI.GetFaceIDs(); + TopTools_ListOfShape aFacesToRm; + + if (aFacesIDs.IsNull()) { + return 0; + } + + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes(aShapeBase, anIndices); + + Standard_Integer aNbShapes = anIndices.Extent(); + Standard_Integer i; + + for (i = aFacesIDs->Lower(); i <= aFacesIDs->Upper(); ++i) { + const Standard_Integer anIndex = aFacesIDs->Value(i); + + if (anIndex < 1 || anIndex > aNbShapes) { + // Invalid index. + return 0; + } + + const TopoDS_Shape &aFace = anIndices.FindKey(anIndex); + + if (aFace.ShapeType() != TopAbs_FACE) { + // Shape by index is not a face. + return 0; + } + + aFacesToRm.Append(aFace); + } + + // Create a hollowed solid. + BRepOffsetAPI_MakeThickSolid aMkSolid + (aShapeBase, aFacesToRm, anOffset, aTol, BRepOffset_Skin, + Standard_False, Standard_False, GeomAbs_Intersection); + + if (aMkSolid.IsDone()) { + aShape = aMkSolid.Shape(); + } } } @@ -160,6 +209,13 @@ GetCreationInformation(std::string& theOperationName, theOperationName = "MakeThickening"; AddParam( theParams, "Object", aCI.GetShape() ); AddParam( theParams, "Offset", aCI.GetValue() ); + { + Handle(TColStd_HArray1OfInteger) aFacesIDs = aCI.GetFaceIDs(); + + if (aFacesIDs.IsNull() == Standard_False) { + AddParam(theParams, "Faces IDs", aFacesIDs); + } + } break; default: return false; diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 1b1522990..3a67fc182 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -1184,9 +1184,10 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThickening - (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset, - CORBA::Boolean doCopy) + (GEOM::GEOM_Object_ptr theObject, + const GEOM::ListOfLong &theFacesIDs, + CORBA::Double theOffset, + CORBA::Boolean doCopy) { GEOM::GEOM_Object_var aGEOMObject; //Set a not done flag @@ -1206,12 +1207,25 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThickening //Get the basic object Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject); if (aBasicObject.IsNull()) return aGEOMObject._retn(); - + + // Get faces IDs. + Handle(TColStd_HArray1OfInteger) aFaceIDs; + Standard_Integer aNbIDs = theFacesIDs.length(); + Standard_Integer i; + + if (aNbIDs > 0) { + aFaceIDs = new TColStd_HArray1OfInteger (1, aNbIDs); + + for (i = 0; i < aNbIDs; i++) { + aFaceIDs->SetValue(i + 1, theFacesIDs[i]); + } + } + //Create the thickened shape if (doCopy) { Handle(GEOM_Object) anObject = GetOperations()->MakeThickening( - aBasicObject, theOffset, doCopy); + aBasicObject, aFaceIDs, theOffset, doCopy); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -1219,7 +1233,7 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThickening } else { - GetOperations()->MakeThickening(aBasicObject, theOffset, doCopy); + GetOperations()->MakeThickening(aBasicObject, aFaceIDs, theOffset, doCopy); // Update GUI. UpdateGUIForObject(theObject); diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index cd241d953..ab2f135f0 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -198,9 +198,10 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr thePath, GEOM::GEOM_Object_ptr theVec); - GEOM::GEOM_Object_ptr MakeThickening (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset, - CORBA::Boolean isCopy); + GEOM::GEOM_Object_ptr MakeThickening (GEOM::GEOM_Object_ptr theObject, + const GEOM::ListOfLong &theFacesIDs, + CORBA::Double theOffset, + CORBA::Boolean isCopy); GEOM::GEOM_Object_ptr RestorePath (GEOM::GEOM_Object_ptr theShape, GEOM::GEOM_Object_ptr theBase1, diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index 53e597c6c..3aa3eff61 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -241,6 +241,12 @@ def TestAll (geompy, math): tol2d, tol3d, nbiter) #(GEOM_Object, 4 Doubles, Short)->GEOM_Object Pipe = geompy.MakePipe(Wire, Edge) #(2 GEOM_Object)->GEOM_Object Sewing = geompy.MakeSewing([Face, S], precision) #(List Of GEOM_Object, Double)->GEOM_Object + ThickSolid = geompy.MakeCopy(Box) + faces = geompy.SubShapeAllSortedCentres(Box, geompy.ShapeType["FACE"]) + shell = geompy.MakeShell([faces[0], faces[1], faces[2]]) + faceIDs = geompy.SubShapeAllSortedCentresIDs(ThickSolid, geompy.ShapeType["FACE"]) + ThickShell = geompy.MakeThickSolid(shell, 50) #(GEOM_Object, Double)->GEOM_Object + geompy.Thicken(ThickSolid, 50, [faceIDs[0], faceIDs[1]]) #(GEOM_Object) modification Copy = geompy.MakeCopy(Box) #(GEOM_Object)->GEOM_Object #Transform objects @@ -437,6 +443,9 @@ def TestAll (geompy, math): id_Plane2 = geompy.addToStudy(Plane2, "Plane on Face") id_Copy = geompy.addToStudy(Copy, "Copy") + id_ThickShell = geompy.addToStudy(ThickShell, "ThickShell") + id_ThickSolid = geompy.addToStudy(ThickSolid, "ThickSolid") + id_Prism = geompy.addToStudy(Prism, "Prism") id_Prism2Ways = geompy.addToStudy(Prism2Ways, "Prism2Ways") id_PrismTwoPnt = geompy.addToStudy(PrismTwoPnt, "PrismTwoPnt") diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py old mode 100755 new mode 100644 index 9479be3b8..531c1bf18 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -4140,61 +4140,88 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "pipe") return anObj - ## Makes a thick solid from a face or a shell - # @param theShape Face or Shell to be thicken + ## Makes a thick solid from a shape. If the input is a surface shape + # (face or shell) the result is a thick solid. If an input shape is + # a solid the result is a hollowed solid with removed faces. + # @param theShape Face or Shell to get thick solid or solid to get + # hollowed solid. # @param theThickness Thickness of the resulting solid + # @param theFacesIDs the list of face IDs to be removed from the + # result. It is ignored if \a theShape is a face or a shell. + # It is empty by default. # @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 the created solid # + # @ref tui_creation_thickness "Example" @ManageTransactions("PrimOp") - def MakeThickSolid(self, theShape, theThickness, theName=None): + def MakeThickSolid(self, theShape, theThickness, + theFacesIDs=[], theName=None): """ - Make a thick solid from a face or a shell + Make a thick solid from a shape. If the input is a surface shape + (face or shell) the result is a thick solid. If an input shape is + a solid the result is a hollowed solid with removed faces. Parameters: - theShape Face or Shell to be thicken + theShape Face or Shell to get thick solid or solid to get + hollowed solid. theThickness Thickness of the resulting solid + theFacesIDs the list of face IDs to be removed from the + result. It is ignored if theShape is a face or a + shell. It is empty by default. 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. + 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 the created solid """ # Example: see GEOM_TestAll.py - anObj = self.PrimOp.MakeThickening(theShape, theThickness, True) - RaiseIfFailed("MakeThickening", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") + anObj = self.PrimOp.MakeThickening(theShape, theFacesIDs, + theThickness, True) + RaiseIfFailed("MakeThickSolid", self.PrimOp) + self._autoPublish(anObj, theName, "thickSolid") return anObj - ## Modifies a face or a shell to make it a thick solid - # @param theShape Face or Shell to be thicken + ## Modifies a shape to make it a thick solid. If the input is a surface + # shape (face or shell) the result is a thick solid. If an input shape + # is a solid the result is a hollowed solid with removed faces. + # @param theShape Face or Shell to get thick solid or solid to get + # hollowed solid. # @param theThickness Thickness of the resulting solid + # @param theFacesIDs the list of face IDs to be removed from the + # result. It is ignored if \a theShape is a face or a shell. + # It is empty by default. # # @return The modified shape # + # @ref tui_creation_thickness "Example" @ManageTransactions("PrimOp") - def Thicken(self, theShape, theThickness): + def Thicken(self, theShape, theThickness, theFacesIDs=[]): """ - Modifies a face or a shell to make it a thick solid + Modifies a shape to make it a thick solid. If the input is a + surface shape (face or shell) the result is a thick solid. If + an input shape is a solid the result is a hollowed solid with + removed faces. Parameters: - theBase Base shape to be extruded. - thePath Path shape to extrude the base shape along it. - 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. + theShape Face or Shell to get thick solid or solid to get + hollowed solid. + theThickness Thickness of the resulting solid + theFacesIDs the list of face IDs to be removed from the + result. It is ignored if \a theShape is a face or + a shell. It is empty by default. Returns: The modified shape """ # Example: see GEOM_TestAll.py - anObj = self.PrimOp.MakeThickening(theShape, theThickness, False) - RaiseIfFailed("MakeThickening", self.PrimOp) + anObj = self.PrimOp.MakeThickening(theShape, theFacesIDs, + theThickness, False) + RaiseIfFailed("Thicken", self.PrimOp) return anObj ## Build a middle path of a pipe-like shape. diff --git a/src/GenerationGUI/CMakeLists.txt b/src/GenerationGUI/CMakeLists.txt index ce6a64e88..181522a3c 100755 --- a/src/GenerationGUI/CMakeLists.txt +++ b/src/GenerationGUI/CMakeLists.txt @@ -68,6 +68,7 @@ SET(GenerationGUI_HEADERS GenerationGUI_FillingDlg.h GenerationGUI_PipeDlg.h GenerationGUI_PipePathDlg.h + GenerationGUI_ThicknessDlg.h ) # header files / to be processed by moc @@ -77,6 +78,7 @@ SET(_moc_HEADERS GenerationGUI_FillingDlg.h GenerationGUI_PipeDlg.h GenerationGUI_PipePathDlg.h + GenerationGUI_ThicknessDlg.h ) # --- sources --- @@ -91,6 +93,7 @@ SET(GenerationGUI_SOURCES GenerationGUI_FillingDlg.cxx GenerationGUI_PipeDlg.cxx GenerationGUI_PipePathDlg.cxx + GenerationGUI_ThicknessDlg.cxx ${_moc_SOURCES} ) diff --git a/src/GenerationGUI/GenerationGUI.cxx b/src/GenerationGUI/GenerationGUI.cxx index f357d09ab..f206a4f95 100644 --- a/src/GenerationGUI/GenerationGUI.cxx +++ b/src/GenerationGUI/GenerationGUI.cxx @@ -37,6 +37,7 @@ #include "GenerationGUI_FillingDlg.h" // Method FILLING #include "GenerationGUI_PipeDlg.h" // Method PIPE #include "GenerationGUI_PipePathDlg.h" // Method RESTORE PATH +#include "GenerationGUI_ThicknessDlg.h" // Method THICKNESS //======================================================================= // function : GenerationGUI() @@ -70,11 +71,12 @@ bool GenerationGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) QDialog* aDlg = NULL; switch ( theCommandID ) { - case GEOMOp::OpPrism: aDlg = new GenerationGUI_PrismDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpRevolution: aDlg = new GenerationGUI_RevolDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpFilling: aDlg = new GenerationGUI_FillingDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpPipe: aDlg = new GenerationGUI_PipeDlg ( getGeometryGUI(), parent ); break; - case GEOMOp::OpPipePath: aDlg = new GenerationGUI_PipePathDlg( getGeometryGUI(), parent ); break; + case GEOMOp::OpPrism: aDlg = new GenerationGUI_PrismDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpRevolution: aDlg = new GenerationGUI_RevolDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpFilling: aDlg = new GenerationGUI_FillingDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpPipe: aDlg = new GenerationGUI_PipeDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpPipePath: aDlg = new GenerationGUI_PipePathDlg ( getGeometryGUI(), parent ); break; + case GEOMOp::OpThickness: aDlg = new GenerationGUI_ThicknessDlg( getGeometryGUI(), parent ); break; default: app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); break; } diff --git a/src/GenerationGUI/GenerationGUI_PrismDlg.cxx b/src/GenerationGUI/GenerationGUI_PrismDlg.cxx index 3250c9db6..ecdfae3fa 100644 --- a/src/GenerationGUI/GenerationGUI_PrismDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PrismDlg.cxx @@ -721,8 +721,11 @@ bool GenerationGUI_PrismDlg::execute (ObjectList& objects) { aThickness = -aThickness; } - - anObj = anotherOper->MakeThickening(anObj, aThickness, /*copy=*/false); + + GEOM::ListOfLong_var anArray = new GEOM::ListOfLong; + + anObj = anotherOper->MakeThickening + (anObj, anArray, aThickness, /*copy=*/false); } if (!anObj->_is_nil()) diff --git a/src/GenerationGUI/GenerationGUI_ThicknessDlg.cxx b/src/GenerationGUI/GenerationGUI_ThicknessDlg.cxx new file mode 100644 index 000000000..f743fa631 --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_ThicknessDlg.cxx @@ -0,0 +1,467 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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, or (at your option) any later version. +// +// 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 : GenerationGUI_ThicknessDlg.cxx +// Author : Sergey KHROMOV, Open CASCADE S.A.S. + +#include "GenerationGUI_ThicknessDlg.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define GEOM_SOLID_THICK 0 +#define GEOM_SOLID_HOLLOWED 1 + +//============================================================================== +// class : GenerationGUI_ThicknessDlg() +// purpose : +//============================================================================== +GenerationGUI_ThicknessDlg::GenerationGUI_ThicknessDlg + (GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myFacesLbl (0), + myObjSelBtn (0), + myFacesSelBtn (0), + myObjEdit (0), + myFacesEdit (0), + myThicknessSpin (0), + myInsideCheck (0) +{ + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap image0(aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image1(aResMgr->loadPixmap("GEOM", tr("ICON_DLG_THICKNESS"))); + QPixmap image2 + (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_THICKNESS_HOLLOWED"))); + + setWindowTitle(tr("GEOM_THICKNESS_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_THICKNESS")); + mainFrame()->RadioButton1->setIcon(image1); + mainFrame()->RadioButton2->setIcon(image2); + + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + mainFrame()->RadioButton1->setChecked(true); + + QGroupBox *aMainGrp = new QGroupBox (tr("GEOM_ARGUMENTS"), this); + QGridLayout *aParamsLayout = new QGridLayout(aMainGrp); + QLabel *anObjLbl = new QLabel (tr("GEOM_OBJECT"), aMainGrp); + QLabel *aThicknessLbl = new QLabel (tr("GEOM_THICKNESS"), aMainGrp); + + myFacesLbl = new QLabel (tr("GEOM_FACES"), aMainGrp); + myObjSelBtn = new QPushButton(aMainGrp); + myFacesSelBtn = new QPushButton(aMainGrp); + myObjEdit = new QLineEdit(aMainGrp); + myFacesEdit = new QLineEdit(aMainGrp); + myThicknessSpin = new SalomeApp_DoubleSpinBox(aMainGrp); + myInsideCheck = new QCheckBox(tr("GEOM_TOWARDS_INSIDE"), aMainGrp); + + myObjSelBtn->setIcon(image0); + myFacesSelBtn->setIcon(image0); + myObjEdit->setReadOnly(true); + myObjEdit->setSizePolicy + (QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + myFacesEdit->setReadOnly(true); + myFacesEdit->setSizePolicy + (QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + + aParamsLayout->setMargin(9); + aParamsLayout->setSpacing(6); + aParamsLayout->addWidget(anObjLbl, 0, 0); + aParamsLayout->addWidget(myObjSelBtn, 0, 1); + aParamsLayout->addWidget(myObjEdit, 0, 2); + aParamsLayout->addWidget(myFacesLbl, 1, 0); + aParamsLayout->addWidget(myFacesSelBtn, 1, 1); + aParamsLayout->addWidget(myFacesEdit, 1, 2); + aParamsLayout->addWidget(aThicknessLbl, 2, 0); + aParamsLayout->addWidget(myThicknessSpin, 2, 1, 1, 2); + aParamsLayout->addWidget(myInsideCheck, 3, 0, 1, 3); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + + layout->setMargin(0); + layout->setSpacing(6); + layout->addWidget(aMainGrp); + + myHelpFileName = "create_thickness_page.html"; + + /* Initialisation */ + Init(); +} + +//============================================================================== +// function : ~GenerationGUI_ThicknessDlg() +// purpose : +//============================================================================== +GenerationGUI_ThicknessDlg::~GenerationGUI_ThicknessDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//============================================================================== +// function : Init() +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::Init() +{ + // Get setting of step value from file configuration + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double aStep = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + double aThickness = 10.; + double aThicknessMin = Precision::Confusion() * 10.0; + + initSpinBox(myThicknessSpin, aThicknessMin, + COORD_MAX, aStep, "length_precision"); + myThicknessSpin->setValue(aThickness); + myObject.nullify(); + myFaces.clear(); + + showOnlyPreviewControl(); + + // signals and slots connections + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(this, SIGNAL(constructorsClicked(int)), + this, SLOT(ConstructorsClicked(int))); + connect(myObjSelBtn, SIGNAL(clicked()), + this, SLOT(SetEditCurrentArgument())); + connect(myFacesSelBtn, SIGNAL(clicked()), + this, SLOT(SetEditCurrentArgument())); + connect(myThicknessSpin, SIGNAL(valueChanged(double)), + this, SLOT(ValueChangedInSpinBox())); + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), + this, SLOT(SetDoubleSpinBoxStep(double))); + connect(myInsideCheck, SIGNAL(toggled(bool)), + this, SLOT(onChangeDirection(bool))); + + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + initName(tr("GEOM_THICKNESS")); + + ConstructorsClicked(0); +} + +//============================================================================== +// function : SetDoubleSpinBoxStep() +// purpose : Double spin box management +//============================================================================== +void GenerationGUI_ThicknessDlg::SetDoubleSpinBoxStep (double step) +{ + myThicknessSpin->setSingleStep(step); +} + +//============================================================================== +// function : ConstructorsClicked() +// purpose : Radio button management +//============================================================================== +void GenerationGUI_ThicknessDlg::ConstructorsClicked (int constructorId) +{ + switch (constructorId) { + case GEOM_SOLID_THICK: + myObjSelBtn->setDown(false); + myFacesLbl->hide(); + myFacesSelBtn->hide(); + myFacesEdit->hide(); + myFaces.clear(); + break; + case GEOM_SOLID_HOLLOWED: + myObjSelBtn->setDown(true); + myFacesLbl->show(); + myFacesSelBtn->show(); + myFacesEdit->show(); + break; + default: + break; + } + + myEditCurrentArgument = myObjEdit; + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + + SelectionIntoArgument(); +} + +//============================================================================== +// function : ClickOnOk() +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::ClickOnOk() +{ + setIsApplyAndClose(true); + + if (ClickOnApply()) { + ClickOnCancel(); + } +} + +//============================================================================== +// function : ClickOnApply() +// purpose : +//============================================================================== +bool GenerationGUI_ThicknessDlg::ClickOnApply() +{ + if (!onAccept()) { + return false; + } + + initName(); + + // activate selection and connect selection manager + ConstructorsClicked(getConstructorId()); + + return true; +} + +//============================================================================== +// function : SelectionIntoArgument() +// purpose : Called when selection is changed or on dialog initialization or +// activation +//============================================================================== +void GenerationGUI_ThicknessDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if (myEditCurrentArgument == myObjEdit) { + QList aTypes; + const int anID = getConstructorId(); + + if (anID == GEOM_SOLID_THICK) { + aTypes << TopAbs_SHELL << TopAbs_FACE; + } else if (anID == GEOM_SOLID_HOLLOWED) { + aTypes << TopAbs_SOLID; + } + + myObject = getSelected(aTypes); + + if (myObject) { + QString aName = GEOMBase::GetName(myObject.get()); + + myEditCurrentArgument->setText(aName); + + if (anID == GEOM_SOLID_HOLLOWED && myFaces.empty()) { + myFacesSelBtn->click(); + } + } + } else if (myEditCurrentArgument == myFacesEdit) { + myFaces.clear(); + myFaces = getSelected(TopAbs_FACE, -1); + + int i = myFaces.count(); + + if (i == 1) { + myEditCurrentArgument->setText(GEOMBase::GetName(myFaces.first().get())); + } else if (i > 0) { + myEditCurrentArgument->setText + (QString::number( i ) + "_" + tr("GEOM_OBJECTS")); + } + } + + processPreview(); +} + +//============================================================================== +// function : SetEditCurrentArgument() +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == myObjSelBtn) { + myFacesSelBtn->setDown(false); + myEditCurrentArgument = myObjEdit; + globalSelection(GEOM_ALLSHAPES); + } else if (send == myFacesSelBtn) { + myObjSelBtn->setDown(false); + myEditCurrentArgument = myFacesEdit; + globalSelection(); // close local contexts, if any + localSelection(myObject.get(), TopAbs_FACE); + } + + myEditCurrentArgument->setFocus(); + + const int anID = getConstructorId(); + + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(anID == GEOM_SOLID_HOLLOWED); + + // seems we need it only to avoid preview disappearing, caused by selection + // mode change + processPreview(); +} + +//============================================================================== +// function : ActivateThisDialog() +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked(getConstructorId()); +} + +//============================================================================== +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//============================================================================== +void GenerationGUI_ThicknessDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//============================================================================== +// function : ValueChangedInSpinBox() +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::ValueChangedInSpinBox() +{ + processPreview(); +} + +//============================================================================== +// function : createOperation +// purpose : +//============================================================================== +GEOM::GEOM_IOperations_ptr GenerationGUI_ThicknessDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations(getStudyId()); +} + +//============================================================================== +// function : isValid +// purpose : +//============================================================================== +bool GenerationGUI_ThicknessDlg::isValid (QString& msg) +{ + bool isOk = false; + + switch (getConstructorId()) { + case GEOM_SOLID_THICK: + isOk = myThicknessSpin->isValid(msg, !IsPreview()) && myObject; + break; + case GEOM_SOLID_HOLLOWED: + isOk = myThicknessSpin->isValid(msg, !IsPreview()) && + myObject && !myFaces.empty(); + break; + default: + break; + } + + return isOk; +} + +//============================================================================== +// function : onChangeDirection(bool) +// purpose : +//============================================================================== +void GenerationGUI_ThicknessDlg::onChangeDirection(bool) +{ + processPreview(); +} + +//============================================================================== +// function : execute +// purpose : +//============================================================================== +bool GenerationGUI_ThicknessDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_Object_var anObj; + GEOM::GEOM_I3DPrimOperations_var anOper = + GEOM::GEOM_I3DPrimOperations::_narrow(getOperation()); + double aThickness = myThicknessSpin->value(); + GEOM::ListOfLong_var anObjIDsList = new GEOM::ListOfLong(); + TopoDS_Shape aShape; + + if (GEOMBase::GetShape(myObject.get(), aShape)) { + TopTools_IndexedMapOfShape aMainMap; + QList aListIDs; + + TopExp::MapShapes(aShape, aMainMap); + + for (int i = 0; i < myFaces.count(); i++) { + TopoDS_Shape aFace; + + if (GEOMBase::GetShape(myFaces[i].get(), aFace)) { + int anIndex = aMainMap.FindIndex(aFace); + + if (anIndex >= 0) { + aListIDs << anIndex; + } + } + } + + + if (!aListIDs.empty()) { + anObjIDsList->length(aListIDs.length()); + + for (int i = 0; i < aListIDs.length(); i++) { + anObjIDsList[i] = aListIDs[i]; + } + } + } + + if (myInsideCheck->isChecked()) { + aThickness = -aThickness; + } + + anObj = anOper->MakeThickening + (myObject.get(), anObjIDsList.in(), aThickness, true); + + if (!anObj->_is_nil()) { + objects.push_back(anObj._retn()); + } + + return true; +} diff --git a/src/GenerationGUI/GenerationGUI_ThicknessDlg.h b/src/GenerationGUI/GenerationGUI_ThicknessDlg.h new file mode 100644 index 000000000..b05d9f51b --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_ThicknessDlg.h @@ -0,0 +1,83 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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, or (at your option) any later version. +// +// 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 : GenerationGUI_ThicknessDlg.h +// Author : Sergey KHROMOV, Open CASCADE S.A.S. + +#ifndef GENERATIONGUI_THICKNESSDLG_H +#define GENERATIONGUI_THICKNESSDLG_H + +#include "GEOMBase_Skeleton.h" + + +//================================================================================= +// class : GenerationGUI_ThicknessDlg +// purpose : +//================================================================================= +class GenerationGUI_ThicknessDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + + GenerationGUI_ThicknessDlg(GeometryGUI*, QWidget* = 0, + bool = false, Qt::WindowFlags = 0); + ~GenerationGUI_ThicknessDlg(); + +protected: + + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& ); + +private: + void Init(); + void enterEvent( QEvent* ); + +private: + GEOM::GeomObjPtr myObject; + QList myFaces; + + QLabel *myFacesLbl; + QPushButton *myObjSelBtn; + QPushButton *myFacesSelBtn; + QLineEdit *myObjEdit; + QLineEdit *myFacesEdit; + SalomeApp_DoubleSpinBox *myThicknessSpin; + QCheckBox *myInsideCheck; + + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void ConstructorsClicked(int); + void ValueChangedInSpinBox(); + void SetDoubleSpinBoxStep(double); + void onChangeDirection(bool); +}; + +#endif // GENERATIONGUI_THICKNESSDLG_H -- 2.30.2