From d37d50070c8c0071420dd8dc71cd43bfc5ddc001 Mon Sep 17 00:00:00 2001 From: skv Date: Wed, 22 Oct 2014 14:33:19 +0400 Subject: [PATCH] 0022753: [EDF] Extension of the curves and surfaces --- doc/salome/examples/CMakeLists.txt | 1 + .../transformation_operations_ex14.py | 75 ++++ .../gui/GEOM/images/extend_edge_example.png | Bin 0 -> 1827 bytes .../gui/GEOM/images/extend_face_example.png | Bin 0 -> 903 bytes doc/salome/gui/GEOM/images/extension1.png | Bin 0 -> 22817 bytes doc/salome/gui/GEOM/images/extension2.png | Bin 0 -> 26901 bytes .../gui/GEOM/input/extension_operation.doc | 58 +++ .../GEOM/input/transformation_operations.doc | 1 + .../input/tui_transformation_operations.doc | 4 + idl/GEOM_Gen.idl | 36 ++ resources/CMakeLists.txt | 2 + resources/edgeextension.png | Bin 0 -> 675 bytes resources/faceextension.png | Bin 0 -> 785 bytes src/GEOMGUI/GEOM_images.ts | 12 + src/GEOMGUI/GEOM_msg_en.ts | 63 +++ src/GEOMGUI/GeometryGUI.cxx | 4 + src/GEOMGUI/GeometryGUI_Operations.h | 1 + src/GEOMImpl/CMakeLists.txt | 1 + src/GEOMImpl/GEOMImpl_IShapeExtend.hxx | 72 +++ src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 136 ++++++ src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 12 + src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 197 +++++++++ src/GEOMImpl/GEOMImpl_ShapeDriver.hxx | 10 + src/GEOMImpl/GEOMImpl_Types.hxx | 2 + src/GEOM_I/GEOM_IShapesOperations_i.cc | 68 +++ src/GEOM_I/GEOM_IShapesOperations_i.hh | 10 + src/GEOM_SWIG/GEOM_TestAll.py | 4 + src/GEOM_SWIG/geomBuilder.py | 87 ++++ src/TransformationGUI/CMakeLists.txt | 3 + src/TransformationGUI/TransformationGUI.cxx | 4 + .../TransformationGUI_ExtensionDlg.cxx | 411 ++++++++++++++++++ .../TransformationGUI_ExtensionDlg.h | 83 ++++ 32 files changed, 1357 insertions(+) create mode 100644 doc/salome/examples/transformation_operations_ex14.py create mode 100644 doc/salome/gui/GEOM/images/extend_edge_example.png create mode 100644 doc/salome/gui/GEOM/images/extend_face_example.png create mode 100644 doc/salome/gui/GEOM/images/extension1.png create mode 100644 doc/salome/gui/GEOM/images/extension2.png create mode 100644 doc/salome/gui/GEOM/input/extension_operation.doc create mode 100644 resources/edgeextension.png create mode 100644 resources/faceextension.png create mode 100644 src/GEOMImpl/GEOMImpl_IShapeExtend.hxx create mode 100644 src/TransformationGUI/TransformationGUI_ExtensionDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_ExtensionDlg.h diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 3d9da7036..67721de68 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -114,6 +114,7 @@ SET(GOOD_TESTS transformation_operations_ex11.py transformation_operations_ex12.py transformation_operations_ex13.py + transformation_operations_ex14.py viewing_geom_objs_ex01.py viewing_geom_objs_ex02.py viewing_geom_objs_ex03.py diff --git a/doc/salome/examples/transformation_operations_ex14.py b/doc/salome/examples/transformation_operations_ex14.py new file mode 100644 index 000000000..e8bc167ed --- /dev/null +++ b/doc/salome/examples/transformation_operations_ex14.py @@ -0,0 +1,75 @@ +# Extend Edge and Face + +import salome +salome.salome_init() +import GEOM +from salome.geom import geomBuilder +geompy = geomBuilder.New(salome.myStudy) +gg = salome.ImportComponentGUI("GEOM") + +# create vertices +p1 = geompy.MakeVertex( 0., 0., 0.) +p2 = geompy.MakeVertex(100., 100., 0.) +p3 = geompy.MakeVertex( 0., 100., 0.) + +# create edges +edge1 = geompy.MakeEdge(p1, p2) +edge2 = geompy.MakeCircleR(100) + +# create faces +face1 = geompy.MakePlaneThreePnt(p1, p2, p3, 200) +sphere1 = geompy.MakeSpherePntR(p1, 100) +faces2 = geompy.SubShapeAllSorted(sphere1, GEOM.FACE) +face2 = faces2[0] + +# perform edge extension +resEdge1 = geompy.ExtendEdge(edge1, 0.2, 0.8) +resEdge2 = geompy.ExtendEdge(edge1, -0.3, 1.3) +resEdge3 = geompy.ExtendEdge(edge2, 0.5, 1) +resEdge4 = geompy.ExtendEdge(edge2, 0.2, 0.5) + +# perform face extension +resFace1 = geompy.ExtendFace(face1, 0.2, 0.8, -0.3, 1.3) +resFace2 = geompy.ExtendFace(face1, 0, 0.5, 1, 2) +resFace3 = geompy.ExtendFace(face2, 0.2, 0.8, 0.3, 0.7) +resFace4 = geompy.ExtendFace(face2, 0.5, 1, 0.5, 1) + +# add objects in the study +id_edge1 = geompy.addToStudy(edge1, "Edge 1") +id_edge2 = geompy.addToStudy(edge2, "Edge 2") +id_face1 = geompy.addToStudy(face1, "Face 1") +id_face2 = geompy.addToStudy(face2, "Face 2") +id_resEdge1 = geompy.addToStudy(resEdge1, "Extended Edge 1") +id_resEdge2 = geompy.addToStudy(resEdge2, "Extended Edge 1") +id_resEdge3 = geompy.addToStudy(resEdge3, "Extended Edge 2") +id_resEdge4 = geompy.addToStudy(resEdge4, "Extended Edge 3") +id_resFace1 = geompy.addToStudy(resFace1, "Extended Face 1") +id_resFace2 = geompy.addToStudy(resFace2, "Extended Face 2") +id_resFace3 = geompy.addToStudy(resFace3, "Extended Face 3") +id_resFace4 = geompy.addToStudy(resFace4, "Extended Face 4") + +# display the prism and the results of chamfer operation +gg.createAndDisplayGO(id_edge1) +gg.setDisplayMode(id_edge1, 1) +gg.createAndDisplayGO(id_edge2) +gg.setDisplayMode(id_edge2, 1) +gg.createAndDisplayGO(id_face1) +gg.setDisplayMode(id_face1, 1) +gg.createAndDisplayGO(id_face2) +gg.setDisplayMode(id_face2, 1) +gg.createAndDisplayGO(id_resEdge1) +gg.setDisplayMode(id_resEdge1, 1) +gg.createAndDisplayGO(id_resEdge2) +gg.setDisplayMode(id_resEdge2, 1) +gg.createAndDisplayGO(id_resEdge3) +gg.setDisplayMode(id_resEdge3, 1) +gg.createAndDisplayGO(id_resEdge4) +gg.setDisplayMode(id_resEdge4, 1) +gg.createAndDisplayGO(id_resFace1) +gg.setDisplayMode(id_resFace1, 1) +gg.createAndDisplayGO(id_resFace2) +gg.setDisplayMode(id_resFace2, 1) +gg.createAndDisplayGO(id_resFace3) +gg.setDisplayMode(id_resFace3, 1) +gg.createAndDisplayGO(id_resFace4) +gg.setDisplayMode(id_resFace4, 1) diff --git a/doc/salome/gui/GEOM/images/extend_edge_example.png b/doc/salome/gui/GEOM/images/extend_edge_example.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a88e9ecdc68db6ad52287d8037b5618c758122 GIT binary patch literal 1827 zcmZ`)3s6&68V-hXF~~!aQ6A+6ER~mHEdsHD3*nK3f*?2scHN>yM0bP;WCd2ZAv`3Y zZA|Ibg4F<_7OfMi5D}Eeq9w2{NfaNv1R*>Egl8@R0vGnC*lDNJo%#Pc^L_t0|9{Ut z-+xX)_#vt>!HR&x;f(3DfCwB;&jRxUhMO=Zh^WZH2ECLBDg`H!+Kgjh^Ep~{3Jz!T zMCW?{axt;SNPtBT4FviLJB^G;m!eI!V3Z{*FpA~ROh|}JWa0di<4&;RP7+hkuuc=H z^w4ky$7BZ%XK;lc;CCdgXX=f2vK4)2)?iQ|->ak{yKa+YkPzYM5D*;TC~8i6uqnQ) zz{76Npv!p+S73YVLj72}eZtFcQu9U^78hoP&t$cWxPbIovn<#bDh1`HI#&V+UgzDH zz4f~j&a0W)qWB_lJ_Bl~P7vJeSYaGcXEK&w?tky5z&<~u#AtDX?GV~(VV%C-(oi%u z3%Z4s-4jV&^R7Yu$9fMnRla2+!u7uj>5!9@+^e~T&M`Bu_6&NKJD?eVqse%7$&f^!xf*PMV{A8L#laAYkik8K6j3 z9RAXr539~@Cvypt5@}GC!LtW<(!PFtCeYHG3pmeE$x15u#m(1aU~SJn_LCg=2|f_n zWxHXH<=|YYAZ^GG;*;rx@E@bot9b248FF4)sSM=;m_652uZxe`CL!jQyn)U6uzdl5 zdTD%HV4DkaUaV=w6jn{*ji>cv09#2+hZ3WN0-E=#gCaZx@@X|jyZVTo%K#F)l(mdU zXC$+JkncRa1w`;4{3&=O1BO=Sd_b;BGRs-QCK^tIz7ufYeFHTnxAzue)A4HHt3^fR zU|Hwt+^yN;?3^0(K?-gZlO$n6VkEL_1l=AOtXN~|=MCo2sQ%_P11%?8o3wKwTp?QTo_HOofDi3!Q4Z;AK7u(E8_7{NPe6o&fm z_OZunADb8hCE8(st$ig)f0G)RU%^9hjgP~>Z-4@QqyljzLLI5)Js7Zn*dF$K1XeOaw5L|Sb_lbK7V`-JAj_ouMDx}r;5Z96BYA{5KP_Lyvhkd zcls%Twimpuxp3D11qbIEiHNyuC0owhs$Z=A=(jO!_jH_4Aj*jF&=!DxK2FwX*AS5k zZKFUYlq*#rV28wB$_YVfhM3JSU{cE_4y^Lcw0yJSPu4Lu3%*QrOj`RTj!g+xQ7KBy zcDsN!`S4K3hm)BUX9_g8xqCz&mO;7p<`_l!LnP%(f8}nUGM?g!z+5}dqW+sl&{Y_w zwN2?Go$Wq$7G;8^Tvf7CvNs=2o=Jvbr6kD^JsI3aq(CwIxT}SBh`AuV`t%n2ZPpC+ z^^mJSnzd+_?`9@oHyXHSG;El7?`fGp^zggFr9`2CIU|OdD+)PWg&z~Nnez*OYWkTm zOtMEh#rAGTo7YZV_lK~L#O(3+_K2{&u~#)JZY&Rm;+^ZQp5M0pbUo8Ft zojO|Ge$aJ2Gn|Tj>Pt lt|$dJnnnr8O*0DC^}Oa&Ah)xn+pz}>M-My{Afg=4{vYiGhmHUM literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/extend_face_example.png b/doc/salome/gui/GEOM/images/extend_face_example.png new file mode 100644 index 0000000000000000000000000000000000000000..26281f1c4147910a6f666b58ef5ee3aa0917974c GIT binary patch literal 903 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Q|6AmVzNW6|!9gt!y4sv&5Sa(k5C6L2e;1OBO zz`%C|gc+x5^GO2**-JcqUD@w(NpK4?b=Av$1`0`*xJHyX=jZ08=9Mrw7o{eaq^2m8 zXO?6rxO@5rgg5euGcYiH@pN$vskrs_uHmF61Br%dJSaZ-;0iMb37CJesK6ow_82IjAE+O4JD)o%ZN2K+*IDt! z=l^7j9{bKW{dJ%BuJYwq)Z0y$TO6sH6SMR{IWR5Z49i5E5r8Euf82JOxVp=E%ho?` jq5YFJ8<0{$LOH)>xaMU)4V@BTCSmY&^>bP0l+XkKpqKgz literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/extension1.png b/doc/salome/gui/GEOM/images/extension1.png new file mode 100644 index 0000000000000000000000000000000000000000..419d44e66bdbd7f9bd6a2b18e33378c1e962941e GIT binary patch literal 22817 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

YwuFic=l>?`qtNb)b4^@OTzss6Q30` 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/extension2.png b/doc/salome/gui/GEOM/images/extension2.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ac66a2583697dfb938aa09efdaa190ba1f7997 GIT binary patch literal 26901 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�%rt3zCf(244VaB2p(&iK~HqK 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/extension_operation.doc b/doc/salome/gui/GEOM/input/extension_operation.doc new file mode 100644 index 000000000..417577adb --- /dev/null +++ b/doc/salome/gui/GEOM/input/extension_operation.doc @@ -0,0 +1,58 @@ +/*! + +\page extension_operation_page Extension of an Edge or a Face + +\n To produce an \b Extension in the Main Menu select +Operations - > Transformation - > Extension + +\n This operation resizes an \b Edge by means of first + and last parameters modification or a \b Face by means of modification + of minimal and maximal U- and V-Parameters. \n +\ref restore_presentation_parameters_page "Advanced options". + +The type of extension is defined using the radio buttons. + +Firstly it is possible to resize an \b Edge. +\n TUI Command: geompy.ExtendEdge(theEdge, theMin, theMax), +where \em theEdge the input edge to be resized, \em theMin the minimal +parameter value, \em theMax the maximal parameter value. +\n Arguments: Name + Object (Edge) + 2 values (Min and Max Parameters). + +\image html extension1.png "Extension of an Edge" + +\n Example: + +\image html extend_edge_example.png "Original edge (white) and extended edge" + +\note The input Edge parameters range is [0, 1]. If \b theMin parameter is + negative, the input Edge is extended, otherwise it is shrinked by + \b theMin parameter. If \b theMax is greater than 1, the Edge is + extended, otherwise it is shrinked by \btheMax parameter. + +Secondly it is possible to resize a \b Face. +\n TUI Command: geompy.ExtendFace(theFace, theUMin, theUMax, +theVMin, theVMax), where \em theFace the input face to be resized, +\em theUMin the minimal U-Parameter value, \em theUMax the maximal U-Parameter +value, \em theVMin the minimal V-Parameter value, \em theVMax the maximal +V-Parameter value. +\n Arguments: Name + Object (Face) + 4 values (Min and Max U- and +V-Parameters). + +\image html extension2.png "Extension of a Face" + +\n Example: + +\image html extend_face_example.png "The original face (gray) and a result + face shrinked along U-Direction and extended along V-Direction" + +\note The input Face U- and V-Parameters range is [0, 1]. If \b theUMin + parameter is negative, the input Face is extended, otherwise it is + shrinked along U-Direction by \b theUMin parameter. If theUMax is + greater than 1, the Face is extended, otherwise it is shrinked along + U-Direction by \b theUMax parameter. So as for \b theVMin, \b theVMax + and V-Direction of the input Face. + +Our TUI Scripts provide you with useful examples of the use of +\ref tui_extend "Extension Operations". + +*/ diff --git a/doc/salome/gui/GEOM/input/transformation_operations.doc b/doc/salome/gui/GEOM/input/transformation_operations.doc index 075973737..ac745b669 100644 --- a/doc/salome/gui/GEOM/input/transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/transformation_operations.doc @@ -16,6 +16,7 @@ which allow to:

  • \subpage scale_operation_page "Scale" an object by one or several scale factors.
  • Create an \subpage offset_operation_page "Offset" of an object.
  • Create a \subpage projection_operation_page "Projection" of an object on a face.
  • +
  • Create an \subpage extension_operation_page "Extension" of an edge or a face.
  • Create a simultaneous \subpage multi_translation_operation_page "Translation in several directions".
  • Create a simultaneous \subpage multi_rotation_operation_page
  • "Rotation in several directions". diff --git a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc index f25eb9c76..2114d7cba 100644 --- a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc @@ -54,4 +54,8 @@

    Chamfer

    \tui_script{transformation_operations_ex13.py} +\anchor tui_extend +

    Extend Edge and Face

    +\tui_script{transformation_operations_ex14.py} + */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 4e2fd3f8f..1440b1dca 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2539,6 +2539,42 @@ module GEOM ListOfLong GetSameIDs (in GEOM_Object theShapeWhere, in GEOM_Object theShapeWhat); + /*! + * \brief Resize the input edge with the new Min and Max parameters. + * The input edge parameters range is [0, 1]. If theMin parameter is + * negative, the input edge is extended, otherwise it is shrinked by + * theMin parameter. If theMax is greater than 1, the edge is extended, + * otherwise it is shrinked by theMax parameter. + * \param theEdge the input edge to be resized. + * \param theMin the minimal parameter value. + * \param theMax the maximal parameter value. + * \return a newly created edge. + */ + GEOM_Object ExtendEdge(in GEOM_Object theEdge, + in double theMin, + in double theMax); + + /*! + * \brief Resize the input face with the new UMin, UMax, VMin and VMax + * parameters. The input face U and V parameters range is [0, 1]. If + * theUMin parameter is negative, the input face is extended, otherwise + * it is shrinked along U direction by theUMin parameter. If theUMax is + * greater than 1, the face is extended, otherwise it is shrinked along + * U direction by theUMax parameter. So as for theVMin, theVMax and + * V direction of the input face. + * \param theFace the input face to be resized. + * \param theUMin the minimal U parameter value. + * \param theUMax the maximal U parameter value. + * \param theVMin the minimal V parameter value. + * \param theVMax the maximal V parameter value. + * \return a newly created face. + */ + GEOM_Object ExtendFace(in GEOM_Object theFace, + in double theUMin, + in double theUMax, + in double theVMin, + in double theVMax); + }; // # GEOM_IBlocksOperations: diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 1dd296155..f2e64385a 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -89,10 +89,12 @@ SET( _res_files displayonly.png displayall.png draft.png + edgeextension.png erase.png eraseall.png extruded_boss.png extruded_cut.png + faceextension.png face_hw.png face_vechw.png feature_detect.png diff --git a/resources/edgeextension.png b/resources/edgeextension.png new file mode 100644 index 0000000000000000000000000000000000000000..c468969c3d99bd3ab3236830070d99245a467b45 GIT binary patch literal 675 zcmV;U0$lxxP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2i^)8 z2rnk}|6B$D00JXPL_t(I%iWaCYZE~jho5W<#rhZY;?aW|6e=ZZNmzumxrmgaP!Pd` zT0u&B5^b=w+CwQQl9L~h9>fpoMGsQEcnJ2;)>=_-{sA6(ahvSS&X$Z`DV~e^IC5=WtmKd!^2Z3<9J_Qax3%s!2~=8 z_MM%2H`CqSO-Dz^_P`c(`?c0+V~LcB$NGT<2ZbPv=)3lmQ`evE(PgL{9hoIkmeti| zw=$m}1o{Ui-Y)tw!c+rH6k@Gz4{YrnKvnAIv>zymY6UH;m?*?3!E$MAYssy!R4T=2 zu}o<^!tn3WLBT{JCaR)k1uZLEdgLYA zz}5w;8KTk3C0jZXkmVtdgw1yuB6JI*?AMIdbkUGBSKxTWuHt6dQ^X z-p*$^nM~5zS@Y-M&>bF(o{UdH3@e|w`s9Ze0a{eBO7QvBbbDY=PY;Ji?&BQ1xOv*K zmX1NOtL4Khxwf%hp(ACw2F$S&mKoba{+;^$CXq2dJkw{>T;_K_#olBNd z#(6J5>dK>nRT8TsR2X2C!0HHV6yM&={rMGk?EEyzp$Y!4_yw)Y4)eFSAQ}Jw002ov JPDHLkV1lqjG$sH5 literal 0 HcmV?d00001 diff --git a/resources/faceextension.png b/resources/faceextension.png new file mode 100644 index 0000000000000000000000000000000000000000..b8429df291792535f795b0cb26c869a9668d12bf GIT binary patch literal 785 zcmV+s1Md8ZP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2i^)8 z2rn;;Bjln000NOoL_t(I%dM2lOH@%D$3J(n2f1hwq3cV3z*qzsJt&n7T#vITDZ+}9 z4DID2BOfgyqNt>Ts7;%&q_PLCf-K9GMXf4>7GXl9&Rpl-^K3EqPUCGRf;w>daX9Dq zIp6cUzwdFZwfxUf@yAui$%ky`yO<0?Kto(+?Gw)GRgpqfv->cS+?mYOBOER$Mg(Z zRwnaiL8 zkI^f;sY&;vrO%r?y~XOr!$^fqrEI!pFV^PGuQCBcCmN{hdPpYgVU$4TW_fjO56N^t zO5`wFmQ)uxrP8`?7N9P55u+9U>=duAw$3X>vbh&6e2kX7yMHE9_YoKj>sJ6)0gXVT zb=@>TZ9^AE1{fvKGC)foqXb4v-aj}S!LlJ}5cpK=J0BY9kLd$@+ zcl(OX|E#!8!sx{xhf1J21SSh$XexsI)^l-Ksn@0?I9!_yVTGQH!vKB)dGTWiAE??( P00000NkvXXu0mjf@;+fX literal 0 HcmV?d00001 diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 2e8f2ebdc..2e5d49e1e 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -431,6 +431,14 @@ ICON_DLG_PROJECTION projection.png + + ICON_DLG_EXTEND_EDGE + edgeextension.png + + + ICON_DLG_EXTEND_FACE + faceextension.png + ICON_DLG_PARTITION partition.png @@ -1099,6 +1107,10 @@ ICO_PROJECTION projection.png + + ICO_EXTENSION + edgeextension.png + ICO_ORIGIN_AND_VECTORS origin_and_vectors.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index f013b33de..0ec8db329 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -3112,6 +3112,14 @@ Please, select face, shell or solid and try again MEN_POP_PREDEF_MATER_CUSTOM Custom... + + MEN_EDGE_EXTEND + Extended Edge + + + MEN_FACE_EXTEND + Extended Face + NAME_LBL Name: @@ -4980,6 +4988,18 @@ Please, select face, shell or solid and try again STB_GET_SHARED_SHAPES Get shared shapes + + TOP_EXTENSION + Extend Edge or Face + + + MEN_EXTENSION + Extension + + + STB_EXTENSION + Extend Edge or Face + GEOM_PUBLISH_RESULT_GRP Advanced options @@ -6990,4 +7010,47 @@ Do you want to create new material? All interferences + + TransformationGUI_ExtensionDlg + + GEOM_EXTENSION_TITLE + Extension of Edge or Face + + + GEOM_EXTENSION + Extension + + + GEOM_EXTENSION_MIN + First Parameter + + + GEOM_EXTENSION_MAX + Last Parameter + + + GEOM_EXTENSION_MIN_U + First U-Parameter + + + GEOM_EXTENSION_MAX_U + Last U-Parameter + + + GEOM_EXTENSION_MIN_V + First V-Parameter + + + GEOM_EXTENSION_MAX_V + Last V-Parameter + + + GEOM_EXTENSION_EDGE_NAME + ExtendedEdge + + + GEOM_EXTENSION_FACE_NAME + ExtendedFace + + diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 1ac42576e..76af3e5c6 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -587,6 +587,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED + case GEOMOp::OpExtension: // MENU TRANSFORMATION - EXTENSION libName = "TransformationGUI"; break; case GEOMOp::OpPartition: // MENU OPERATION - PARTITION @@ -960,6 +961,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpProjection, "PROJECTION" ); createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" ); createGeomAction( GEOMOp::OpMultiRotate, "MUL_ROTATION" ); + createGeomAction( GEOMOp::OpExtension, "EXTENSION" ); createGeomAction( GEOMOp::OpPartition, "PARTITION" ); createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" ); @@ -1194,6 +1196,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpScale, transId, -1 ); createMenu( GEOMOp::OpOffset, transId, -1 ); createMenu( GEOMOp::OpProjection, transId, -1 ); + createMenu( GEOMOp::OpExtension, transId, -1 ); createMenu( separator(), transId, -1 ); createMenu( GEOMOp::OpMultiTranslate, transId, -1 ); createMenu( GEOMOp::OpMultiRotate, transId, -1 ); @@ -1362,6 +1365,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpScale, transTbId ); createTool( GEOMOp::OpOffset, transTbId ); createTool( GEOMOp::OpProjection, transTbId ); + createTool( GEOMOp::OpExtension, transTbId ); createTool( separator(), transTbId ); createTool( GEOMOp::OpMultiTranslate, transTbId ); createTool( GEOMOp::OpMultiRotate, transTbId ); diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index f66c19df1..ac13135cf 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -143,6 +143,7 @@ namespace GEOMOp { OpMultiRotate = 3607, // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION OpReimport = 3608, // POPUP MENU - RELOAD IMPORTED OpProjection = 3609, // MENU OPERATIONS - TRANSFORMATION - PROJECTION + OpExtension = 3610, // MENU OPERATIONS - TRANSFORMATION - EXTENSION // OperationGUI ----------------//-------------------------------- OpPartition = 3700, // MENU OPERATION - PARTITION OpArchimede = 3701, // MENU OPERATION - ARCHIMEDE diff --git a/src/GEOMImpl/CMakeLists.txt b/src/GEOMImpl/CMakeLists.txt index a09066811..3822d2912 100755 --- a/src/GEOMImpl/CMakeLists.txt +++ b/src/GEOMImpl/CMakeLists.txt @@ -116,6 +116,7 @@ SET(GEOMImpl_HEADERS GEOMImpl_IRevolution.hxx GEOMImpl_IMeasure.hxx GEOMImpl_IShapes.hxx + GEOMImpl_IShapeExtend.hxx GEOMImpl_IFilling.hxx GEOMImpl_IThruSections.hxx GEOMImpl_IPartition.hxx diff --git a/src/GEOMImpl/GEOMImpl_IShapeExtend.hxx b/src/GEOMImpl/GEOMImpl_IShapeExtend.hxx new file mode 100644 index 000000000..7ef0b2297 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IShapeExtend.hxx @@ -0,0 +1,72 @@ +// Copyright (C) 2007-2014 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 +// + +//NOTE: This is an intreface to a function for the extended shape creation. +// +#include "GEOM_Function.hxx" + +#define SHAPE_EXTEND_SHAPE 1 +#define SHAPE_EXTEND_UMIN 2 +#define SHAPE_EXTEND_UMAX 3 +#define SHAPE_EXTEND_VMIN 4 +#define SHAPE_EXTEND_VMAX 5 + +class GEOMImpl_IShapeExtend +{ + public: + + GEOMImpl_IShapeExtend(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theShape) + { _func->SetReference(SHAPE_EXTEND_SHAPE, theShape); } + + Handle(GEOM_Function) GetShape() + { return _func->GetReference(SHAPE_EXTEND_SHAPE); } + + void SetUMin(const Standard_Real theUMin) + { _func->SetReal(SHAPE_EXTEND_UMIN, theUMin); } + + double GetUMin() + { return _func->GetReal(SHAPE_EXTEND_UMIN); } + + void SetUMax(const Standard_Real theUMax) + { _func->SetReal(SHAPE_EXTEND_UMAX, theUMax); } + + double GetUMax() + { return _func->GetReal(SHAPE_EXTEND_UMAX); } + + void SetVMin(const Standard_Real theVMin) + { _func->SetReal(SHAPE_EXTEND_VMIN, theVMin); } + + double GetVMin() + { return _func->GetReal(SHAPE_EXTEND_VMIN); } + + void SetVMax(const Standard_Real theVMax) + { _func->SetReal(SHAPE_EXTEND_VMAX, theVMax); } + + double GetVMax() + { return _func->GetReal(SHAPE_EXTEND_VMAX); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 70c87a35d..ce0fa360f 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -37,6 +37,7 @@ #include "GEOMImpl_IVector.hxx" #include "GEOMImpl_IShapes.hxx" +#include "GEOMImpl_IShapeExtend.hxx" #include "GEOMImpl_IGlue.hxx" #include "GEOMImpl_Block6Explorer.hxx" @@ -4785,3 +4786,138 @@ Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetSameIDs return NULL; } } + +//======================================================================= +//function : ExtendEdge +//purpose : +//======================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::ExtendEdge + (const Handle(GEOM_Object) &theEdge, + const Standard_Real theMin, + const Standard_Real theMax) +{ + SetErrorCode(KO); + + if (theEdge.IsNull()) { + return NULL; + } + + //Add a new Edge object + Handle(GEOM_Object) aResEdge = GetEngine()->AddObject(GetDocID(), GEOM_EDGE); + + //Add a new Vector function + Handle(GEOM_Function) aFunction = + aResEdge->AddFunction(GEOMImpl_ShapeDriver::GetID(), EDGE_UV); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) { + return NULL; + } + + GEOMImpl_IShapeExtend aCI (aFunction); + + Handle(GEOM_Function) anEdge = theEdge->GetLastFunction(); + + if (anEdge.IsNull()) { + return NULL; + } + + aCI.SetShape(anEdge); + aCI.SetUMin(theMin); + aCI.SetUMax(theMax); + + //Compute the Edge value + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape 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) + << aResEdge << " = geompy.ExtendEdge(" + << theEdge << ", " << theMin << ", " << theMax << ")"; + + SetErrorCode(OK); + + return aResEdge; +} + +//======================================================================= +//function : ExtendFace +//purpose : +//======================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::ExtendFace + (const Handle(GEOM_Object) &theFace, + const Standard_Real theUMin, + const Standard_Real theUMax, + const Standard_Real theVMin, + const Standard_Real theVMax) +{ + SetErrorCode(KO); + + if (theFace.IsNull()) { + return NULL; + } + + //Add a new Face object + Handle(GEOM_Object) aResFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new Vector function + Handle(GEOM_Function) aFunction = + aResFace->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_UV); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) { + return NULL; + } + + GEOMImpl_IShapeExtend aCI (aFunction); + + Handle(GEOM_Function) aFace = theFace->GetLastFunction(); + + if (aFace.IsNull()) { + return NULL; + } + + aCI.SetShape(aFace); + aCI.SetUMin(theUMin); + aCI.SetUMax(theUMax); + aCI.SetVMin(theVMin); + aCI.SetVMax(theVMax); + + //Compute the Face value + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape 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) + << aResFace << " = geompy.ExtendFace(" + << theFace << ", " << theUMin << ", " << theUMax << ", " + << theVMin << ", " << theVMax << ")"; + + SetErrorCode(OK); + + return aResFace; +} diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index 8c15f7190..22b3211ec 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -384,6 +384,18 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations const Standard_Integer theShapeType, GEOMAlgo_State theState); + Standard_EXPORT Handle(GEOM_Object) + ExtendEdge(const Handle(GEOM_Object) &theEdge, + const Standard_Real theMin, + const Standard_Real theMax); + + Standard_EXPORT Handle(GEOM_Object) + ExtendFace(const Handle(GEOM_Object) &theFace, + const Standard_Real theUMin, + const Standard_Real theUMax, + const Standard_Real theVMin, + const Standard_Real theVMax); + private: Handle(GEOM_Object) MakeShape (std::list theShapes, const Standard_Integer theObjectType, diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index 39c40d119..868a33bd2 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -77,6 +78,7 @@ #include #include +#include #include #include #include @@ -572,6 +574,35 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise ("Shape for isoline construction is not a face"); } + } else if (aType == EDGE_UV) { +#ifdef RESULT_TYPE_CHECK + anExpectedType = TopAbs_EDGE; +#endif + GEOMImpl_IShapeExtend aSE (aFunction); + Handle(GEOM_Function) aRefEdge = aSE.GetShape(); + TopoDS_Shape aShapeEdge = aRefEdge->GetValue(); + + if (aShapeEdge.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge anEdge = TopoDS::Edge(aShapeEdge); + + aShape = ExtendEdge(anEdge, aSE.GetUMin(), aSE.GetUMax()); + } + } else if (aType == FACE_UV) { +#ifdef RESULT_TYPE_CHECK + anExpectedType = TopAbs_FACE; +#endif + + GEOMImpl_IShapeExtend aSE (aFunction); + Handle(GEOM_Function) aRefFace = aSE.GetShape(); + TopoDS_Shape aShapeFace = aRefFace->GetValue(); + + if (aShapeFace.ShapeType() == TopAbs_FACE) { + TopoDS_Face aFace = TopoDS::Face(aShapeFace); + + aFace.Orientation(TopAbs_FORWARD); + aShape = ExtendFace(aFace, aSE.GetUMin(), aSE.GetUMax(), + aSE.GetVMin(), aSE.GetVMax()); + } } else { } @@ -1241,6 +1272,150 @@ TopoDS_Shape GEOMImpl_ShapeDriver::MakeIsoline return aResult; } +//============================================================================= +/*! + * \brief Returns an extended edge. + */ +//============================================================================= + +TopoDS_Shape GEOMImpl_ShapeDriver::ExtendEdge + (const TopoDS_Edge &theEdge, + const Standard_Real theMin, + const Standard_Real theMax) const +{ + TopoDS_Shape aResult; + Standard_Real aF; + Standard_Real aL; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(theEdge, aF, aL); + const Standard_Real aTol = BRep_Tool::Tolerance(theEdge); + Standard_Real aRange2d = aL - aF; + + if (aCurve.IsNull() == Standard_False && aRange2d > aTol) { + Standard_Real aMin = aF + aRange2d*theMin; + Standard_Real aMax = aF + aRange2d*theMax; + + Handle(Standard_Type) aType = aCurve->DynamicType(); + + // Get the curve of original type + while (aType == STANDARD_TYPE(Geom_TrimmedCurve)) { + Handle(Geom_TrimmedCurve) aTrCurve = + Handle(Geom_TrimmedCurve)::DownCast(aCurve); + + aCurve = aTrCurve->BasisCurve(); + aType = aCurve->DynamicType(); + } + + if (aCurve->IsPeriodic()) { + // The curve is periodic. Check if a new range is less then a period. + if (aMax - aMin > aCurve->Period()) { + aMax = aMin + aCurve->Period(); + } + } else { + // The curve is not periodic. Check if aMin and aMax within bounds. + aMin = Max(aMin, aCurve->FirstParameter()); + aMax = Min(aMax, aCurve->LastParameter()); + } + + if (aMax - aMin > aTol) { + // Create a new edge. + BRepBuilderAPI_MakeEdge aME (aCurve, aMin, aMax); + + if (aME.IsDone()) { + aResult = aME.Shape(); + } + } + } + + return aResult; +} + +//============================================================================= +/*! + * \brief Returns an extended face. + */ +//============================================================================= + +TopoDS_Shape GEOMImpl_ShapeDriver::ExtendFace + (const TopoDS_Face &theFace, + const Standard_Real theUMin, + const Standard_Real theUMax, + const Standard_Real theVMin, + const Standard_Real theVMax) const +{ + TopoDS_Shape aResult; + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(theFace); + const Standard_Real aTol = BRep_Tool::Tolerance(theFace); + Standard_Real aU1; + Standard_Real aU2; + Standard_Real aV1; + Standard_Real aV2; + + // Get U, V bounds of the face. + ShapeAnalysis::GetFaceUVBounds(theFace, aU1, aU2, aV1, aV2); + + const Standard_Real aURange = aU2 - aU1; + const Standard_Real aVRange = aV2 - aV1; + + if (aSurface.IsNull() == Standard_False && + aURange > aTol && aURange > aTol) { + Handle(Standard_Type) aType = aSurface->DynamicType(); + + // Get the surface of original type + while (aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { + Handle(Geom_RectangularTrimmedSurface) aTrSurface = + Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface); + + aSurface = aTrSurface->BasisSurface(); + aType = aSurface->DynamicType(); + } + + Standard_Real aUMin = aU1 + aURange*theUMin; + Standard_Real aUMax = aU1 + aURange*theUMax; + Standard_Real aVMin = aV1 + aVRange*theVMin; + Standard_Real aVMax = aV1 + aVRange*theVMax; + + aSurface->Bounds(aU1, aU2, aV1, aV2); + + if (aSurface->IsUPeriodic()) { + // The surface is U-periodic. Check if a new U range is less + // then a period. + if (aUMax - aUMin > aSurface->UPeriod()) { + aUMax = aUMin + aSurface->UPeriod(); + } + } else { + // The surface is not V-periodic. Check if aUMin and aUMax + // within bounds. + aUMin = Max(aUMin, aU1); + aUMax = Min(aUMax, aU2); + } + + if (aSurface->IsVPeriodic()) { + // The surface is V-periodic. Check if a new V range is less + // then a period. + if (aVMax - aVMin > aSurface->VPeriod()) { + aVMax = aVMin + aSurface->VPeriod(); + } + } else { + // The surface is not V-periodic. Check if aVMin and aVMax + // within bounds. + aVMin = Max(aVMin, aV1); + aVMax = Min(aVMax, aV2); + } + + if (aUMax - aUMin > aTol && aVMax - aVMin > aTol) { + // Create a new edge. + BRepBuilderAPI_MakeFace aMF + (aSurface, aUMin, aUMax, aVMin, aVMax, aTol); + + if (aMF.IsDone()) { + aResult = aMF.Shape(); + } + } + } + + return aResult; +} + //================================================================================ /*! * \brief Returns a name of creation operation and names and values of creation parameters @@ -1341,6 +1516,28 @@ GetCreationInformation(std::string& theOperationName, AddParam(theParams, "Parameter", aII.GetParameter()); break; } + case EDGE_UV: + { + GEOMImpl_IShapeExtend aSE (function); + + theOperationName = "EDGE_EXTEND"; + AddParam(theParams, "Edge", aSE.GetShape()); + AddParam(theParams, "Min", aSE.GetUMin()); + AddParam(theParams, "Max", aSE.GetUMax()); + break; + } + case FACE_UV: + { + GEOMImpl_IShapeExtend aSE (function); + + theOperationName = "FACE_EXTEND"; + AddParam(theParams, "Face", aSE.GetShape()); + AddParam(theParams, "UMin", aSE.GetUMin()); + AddParam(theParams, "UMax", aSE.GetUMax()); + AddParam(theParams, "VMin", aSE.GetVMin()); + AddParam(theParams, "VMax", aSE.GetVMax()); + break; + } default: return false; } diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx index da699188c..45354d569 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx @@ -105,6 +105,16 @@ private: const bool IsUIso, const double theParameter) const; + TopoDS_Shape ExtendEdge(const TopoDS_Edge &theEdge, + const Standard_Real theMin, + const Standard_Real theMax) const; + + TopoDS_Shape ExtendFace(const TopoDS_Face &theFace, + const Standard_Real theUMin, + const Standard_Real theUMax, + const Standard_Real theVMin, + const Standard_Real theVMax) const; + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 715fddf09..293deb108 100644 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -304,6 +304,8 @@ #define SHAPES_ON_SHAPE 13 #define SHAPE_ISOLINE 14 #define FACE_FROM_SURFACE 15 +#define EDGE_UV 16 +#define FACE_UV 17 #define ARCHIMEDE_TYPE 1 diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index a03d84e47..b2fae9ae4 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -1932,3 +1932,71 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetSameIDs return aSeq._retn(); } + +//============================================================================= +/*! + * ExtendEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ExtendEdge + (GEOM::GEOM_Object_ptr theEdge, + CORBA::Double theMin, + CORBA::Double theMax) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) anEdge = GetObjectImpl(theEdge); + + if (anEdge.IsNull()) { + return aGEOMObject._retn(); + } + + //Get Shapes in place of aShapeWhat + Handle(GEOM_Object) aNewEdge = + GetOperations()->ExtendEdge(anEdge, theMin, theMax); + + if (!GetOperations()->IsDone() || aNewEdge.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(aNewEdge); +} + +//============================================================================= +/*! + * ExtendFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ExtendFace + (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theUMin, + CORBA::Double theUMax, + CORBA::Double theVMin, + CORBA::Double theVMax) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) aFace = GetObjectImpl(theFace); + + if (aFace.IsNull()) { + return aGEOMObject._retn(); + } + + //Get Shapes in place of aShapeWhat + Handle(GEOM_Object) aNewFace = + GetOperations()->ExtendFace(aFace, theUMin, theUMax, theVMin, theVMax); + + if (!GetOperations()->IsDone() || aNewFace.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(aNewFace); +} diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index be9d5584c..72ac7b074 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -274,6 +274,16 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::ListOfLong* GetSameIDs (GEOM::GEOM_Object_ptr theShapeWhere, GEOM::GEOM_Object_ptr theShapeWhat); + GEOM::GEOM_Object_ptr ExtendEdge(GEOM::GEOM_Object_ptr theEdge, + CORBA::Double theMin, + CORBA::Double theMax); + + GEOM::GEOM_Object_ptr ExtendFace(GEOM::GEOM_Object_ptr theFace, + CORBA::Double theUMin, + CORBA::Double theUMax, + CORBA::Double theVMin, + CORBA::Double theVMax); + ::GEOMImpl_IShapesOperations* GetOperations() { return (::GEOMImpl_IShapesOperations*)GetImpl(); } }; diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index a63590d52..9766171a1 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -255,6 +255,8 @@ def TestAll (geompy, math): Offset = geompy.MakeOffset(Box, 10.) #(GEOM_Object, Double)->GEOM_Object Orientation = geompy.ChangeOrientation(Box) ProjOnWire = geompy.MakeProjectionOnWire(p0, Wire) + ExtEdge = geompy.ExtendEdge(Edge1, -0.3, 1.3) + ExtFace = geompy.ExtendFace(Face5, -0.3, 1.3, -0.1, 1.1) #IDList for Fillet/Chamfer prism_edges = geompy.ExtractShapes(Prism, geompy.ShapeType["EDGE"], True) @@ -469,6 +471,8 @@ def TestAll (geompy, math): id_Offset = geompy.addToStudy(Offset, "Offset") id_Orientation = geompy.addToStudy(Orientation, "Orientation") id_ProjOnWire = geompy.addToStudy(ProjOnWire[1], "ProjOnWire") + id_ExtEdge = geompy.addToStudy(ExtEdge, "ExtendedEdge") + id_ExtFace = geompy.addToStudy(ExtFace, "ExtendedFace") id_Fillet = geompy.addToStudy(Fillet, "Fillet") id_Fillet2 = geompy.addToStudy(Fillet2, "Fillet2") diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 44d27b6e4..46cfb23a9 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -5686,6 +5686,93 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): RaiseIfFailed("GetSameIDs", self.ShapesOp) return anObj + ## Resize the input edge with the new Min and Max parameters. + # The input edge parameters range is [0, 1]. If theMin parameter is + # negative, the input edge is extended, otherwise it is shrinked by + # theMin parameter. If theMax is greater than 1, the edge is extended, + # otherwise it is shrinked by theMax parameter. + # @param theEdge the input edge to be resized. + # @param theMin the minimal parameter value. + # @param theMax the maximal parameter value. + # @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 edge. + # + # @ref tui_extend "Example" + @ManageTransactions("ShapesOp") + def ExtendEdge(self, theEdge, theMin, theMax, theName=None): + """ + Resize the input edge with the new Min and Max parameters. + The input edge parameters range is [0, 1]. If theMin parameter is + negative, the input edge is extended, otherwise it is shrinked by + theMin parameter. If theMax is greater than 1, the edge is extended, + otherwise it is shrinked by theMax parameter. + + Parameters: + theEdge the input edge to be resized. + theMin the minimal parameter value. + theMax the maximal parameter value. + 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 the created edge. + """ + anObj = self.ShapesOp.ExtendEdge(theEdge, theMin, theMax) + RaiseIfFailed("ExtendEdge", self.ShapesOp) + self._autoPublish(anObj, theName, "edge") + return anObj + + ## Resize the input face with the new UMin, UMax, VMin and VMax + # parameters. The input face U and V parameters range is [0, 1]. If + # theUMin parameter is negative, the input face is extended, otherwise + # it is shrinked along U direction by theUMin parameter. If theUMax is + # greater than 1, the face is extended, otherwise it is shrinked along + # U direction by theUMax parameter. So as for theVMin, theVMax and + # V direction of the input face. + # @param theFace the input face to be resized. + # @param theUMin the minimal U parameter value. + # @param theUMax the maximal U parameter value. + # @param theVMin the minimal V parameter value. + # @param theVMax the maximal V parameter value. + # @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 face. + # + # @ref tui_extend "Example" + @ManageTransactions("ShapesOp") + def ExtendFace(self, theFace, theUMin, theUMax, + theVMin, theVMax, theName=None): + """ + Resize the input face with the new UMin, UMax, VMin and VMax + parameters. The input face U and V parameters range is [0, 1]. If + theUMin parameter is negative, the input face is extended, otherwise + it is shrinked along U direction by theUMin parameter. If theUMax is + greater than 1, the face is extended, otherwise it is shrinked along + U direction by theUMax parameter. So as for theVMin, theVMax and + V direction of the input face. + + Parameters: + theFace the input face to be resized. + theUMin the minimal U parameter value. + theUMax the maximal U parameter value. + theVMin the minimal V parameter value. + theVMax the maximal V parameter value. + 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 the created face. + """ + anObj = self.ShapesOp.ExtendFace(theFace, theUMin, theUMax, + theVMin, theVMax) + RaiseIfFailed("ExtendFace", self.ShapesOp) + self._autoPublish(anObj, theName, "face") + return anObj # end of l4_obtain ## @} diff --git a/src/TransformationGUI/CMakeLists.txt b/src/TransformationGUI/CMakeLists.txt index e20407629..34622e9c4 100755 --- a/src/TransformationGUI/CMakeLists.txt +++ b/src/TransformationGUI/CMakeLists.txt @@ -66,6 +66,7 @@ SET(_uic_files SET(TransformationGUI_HEADERS TransformationGUI.h + TransformationGUI_ExtensionDlg.h TransformationGUI_MultiTranslationDlg.h TransformationGUI_MultiRotationDlg.h TransformationGUI_TranslationDlg.h @@ -79,6 +80,7 @@ SET(TransformationGUI_HEADERS # header files / to be processed by moc SET(_moc_HEADERS + TransformationGUI_ExtensionDlg.h TransformationGUI_MultiTranslationDlg.h TransformationGUI_MultiRotationDlg.h TransformationGUI_TranslationDlg.h @@ -100,6 +102,7 @@ QT4_WRAP_CPP(_moc_SOURCES ${_moc_HEADERS}) SET(TransformationGUI_SOURCES TransformationGUI.cxx + TransformationGUI_ExtensionDlg.cxx TransformationGUI_MultiTranslationDlg.cxx TransformationGUI_MultiRotationDlg.cxx TransformationGUI_TranslationDlg.cxx diff --git a/src/TransformationGUI/TransformationGUI.cxx b/src/TransformationGUI/TransformationGUI.cxx index eb62c1f18..978051669 100644 --- a/src/TransformationGUI/TransformationGUI.cxx +++ b/src/TransformationGUI/TransformationGUI.cxx @@ -39,6 +39,7 @@ #include #include +#include "TransformationGUI_ExtensionDlg.h" // Method EXTENSION #include "TransformationGUI_MultiTranslationDlg.h" // Method MULTI TRANSLATION #include "TransformationGUI_MultiRotationDlg.h" // Method MULTI ROTATION #include "TransformationGUI_TranslationDlg.h" // Method TRANSLATION @@ -151,6 +152,9 @@ bool TransformationGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) } // for (; aSelIt.More(); aSelIt.Next()) } break; + case GEOMOp::OpExtension: // EXTENSION + aDlg = new TransformationGUI_ExtensionDlg( getGeometryGUI(), parent ); + break; default: app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); break; diff --git a/src/TransformationGUI/TransformationGUI_ExtensionDlg.cxx b/src/TransformationGUI/TransformationGUI_ExtensionDlg.cxx new file mode 100644 index 000000000..91428ef36 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_ExtensionDlg.cxx @@ -0,0 +1,411 @@ +// Copyright (C) 2007-2014 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 : TransformationGUI_ExtensionDlg.cxx +// Author : Sergey KHROMOV, Open CASCADE S.A.S. + +#include "TransformationGUI_ExtensionDlg.h" +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + + +//================================================================================= +// class : TransformationGUI_ExtensionDlg +// purpose : +//================================================================================= +TransformationGUI_ExtensionDlg::TransformationGUI_ExtensionDlg + (GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myObjLbl (0), + myUMinLbl (0), + myUMaxLbl (0), + myVMinLbl (0), + myVMaxLbl (0), + mySelButton (0), + myEditObjName (0), + myUMinSpinBox (0), + myUMaxSpinBox (0), + myVMinSpinBox (0), + myVMaxSpinBox (0) +{ + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_EXTEND_EDGE"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_EXTEND_FACE"))); + + setWindowTitle(tr("GEOM_EXTENSION_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr ("GEOM_EXTENSION")); + mainFrame()->RadioButton1->setIcon(image1); + mainFrame()->RadioButton2->setIcon(image2); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + QGroupBox *aGrp = new QGroupBox(tr("GEOM_ARGUMENTS")); + + myObjLbl = new QLabel; + myUMinLbl = new QLabel; + myUMaxLbl = new QLabel; + myVMinLbl = new QLabel; + myVMaxLbl = new QLabel; + mySelButton = new QPushButton; + myEditObjName = new QLineEdit; + myUMinSpinBox = new SalomeApp_DoubleSpinBox; + myUMaxSpinBox = new SalomeApp_DoubleSpinBox; + myVMinSpinBox = new SalomeApp_DoubleSpinBox; + myVMaxSpinBox = new SalomeApp_DoubleSpinBox; + + myVMinLbl->setText(tr("GEOM_EXTENSION_MIN_V")); + myVMaxLbl->setText(tr("GEOM_EXTENSION_MAX_V")); + mySelButton->setIcon(image0); + + QGridLayout *aGrpLayout = new QGridLayout(aGrp); + + aGrpLayout->setMargin(9); + aGrpLayout->setSpacing(6); + aGrpLayout->addWidget(myObjLbl, 0, 0); + aGrpLayout->addWidget(myUMinLbl, 1, 0); + aGrpLayout->addWidget(myUMaxLbl, 2, 0); + aGrpLayout->addWidget(myVMinLbl, 3, 0); + aGrpLayout->addWidget(myVMaxLbl, 4, 0); + aGrpLayout->addWidget(mySelButton, 0, 1); + aGrpLayout->addWidget(myEditObjName, 0, 2); + aGrpLayout->addWidget(myUMinSpinBox, 1, 1, 1, 2); + aGrpLayout->addWidget(myUMaxSpinBox, 2, 1, 1, 2); + aGrpLayout->addWidget(myVMinSpinBox, 3, 1, 1, 2); + aGrpLayout->addWidget(myVMaxSpinBox, 4, 1, 1, 2); + + myVMinLbl->hide(); + myVMaxLbl->hide(); + myVMinSpinBox->hide(); + myVMaxSpinBox->hide(); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(aGrp); + /***************************************************************/ + + setHelpFileName("extension_operation_page.html"); + + /* Initialisations */ + Init(); +} + +//================================================================================= +// function : ~GenerationGUI_FillingDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_ExtensionDlg::~TransformationGUI_ExtensionDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::Init() +{ + /* init variables */ + showOnlyPreviewControl(); + myEditCurrentArgument = myEditObjName; + + double aStep = 0.1; + /* min, max, step and decimals for spin boxes & initial values */ + initSpinBox(myUMinSpinBox, -MAX_NUMBER, MAX_NUMBER, aStep, "parametric_precision"); + initSpinBox(myUMaxSpinBox, -MAX_NUMBER, MAX_NUMBER, aStep, "parametric_precision"); + initSpinBox(myVMinSpinBox, -MAX_NUMBER, MAX_NUMBER, aStep, "parametric_precision"); + initSpinBox(myVMaxSpinBox, -MAX_NUMBER, MAX_NUMBER, aStep, "parametric_precision"); + + myUMinSpinBox->setValue(0.); + myUMaxSpinBox->setValue(1.); + myVMinSpinBox->setValue(0.); + myVMaxSpinBox->setValue(1.); + + /* signals and slots connections */ + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(mySelButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(myUMinSpinBox, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(myUMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(myVMinSpinBox, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(myVMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName(tr("GEOM_EXTENSION_EDGE_NAME")); + resize(100,100); + + ConstructorsClicked(0); +} + +//================================================================================= +// function : SetDoubleSpinBoxStep() +// purpose : Double spin box management +//================================================================================= +void TransformationGUI_ExtensionDlg::SetDoubleSpinBoxStep(double step) +{ + myUMinSpinBox->setSingleStep(step); + myUMaxSpinBox->setSingleStep(step); + myVMinSpinBox->setSingleStep(step); + myVMaxSpinBox->setSingleStep(step); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_ExtensionDlg::ConstructorsClicked (int constructorId) +{ + switch (constructorId) { + case 0: // Extend edge + { + TColStd_MapOfInteger aMap; + + aMap.Add(GEOM_EDGE); + globalSelection(aMap); + + myObjLbl->setText(tr("GEOM_EDGE")); + myUMinLbl->setText(tr("GEOM_EXTENSION_MIN")); + myUMaxLbl->setText(tr("GEOM_EXTENSION_MAX")); + myVMinLbl->hide(); + myVMaxLbl->hide(); + myVMinSpinBox->hide(); + myVMaxSpinBox->hide(); + + initName(tr("GEOM_EXTENSION_EDGE_NAME")); + + break; + } + case 1: // Extend face + { + TColStd_MapOfInteger aMap; + + aMap.Add(GEOM_FACE); + globalSelection(aMap); + + myObjLbl->setText(tr("GEOM_FACE")); + myUMinLbl->setText(tr("GEOM_EXTENSION_MIN_U")); + myUMaxLbl->setText(tr("GEOM_EXTENSION_MAX_U")); + myVMinLbl->show(); + myVMaxLbl->show(); + myVMinSpinBox->show(); + myVMaxSpinBox->show(); + + initName(tr("GEOM_EXTENSION_FACE_NAME")); + + break; + } + default: + break; + } + + myBase.nullify(); + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + + SelectionIntoArgument(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::ClickOnOk() +{ + setIsApplyAndClose(true); + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_ExtensionDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_ExtensionDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if (myEditCurrentArgument == myEditObjName) { + const TopAbs_ShapeEnum aType = + getConstructorId() == 0 ? TopAbs_EDGE: TopAbs_FACE; + GEOM::GeomObjPtr aSelectedObject = getSelected(aType); + + if (aSelectedObject) { + myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject.get())); + myBase = aSelectedObject; + } else { + myBase.nullify(); + } + } + + processPreview(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == mySelButton) { + myEditObjName->setFocus(); + myEditCurrentArgument = myEditObjName; + SelectionIntoArgument(); + } +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked(getConstructorId()); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::enterEvent(QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_ExtensionDlg::ValueChangedInSpinBox(double newValue) +{ + processPreview(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_ExtensionDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_ExtensionDlg::isValid(QString& msg) +{ + bool ok = (myUMinSpinBox->isValid(msg, !IsPreview()) && + myUMaxSpinBox->isValid(msg, !IsPreview()) && + myVMinSpinBox->isValid(msg, !IsPreview()) && + myVMaxSpinBox->isValid(msg, !IsPreview()) && + myBase); + return ok; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_ExtensionDlg::execute(ObjectList& objects) +{ + bool res = false; + GEOM::GEOM_IShapesOperations_var anOper = + GEOM::GEOM_IShapesOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + anObj = anOper->ExtendEdge(myBase.get(), myUMinSpinBox->value(), + myUMaxSpinBox->value()); + res = true; + break; + case 1: + anObj = anOper->ExtendFace(myBase.get(), myUMinSpinBox->value(), + myUMaxSpinBox->value(), + myVMinSpinBox->value(), + myVMaxSpinBox->value()); + res = true; + break; + default: + break; + } + + if (!anObj->_is_nil()) { + objects.push_back(anObj._retn()); + } + + return res; +} diff --git a/src/TransformationGUI/TransformationGUI_ExtensionDlg.h b/src/TransformationGUI/TransformationGUI_ExtensionDlg.h new file mode 100644 index 000000000..b03eb6a2e --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_ExtensionDlg.h @@ -0,0 +1,83 @@ +// Copyright (C) 2007-2014 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 : TransformationGUI_ExtensionDlg.h +// Author : Sergey KHROMOV, Open CASCADE S.A.S. +// +#ifndef TRANSFORMATIONGUI_EXTENSIONDLG_H +#define TRANSFORMATIONGUI_EXTENSIONDLG_H + +#include "GEOMBase_Skeleton.h" +#include "GEOM_GenericObjPtr.h" + +class DlgRef_3Sel4Spin2Check; + +/** + * This is a dialog for ExtendEdge and ExtendFace functionality + */ +class TransformationGUI_ExtensionDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + TransformationGUI_ExtensionDlg(GeometryGUI*, QWidget* = 0, + bool = false, Qt::WindowFlags = 0); + ~TransformationGUI_ExtensionDlg(); + +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: + + QLabel *myObjLbl; + QLabel *myUMinLbl; + QLabel *myUMaxLbl; + QLabel *myVMinLbl; + QLabel *myVMaxLbl; + QPushButton *mySelButton; + QLineEdit *myEditObjName; + SalomeApp_DoubleSpinBox *myUMinSpinBox; + SalomeApp_DoubleSpinBox *myUMaxSpinBox; + SalomeApp_DoubleSpinBox *myVMinSpinBox; + SalomeApp_DoubleSpinBox *myVMaxSpinBox; + GEOM::GeomObjPtr myBase; + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void ValueChangedInSpinBox( double ); + void ConstructorsClicked( int ); + void SetDoubleSpinBoxStep( double ); +}; + +#endif // TRANSFORMATIONGUI_EXTENSIONDLG_H -- 2.39.2