]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Mantis issue 0021718: EDF 1874: Ergonomic of multi-translation / multi-rotation
authorjfa <jfa@opencascade.com>
Fri, 11 Jan 2013 14:20:45 +0000 (14:20 +0000)
committerjfa <jfa@opencascade.com>
Fri, 11 Jan 2013 14:20:45 +0000 (14:20 +0000)
31 files changed:
doc/salome/gui/GEOM/images/mtrans1.png
doc/salome/gui/GEOM/images/mtrans2.png
doc/salome/gui/GEOM/images/neo-mrot1.png
doc/salome/gui/GEOM/images/neo-mrot2.png
doc/salome/gui/GEOM/input/multi_rotation_operation.doc
doc/salome/gui/GEOM/input/multi_translation_operation.doc
doc/salome/gui/GEOM/input/tui_transformation_operations.doc
idl/GEOM_Gen.idl
src/DlgRef/DlgRef.cxx
src/DlgRef/DlgRef.h
src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui [deleted file]
src/DlgRef/Makefile.am
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMImpl/GEOMImpl_ITransformOperations.cxx
src/GEOMImpl/GEOMImpl_ITransformOperations.hxx
src/GEOMImpl/GEOMImpl_RotateDriver.cxx
src/GEOMImpl/GEOMImpl_TranslateDriver.cxx
src/GEOMImpl/GEOMImpl_Types.hxx
src/GEOM_I/GEOM_IMeasureOperations_i.cc
src/GEOM_I/GEOM_IMeasureOperations_i.hh
src/GEOM_I/GEOM_ITransformOperations_i.cc
src/GEOM_I/GEOM_ITransformOperations_i.hh
src/GEOM_SWIG/GEOM_TestAll.py
src/GEOM_SWIG/GEOM_TestOthers.py
src/GEOM_SWIG/geompyDC.py
src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx
src/MeasureGUI/MeasureGUI_DistanceDlg.cxx
src/MeasureGUI/MeasureGUI_DistanceDlg.h
src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx
src/TransformationGUI/TransformationGUI_MultiRotationDlg.h
src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx

index f5752e4b19fa64c4d082b1a746de90460f91131b..2e968557405882f45d9f953712c26aba7795d726 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/mtrans1.png and b/doc/salome/gui/GEOM/images/mtrans1.png differ
index c61b1c3c140ce43d3b64ef77e8333bcaf23dfc7d..8f051425b4a8fa2be92f66fa5a3c1d79414659fd 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/mtrans2.png and b/doc/salome/gui/GEOM/images/mtrans2.png differ
index e94b5ab73eba443b0a7851642c6d38943a55cf56..269fccc7043d191b582969de9838f9097a161815 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/neo-mrot1.png and b/doc/salome/gui/GEOM/images/neo-mrot1.png differ
index f3f3c347ef64ec51b60409adfd3f2c556ef86a7c..b17098a7591331e3c69ecc52fdbf846fcf098f6e 100755 (executable)
Binary files a/doc/salome/gui/GEOM/images/neo-mrot2.png and b/doc/salome/gui/GEOM/images/neo-mrot2.png differ
index cdc6234a17ded3960aa4ae1c80f2b5d447d4f513..0238f63343e1d09f3b46868f9d94a6cbc773b665 100644 (file)
@@ -5,24 +5,28 @@
 \n To produce a <b>Multi Rotation</b> in the <b>Main Menu</b> select
 <b>Operations - > Transformation - > Multi Rotation</b>
 
-\n This operation creates several geometrical objects rotated in one
-or two dimensions basing on the initial geometrical object.
-\n The \b Result will be one or several \b GEOM_Objects (compound).
+\n This operation creates a compound of several shapes rotated in one
+or two dimensions basing on the initial shape.
+\n The \b Result will be one \b GEOM_Object (compound).
 
 \n To produce a <b>Simple Multi Rotation</b> (in one dimension) you
-need to define a \b Shape to be rotated, an \b Axis of rotation and a
-<b>Number of Times</b> the shape must be rotated. <b>Rotation Angle</b> will
-be 2 * \a PI / \a NbTimes. Number of shapes in the resulting compound will be equal
-to \a NbTimes (if \a NbTimes = 1, the result will contain only the initial
-non-transformed shape).
-\n <b>TUI Command:</b> <em>geompy.MultiRotate1D(Shape, Axis, NbTimes)</em>
-\n <b>Arguments:</b> Name + 1 shape + 1 vector for direction + 1 value
-(repetition).
+need to define a \b Shape to be rotated, an \b Axis of rotation (DZ by
+default), Angle of rotation (optionally) and a <b>Number of Times</b>
+the shape must be rotated. If <b>Angular step</b> is not defined
+(checkbox is not checked), it will be 2 * \a PI / \a NbTimes. Number
+of shape's copies in the resulting compound will be equal to
+\a NbTimes (if \a NbTimes = 1, the result will contain only the
+initial non-transformed shape).
+
+\n <b>TUI Commands:</b>
+\n <em>geompy.MultiRotate1DNbTimes(Shape, Axis, NbTimes)</em>
+\n <em>geompy.MultiRotate1DByStep(Shape, Axis, AngleStep, NbTimes)</em>
 
 \b <b>NB!</b> There is another way to execute a Multi-rotation
 operation, which is currently accessible only via TUI commands:
-<em>geompy.MakeMultiRotation1D(Shape, Dir, Point, NbTimes)</em> which works in
-the same way, but the Axis is defined  by direction and point.
+<em>geompy.MakeMultiRotation1DNbTimes(Shape, Dir, Point, NbTimes)</em>,
+<em>geompy.MakeMultiRotation1DByStep(Shape, Dir, Point, AngleStep, NbTimes)</em>,
+which works in the same way, but the Axis is defined by direction and point.
 
 \image html neo-mrot1.png
 
@@ -31,23 +35,27 @@ the same way, but the Axis is defined  by direction and point.
 \image html multi_rotation1d2.png "The result of a simple multi-rotation"
 
 \n <b>Double Multi Rotation</b> (in two dimensions) rotates the given
-\b Object around the given \b Axis on the given \b Angle a given
-<b>Number of Times</b> and multi-translates each rotation
-result. Translation direction passes through the center of gravity of
-the rotated shape and its projection on the rotation axis. Number of
-shapes in the resulting compound will be equal to \a NbTimes1 x \a NbTimes2 (if
-both \a NbTimes1 and \a NbTimes2 are equal to 1, the result will contain
+\b Object around the given \b Axis (DZ by default) on the given
+\b Angle (optional) a given <b>Number of Times</b> and
+multi-translates each rotation result.
+If <b>Angular step</b> is not defined (checkbox is not checked), it
+will be 2 * \a PI / \a NbTimes.
+Translation direction passes through the center of gravity of the
+initial shape and its projection on the rotation axis. Number of
+shape's copies in the resulting compound will be equal to \a NbTimes1 x \a NbTimes2
+(if both \a NbTimes1 and \a NbTimes2 are equal to 1, the result will contain
 only the initial non-transformed shape).
 \b Reverse checkbox allows to set the direction of rotation.
-\n <b>TUI Command:</b> <em>geompy.MultiRotate2D(Shape, Axis, Angle, NbTimes1, Step, NbTimes2)</em>
-\n <b>Arguments:</b> Name + 1 shape + 1 vector for direction + 1 angle
-+ 1 value (repetition) + 1 step value + 1 value (repetition).
+
+\n <b>TUI Commands:</b>
+\n <em>geompy.MultiRotate2DNbTimes(Shape, Axis, NbTimes1, RadialStep, NbTimes2)</em>
+\n <em>geompy.MultiRotate2DByStep(Shape, Axis, AngleStep, NbTimes1, RadialStep, NbTimes2)</em>
 
 <b>NB!</b> There is another way to execute a Double Multi-rotation
 operation, which is currently accessible only via TUI commands: 
-<em>geompy.MakeMultiRotation2D(Shape, Dir, Point, Angle, nbtimes1, Step,nbtimes2)</em>
-which works in the same way,
-but the Axis is defined  by direction and point.
+<em>geompy.MakeMultiRotation2DNbTimes(Shape, Dir, Point, NbTimes1, RadialStep, NbTimes2)</em>,
+<em>geompy.MakeMultiRotation2DByStep(Shape, Dir, Point, AngleStep, NbTimes1, RadialStep, NbTimes2)</em>,
+which works in the same way, but the Axis is defined by direction and point.
 
 \image html neo-mrot2.png
 
index 0d084f3c1943b476e950d9ecd6bf2099a57f8804..6274ad9b4ab6a13c689ecdeffcaeae02fa6d44ea 100644 (file)
@@ -7,9 +7,8 @@ select <b>Operations - > Transformation - > Multi Translation</b>
 
 \n This operation makes several translations of a shape in \b one or \b
 two directions.
-\n The \b Result will be one or several \b GEOM_Objects
-(compound). The total number of shapes in the resulting compound (for
-a single initial selected shape) will be equal to:
+\n The \b Result will be one \b GEOM_Object (compound). The total
+number of shape copies in the resulting compound will be equal to:
 - in case of \ref single_multi_translation "Single multi translation":
 \a NbTimes (if \a NbTimes parameter is equal to 1, the result will
 contain only the initial non-translated shape). 
@@ -21,14 +20,11 @@ initial shape).
 \anchor single_multi_translation
 \n To produce a <b>Simple Multi Translation</b> (in one direction) you
 need to indicate an \b Object to be translated, a \b Vector of
-translation, a \b Step of translation and a <b>Number of Times</b> the
-Object should be duplicated. If a curve has been selected instead of
-the Vector, only its first and last vertices will be used to get the vector direction
-and the dialog preview will display the vector along which the object will be translated.
-\n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation1D(Shape, Dir,
-Step, NbTimes)</em>
-\n <b>Arguments:</b> Name + 1 shape + 1 vector (for direction) + 1
-step value + 1 value (repetition).
+translation (DX by default), a \b Step of translation and a <b>Number
+of Times</b> the Object should be duplicated. If a curve has been
+selected instead of the Vector, only its first and last vertices will
+be used to get the vector direction and the dialog preview will
+display the vector along which the object will be translated.
 
 \image html mtrans1.png
 
@@ -36,12 +32,26 @@ step value + 1 value (repetition).
 
 \image html multi_translation1dsn.png "The result of a simple multi-translation"
 
+\n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation1D(Shape, Dir,
+Step, NbTimes)</em>
+\n <b>Arguments:</b> Name + 1 shape + 1 vector (for direction) + 1
+step value + 1 value (repetition).
+
 \anchor double_multi_translation
 \n To produce a <b>Double Multi Translation</b> (in two directions) you need to
 indicate an \b Object to be translated, and, for both axes, a \b
-Vector of translation, a \b Step of translation and a <b>Number of Times</b> the shape must be duplicated.
-If a curve has been selected instead of the Vector, only its first and last vertices will be used to get the vector direction
-and the dialog preview will display the vector along which the object will be translated.
+Vector of translation (DX and DY by default), a \b Step of translation
+and a <b>Number of Times</b> the shape must be duplicated.
+If a curve has been selected instead of the Vector, only its first and
+last vertices will be used to get the vector direction and the dialog
+preview will display the vector along which the object will be
+translated.
+
+\image html mtrans2.png
+
+\image html multi_translation_initialsn.png "The initial object"
+
+\image html multi_translation2dsn.png "The result of a double multi-translation"
 
 \n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation2D(Shape, Dir1,
 Step1, NbTimes1, Dir2, Step2, NbTimes2),</em> where \em Shape is a shape
@@ -53,12 +63,6 @@ along \em Dir2.
 \n <b>Arguments:</b> Name + 1 shape + 2 vectors defining the direction
 + 2 step values + 2 values (repetitions).
 
-\image html mtrans2.png
-
-\image html multi_translation_initialsn.png "The initial object"
-
-\image html multi_translation2dsn.png "The result of a double multi-translation"
-
 Our <b>TUI Scripts</b> provide you with useful examples of the use of
 \ref tui_multi_translation "Transformation Operations".
 
index 09744cddfffe8d8ebc4365e0fcfd605bbff59b04..9c582a8971acc619d735c7f8273a9fbaa3692541 100644 (file)
@@ -340,6 +340,7 @@ gg.setDisplayMode(id_tr2d,1)
 import geompy
 import salome
 gg = salome.ImportComponentGUI("GEOM")
+import math
 
 # create vertices and vectors
 p0  = geompy.MakeVertex( 0.,  0.,  0.)
@@ -349,7 +350,7 @@ pz  = geompy.MakeVertex( 0.,  0., 20.)
 pxyz = geompy.MakeVertex( 50., 50., 10.)
 vz  = geompy.MakeVector(p0, pz)
 vxy = geompy.MakeVector(px, py)
-vrot1d = geompy.MakeVector(p0, pxyz)
+vrot = geompy.MakeVector(p0, pxyz)
 
 # create an arc
 arc = geompy.MakeArc(py, pz, px)
@@ -363,25 +364,41 @@ face = geompy.MakeFace(wire, 1)
 # create a prism
 prism = geompy.MakePrismVecH(face, vz, 20.0)
 
-# rotate the given object around the given axis by the given angle a given number of times
-rot1d = geompy.MultiRotate1D(prism, vrot1d, 4)
+# 1. Rotate the prism around the axis vrot 4 times
+
+# rotation angle = 2 * PI / 4
+rot1da = geompy.MultiRotate1DNbTimes(prism, vrot, 4)
+
+# by the given angle of 30 degrees
+rot1db = geompy.MultiRotate1DByStep(prism, vrot, math.pi/6., 4)
+
+# 2. Rotate the prism around the axis vrot 4 times
+#    and translate the result of each rotation 5 times on distance 50
+
+# rotation angle = 2 * PI / 4
+rot2da = geompy.MultiRotate2DNbTimes(prism, vrot, 4, 50, 5)
 
-# rotate the given object around the given axis by the given angle a given number of times
-# and multi-translate the result of each rotation
-rot2d = geompy.MultiRotate2D(prism, vrot1d, 60, 4, 50, 5)
+# by the given angle of 60 degrees
+rot2db = geompy.MultiRotate2DByStep(prism, vrot, math.pi/3., 4, 50, 5)
 
 # add objects in the study
 id_prism = geompy.addToStudy(prism,"Prism")
-id_rot1d = geompy.addToStudy(rot1d,"Rotation 1D")
-id_rot2d = geompy.addToStudy(rot2d,"Rotation 2D")
+id_rot1da = geompy.addToStudy(rot1da,"Rotation 1D Nb.Times")
+id_rot1db = geompy.addToStudy(rot1db,"Rotation 1D By Step")
+id_rot2da = geompy.addToStudy(rot2da,"Rotation 2D Nb.Times")
+id_rot2db = geompy.addToStudy(rot2db,"Rotation 2D By Step")
 
 # display the prism and the results of fillet operation
 gg.createAndDisplayGO(id_prism)
 gg.setDisplayMode(id_prism,1)
-gg.createAndDisplayGO(id_rot1d)
-gg.setDisplayMode(id_rot1d,1)
-gg.createAndDisplayGO(id_rot2d)
-gg.setDisplayMode(id_rot2d,1) 
+gg.createAndDisplayGO(id_rot1da)
+gg.setDisplayMode(id_rot1da,1)
+gg.createAndDisplayGO(id_rot1db)
+gg.setDisplayMode(id_rot1db,1)
+gg.createAndDisplayGO(id_rot2da)
+gg.setDisplayMode(id_rot2da,1) 
+gg.createAndDisplayGO(id_rot2db)
+gg.setDisplayMode(id_rot2db,1) 
 \endcode
 
 \anchor tui_fillet2d
index 4c0c92b2ac9f44f7d30307fe32e6b6bcca0ac293..af98eeb8a8eec1f5e3b889ad60426f20467d9f1a 100644 (file)
@@ -804,7 +804,7 @@ module GEOM
     /*!
      *  \brief Translate the given object along the given vector a given number times
      *  \param theObject The object to be translated.
-     *  \param theVector Direction of the translation.
+     *  \param theVector Direction of the translation. DX if None.
      *  \param theStep Distance to translate on.
      *  \param theNbTimes Quantity of translations to be done.
      *  \return New GEOM_Object, containing compound of all
@@ -818,10 +818,10 @@ module GEOM
     /*!
      *  \brief Conseqently apply two specified translations to theObject specified number of times.
      *  \param theObject The object to be translated.
-     *  \param theVector1 Direction of the first translation.
+     *  \param theVector1 Direction of the first translation. DX if None.
      *  \param theStep1 Step of the first translation.
      *  \param theNbTimes1 Quantity of translations to be done along theVector1.
-     *  \param theVector2 Direction of the second translation.
+     *  \param theVector2 Direction of the second translation. DY if None.
      *  \param theStep2 Step of the second translation.
      *  \param theNbTimes2 Quantity of translations to be done along theVector2.
      *  \return New GEOM_Object, containing compound of all
@@ -888,20 +888,56 @@ module GEOM
                             in GEOM_Object theAxis,
                             in double theAngle);
 
-
     /*!
      *  \brief Rotate the given object around the given axis a given number times.
      *
-     *  Rotation angle will be 2*PI/theNbTimes.
+     *  Rotation angle will be 2*PI/theNbObjects.
      *  \param theObject The object to be rotated.
-     *  \param theAxis The rotation axis.
-     *  \param theNbTimes Quantity of rotations to be done.
+     *  \param theAxis The rotation axis. DZ if None.
+     *  \param theNbObjects Quantity of rotations to be done.
      *  \return New GEOM_Object, containing compound of all the
      *          shapes, obtained after each rotation.
      */
     GEOM_Object MultiRotate1D (in GEOM_Object theObject,
                                in GEOM_Object theAxis,
-                               in long theNbTimes);
+                               in long theNbObjects);
+
+    /*!
+     *  \brief Rotate the given object around the given axis
+     *         a given number times on the given angle.
+     *
+     *  \param theObject The object to be rotated.
+     *  \param theAxis The rotation axis. DZ if None.
+     *  \param theAngleStep Rotation angle in radians.
+     *  \param theNbSteps Quantity of rotations to be done.
+     *  \return New GEOM_Object, containing compound of all the
+     *          shapes, obtained after each rotation.
+     */
+    GEOM_Object MultiRotate1DByStep (in GEOM_Object theObject,
+                                     in GEOM_Object theAxis,
+                                     in double theAngleStep,
+                                     in long theNbSteps);
+
+    /*!
+     *  \brief Rotate the given object around the given axis
+     *  a given number times and multi-translate each rotation result.
+     *
+     *  Rotation angle will be 2*PI/theNbObjects.
+     *  Translation direction passes through center of gravity
+     *  of rotated shape and its projection on the rotation axis.
+     *  \param theObject The object to be rotated.
+     *  \param theAxis Rotation axis. DZ if None.
+     *  \param theNbObjects Quantity of rotations to be done.
+     *  \param theRadialStep Translation distance.
+     *  \param theNbSteps Quantity of translations to be done.
+     *  \return New GEOM_Object, containing compound of all the
+     *          shapes, obtained after each transformation.
+     */
+    GEOM_Object MultiRotate2DNbTimes (in GEOM_Object theObject,
+                                      in GEOM_Object theAxis,
+                                      in long theNbObjects,
+                                      in double theRadialStep,
+                                      in long theNbSteps);
 
     /*!
      *  \brief Rotate the given object around the
@@ -911,20 +947,43 @@ module GEOM
      *  Translation direction passes through center of gravity
      *  of rotated shape and its projection on the rotation axis.
      *  \param theObject The object to be rotated.
-     *  \param theAxis Rotation axis.
-     *  \param theAngle Rotation angle in graduces.
-     *  \param theNbTimes1 Quantity of rotations to be done.
-     *  \param theStep Translation distance.
-     *  \param theNbTimes2 Quantity of translations to be done.
+     *  \param theAxis Rotation axis. DZ if None.
+     *  \param theAngleStep Rotation angle in radians.
+     *  \param theNbSteps1 Quantity of rotations to be done.
+     *  \param theRadialStep Translation distance.
+     *  \param theNbSteps2 Quantity of translations to be done.
+     *  \return New GEOM_Object, containing compound of all the
+     *          shapes, obtained after each transformation.
+     */
+    GEOM_Object MultiRotate2DByStep (in GEOM_Object theObject,
+                                     in GEOM_Object theAxis,
+                                     in double theAngleStep,
+                                     in long theNbSteps1,
+                                     in double theRadialStep,
+                                     in long theNbSteps2);
+
+    /*!
+     *  \brief Rotate the given object around the
+     *  given axis on the given angle a given number
+     *  times and multi-translate each rotation result.
+     *
+     *  Translation direction passes through center of gravity
+     *  of rotated shape and its projection on the rotation axis.
+     *  \param theObject The object to be rotated.
+     *  \param theAxis Rotation axis. DZ if None.
+     *  \param theAngleStep Rotation angle in degrees.
+     *  \param theNbSteps1 Quantity of rotations to be done.
+     *  \param theRadialStep Translation distance.
+     *  \param theNbSteps2 Quantity of translations to be done.
      *  \return New GEOM_Object, containing compound of all the
      *          shapes, obtained after each transformation.
      */
     GEOM_Object MultiRotate2D (in GEOM_Object theObject,
                                in GEOM_Object theAxis,
-                               in double theAngle,
-                               in long theNbTimes1,
-                               in double theStep,
-                               in long theNbTimes2);
+                               in double theAngleStep,
+                               in long theNbSteps1,
+                               in double theRadialStep,
+                               in long theNbSteps2);
 
     /*!
      *  \brief Replace the given object by an object,
@@ -3629,6 +3688,16 @@ module GEOM
                            out double X1, out double Y1, out double Z1,
                            out double X2, out double Y2, out double Z2);
 
+    /*!
+     *  \brief Get closest points of the given shapes.
+     *  \param theShape1,theShape2 Shapes to find closest points of.
+     *  \param theCoords Output. List of (X, Y, Z) coordinates for all couples of points.
+     *  \return The number of found solutions (-1 in case of infinite number of solutions).
+     */
+    long ClosestPoints (in GEOM_Object theShape1,
+                        in GEOM_Object theShape2,
+                        out ListOfDouble theCoords);
+
     /*!
      *  \brief Get angle between the given lines or linear edges.
      *  \param theShape1,theShape2 Shapes to find angle between. Lines or linear edges.
index 164f483b4e52237c9feebcf1dd4ce424461527b6..01be686b65ed1971c88ebfaf054b7954a75ed4b9 100644 (file)
@@ -15,7 +15,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 // File   : DlgRef.cxx
 // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
@@ -526,20 +525,6 @@ DlgRef_2Sel3Spin::~DlgRef_2Sel3Spin()
 {
 }
 
-//////////////////////////////////////////
-// DlgRef_2Sel4Spin1Check
-//////////////////////////////////////////
-
-DlgRef_2Sel4Spin1Check::DlgRef_2Sel4Spin1Check( QWidget* parent, Qt::WindowFlags f )
-: QWidget( parent, f )
-{
-  setupUi( this );
-}
-
-DlgRef_2Sel4Spin1Check::~DlgRef_2Sel4Spin1Check()
-{
-}
-
 //////////////////////////////////////////
 // DlgRef_2Sel
 //////////////////////////////////////////
index bda6da5b5041da0a921f9eef0477e6856b5cc111..bb707a5119becd561870c6c58336f3d25288cf0a 100644 (file)
@@ -15,7 +15,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 // File   : DlgRef.h
 // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
@@ -611,22 +610,6 @@ public:
   ~DlgRef_2Sel3Spin();
 };
 
-//////////////////////////////////////////
-// DlgRef_2Sel4Spin1Check
-//////////////////////////////////////////
-
-#include "ui_DlgRef_2Sel4Spin1Check_QTD.h"
-
-class DLGREF_EXPORT DlgRef_2Sel4Spin1Check : public QWidget, 
-                                             public Ui::DlgRef_2Sel4Spin1Check_QTD
-{
-  Q_OBJECT
-
-public:
-  DlgRef_2Sel4Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 );
-  ~DlgRef_2Sel4Spin1Check();
-};
-
 //////////////////////////////////////////
 // DlgRef_2Sel
 //////////////////////////////////////////
diff --git a/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui b/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui
deleted file mode 100644 (file)
index 5d0afce..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-<ui version="4.0" >
- <class>DlgRef_2Sel4Spin1Check_QTD</class>
- <widget class="QWidget" name="DlgRef_2Sel4Spin1Check_QTD" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>156</width>
-    <height>197</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string/>
-  </property>
-  <layout class="QGridLayout" >
-   <property name="leftMargin" >
-    <number>0</number>
-   </property>
-   <property name="topMargin" >
-    <number>0</number>
-   </property>
-   <property name="rightMargin" >
-    <number>0</number>
-   </property>
-   <property name="bottomMargin" >
-    <number>0</number>
-   </property>
-   <property name="horizontalSpacing" >
-    <number>0</number>
-   </property>
-   <property name="verticalSpacing" >
-    <number>0</number>
-   </property>
-   <item row="0" column="0" >
-    <widget class="QGroupBox" name="GroupBox1" >
-     <property name="title" >
-      <string/>
-     </property>
-     <layout class="QGridLayout" >
-      <property name="leftMargin" >
-       <number>9</number>
-      </property>
-      <property name="topMargin" >
-       <number>9</number>
-      </property>
-      <property name="rightMargin" >
-       <number>9</number>
-      </property>
-      <property name="bottomMargin" >
-       <number>9</number>
-      </property>
-      <property name="horizontalSpacing" >
-       <number>6</number>
-      </property>
-      <property name="verticalSpacing" >
-       <number>6</number>
-      </property>
-      <item row="4" column="0" colspan="3" >
-       <widget class="QCheckBox" name="CheckButton1" >
-        <property name="text" >
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="1" colspan="2" >
-       <widget class="SalomeApp_IntSpinBox" name="SpinBox_DY2" />
-      </item>
-      <item row="5" column="1" colspan="2" >
-       <widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DX2" />
-      </item>
-      <item row="3" column="1" colspan="2" >
-       <widget class="SalomeApp_IntSpinBox" name="SpinBox_DY1" />
-      </item>
-      <item row="2" column="1" colspan="2" >
-       <widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DX1" />
-      </item>
-      <item row="6" column="0" >
-       <widget class="QLabel" name="TextLabel6" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL6</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="0" >
-       <widget class="QLabel" name="TextLabel5" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL5</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0" >
-       <widget class="QLabel" name="TextLabel4" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL4</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0" >
-       <widget class="QLabel" name="TextLabel3" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL3</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0" >
-       <widget class="QLabel" name="TextLabel2" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL2</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1" >
-       <widget class="QPushButton" name="PushButton2" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="2" >
-       <widget class="QLineEdit" name="LineEdit1" />
-      </item>
-      <item row="0" column="0" >
-       <widget class="QLabel" name="TextLabel1" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string>TL1</string>
-        </property>
-        <property name="wordWrap" >
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2" >
-       <widget class="QLineEdit" name="LineEdit2" />
-      </item>
-      <item row="0" column="1" >
-       <widget class="QPushButton" name="PushButton1" >
-        <property name="sizePolicy" >
-         <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text" >
-         <string/>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <layoutdefault spacing="6" margin="11" />
- <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
- <customwidgets>
-  <customwidget>
-   <class>SalomeApp_DoubleSpinBox</class>
-   <extends>QDoubleSpinBox</extends>
-   <header location="global" >SalomeApp_DoubleSpinBox.h</header>
-  </customwidget>
-  <customwidget>
-   <class>SalomeApp_IntSpinBox</class>
-   <extends>QSpinBox</extends>
-   <header location="global" >SalomeApp_IntSpinBox.h</header>
-  </customwidget>
- </customwidgets>
- <tabstops>
-  <tabstop>PushButton1</tabstop>
-  <tabstop>LineEdit1</tabstop>
-  <tabstop>PushButton2</tabstop>
-  <tabstop>LineEdit2</tabstop>
-  <tabstop>SpinBox_DX1</tabstop>
-  <tabstop>SpinBox_DY1</tabstop>
-  <tabstop>CheckButton1</tabstop>
-  <tabstop>SpinBox_DX2</tabstop>
-  <tabstop>SpinBox_DY2</tabstop>
- </tabstops>
- <resources/>
- <connections/>
-</ui>
index deaa27026fa6f736f0f305d26fef73356baf9230..3e5d05b635a86ce8de9ddc45f1e340ade54b6345 100644 (file)
@@ -15,9 +15,7 @@
 # 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 DLGREF : 
 # File    : Makefile.am
 # Author  : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com)
 # Package : DlgRef
@@ -72,7 +70,6 @@ UIC_FILES =                                   \
        ui_DlgRef_2Sel2Spin2Push_QTD.h          \
        ui_DlgRef_2Sel3Spin2Rb_QTD.h            \
        ui_DlgRef_2Sel3Spin_QTD.h               \
-       ui_DlgRef_2Sel4Spin1Check_QTD.h         \
        ui_DlgRef_2Sel_QTD.h                    \
        ui_DlgRef_2SelExt_QTD.h                 \
        ui_DlgRef_2Spin_QTD.h                   \
index 1eeee7c4861cece75ad53c1f0d1e57d81e22eb51..c0ec2c7925b4c2594f5d5ad599d96357e0958584 100644 (file)
@@ -125,6 +125,10 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_ANGLE_1</source>
         <translation>Angle</translation>
     </message>
+    <message>
+        <source>GEOM_ANGLE_STEP</source>
+        <translation>Angular step :</translation>
+    </message>
     <message>
         <source>GEOM_ARC_ELLIPSE</source>
         <translation>Arc of ellipse</translation>
@@ -1950,6 +1954,10 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_STEP</source>
         <translation>Step :</translation>
     </message>
+    <message>
+        <source>GEOM_STEP_R</source>
+        <translation>Radial step :</translation>
+    </message>
     <message>
         <source>GEOM_STEP_TITLE</source>
         <translation>Step value for GUI constructions</translation>
index 9b754517f9cad01f28e1cf50247ca6806ac8c945..c296d9c5885d40557551aa79ba39e415fb91727e 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -500,7 +499,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D
 {
   SetErrorCode(KO);
 
-  if (theObject.IsNull() || theVector.IsNull()) return NULL;
+  if (theObject.IsNull()) return NULL;
 
   Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
   if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved
@@ -515,9 +514,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D
   //Check if the function is set correctly
   if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL;
 
-  GEOMImpl_ITranslate aTI(aFunction);
-  aTI.SetVector(theVector->GetLastFunction());
+  GEOMImpl_ITranslate aTI (aFunction);
   aTI.SetOriginal(aLastFunction);
+  if (!theVector.IsNull())
+    aTI.SetVector(theVector->GetLastFunction());
   aTI.SetStep1(theStep);
   aTI.SetNbIter1(theNbTimes);
 
@@ -560,7 +560,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
 {
   SetErrorCode(KO);
 
-  if (theObject.IsNull() || theVector.IsNull() || theVector2.IsNull()) return NULL;
+  if (theObject.IsNull()) return NULL;
 
   Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
   if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved
@@ -576,11 +576,13 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
   if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL;
 
   GEOMImpl_ITranslate aTI (aFunction);
-  aTI.SetVector(theVector->GetLastFunction());
-  aTI.SetVector2(theVector2->GetLastFunction());
   aTI.SetOriginal(aLastFunction);
+  if (!theVector.IsNull())
+    aTI.SetVector(theVector->GetLastFunction());
   aTI.SetStep1(theStep1);
   aTI.SetNbIter1(theNbTimes1);
+  if (!theVector2.IsNull())
+    aTI.SetVector2(theVector2->GetLastFunction());
   aTI.SetStep2(theStep2);
   aTI.SetNbIter2(theNbTimes2);
 
@@ -1675,10 +1677,12 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) t
 
 //=============================================================================
 /*!
- *  Rotate
+ *  RotateCopy
  */
 //=============================================================================
-Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle)
+Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject,
+                                                               Handle(GEOM_Object) theAxis,
+                                                               double theAngle)
 {
   SetErrorCode(KO);
 
@@ -1728,7 +1732,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Objec
 
 //=============================================================================
 /*!
- *  Rotate1D
+ *  Rotate1D (for MultiRotate1DNbTimes)
  */
 //=============================================================================
 Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject,
@@ -1737,7 +1741,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
 {
   SetErrorCode(KO);
 
-  if (theObject.IsNull() || theAxis.IsNull()) return NULL;
+  if (theObject.IsNull()) return NULL;
 
   Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
   if (aLastFunction.IsNull()) return NULL;  //There is no function which creates an object to be rotated
@@ -1754,7 +1758,8 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
 
   GEOMImpl_IRotate aRI(aFunction);
   aRI.SetOriginal(aLastFunction);
-  aRI.SetAxis(theAxis->GetLastFunction());
+  if (!theAxis.IsNull())
+    aRI.SetAxis(theAxis->GetLastFunction());
   aRI.SetNbIter1(theNbTimes);
 
   //Compute the translation
@@ -1774,7 +1779,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
   }
 
   //Make a Python command
-  GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1D("
+  GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1DNbTimes("
     << theObject << ", " << theAxis << ", " << theNbTimes << ")";
 
   SetErrorCode(OK);
@@ -1783,22 +1788,148 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
 
 //=============================================================================
 /*!
- *  Rotate2D
+ *  Rotate1D (for MultiRotate1DByStep)
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject,
+                                                             Handle(GEOM_Object) theAxis,
+                                                             double theAngleStep,
+                                                             Standard_Integer theNbSteps)
+{
+  SetErrorCode(KO);
+
+  if (theObject.IsNull()) return NULL;
+
+  Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
+  if (aLastFunction.IsNull()) return NULL;  //There is no function which creates an object to be rotated
+
+  //Add a new Copy object
+  Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType());
+
+  //Add a rotate function
+  aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D_STEP);
+  if (aFunction.IsNull()) return NULL;
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL;
+
+  //Convert angle into degrees
+  double anAngleStep = theAngleStep * 180. / M_PI;
+
+  GEOMImpl_IRotate aRI (aFunction);
+  aRI.SetOriginal(aLastFunction);
+  if (!theAxis.IsNull())
+    aRI.SetAxis(theAxis->GetLastFunction());
+  aRI.SetAngle(anAngleStep);
+  aRI.SetNbIter1(theNbSteps);
+
+  //Compute the translation
+  try {
+#if OCC_VERSION_LARGE > 0x06010000
+    OCC_CATCH_SIGNALS;
+#endif
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Rotate 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)
+    << aCopy << " = geompy.MultiRotate1DByStep(" << theObject << ", "
+    << theAxis << ", " << anAngleStep << "*math.pi/180.0, " << theNbSteps << ")";
+
+  SetErrorCode(OK);
+  return aCopy;
+}
+
+//=============================================================================
+/*!
+ *  Rotate2D (for MultiRotate2DNbTimes)
  */
 //=============================================================================
 Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject,
                                                              Handle(GEOM_Object) theAxis,
-                                                             double theAngle,
+                                                             Standard_Integer theNbObjects,
+                                                             double theRadialStep,
+                                                             Standard_Integer theNbSteps)
+{
+  SetErrorCode(KO);
+
+  if (theObject.IsNull()) return NULL;
+
+  Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
+  if (aLastFunction.IsNull()) return NULL;  //There is no function which creates an object to be rotated
+
+  //Add a new Copy object
+  Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType());
+
+  //Add a rotate function
+  aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D);
+  if (aFunction.IsNull()) return NULL;
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL;
+
+  double anAngle = 360. / (double)theNbObjects;
+
+  GEOMImpl_IRotate aRI (aFunction);
+  aRI.SetOriginal(aLastFunction);
+  if (!theAxis.IsNull())
+    aRI.SetAxis(theAxis->GetLastFunction());
+  aRI.SetAngle(anAngle);
+  aRI.SetNbIter1(theNbObjects);
+  aRI.SetStep(theRadialStep);
+  aRI.SetNbIter2(theNbSteps);
+
+  //Compute the translation
+  try {
+#if OCC_VERSION_LARGE > 0x06010000
+    OCC_CATCH_SIGNALS;
+#endif
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Rotate 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) << aCopy << " = geompy.MultiRotate2DNbTimes("
+                               << theObject << ", " << theAxis << ", " << theNbObjects
+                               << ", " << theRadialStep << ", " << theNbSteps << ")";
+
+  SetErrorCode(OK);
+  return aCopy;
+}
+
+//=============================================================================
+/*!
+ *  Rotate2D (for MultiRotate2DByStep)
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject,
+                                                             Handle(GEOM_Object) theAxis,
+                                                             double theAngleStep,
                                                              Standard_Integer theNbTimes1,
                                                              double theStep,
                                                              Standard_Integer theNbTimes2)
 {
   SetErrorCode(KO);
 
-  if (theObject.IsNull() || theAxis.IsNull()) return NULL;
+  if (theObject.IsNull()) return NULL;
 
   Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
-  if (aLastFunction.IsNull()) return NULL;  //There is no function which creates an object to be rotated
+  if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated
 
   //Add a new Copy object
   Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType());
@@ -1807,16 +1938,20 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object)
   aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D);
   if (aFunction.IsNull()) return NULL;
 
-    //Check if the function is set correctly
+  //Check if the function is set correctly
   if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL;
 
-  GEOMImpl_IRotate aRI(aFunction);
-  aRI.SetAxis(theAxis->GetLastFunction());
+  //Convert angle into degrees
+  double anAngleStep = theAngleStep * 180. / M_PI;
+
+  GEOMImpl_IRotate aRI (aFunction);
   aRI.SetOriginal(aLastFunction);
+  if (!theAxis.IsNull())
+    aRI.SetAxis(theAxis->GetLastFunction());
+  aRI.SetAngle(anAngleStep);
   aRI.SetNbIter1(theNbTimes1);
-  aRI.SetNbIter2(theNbTimes2);
-  aRI.SetAngle(theAngle);
   aRI.SetStep(theStep);
+  aRI.SetNbIter2(theNbTimes2);
 
   //Compute the translation
   try {
@@ -1835,9 +1970,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object)
   }
 
   //Make a Python command
-  GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate2D("
-    << theObject << ", " << theAxis << ", " << theAngle << ", "
-      << theNbTimes1 << ", " << theStep << ", " << theNbTimes2 << ")";
+  GEOM::TPythonDump(aFunction)
+    << aCopy << " = geompy.MultiRotate2DByStep(" << theObject << ", "
+    << theAxis << ", " << anAngleStep << "*math.pi/180.0, "
+    << theNbTimes1 << ", " << theStep << ", " << theNbTimes2 << ")";
 
   SetErrorCode(OK);
   return aCopy;
@@ -1858,7 +1994,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateThreePoints (Handle(GEO
   if (theObject.IsNull() || theCentPoint.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL;
 
   Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
-  if (aLastFunction.IsNull()) return NULL;  //There is no function which creates an object to be rotated
+  if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated
 
   // Get last functions of the arguments
   Handle(GEOM_Function) aCPF = theCentPoint->GetLastFunction();
index 270854229c9ba529adb9a1cd364384751e93db07..a003f0fb960e1d202647d17c9167bc95031c1328 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #ifndef _GEOMImpl_ITransformOperations_HXX_
 #define _GEOMImpl_ITransformOperations_HXX_
@@ -154,6 +153,17 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
                                                 Handle(GEOM_Object) theAxis,
                                                 Standard_Integer theNbTimes);
 
+  Standard_EXPORT Handle(GEOM_Object) Rotate1D (Handle(GEOM_Object) theObject,
+                                                Handle(GEOM_Object) theAxis,
+                                                double theAngleStep,
+                                                Standard_Integer theNbSteps);
+
+  Standard_EXPORT Handle(GEOM_Object) Rotate2D (Handle(GEOM_Object) theObject,
+                                                Handle(GEOM_Object) theAxis,
+                                                Standard_Integer theNbObjects,
+                                                double theRadialStep,
+                                                Standard_Integer theNbSteps);
+
   Standard_EXPORT Handle(GEOM_Object) Rotate2D (Handle(GEOM_Object) theObject,
                                                 Handle(GEOM_Object) theAxis,
                                                 double theAngle,
index 9f1e3035b68d9d1519ea1e2961b55acf24289d70..0365380189c52923a6267af6196e4dd4720fc4c1 100644 (file)
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
 #include <GEOMImpl_RotateDriver.hxx>
 #include <GEOMImpl_IRotate.hxx>
 #include <GEOMImpl_Types.hxx>
+
 #include <GEOM_Function.hxx>
-#include <gp_Trsf.hxx>
-#include <gp_Pnt.hxx>
-#include <gp_Vec.hxx>
-#include <gp_Dir.hxx>
-#include <gp_Ax1.hxx>
+
+#include <GEOMUtils.hxx>
+
 #include <BRepBuilderAPI_Transform.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopoDS_Compound.hxx>
+#include <BRep_Builder.hxx>
+#include <BRep_Tool.hxx>
+#include <BRepGProp.hxx>
+
 #include <TopAbs.hxx>
 #include <TopExp.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Shape.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <TopoDS_Compound.hxx>
 #include <TopoDS_Edge.hxx>
-#include <BRep_Tool.hxx>
-#include <BRep_Builder.hxx>
+
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <Geom_Line.hxx>
 #include <GProp_GProps.hxx>
-#include <BRepGProp.hxx>
+
 #include <Precision.hxx>
 
+#include <gp_Trsf.hxx>
+#include <gp_Pnt.hxx>
+#include <gp_Vec.hxx>
+#include <gp_Dir.hxx>
+#include <gp_Ax1.hxx>
+
 //=======================================================================
 //function : GetID
 //purpose  :
@@ -92,13 +98,12 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
     Handle(GEOM_Function) anAxis = RI.GetAxis();
     if (anAxis.IsNull()) return 0;
     TopoDS_Shape A = anAxis->GetValue();
-    if (A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0;
+    gp_Vec aV = GEOMUtils::GetVector(A);
     TopoDS_Edge anEdge = TopoDS::Edge(A);
-
     gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
-    gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge));
-    gp_Dir aDir(gp_Vec(aP1, aP2));
-    gp_Ax1 anAx1(aP1, aDir);
+    gp_Dir aDir (aV);
+    gp_Ax1 anAx1 (aP1, aDir);
+
     Standard_Real anAngle = RI.GetAngle();
     if (fabs(anAngle) < Precision::Angular()) anAngle += 2.*M_PI; // NPAL19665,19769
     aTrsf.SetRotation(anAx1, anAngle);
@@ -148,22 +153,24 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
     TopLoc_Location aLocRes (aTrsfOrig);
     aShape = anOriginal.Located(aLocRes);
   }
-  else if (aType == ROTATE_1D) {
+  else if (aType == ROTATE_1D || aType == ROTATE_1D_STEP) {
     //Get direction
+    gp_Pnt aP1 = gp::Origin();
+    gp_Dir D = gp::DZ();
     Handle(GEOM_Function) anAxis = RI.GetAxis();
-    if(anAxis.IsNull()) return 0;
-    TopoDS_Shape A = anAxis->GetValue();
-    if(A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0;
-    TopoDS_Edge anEdge = TopoDS::Edge(A);
-
-    gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
-    gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge));
-    gp_Dir D(gp_Vec(aP1, aP2));
-
-    gp_Ax1 AX1(aP1, D);
+    if (!anAxis.IsNull()) {
+      TopoDS_Shape A = anAxis->GetValue();
+      gp_Vec aV = GEOMUtils::GetVector(A);
+      TopoDS_Edge anEdge = TopoDS::Edge(A);
+      aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
+      D = gp_Dir(aV);
+    }
+    gp_Ax1 AX1 (aP1, D);
 
     Standard_Integer nbtimes = RI.GetNbIter1();
-    Standard_Real angle = 360.0/nbtimes;
+    Standard_Real angle = 360. / nbtimes;
+    if (aType == ROTATE_1D_STEP)
+      angle = RI.GetAngle();
 
     TopoDS_Compound aCompound;
     BRep_Builder B;
@@ -177,7 +184,7 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
         B.Add(aCompound, anOriginal);
       }
       else {
-        aTrsf.SetRotation(AX1, i*angle*M_PI/180.);
+        aTrsf.SetRotation(AX1, i * angle * M_PI / 180.);
         //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug
         gp_Trsf aTrsfNew (aTrsfOrig);
         aTrsfNew.PreMultiply(aTrsf);
@@ -194,16 +201,17 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
   }
   else if (aType == ROTATE_2D) {
     //Get direction
+    gp_Pnt aP1 = gp::Origin();
+    gp_Dir D = gp::DZ();
     Handle(GEOM_Function) anAxis = RI.GetAxis();
-    if(anAxis.IsNull()) return 0;
-    TopoDS_Shape A = anAxis->GetValue();
-    if(A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0;
-    TopoDS_Edge anEdge = TopoDS::Edge(A);
-    gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
-    gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge));
-    gp_Dir D(gp_Vec(aP1, aP2));
-
-    gp_Ax1 AX1(aP1, D);
+    if (!anAxis.IsNull()) {
+      TopoDS_Shape A = anAxis->GetValue();
+      gp_Vec aV = GEOMUtils::GetVector(A);
+      TopoDS_Edge anEdge = TopoDS::Edge(A);
+      aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
+      D = gp_Dir(aV);
+    }
+    gp_Ax1 AX1 (aP1, D);
 
     gp_Trsf aTrsf1;
     gp_Trsf aTrsf2;
@@ -274,7 +282,7 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
           B.Add(aCompound, anOriginal.Located(aLocRes));
         }
         else {
-          aTrsf2.SetRotation(AX1, j*ang*M_PI/180.);
+          aTrsf2.SetRotation(AX1, j * ang * M_PI / 180.);
           //TopLoc_Location aLocRes (aTrsf2 * aTrsf1 * aTrsfOrig); // gp_Trsf::Multiply() has a bug
           gp_Trsf aTrsfNew (aTrsfOrig);
           aTrsfNew.PreMultiply(aTrsf1);
index 575cbaea953f9675cb4f0f0eba502964af03c92b..1f6de2170bf1ba248c23803f45b4c2a0f095821e 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -173,13 +172,14 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
     B.MakeCompound( aCompound );
 
     Handle(GEOM_Function) aVector = TI.GetVector();
-    if(aVector.IsNull()) return 0;
-    TopoDS_Shape aV = aVector->GetValue();
-    if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
-    TopoDS_Edge anEdge = TopoDS::Edge(aV);
-
-    gp_Vec Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
-    Vec.Normalize();
+    gp_Vec Vec = gp::DX();
+    if (!aVector.IsNull()) {
+      TopoDS_Shape aV = aVector->GetValue();
+      if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
+      TopoDS_Edge anEdge = TopoDS::Edge(aV);
+      Vec = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
+      Vec.Normalize();
+    }
 
     TopLoc_Location aLocOrig = anOriginal.Location();
     gp_Trsf aTrsfOrig = aLocOrig.Transformation();
@@ -202,32 +202,36 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
   }
   else if (aType == TRANSLATE_2D) {
     Standard_Integer nbtimes1 = TI.GetNbIter1(), nbtimes2 = TI.GetNbIter2();
-    Standard_Real DX, DY, DZ,  step1 = TI.GetStep1(),  step2 = TI.GetStep2();
-    gp_Vec aVec;
+    Standard_Real DX, DY, DZ, step1 = TI.GetStep1(), step2 = TI.GetStep2();
     Handle(GEOM_Function) aVector = TI.GetVector();
-    if(aVector.IsNull()) return 0;
-    TopoDS_Shape aV = aVector->GetValue();
-    if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
-    TopoDS_Edge anEdge = TopoDS::Edge(aV);
+    Handle(GEOM_Function) aVector2 = TI.GetVector2();
 
-    gp_Vec Vec1(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
-    Vec1.Normalize();
+    gp_Vec Vec1 = gp::DX();
+    gp_Vec Vec2 = gp::DY();
 
-    Handle(GEOM_Function) aVector2 = TI.GetVector2();
-    if(aVector2.IsNull()) return 0;
-    aV = aVector2->GetValue();
-    if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
-    anEdge = TopoDS::Edge(aV);
+    if (!aVector.IsNull()) {
+      TopoDS_Shape aV = aVector->GetValue();
+      if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
+      TopoDS_Edge anEdge = TopoDS::Edge(aV);
+      Vec1 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
+      Vec1.Normalize();
+    }
 
-    gp_Vec Vec2(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
-    Vec2.Normalize();
+    if (!aVector2.IsNull()) {
+      TopoDS_Shape aV = aVector2->GetValue();
+      if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
+      TopoDS_Edge anEdge = TopoDS::Edge(aV);
+      Vec2 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
+      Vec2.Normalize();
+    }
 
     TopoDS_Compound aCompound;
     BRep_Builder B;
-    B.MakeCompound( aCompound );
+    B.MakeCompound(aCompound);
 
     TopLoc_Location aLocOrig = anOriginal.Location();
     gp_Trsf aTrsfOrig = aLocOrig.Transformation();
+    gp_Vec aVec;
 
     for (int i = 0; i < nbtimes1; i++) {
       for (int j = 0; j < nbtimes2; j++) {
index 687eb7f1531800320043cd724e1a2f5a072a4402..0419dd16927b92d130efb41ebb15ceef64e9edc1 100755 (executable)
 #define ROTATE_2D                 4
 #define ROTATE_THREE_POINTS       5
 #define ROTATE_THREE_POINTS_COPY  6
+#define ROTATE_1D_STEP            7
 
 #define MIRROR_PLANE      1
 #define MIRROR_PLANE_COPY 2
index 66bcb5288423ec612f5e932dddf704e56193798b..257822004e75ea606d95618ad28e82d6e7f88996 100644 (file)
@@ -518,6 +518,52 @@ CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
   return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
 }
 
+//=============================================================================
+/*!
+ *  ClosestPoints
+ */
+//=============================================================================
+CORBA::Long GEOM_IMeasureOperations_i::ClosestPoints
+  (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
+   GEOM::ListOfDouble_out theCoords)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // allocate the CORBA array
+  int nbSols = -1;
+  GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble();
+
+  //Get the reference shape
+  Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
+  Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
+
+  if (!aShape1.IsNull() && !aShape2.IsNull()) {
+    Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal;
+    // Get shape parameters
+    //nbSols = GetOperations()->ClosestPoints(aShape1, aShape2, aDoubles);
+    //int nbDbls = aDoubles->Length();
+    //aDoublesArray->length(nbDbls);
+    //for (int id = 0; id < nbDbls; id++) {
+    //  aDoublesArray[id] = aDoubles->Value(id + 1);
+    //}
+    // tmp
+    double X1, Y1, Z1, X2, Y2, Z2;
+    GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
+    aDoublesArray->length(6);
+    aDoublesArray[0] = X1;
+    aDoublesArray[1] = Y1;
+    aDoublesArray[2] = Z1;
+    aDoublesArray[3] = X2;
+    aDoublesArray[4] = Y2;
+    aDoublesArray[5] = Z2;
+    nbSols = 1;
+  }
+
+  theCoords = aDoublesArray._retn();
+  return nbSols;
+}
+
 //=============================================================================
 /*!
  *  PointCoordinates
index 0f68c35101469d49546b33e3f8fc332fcdee6700..e8269bd223f8f1d98a289e5197951d4ca7990495 100644 (file)
@@ -103,6 +103,10 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i :
                                 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
                                 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2);
 
+  CORBA::Long ClosestPoints (GEOM::GEOM_Object_ptr theShape1,
+                             GEOM::GEOM_Object_ptr theShape2,
+                             GEOM::ListOfDouble_out theCoords);
+
   void PointCoordinates (GEOM::GEOM_Object_ptr theShape,
                          CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z);
 
index 59bc4a2932522f68fc5573985e9f0b8069d0f0a2..05b132959ad78713b27b2a04287ba62246093fc4 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -958,7 +957,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate1D
 
   //Get the vector of translation
   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
-  if (aVector.IsNull()) return aGEOMObject._retn();
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DX by default
 
   //Perform the translation
   Handle(GEOM_Object) anObject =
@@ -992,11 +991,11 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate2D (GEOM::GEOM_
 
   //Get the vector1 of translation
   Handle(GEOM_Object) aVector1 = GetObjectImpl(theVector1);
-  if (aVector1.IsNull()) return aGEOMObject._retn();
+  //if (aVector1.IsNull()) return aGEOMObject._retn(); // DX by default
 
   //Get the vector2 of translation
   Handle(GEOM_Object) aVector2 = GetObjectImpl(theVector2);
-  if (aVector2.IsNull()) return aGEOMObject._retn();
+  //if (aVector2.IsNull()) return aGEOMObject._retn(); // DY by default
 
   //Perform the translation
   Handle(GEOM_Object) anObject = GetOperations()->Translate2D
@@ -1026,7 +1025,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Obj
 
   //Get the a directon of rotation
   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
-  if (aVector.IsNull()) return aGEOMObject._retn();
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
 
   //Perform the rotation
   Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theNbTimes);
@@ -1035,6 +1034,101 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Obj
   return GetObject(anObject);
 }
 
+//=============================================================================
+/*!
+ *  MultiRotate1DByStep
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1DByStep (GEOM::GEOM_Object_ptr theObject,
+                                                                        GEOM::GEOM_Object_ptr theVector,
+                                                                        CORBA::Double theAngleStep,
+                                                                        CORBA::Long theNbSteps)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Get the object itself
+  Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
+  if (aBasicObject.IsNull()) return aGEOMObject._retn();
+
+  //Get the a directon of rotation
+  Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
+
+  //Perform the rotation
+  Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theAngleStep, theNbSteps);
+  if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  MultiRotate2DNbTimes
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DNbTimes (GEOM::GEOM_Object_ptr theObject,
+                                                                         GEOM::GEOM_Object_ptr theVector,
+                                                                         CORBA::Long theNbObjects,
+                                                                         CORBA::Double theRadialStep,
+                                                                         CORBA::Long theNbSteps)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Get the object itself
+  Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
+  if (aBasicObject.IsNull()) return aGEOMObject._retn();
+
+  //Get the a directon of rotation
+  Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
+
+  //Perform the rotation
+  Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
+    (aBasicObject, aVector, theNbObjects, theRadialStep, theNbSteps);
+  if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  MultiRotate2DByStep
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DByStep (GEOM::GEOM_Object_ptr theObject,
+                                                                        GEOM::GEOM_Object_ptr theVector,
+                                                                        CORBA::Double theAngle,
+                                                                        CORBA::Long theNbTimes1,
+                                                                        CORBA::Double theStep,
+                                                                        CORBA::Long theNbTimes2)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Get the object itself
+  Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
+  if (aBasicObject.IsNull()) return aGEOMObject._retn();
+
+  //Get the a directon of rotation
+  Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
+
+  //Perform the rotation
+  Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
+    (aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2);
+  if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
 //=============================================================================
 /*!
  *  MultiRotate2D
@@ -1058,11 +1152,13 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2D (GEOM::GEOM_Obj
 
   //Get the a directon of rotation
   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
-  if (aVector.IsNull()) return aGEOMObject._retn();
+  //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
+
+  double anAngle = M_PI * theAngle / 180.;
 
   //Perform the rotation
   Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
-    (aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2);
+    (aBasicObject, aVector, anAngle, theNbTimes1, theStep, theNbTimes2);
   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
 
   return GetObject(anObject);
index f01f08c22b10ac243b110ab617d6012c70e76f97..7f7964ce4a704ab19cc6ef5d1e211fd691384539 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #ifndef _GEOM_ITransformOperations_i_HeaderFile
 #define _GEOM_ITransformOperations_i_HeaderFile
@@ -39,17 +38,17 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
 {
  public:
   GEOM_ITransformOperations_i (PortableServer::POA_ptr thePOA,
-                              GEOM::GEOM_Gen_ptr theEngine,
-                              ::GEOMImpl_ITransformOperations* theImpl);
+                               GEOM::GEOM_Gen_ptr theEngine,
+                               ::GEOMImpl_ITransformOperations* theImpl);
   ~GEOM_ITransformOperations_i();
 
   GEOM::GEOM_Object_ptr TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject,
-                                           GEOM::GEOM_Object_ptr thePoint1,
-                                           GEOM::GEOM_Object_ptr thePoint2);
+                                            GEOM::GEOM_Object_ptr thePoint1,
+                                            GEOM::GEOM_Object_ptr thePoint2);
 
   GEOM::GEOM_Object_ptr TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject,
-                                               GEOM::GEOM_Object_ptr thePoint1,
-                                               GEOM::GEOM_Object_ptr thePoint2);
+                                                GEOM::GEOM_Object_ptr thePoint1,
+                                                GEOM::GEOM_Object_ptr thePoint2);
 
   GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject,
                                          CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
@@ -59,15 +58,15 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
                                              CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
 
   GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject,
-                                        GEOM::GEOM_Object_ptr theVector);
+                                         GEOM::GEOM_Object_ptr theVector);
 
   GEOM::GEOM_Object_ptr TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject,
-                                            GEOM::GEOM_Object_ptr theVector);
+                                             GEOM::GEOM_Object_ptr theVector);
 
   GEOM::GEOM_Object_ptr TranslateVectorDistance (GEOM::GEOM_Object_ptr theObject,
-                                                GEOM::GEOM_Object_ptr theVector,
-                                                CORBA::Double theDistance,
-                                                CORBA::Boolean theCopy);
+                                                 GEOM::GEOM_Object_ptr theVector,
+                                                 CORBA::Double theDistance,
+                                                 CORBA::Boolean theCopy);
 
   GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject,
                                           GEOM::GEOM_Object_ptr theVector,
@@ -81,93 +80,111 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
 
   GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject,
                                 GEOM::GEOM_Object_ptr theAxis,
-                               CORBA::Double theAngle);
+                                CORBA::Double theAngle);
 
   GEOM::GEOM_Object_ptr MultiRotate1D (GEOM::GEOM_Object_ptr theObject,
-                                      GEOM::GEOM_Object_ptr theVector,
-                                      CORBA::Long theNbTimes);
+                                       GEOM::GEOM_Object_ptr theVector,
+                                       CORBA::Long theNbTimes);
+
+  GEOM::GEOM_Object_ptr MultiRotate1DByStep (GEOM::GEOM_Object_ptr theObject,
+                                             GEOM::GEOM_Object_ptr theAxis,
+                                             CORBA::Double theAngleStep,
+                                             CORBA::Long theNbSteps);
+
+  GEOM::GEOM_Object_ptr MultiRotate2DNbTimes (GEOM::GEOM_Object_ptr theObject,
+                                              GEOM::GEOM_Object_ptr theAxis,
+                                              CORBA::Long theNbObjects,
+                                              CORBA::Double theRadialStep,
+                                              CORBA::Long theNbSteps);
+
+  GEOM::GEOM_Object_ptr MultiRotate2DByStep (GEOM::GEOM_Object_ptr theObject,
+                                             GEOM::GEOM_Object_ptr theVector,
+                                             CORBA::Double theAngle,
+                                             CORBA::Long theNbTimes1,
+                                             CORBA::Double theStep,
+                                             CORBA::Long theNbTimes2);
+
   GEOM::GEOM_Object_ptr MultiRotate2D (GEOM::GEOM_Object_ptr theObject,
-                                      GEOM::GEOM_Object_ptr theVector, 
-                                      CORBA::Double theAngle, 
-                                      CORBA::Long theNbTimes1, 
-                                      CORBA::Double theStep, 
-                                      CORBA::Long theNbTimes2);
-                                          
+                                       GEOM::GEOM_Object_ptr theVector,
+                                       CORBA::Double theAngle,
+                                       CORBA::Long theNbTimes1,
+                                       CORBA::Double theStep,
+                                       CORBA::Long theNbTimes2);
+
   GEOM::GEOM_Object_ptr RotateCopy (GEOM::GEOM_Object_ptr theObject,
-                                   GEOM::GEOM_Object_ptr theAxis,
-                                   CORBA::Double theAngle);  
+                                    GEOM::GEOM_Object_ptr theAxis,
+                                    CORBA::Double theAngle);
 
   GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject,
-                                    GEOM::GEOM_Object_ptr thePlane);
+                                     GEOM::GEOM_Object_ptr thePlane);
 
   GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject,
-                                        GEOM::GEOM_Object_ptr thePlane);
+                                         GEOM::GEOM_Object_ptr thePlane);
 
   GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject,
-                                   GEOM::GEOM_Object_ptr theAxis);
+                                    GEOM::GEOM_Object_ptr theAxis);
 
   GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject,
-                                       GEOM::GEOM_Object_ptr theAxis);
+                                        GEOM::GEOM_Object_ptr theAxis);
 
   GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject,
-                                    GEOM::GEOM_Object_ptr thePoint);
+                                     GEOM::GEOM_Object_ptr thePoint);
 
   GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject,
-                                        GEOM::GEOM_Object_ptr thePoint);
+                                         GEOM::GEOM_Object_ptr thePoint);
 
   GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject,
-                                    CORBA::Double theOffset);
+                                     CORBA::Double theOffset);
 
   GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject,
-                                        CORBA::Double theOffset);
+                                         CORBA::Double theOffset);
 
   GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource,
                                           GEOM::GEOM_Object_ptr theTarget);
 
   GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject,
-                                   GEOM::GEOM_Object_ptr thePoint,
-                                   CORBA::Double theFactor);
+                                    GEOM::GEOM_Object_ptr thePoint,
+                                    CORBA::Double theFactor);
 
   GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject,
-                                       GEOM::GEOM_Object_ptr thePoint,
-                                       CORBA::Double theFactor);
+                                        GEOM::GEOM_Object_ptr thePoint,
+                                        CORBA::Double theFactor);
 
   GEOM::GEOM_Object_ptr ScaleShapeAlongAxes (GEOM::GEOM_Object_ptr theObject,
-                                            GEOM::GEOM_Object_ptr thePoint,
-                                            CORBA::Double theFactorX,
-                                            CORBA::Double theFactorY,
-                                            CORBA::Double theFactorZ);
+                                             GEOM::GEOM_Object_ptr thePoint,
+                                             CORBA::Double theFactorX,
+                                             CORBA::Double theFactorY,
+                                             CORBA::Double theFactorZ);
 
   GEOM::GEOM_Object_ptr ScaleShapeAlongAxesCopy (GEOM::GEOM_Object_ptr theObject,
-                                                GEOM::GEOM_Object_ptr thePoint,
-                                                CORBA::Double theFactorX,
-                                                CORBA::Double theFactorY,
-                                                CORBA::Double theFactorZ);
+                                                 GEOM::GEOM_Object_ptr thePoint,
+                                                 CORBA::Double theFactorX,
+                                                 CORBA::Double theFactorY,
+                                                 CORBA::Double theFactorZ);
 
   GEOM::GEOM_Object_ptr PositionShape (GEOM::GEOM_Object_ptr theObject,
-                                      GEOM::GEOM_Object_ptr theStartLCS,
-                                      GEOM::GEOM_Object_ptr theEndLCS);
+                                       GEOM::GEOM_Object_ptr theStartLCS,
+                                       GEOM::GEOM_Object_ptr theEndLCS);
 
   GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject,
-                                          GEOM::GEOM_Object_ptr theStartLCS,
-                                          GEOM::GEOM_Object_ptr theEndLCS);
+                                           GEOM::GEOM_Object_ptr theStartLCS,
+                                           GEOM::GEOM_Object_ptr theEndLCS);
 
   GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject,
-                                          GEOM::GEOM_Object_ptr thePath,
-                                          CORBA::Double         theDistance,
-                                          CORBA::Boolean        theCopy,
-                                          CORBA::Boolean        theReverse);
+                                           GEOM::GEOM_Object_ptr thePath,
+                                           CORBA::Double         theDistance,
+                                           CORBA::Boolean        theCopy,
+                                           CORBA::Boolean        theReverse);
 
   GEOM::GEOM_Object_ptr RotateThreePoints (GEOM::GEOM_Object_ptr theObject,
-                                          GEOM::GEOM_Object_ptr theCentPoint,
-                                          GEOM::GEOM_Object_ptr thePoint1,
-                                          GEOM::GEOM_Object_ptr thePoint2);
+                                           GEOM::GEOM_Object_ptr theCentPoint,
+                                           GEOM::GEOM_Object_ptr thePoint1,
+                                           GEOM::GEOM_Object_ptr thePoint2);
 
   GEOM::GEOM_Object_ptr RotateThreePointsCopy (GEOM::GEOM_Object_ptr theObject,
-                                              GEOM::GEOM_Object_ptr theCentPoint,
-                                              GEOM::GEOM_Object_ptr thePoint1,
-                                              GEOM::GEOM_Object_ptr thePoint2);
+                                               GEOM::GEOM_Object_ptr theCentPoint,
+                                               GEOM::GEOM_Object_ptr thePoint1,
+                                               GEOM::GEOM_Object_ptr thePoint2);
 
   GEOM::GEOM_Object_ptr TransformLikeOtherCopy (GEOM::GEOM_Object_ptr theObject,
                                                 GEOM::GEOM_Object_ptr theSample);
index 4eb309e4c2cd594dee72ac3c736f7c7ecb08fb15..bffea27eaea414af115d86b7af75783d039bd58d 100644 (file)
@@ -290,9 +290,8 @@ def TestAll (geompy, math):
   #Create Patterns
   MultiTrans1D = geompy.MakeMultiTranslation1D(Fillet, vz, step1, nbtimes1)
   MultiTrans2D = geompy.MakeMultiTranslation2D(Fillet, vz, step1, nbtimes1, vy, step2, nbtimes2)
-  #!!!!Angle In Degree!!!!
-  MultiRot1D   = geompy.MultiRotate1D(Chamfer, vx, nbtimes1)
-  MultiRot2D   = geompy.MultiRotate2D(Chamfer, vx, angle, nbtimes1, step1, nbtimes2)
+  MultiRot1D   = geompy.MultiRotate1DNbTimes(Chamfer, vx, nbtimes1)
+  MultiRot2D   = geompy.MultiRotate2DByStep(Chamfer, vx, angle1, nbtimes1, step1, nbtimes2)
 
   #Create Informations objects
   CDG        = geompy.MakeCDG(Prism)               #(GEOM_Object)->GEOM_Object
index 42429b3ca00a8eedfe189bdd55a3dac145c16455..afd2a0af553341605f1f18172feab1631b2c8718 100644 (file)
@@ -186,8 +186,8 @@ def TestOtherOperations (geompy, math):
   pz = geompy.MakeVertex(0, 0, 100)
   vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
 
-  MultiRot1D = geompy.MakeMultiRotation1D(f12, vy, pz, 6)
-  MultiRot2D = geompy.MakeMultiRotation2D(f12, vy, pz, 45, 6, 30, 3)
+  MultiRot1D = geompy.MakeMultiRotation1DNbTimes(f12, vy, pz, 6)
+  MultiRot2D = geompy.MakeMultiRotation2DByStep(f12, vy, pz, math.pi/4, 6, 30, 3)
 
   id_MultiRot1D = geompy.addToStudy(MultiRot1D, "MakeMultiRotation1D")
   id_MultiRot2D = geompy.addToStudy(MultiRot2D, "MakeMultiRotation2D")
index 64cfe0346d3ba3ca45578cb911e98a6af38b6042..9d750572a59db572f16747ba70d51174bbb97b10 100644 (file)
 ##     @defgroup l3_basic_op      Basic Operations
 ##     @defgroup l3_boolean       Boolean Operations
 ##     @defgroup l3_transform     Transformation Operations
+##     @defgroup l3_transform_d   Transformation Operations deprecated methods
 ##     @defgroup l3_local         Local Operations (Fillet, Chamfer and other Features)
 ##     @defgroup l3_blocks_op     Blocks Operations
 ##     @defgroup l3_healing       Repairing Operations
@@ -7652,7 +7653,7 @@ class geompyDC(GEOM._objref_GEOM_Gen):
 
         ## Translate the given object along the given vector a given number times
         #  @param theObject The object to be translated.
-        #  @param theVector Direction of the translation.
+        #  @param theVector Direction of the translation. DX if None.
         #  @param theStep Distance to translate on.
         #  @param theNbTimes Quantity of translations to be done.
         #  @param theName Object name; when specified, this parameter is used
@@ -7669,7 +7670,7 @@ class geompyDC(GEOM._objref_GEOM_Gen):
 
             Parameters:
                 theObject The object to be translated.
-                theVector Direction of the translation.
+                theVector Direction of the translation. DX if None.
                 theStep Distance to translate on.
                 theNbTimes Quantity of translations to be done.
                 theName Object name; when specified, this parameter is used
@@ -7693,10 +7694,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
 
         ## Conseqently apply two specified translations to theObject specified number of times.
         #  @param theObject The object to be translated.
-        #  @param theVector1 Direction of the first translation.
+        #  @param theVector1 Direction of the first translation. DX if None.
         #  @param theStep1 Step of the first translation.
         #  @param theNbTimes1 Quantity of translations to be done along theVector1.
-        #  @param theVector2 Direction of the second translation.
+        #  @param theVector2 Direction of the second translation. DY if None.
         #  @param theStep2 Step of the second translation.
         #  @param theNbTimes2 Quantity of translations to be done along theVector2.
         #  @param theName Object name; when specified, this parameter is used
@@ -7714,10 +7715,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
 
             Parameters:
                 theObject The object to be translated.
-                theVector1 Direction of the first translation.
+                theVector1 Direction of the first translation. DX if None.
                 theStep1 Step of the first translation.
                 theNbTimes1 Quantity of translations to be done along theVector1.
-                theVector2 Direction of the second translation.
+                theVector2 Direction of the second translation. DY if None.
                 theStep2 Step of the second translation.
                 theNbTimes2 Quantity of translations to be done along theVector2.
                 theName Object name; when specified, this parameter is used
@@ -7743,7 +7744,7 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         ## Rotate the given object around the given axis a given number times.
         #  Rotation angle will be 2*PI/theNbTimes.
         #  @param theObject The object to be rotated.
-        #  @param theAxis The rotation axis.
+        #  @param theAxis The rotation axis. DZ if None.
         #  @param theNbTimes Quantity of rotations to be done.
         #  @param theName Object name; when specified, this parameter is used
         #         for result publication in the study. Otherwise, if automatic
@@ -7753,14 +7754,14 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #          shapes, obtained after each rotation.
         #
         #  @ref tui_multi_rotation "Example"
-        def MultiRotate1D(self, theObject, theAxis, theNbTimes, theName=None):
+        def MultiRotate1DNbTimes (self, theObject, theAxis, theNbTimes, theName=None):
             """
             Rotate the given object around the given axis a given number times.
             Rotation angle will be 2*PI/theNbTimes.
 
             Parameters:
                 theObject The object to be rotated.
-                theAxis The rotation axis.
+                theAxis The rotation axis. DZ if None.
                 theNbTimes Quantity of rotations to be done.
                 theName Object name; when specified, this parameter is used
                         for result publication in the study. Otherwise, if automatic
@@ -7771,12 +7772,106 @@ class geompyDC(GEOM._objref_GEOM_Gen):
                 shapes, obtained after each rotation.
 
             Example of usage:
-                rot1d = geompy.MultiRotate1D(prism, vect, 4)
+                rot1d = geompy.MultiRotate1DNbTimes(prism, vect, 4)
             """
             # Example: see GEOM_TestAll.py
-            theAxis, theNbTimes, Parameters = ParseParameters(theAxis, theNbTimes)
+            theNbTimes, Parameters = ParseParameters(theNbTimes)
             anObj = self.TrsfOp.MultiRotate1D(theObject, theAxis, theNbTimes)
-            RaiseIfFailed("MultiRotate1D", self.TrsfOp)
+            RaiseIfFailed("MultiRotate1DNbTimes", self.TrsfOp)
+            anObj.SetParameters(Parameters)
+            self._autoPublish(anObj, theName, "multirotation")
+            return anObj
+
+        ## Rotate the given object around the given axis
+        #  a given number times on the given angle.
+        #  @param theObject The object to be rotated.
+        #  @param theAxis The rotation axis. DZ if None.
+        #  @param theAngleStep Rotation angle in radians.
+        #  @param theNbTimes Quantity of rotations to be done.
+        #  @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 compound of all the
+        #          shapes, obtained after each rotation.
+        #
+        #  @ref tui_multi_rotation "Example"
+        def MultiRotate1DByStep(self, theObject, theAxis, theAngleStep, theNbTimes, theName=None):
+            """
+            Rotate the given object around the given axis
+            a given number times on the given angle.
+
+            Parameters:
+                theObject The object to be rotated.
+                theAxis The rotation axis. DZ if None.
+                theAngleStep Rotation angle in radians.
+                theNbTimes Quantity of rotations to be done.
+                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 compound of all the
+                shapes, obtained after each rotation.
+
+            Example of usage:
+                rot1d = geompy.MultiRotate1DByStep(prism, vect, math.pi/4, 4)
+            """
+            # Example: see GEOM_TestAll.py
+            theAngleStep, theNbTimes, Parameters = ParseParameters(theAngleStep, theNbTimes)
+            anObj = self.TrsfOp.MultiRotate1DByStep(theObject, theAxis, theAngleStep, theNbTimes)
+            RaiseIfFailed("MultiRotate1DByStep", self.TrsfOp)
+            anObj.SetParameters(Parameters)
+            self._autoPublish(anObj, theName, "multirotation")
+            return anObj
+
+        ## Rotate the given object around the given axis a given
+        #  number times and multi-translate each rotation result.
+        #  Rotation angle will be 2*PI/theNbTimes1.
+        #  Translation direction passes through center of gravity
+        #  of rotated shape and its projection on the rotation axis.
+        #  @param theObject The object to be rotated.
+        #  @param theAxis Rotation axis. DZ if None.
+        #  @param theNbTimes1 Quantity of rotations to be done.
+        #  @param theRadialStep Translation distance.
+        #  @param theNbTimes2 Quantity of translations to be done.
+        #  @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 compound of all the
+        #          shapes, obtained after each transformation.
+        #
+        #  @ref tui_multi_rotation "Example"
+        def MultiRotate2DNbTimes(self, theObject, theAxis, theNbTimes1, theRadialStep, theNbTimes2, theName=None):
+            """
+            Rotate the given object around the
+            given axis on the given angle a given number
+            times and multi-translate each rotation result.
+            Translation direction passes through center of gravity
+            of rotated shape and its projection on the rotation axis.
+
+            Parameters:
+                theObject The object to be rotated.
+                theAxis Rotation axis. DZ if None.
+                theNbTimes1 Quantity of rotations to be done.
+                theRadialStep Translation distance.
+                theNbTimes2 Quantity of translations to be done.
+                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 compound of all the
+                shapes, obtained after each transformation.
+
+            Example of usage:
+                rot2d = geompy.MultiRotate2D(prism, vect, 60, 4, 50, 5)
+            """
+            # Example: see GEOM_TestAll.py
+            theNbTimes1, theRadialStep, theNbTimes2, Parameters = ParseParameters(theNbTimes1, theRadialStep, theNbTimes2)
+            anObj = self.TrsfOp.MultiRotate2DNbTimes(theObject, theAxis, theNbTimes1, theRadialStep, theNbTimes2)
+            RaiseIfFailed("MultiRotate2DNbTimes", self.TrsfOp)
             anObj.SetParameters(Parameters)
             self._autoPublish(anObj, theName, "multirotation")
             return anObj
@@ -7787,10 +7882,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #  Translation direction passes through center of gravity
         #  of rotated shape and its projection on the rotation axis.
         #  @param theObject The object to be rotated.
-        #  @param theAxis Rotation axis.
-        #  @param theAngle Rotation angle in degrees.
+        #  @param theAxis Rotation axis. DZ if None.
+        #  @param theAngleStep Rotation angle in radians.
         #  @param theNbTimes1 Quantity of rotations to be done.
-        #  @param theStep Translation distance.
+        #  @param theRadialStep Translation distance.
         #  @param theNbTimes2 Quantity of translations to be done.
         #  @param theName Object name; when specified, this parameter is used
         #         for result publication in the study. Otherwise, if automatic
@@ -7800,7 +7895,7 @@ class geompyDC(GEOM._objref_GEOM_Gen):
         #          shapes, obtained after each transformation.
         #
         #  @ref tui_multi_rotation "Example"
-        def MultiRotate2D(self, theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2, theName=None):
+        def MultiRotate2DByStep (self, theObject, theAxis, theAngleStep, theNbTimes1, theRadialStep, theNbTimes2, theName=None):
             """
             Rotate the given object around the
             given axis on the given angle a given number
@@ -7810,10 +7905,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
 
             Parameters:
                 theObject The object to be rotated.
-                theAxis Rotation axis.
-                theAngle Rotation angle in degrees.
+                theAxis Rotation axis. DZ if None.
+                theAngleStep Rotation angle in radians.
                 theNbTimes1 Quantity of rotations to be done.
-                theStep Translation distance.
+                theRadialStep Translation distance.
                 theNbTimes2 Quantity of translations to be done.
                 theName Object name; when specified, this parameter is used
                         for result publication in the study. Otherwise, if automatic
@@ -7824,9 +7919,113 @@ class geompyDC(GEOM._objref_GEOM_Gen):
                 shapes, obtained after each transformation.
 
             Example of usage:
-                rot2d = geompy.MultiRotate2D(prism, vect, 60, 4, 50, 5)
+                rot2d = geompy.MultiRotate2D(prism, vect, math.pi/3, 4, 50, 5)
             """
             # Example: see GEOM_TestAll.py
+            theAngleStep, theNbTimes1, theRadialStep, theNbTimes2, Parameters = ParseParameters(theAngleStep, theNbTimes1, theRadialStep, theNbTimes2)
+            anObj = self.TrsfOp.MultiRotate2DByStep(theObject, theAxis, theAngleStep, theNbTimes1, theRadialStep, theNbTimes2)
+            RaiseIfFailed("MultiRotate2DByStep", self.TrsfOp)
+            anObj.SetParameters(Parameters)
+            self._autoPublish(anObj, theName, "multirotation")
+            return anObj
+
+        ## The same, as MultiRotate1DNbTimes(), but axis is given by direction and point
+        #
+        #  @ref swig_MakeMultiRotation "Example"
+        def MakeMultiRotation1DNbTimes(self, aShape, aDir, aPoint, aNbTimes, theName=None):
+            """
+            The same, as geompy.MultiRotate1DNbTimes, but axis is given by direction and point
+
+            Example of usage:
+                pz = geompy.MakeVertex(0, 0, 100)
+                vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
+                MultiRot1D = geompy.MakeMultiRotation1DNbTimes(prism, vy, pz, 6)
+            """
+            # Example: see GEOM_TestOthers.py
+            aVec = self.MakeLine(aPoint,aDir)
+            # note: auto-publishing is done in self.MultiRotate1D()
+            anObj = self.MultiRotate1DNbTimes(aShape, aVec, aNbTimes, theName)
+            return anObj
+
+        ## The same, as MultiRotate1DByStep(), but axis is given by direction and point
+        #
+        #  @ref swig_MakeMultiRotation "Example"
+        def MakeMultiRotation1DByStep(self, aShape, aDir, aPoint, anAngle, aNbTimes, theName=None):
+            """
+            The same, as geompy.MultiRotate1D, but axis is given by direction and point
+
+            Example of usage:
+                pz = geompy.MakeVertex(0, 0, 100)
+                vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
+                MultiRot1D = geompy.MakeMultiRotation1DByStep(prism, vy, pz, math.pi/3, 6)
+            """
+            # Example: see GEOM_TestOthers.py
+            aVec = self.MakeLine(aPoint,aDir)
+            # note: auto-publishing is done in self.MultiRotate1D()
+            anObj = self.MultiRotate1DByStep(aShape, aVec, anAngle, aNbTimes, theName)
+            return anObj
+
+        ## The same, as MultiRotate2DNbTimes(), but axis is given by direction and point
+        #
+        #  @ref swig_MakeMultiRotation "Example"
+        def MakeMultiRotation2DNbTimes(self, aShape, aDir, aPoint, nbtimes1, aStep, nbtimes2, theName=None):
+            """
+            The same, as MultiRotate2DNbTimes(), but axis is given by direction and point
+            
+            Example of usage:
+                pz = geompy.MakeVertex(0, 0, 100)
+                vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
+                MultiRot2D = geompy.MakeMultiRotation2DNbTimes(f12, vy, pz, 6, 30, 3)
+            """
+            # Example: see GEOM_TestOthers.py
+            aVec = self.MakeLine(aPoint,aDir)
+            # note: auto-publishing is done in self.MultiRotate2DNbTimes()
+            anObj = self.MultiRotate2DNbTimes(aShape, aVec, nbtimes1, aStep, nbtimes2, theName)
+            return anObj
+
+        ## The same, as MultiRotate2DByStep(), but axis is given by direction and point
+        #
+        #  @ref swig_MakeMultiRotation "Example"
+        def MakeMultiRotation2DByStep(self, aShape, aDir, aPoint, anAngle, nbtimes1, aStep, nbtimes2, theName=None):
+            """
+            The same, as MultiRotate2DByStep(), but axis is given by direction and point
+            
+            Example of usage:
+                pz = geompy.MakeVertex(0, 0, 100)
+                vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
+                MultiRot2D = geompy.MakeMultiRotation2DByStep(f12, vy, pz, math.pi/4, 6, 30, 3)
+            """
+            # Example: see GEOM_TestOthers.py
+            aVec = self.MakeLine(aPoint,aDir)
+            # note: auto-publishing is done in self.MultiRotate2D()
+            anObj = self.MultiRotate2DByStep(aShape, aVec, anAngle, nbtimes1, aStep, nbtimes2, theName)
+            return anObj
+
+        # end of l3_transform
+        ## @}
+
+        ## @addtogroup l3_transform_d
+        ## @{
+
+        ## Deprecated method. Use MultiRotate1DNbTimes instead.
+        def MultiRotate1D(self, theObject, theAxis, theNbTimes, theName=None):
+            """
+            Deprecated method. Use MultiRotate1DNbTimes instead.
+            """
+            print "The method MultiRotate1D is DEPRECATED. Use MultiRotate1DNbTimes instead."
+            return self.MultiRotate1DNbTimes(theObject, theAxis, theNbTimes, theName)
+
+        ## The same, as MultiRotate2DByStep(), but theAngle is in degrees.
+        #  This method is DEPRECATED. Use MultiRotate2DByStep() instead.
+        def MultiRotate2D(self, theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2, theName=None):
+            """
+            The same, as MultiRotate2DByStep(), but theAngle is in degrees.
+            This method is DEPRECATED. Use MultiRotate2DByStep() instead.
+
+            Example of usage:
+                rot2d = geompy.MultiRotate2D(prism, vect, 60, 4, 50, 5)
+            """
+            print "The method MultiRotate2D is DEPRECATED. Use MultiRotate2DByStep instead."
             theAngle, theNbTimes1, theStep, theNbTimes2, Parameters = ParseParameters(theAngle, theNbTimes1, theStep, theNbTimes2)
             anObj = self.TrsfOp.MultiRotate2D(theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2)
             RaiseIfFailed("MultiRotate2D", self.TrsfOp)
@@ -7835,42 +8034,42 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             return anObj
 
         ## The same, as MultiRotate1D(), but axis is given by direction and point
-        #
-        #  @ref swig_MakeMultiRotation "Example"
+        #  This method is DEPRECATED. Use MakeMultiRotation1DNbTimes instead.
         def MakeMultiRotation1D(self, aShape, aDir, aPoint, aNbTimes, theName=None):
             """
-            The same, as geompy.MultiRotate1D, but axis is given by direction and point
+            The same, as geompy.MultiRotate1D, but axis is given by direction and point.
+            This method is DEPRECATED. Use MakeMultiRotation1DNbTimes instead.
 
             Example of usage:
                 pz = geompy.MakeVertex(0, 0, 100)
                 vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
                 MultiRot1D = geompy.MakeMultiRotation1D(prism, vy, pz, 6)
             """
-            # Example: see GEOM_TestOthers.py
+            print "The method MakeMultiRotation1D is DEPRECATED. Use MakeMultiRotation1DNbTimes instead."
             aVec = self.MakeLine(aPoint,aDir)
             # note: auto-publishing is done in self.MultiRotate1D()
             anObj = self.MultiRotate1D(aShape, aVec, aNbTimes, theName)
             return anObj
 
         ## The same, as MultiRotate2D(), but axis is given by direction and point
-        #
-        #  @ref swig_MakeMultiRotation "Example"
+        #  This method is DEPRECATED. Use MakeMultiRotation2DByStep instead.
         def MakeMultiRotation2D(self, aShape, aDir, aPoint, anAngle, nbtimes1, aStep, nbtimes2, theName=None):
             """
             The same, as MultiRotate2D(), but axis is given by direction and point
+            This method is DEPRECATED. Use MakeMultiRotation2DByStep instead.
             
             Example of usage:
                 pz = geompy.MakeVertex(0, 0, 100)
                 vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
                 MultiRot2D = geompy.MakeMultiRotation2D(f12, vy, pz, 45, 6, 30, 3)
             """
-            # Example: see GEOM_TestOthers.py
+            print "The method MakeMultiRotation2D is DEPRECATED. Use MakeMultiRotation2DByStep instead."
             aVec = self.MakeLine(aPoint,aDir)
             # note: auto-publishing is done in self.MultiRotate2D()
             anObj = self.MultiRotate2D(aShape, aVec, anAngle, nbtimes1, aStep, nbtimes2, theName)
             return anObj
 
-        # end of l3_transform
+        # end of l3_transform_d
         ## @}
 
         ## @addtogroup l3_local
index 062b94d7fe981fdb359a62b30231fa40b0caee17..790c0a41c0165a054fa5f80bb6f88edd084208bf 100644 (file)
@@ -162,7 +162,7 @@ void MeasureGUI_BndBoxDlg::ActivateThisDialog()
           this, SLOT(SelectionIntoArgument()));
 
   globalSelection();
-  displayPreview(true);
+  redisplayPreview();
 }
 
 //=================================================================================
index ffd630a9a934b6c26b477276a1517e7d21511631..d0d9fda91d51ea75577c31f1e5c6cdb466382ff3 100644 (file)
 // 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   : MeasureGUI_DistanceDlg.cxx
 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
-//
+
 #include "MeasureGUI_DistanceDlg.h"
 #include "MeasureGUI_Widgets.h"
 
@@ -36,6 +35,7 @@
 #include <SUIT_ResourceMgr.h>
 #include <SUIT_ViewWindow.h>
 #include <SUIT_ViewManager.h>
+#include <SUIT_OverrideCursor.h>
 #include <SOCC_Prs.h>
 #include <SOCC_ViewModel.h>
 #include <SalomeApp_Tools.h>
@@ -61,7 +61,7 @@
 //            true to construct a modal dialog.
 //=================================================================================
 MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* parent)
-  : MeasureGUI_Skeleton(GUI, parent)
+  : GEOMBase_Skeleton(GUI, parent)
 {
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
   QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MINDIST")));
@@ -72,8 +72,12 @@ MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* paren
   /***************************************************************/
   mainFrame()->GroupConstructors->setTitle(tr("GEOM_DISTANCE"));
   mainFrame()->RadioButton1->setIcon(image0);
+  mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton2->close();
+  mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton3->close();
 
-  myGrp = new MeasureGUI_2Sel4LineEdit(centralWidget());
+  myGrp = new MeasureGUI_2Sel4LineEdit (centralWidget());
   myGrp->GroupBox1->setTitle(tr("GEOM_MINDIST_OBJ"));
   myGrp->TextLabel1->setText(tr("GEOM_OBJECT_I").arg("1"));
   myGrp->TextLabel2->setText(tr("GEOM_OBJECT_I").arg("2"));
@@ -90,12 +94,12 @@ MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* paren
   myGrp->LineEdit5->setReadOnly(true);
   myGrp->LineEdit6->setReadOnly(true);
 
-  QVBoxLayout* layout = new QVBoxLayout(centralWidget());
+  QVBoxLayout* layout = new QVBoxLayout (centralWidget());
   layout->setMargin(0); layout->setSpacing(6);
   layout->addWidget(myGrp);
   /***************************************************************/
 
-  myHelpFileName = "using_measurement_tools_page.html#min_distance_anchor";
+  myHelpFileName = "min_distance_page.html";
 
   // Initialisation
   Init();
@@ -115,21 +119,69 @@ MeasureGUI_DistanceDlg::~MeasureGUI_DistanceDlg()
 //=================================================================================
 void MeasureGUI_DistanceDlg::Init()
 {
-  // init variables
-  myGrp->LineEdit1->setText("");
-  myGrp->LineEdit2->setText("");
-  myObj = myObj2 = GEOM::GEOM_Object::_nil();
-
-  mySelBtn   = myGrp->PushButton1;
-  mySelEdit  = myGrp->LineEdit1;
-
   myEditCurrentArgument = myGrp->LineEdit1;
 
   // signals and slots connections
-  connect(myGrp->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
+  connect(buttonOk(),         SIGNAL(clicked()), this, SLOT(ClickOnOk()));
+  connect(buttonApply(),      SIGNAL(clicked()), this, SLOT(ClickOnApply()));
+
+  connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
   connect(myGrp->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
 
-  MeasureGUI_Skeleton::Init();
+  connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
+          this, SLOT(SelectionIntoArgument()));
+
+  initName(tr("GEOM_DISTANCE"));
+  globalSelection();
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void MeasureGUI_DistanceDlg::ClickOnOk()
+{
+  if (ClickOnApply())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool MeasureGUI_DistanceDlg::ClickOnApply()
+{
+  if (!onAccept())
+    return false;
+
+  initName();
+  return true;
+}
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void MeasureGUI_DistanceDlg::ActivateThisDialog()
+{
+  GEOMBase_Skeleton::ActivateThisDialog();
+
+  connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
+          this, SLOT(SelectionIntoArgument()));
+
+  globalSelection();
+  redisplayPreview();
+}
+
+//=================================================================================
+// function : enterEvent()
+// purpose  :
+//=================================================================================
+void MeasureGUI_DistanceDlg::enterEvent(QEvent*)
+{
+  if (!mainFrame()->GroupConstructors->isEnabled())
+    ActivateThisDialog();
 }
 
 //=================================================================================
@@ -145,7 +197,7 @@ void MeasureGUI_DistanceDlg::SelectionIntoArgument()
   GEOM::GEOM_Object_var aSelectedObject = GEOM::GEOM_Object::_nil();
 
   if (aSelList.Extent() > 0) {
-    aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
+    aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First());
   }
 
   // clear selection
@@ -155,26 +207,57 @@ void MeasureGUI_DistanceDlg::SelectionIntoArgument()
           this, SLOT(SelectionIntoArgument()));
 
   if (myEditCurrentArgument == myGrp->LineEdit1) {
-    myObj = aSelectedObject;
-    if (!myObj->_is_nil() && myObj2->_is_nil())
+    myObj1 = aSelectedObject;
+    if (!myObj1->_is_nil() && myObj2->_is_nil())
       myGrp->PushButton2->click();
   }
   else {
     myObj2 = aSelectedObject;
-    if (!myObj2->_is_nil() && myObj->_is_nil())
+    if (!myObj2->_is_nil() && myObj1->_is_nil())
       myGrp->PushButton1->click();
   }
 
   processObject();
 }
 
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void MeasureGUI_DistanceDlg::SetEditCurrentArgument()
+{
+  QPushButton* send = (QPushButton*)sender();
+
+  if (send == myGrp->PushButton1) {
+    myEditCurrentArgument = myGrp->LineEdit1;
+
+    myGrp->PushButton2->setDown(false);
+    myGrp->LineEdit2->setEnabled(false);
+  }
+  else {
+    myEditCurrentArgument = myGrp->LineEdit2;
+
+    myGrp->PushButton1->setDown(false);
+    myGrp->LineEdit1->setEnabled(false);
+  }
+
+  // enable line edit
+  myEditCurrentArgument->setEnabled(true);
+  myEditCurrentArgument->setFocus();
+  // after setFocus(), because it will be setDown(false) when loses focus
+  send->setDown(true);
+
+  // seems we need it only to avoid preview disappearing, caused by selection mode change
+  redisplayPreview();
+}
+
 //=================================================================================
 // function : processObject()
-// purpose  : Fill dialogs fields in accordance with myObj and myObj2
+// purpose  : Fill dialogs fields in accordance with myObj1 and myObj2
 //=================================================================================
 void MeasureGUI_DistanceDlg::processObject()
 {
-  myGrp->LineEdit1->setText(!myObj->_is_nil()  ? GEOMBase::GetName(myObj ) : "");
+  myGrp->LineEdit1->setText(!myObj1->_is_nil() ? GEOMBase::GetName(myObj1) : "");
   myGrp->LineEdit2->setText(!myObj2->_is_nil() ? GEOMBase::GetName(myObj2) : "");
 
   gp_Pnt aPnt1, aPnt2;
@@ -205,22 +288,20 @@ void MeasureGUI_DistanceDlg::processObject()
 // function : getParameters()
 // purpose  : Get distance between objects
 //=================================================================================
-bool MeasureGUI_DistanceDlg::getParameters (double& theDistance,
-                                            gp_Pnt& thePnt1,
-                                            gp_Pnt& thePnt2)
+bool MeasureGUI_DistanceDlg::getParameters (double& theDistance, gp_Pnt& thePnt1, gp_Pnt& thePnt2)
 {
   QString msg;
   if (isValid(msg)) {
-    GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() );
+    GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation());
 
     try {
       double x1, y1, z1, x2, y2, z2;
-      theDistance = anOper->GetMinDistance(myObj, myObj2, x1, y1, z1, x2, y2, z2);
+      theDistance = anOper->GetMinDistance(myObj1, myObj2, x1, y1, z1, x2, y2, z2);
 
       thePnt1.SetCoord(x1, y1, z1);
       thePnt2.SetCoord(x2, y2, z2);
     }
-    catch(const SALOME::SALOME_Exception& e) {
+    catch (const SALOME::SALOME_Exception& e) {
       SalomeApp_Tools::QtCatchCorbaException(e);
       return false;
     }
@@ -231,57 +312,6 @@ bool MeasureGUI_DistanceDlg::getParameters (double& theDistance,
   return false;
 }
 
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose  :
-//=================================================================================
-void MeasureGUI_DistanceDlg::SetEditCurrentArgument()
-{
-  QPushButton* send = (QPushButton*)sender();
-
-  if (send == myGrp->PushButton1) {
-    myEditCurrentArgument = myGrp->LineEdit1;
-
-    myGrp->PushButton2->setDown(false);
-    myGrp->LineEdit2->setEnabled(false);
-  }
-  else {
-    myEditCurrentArgument = myGrp->LineEdit2;
-
-    myGrp->PushButton1->setDown(false);
-    myGrp->LineEdit1->setEnabled(false);
-  }
-
-  // enable line edit
-  myEditCurrentArgument->setEnabled(true);
-  myEditCurrentArgument->setFocus();
-  // after setFocus(), because it will be setDown(false) when loses focus
-  send->setDown(true);
-
-  // seems we need it only to avoid preview disappearing, caused by selection mode change
-  redisplayPreview();
-}
-
-//=================================================================================
-// function : LineEditReturnPressed()
-// purpose  :
-//=================================================================================
-void MeasureGUI_DistanceDlg::LineEditReturnPressed()
-{
-  QLineEdit* send = (QLineEdit*)sender();
-
-  if (send == myGrp->LineEdit1 || send == myGrp->LineEdit2) {
-    myEditCurrentArgument = send;
-
-    LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
-    SALOME_ListIO aSelList;
-    aSelMgr->selectedObjects(aSelList);
-
-    if (GEOMBase::SelectionByNameInDialogs(this, myGrp->LineEdit1->text(), aSelList))
-      myGrp->LineEdit1->setText(myGrp->LineEdit1->text());
-  }
-}
-
 //=================================================================================
 // function : buildPrs()
 // purpose  :
@@ -289,46 +319,47 @@ void MeasureGUI_DistanceDlg::LineEditReturnPressed()
 SALOME_Prs* MeasureGUI_DistanceDlg::buildPrs()
 {
   double aDist = 0.;
-  gp_Pnt aPnt1(0, 0, 0), aPnt2(0, 0, 0);
+  gp_Pnt aPnt1 (0, 0, 0), aPnt2 (0, 0, 0);
 
   SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
 
-  if (myObj->_is_nil() || myObj2->_is_nil() ||
-       !getParameters(aDist, aPnt1, aPnt2) ||
-       vw->getViewManager()->getType() != OCCViewer_Viewer::Type())
+  if (myObj1->_is_nil() || myObj2->_is_nil() ||
+      !getParameters(aDist, aPnt1, aPnt2) ||
+      vw->getViewManager()->getType() != OCCViewer_Viewer::Type())
     return 0;
 
   try
   {
     if (aDist <= 1.e-9) {
-      BRepBuilderAPI_MakeVertex aMaker(aPnt1);
+      BRepBuilderAPI_MakeVertex aMaker (aPnt1);
       return getDisplayer()->BuildPrs(aMaker.Vertex());
     }
     else {
-      BRepBuilderAPI_MakeEdge MakeEdge(aPnt1, aPnt2);
+      BRepBuilderAPI_MakeEdge MakeEdge (aPnt1, aPnt2);
       TopoDS_Vertex aVert1 = BRepBuilderAPI_MakeVertex(aPnt1);
       TopoDS_Vertex aVert2 = BRepBuilderAPI_MakeVertex(aPnt2);
 
       QString aLabel;
       aLabel.sprintf("%.1f", aDist);
 
-      gp_Pnt aPnt3((aPnt1.X() + aPnt2.X()) / 2,
+      gp_Pnt aPnt3 ((aPnt1.X() + aPnt2.X()) / 2,
                     (aPnt1.Y() + aPnt2.Y()) / 2,
                     (aPnt1.Z() + aPnt2.Z()) / 2);
 
-      gp_Vec va(aPnt3, aPnt1);
-      gp_Vec vb(aPnt3, aPnt2);
+      gp_Vec va (aPnt3, aPnt1);
+      gp_Vec vb (aPnt3, aPnt2);
 
       if (va.IsParallel(vb, Precision::Angular())) {
         aPnt3.SetY((aPnt1.Y() + aPnt2.Y()) / 2 + 100);
         aPnt3.SetZ((aPnt1.Z() + aPnt2.Z()) / 2);
       }
 
-      gce_MakePln gce_MP(aPnt1, aPnt2, aPnt3);
-      Handle(Geom_Plane) P = new Geom_Plane(gce_MP.Value());
+      gce_MakePln gce_MP (aPnt1, aPnt2, aPnt3);
+      Handle(Geom_Plane) P = new Geom_Plane (gce_MP.Value());
 
-      Handle(AIS_LengthDimension) anIO = new AIS_LengthDimension(
-        aVert1, aVert2, P, aDist, TCollection_ExtendedString((Standard_CString)aLabel.toLatin1().constData()));
+      Handle(AIS_LengthDimension) anIO = new AIS_LengthDimension
+        (aVert1, aVert2, P, aDist,
+         TCollection_ExtendedString((Standard_CString)aLabel.toLatin1().constData()));
       anIO->SetArrowSize(aDist/20);
       
       SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
@@ -345,16 +376,76 @@ SALOME_Prs* MeasureGUI_DistanceDlg::buildPrs()
       return aPrs;
     }
   }
-  catch(Standard_Failure) {
+  catch (Standard_Failure) {
     return 0;
   }
 }
 
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr MeasureGUI_DistanceDlg::createOperation()
+{
+  return getGeomEngine()->GetIMeasureOperations(getStudyId());
+}
+
 //=================================================================================
 // function : isValid()
 // purpose  :
 //=================================================================================
 bool MeasureGUI_DistanceDlg::isValid (QString& msg)
 {
-  return MeasureGUI_Skeleton::isValid(msg) && !myObj2->_is_nil();
+  return !myObj1->_is_nil() && !myObj2->_is_nil();
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+bool MeasureGUI_DistanceDlg::execute (ObjectList& objects)
+{
+  GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation());
+  GEOM::GEOM_IBasicOperations_var aBasicOper = getGeomEngine()->GetIBasicOperations(getStudyId());
+
+  double x1, y1, z1, x2, y2, z2;
+  double aDist = anOper->GetMinDistance(myObj1, myObj2, x1, y1, z1, x2, y2, z2);
+
+  GEOM::GEOM_Object_var anObj1 = aBasicOper->MakePointXYZ(x1, y1, z1);
+  GEOM::GEOM_Object_var anObj2 = aBasicOper->MakePointXYZ(x2, y2, z2);
+
+  if (!anObj1->_is_nil() && !anObj2->_is_nil()) {
+    objects.push_back(anObj1._retn());
+    objects.push_back(anObj2._retn());
+  }
+
+  return true;
+}
+
+//=================================================================================
+// function : redisplayPreview()
+// purpose  :
+//=================================================================================
+void MeasureGUI_DistanceDlg::redisplayPreview()
+{
+  QString aMess;
+  if (!isValid(aMess)) {
+    erasePreview(true);
+    return;
+  }
+
+  erasePreview(false);
+
+  try {
+    SUIT_OverrideCursor();
+
+    getDisplayer()->SetColor(Quantity_NOC_VIOLET);
+    getDisplayer()->SetToActivate(false);
+    
+    if (SALOME_Prs* aPrs = buildPrs())
+      displayPreview(aPrs);
+  }
+  catch (const SALOME::SALOME_Exception& e) {
+    SalomeApp_Tools::QtCatchCorbaException(e);
+  }
 }
index 2c4e9c56dd82c8956815bb34c51656048748c375..83a44272c7d319c83e8b5f4818e5162f98368790 100644 (file)
 // 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   : MeasureGUI_DistanceDlg.h
 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
-//
+
 #ifndef MEASUREGUI_DISTANCEDLG_H
 #define MEASUREGUI_DISTANCEDLG_H
 
-#include "MeasureGUI_Skeleton.h"
+#include <GEOMBase_Skeleton.h>
 
 class MeasureGUI_2Sel4LineEdit;
 class gp_Pnt;
@@ -36,36 +35,41 @@ class gp_Pnt;
 // class    : MeasureGUI_DistanceDlg
 // purpose  :
 //=================================================================================
-
-class MeasureGUI_DistanceDlg : public MeasureGUI_Skeleton
-{ 
+class MeasureGUI_DistanceDlg : public GEOMBase_Skeleton
+{
   Q_OBJECT
-    
+
 public:
-  MeasureGUI_DistanceDlg( GeometryGUI*, QWidget* );
+  MeasureGUI_DistanceDlg (GeometryGUI*, QWidget*);
   ~MeasureGUI_DistanceDlg();
 
 protected:
-  // redefined from GEOMBase_Helper and MeasureGUI_Skeleton
+  // redefined from GEOMBase_Helper and GEOMBase_Skeleton
+  virtual GEOM::GEOM_IOperations_ptr  createOperation();
+  virtual bool                        isValid (QString&);
+  virtual bool                        execute (ObjectList&);
+
+  void                                redisplayPreview();
   virtual void                        processObject();
   virtual SALOME_Prs*                 buildPrs();
-  virtual void                        SelectionIntoArgument();
-  virtual void                        LineEditReturnPressed();
-  virtual void                        SetEditCurrentArgument();
-  virtual bool                        isValid( QString& );
 
 private:
   void                                Init();
-  bool                                getParameters( double&,
-                                                     gp_Pnt&,
-                                                     gp_Pnt& );
+  void                                enterEvent (QEvent*);
+  bool                                getParameters (double&, gp_Pnt&, gp_Pnt&);
+
 private:
-  QLineEdit*                          myEditCurrentArgument;
-  QLineEdit*                          mySelEdit2;
-  QPushButton*                        mySelBtn2;
-  
-  MeasureGUI_2Sel4LineEdit*           myGrp;
+  GEOM::GEOM_Object_var               myObj1;
   GEOM::GEOM_Object_var               myObj2;
+
+  MeasureGUI_2Sel4LineEdit*           myGrp;
+
+private slots:
+  void                                ClickOnOk();
+  bool                                ClickOnApply();
+  void                                ActivateThisDialog();
+  void                                SelectionIntoArgument();
+  void                                SetEditCurrentArgument();
 };
 
 #endif // MEASUREGUI_DISTANCEDLG_H
index f450a2f8c8f5037dbdfc061d1f0d75b2e57a005d..5a0fd01f3ab68486ff45a129647ce1485090a859 100644 (file)
@@ -69,34 +69,29 @@ TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg
   mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
   mainFrame()->RadioButton3->close();
 
-  GroupPoints = new DlgRef_2Sel1SpinInt(centralWidget());
-  GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE"));
-  GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
-  GroupPoints->TextLabel3->setText(tr("GEOM_NB_TIMES"));
-  GroupPoints->PushButton1->setIcon(image2);
-  GroupPoints->PushButton2->setIcon(image2);
-  GroupPoints->LineEdit1->setReadOnly(true);
-  GroupPoints->LineEdit2->setReadOnly(true);
-
-  GroupDimensions = new DlgRef_2Sel4Spin1Check(centralWidget());
-  GroupDimensions->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
-  GroupDimensions->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  GroupDimensions->TextLabel2->setText(tr("GEOM_VECTOR"));
-  GroupDimensions->TextLabel3->setText(tr("GEOM_ANGLE"));
-  GroupDimensions->TextLabel4->setText(tr("GEOM_NB_TIMES"));
-  GroupDimensions->TextLabel5->setText(tr("GEOM_STEP"));
-  GroupDimensions->TextLabel6->setText(tr("GEOM_NB_TIMES"));
-  GroupDimensions->CheckButton1->setText(tr("GEOM_REVERSE"));
-  GroupDimensions->PushButton1->setIcon(image2);
-  GroupDimensions->PushButton2->setIcon(image2);
-  GroupDimensions->LineEdit1->setReadOnly(true);
-  GroupDimensions->LineEdit2->setReadOnly(true);
+  bool isAngleStep = true;
+
+  GroupArgs = new TransformationGUI_2Sel4Spin1Check (centralWidget());
+  GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
+  GroupArgs->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
+  GroupArgs->TextLabel2->setText(tr("GEOM_VECTOR"));
+  //GroupArgs->TextLabel3->setText(tr("GEOM_ANGLE_STEP"));
+  GroupArgs->CheckAngleStep->setText(tr("GEOM_ANGLE_STEP"));
+  GroupArgs->CheckAngleStep->setChecked(isAngleStep);
+  GroupArgs->TextLabel4->setText(tr("GEOM_NB_TIMES"));
+  GroupArgs->TextLabel5->setText(tr("GEOM_STEP_R"));
+  GroupArgs->TextLabel6->setText(tr("GEOM_NB_TIMES"));
+  GroupArgs->CheckButton1->setText(tr("GEOM_REVERSE"));
+  GroupArgs->PushButton1->setIcon(image2);
+  GroupArgs->PushButton2->setIcon(image2);
+  GroupArgs->LineEdit1->setReadOnly(true);
+  GroupArgs->LineEdit2->setReadOnly(true);
+  GroupArgs->SpinBox_DX1->setEnabled(isAngleStep);
+  GroupArgs->CheckButton1->setEnabled(isAngleStep);
 
   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
   layout->setMargin(0); layout->setSpacing(6);
-  layout->addWidget(GroupPoints);
-  layout->addWidget(GroupDimensions);
+  layout->addWidget(GroupArgs);
   /***************************************************************/
 
   setHelpFileName("multi_rotation_operation_page.html");
@@ -119,38 +114,23 @@ TransformationGUI_MultiRotationDlg::~TransformationGUI_MultiRotationDlg()
 //=================================================================================
 void TransformationGUI_MultiRotationDlg::Init()
 {
+  // init variables
+  myAng = 45.0;
+  myStep = 50.0;
+  myNbTimes1 = myNbTimes2 = 3;
+
   // Get setting of step value from file configuration
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100);
 
   int SpecificStep1 = 5;
   int SpecificStep2 = 1;
-  // init variables
-  myAng = 45.0;
-  myStep = 50.0;
-  myNbTimes1 = myNbTimes2 = 2;
 
   // min, max, step and decimals for spin boxes & initial values
-  initSpinBox(GroupPoints->SpinBox_DX, 1, 999, SpecificStep2);
-  GroupPoints->SpinBox_DX->setValue(myNbTimes1);
-
-  initSpinBox(GroupDimensions->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, "angle_precision" );
-  initSpinBox(GroupDimensions->SpinBox_DY1, 1, 999, SpecificStep2);
-  initSpinBox(GroupDimensions->SpinBox_DX2, COORD_MIN, COORD_MAX, step,"length_precision" );
-  initSpinBox(GroupDimensions->SpinBox_DY2, 1, 999, SpecificStep2);
-  GroupDimensions->SpinBox_DX1->setValue(myAng);
-  GroupDimensions->SpinBox_DY1->setValue(myNbTimes1);
-  GroupDimensions->SpinBox_DX2->setValue(myStep);
-  GroupDimensions->SpinBox_DY2->setValue(myNbTimes2);
-
-  GroupPoints->LineEdit1->setText("");
-  GroupPoints->LineEdit2->setText("");
-
-  GroupDimensions->LineEdit1->setText("");
-  GroupDimensions->LineEdit2->setText("");
-
-  myBase.nullify();
-  myVector.nullify();
+  initSpinBox(GroupArgs->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, "angle_precision");
+  initSpinBox(GroupArgs->SpinBox_DY1, 1, 999, SpecificStep2);
+  initSpinBox(GroupArgs->SpinBox_DX2, COORD_MIN, COORD_MAX, step, "length_precision");
+  initSpinBox(GroupArgs->SpinBox_DY2, 1, 999, SpecificStep2);
 
   mainFrame()->GroupBoxPublish->show();
 
@@ -158,25 +138,23 @@ void TransformationGUI_MultiRotationDlg::Init()
   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
 
-  connect(this,          SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
+  connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
 
-  connect(GroupPoints->PushButton1,     SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(GroupPoints->PushButton2,     SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(GroupDimensions->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(GroupDimensions->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(GroupArgs->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(GroupArgs->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
 
-  connect(GroupPoints->SpinBox_DX,      SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
-  connect(GroupDimensions->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(GroupDimensions->SpinBox_DY1, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
-  connect(GroupDimensions->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(GroupDimensions->SpinBox_DY2, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
+  connect(GroupArgs->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
+  connect(GroupArgs->SpinBox_DY1, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
+  connect(GroupArgs->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
+  connect(GroupArgs->SpinBox_DY2, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
 
-  connect(GroupDimensions->SpinBox_DX1,SIGNAL(textChanged( const QString& )),
-          this, SLOT(TextValueChangedInSpinBox( const QString& )));
+  connect(GroupArgs->SpinBox_DX1, SIGNAL(textChanged(const QString&)),
+          this, SLOT(TextValueChangedInSpinBox(const QString&)));
 
   connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double)));
 
-  connect(GroupDimensions->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseAngle()));
+  connect(GroupArgs->CheckAngleStep, SIGNAL(toggled(bool)), this, SLOT(CheckAngleStep(bool)));
+  connect(GroupArgs->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseAngle()));
 
   initName(tr("GEOM_MULTIROTATION"));
 
@@ -189,13 +167,7 @@ void TransformationGUI_MultiRotationDlg::Init()
 //=================================================================================
 void TransformationGUI_MultiRotationDlg::SetDoubleSpinBoxStep (double step)
 {
-  GroupDimensions->SpinBox_DX2->setSingleStep(step);
-
-  // san: Commented so as not to override specific step settings
-  //GroupPoints->SpinBox_DX->setSingleStep((int)step);
-  //GroupDimensions->SpinBox_DX1->setSingleStep(step);
-  //GroupDimensions->SpinBox_DY1->setSingleStep((int)step);
-  //GroupDimensions->SpinBox_DY2->setSingleStep((int)step);
+  GroupArgs->SpinBox_DX2->setSingleStep(step);
 }
 
 //=================================================================================
@@ -206,42 +178,42 @@ void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId)
 {
   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
 
-  switch (constructorId) {
-  case 0: // Rotate simple
-    {
-      GroupDimensions->hide();
-      GroupPoints->show();
+  myBase.nullify();
+  myVector.nullify();
 
-      GroupPoints->LineEdit1->setText("");
-      GroupPoints->LineEdit2->setText("");
-      myBase.nullify();
-      myVector.nullify();
+  GroupArgs->LineEdit1->setText("");
+  GroupArgs->LineEdit2->setText("");
 
-      GroupPoints->SpinBox_DX->setValue(myNbTimes1);
+  GroupArgs->SpinBox_DX1->setValue(myAng);
+  GroupArgs->SpinBox_DY1->setValue(myNbTimes1);
+  GroupArgs->SpinBox_DX2->setValue(myStep);
+  GroupArgs->SpinBox_DY2->setValue(myNbTimes2);
 
-      GroupPoints->PushButton1->click();
+  switch (constructorId) {
+  case 0: // Rotate simple
+    {
+      GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE"));
+      GroupArgs->TextLabel5->hide();
+      GroupArgs->TextLabel6->hide();
+      GroupArgs->SpinBox_DX2->hide();
+      GroupArgs->SpinBox_DY2->hide();
+      GroupArgs->CheckButton1->hide();
     }
     break;
   case 1: // Rotate double
     {
-      GroupPoints->hide();
-      GroupDimensions->show();
-
-      GroupDimensions->LineEdit1->setText("");
-      GroupDimensions->LineEdit2->setText("");
-      myBase.nullify();
-      myVector.nullify();
-
-      GroupDimensions->SpinBox_DX1->setValue(myAng);
-      GroupDimensions->SpinBox_DY1->setValue(myNbTimes1);
-      GroupDimensions->SpinBox_DX2->setValue(myStep);
-      GroupDimensions->SpinBox_DY2->setValue(myNbTimes2);
-
-      GroupDimensions->PushButton1->click();
+      GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
+      GroupArgs->TextLabel5->show();
+      GroupArgs->TextLabel6->show();
+      GroupArgs->SpinBox_DX2->show();
+      GroupArgs->SpinBox_DY2->show();
+      GroupArgs->CheckButton1->show();
     }
     break;
   }
 
+  GroupArgs->PushButton1->click();
+
   qApp->processEvents();
   updateGeometry();
   resize(minimumSizeHint());
@@ -289,33 +261,39 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
 {
   erasePreview();
 
-  TopAbs_ShapeEnum aNeedType = ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
-                                myEditCurrentArgument == GroupDimensions->LineEdit2 ) ?
+  TopAbs_ShapeEnum aNeedType = ( myEditCurrentArgument == GroupArgs->LineEdit2 ) ?
     TopAbs_EDGE : TopAbs_SHAPE;
   GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType );
   TopoDS_Shape aShape;
   if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
     QString aName = GEOMBase::GetName( aSelectedObject.get() );
     myEditCurrentArgument->setText( aName );
-    if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
-      myBase = aSelectedObject;
-      if ( !myVector )
-       GroupPoints->PushButton2->click();
-    }
-    else if ( myEditCurrentArgument == GroupPoints->LineEdit2)  {
-      myVector = aSelectedObject;
-      if ( !myBase )
-       GroupPoints->PushButton1->click();
-    }
-    else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
+    if ( myEditCurrentArgument == GroupArgs->LineEdit1 ) {
       myBase = aSelectedObject;
+
+      // recompute myAng and myStep (Mantis issue 0021718)
+      GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
+      double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
+      anOper->GetBoundingBox(myBase.get(), Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
+      if (anOper->IsDone()) {
+        // angular step
+        double diag = sqrt((Xmax-Xmin)*(Xmax-Xmin) + (Ymax-Ymin)*(Ymax-Ymin));
+        double d = sqrt((0.5*(Xmax+Xmin))*(0.5*(Xmax+Xmin)) + (0.5*(Ymax+Ymin))*(0.5*(Ymax+Ymin)));
+        myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI);
+        GroupArgs->SpinBox_DX1->setValue(myAng);
+
+        // radial step
+        myStep = Max(floor(1.5*(Xmax-Xmin)), floor(1.5*(Ymax-Ymin)));
+        GroupArgs->SpinBox_DX2->setValue(myStep);
+      }
+
       if ( !myVector )
-       GroupDimensions->PushButton2->click();
+       GroupArgs->PushButton2->click();
     }
-    else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) {
+    else if ( myEditCurrentArgument == GroupArgs->LineEdit2 ) {
       myVector = aSelectedObject;
       if ( !myBase )
-       GroupDimensions->PushButton1->click();
+       GroupArgs->PushButton1->click();
     }
     
     // clear selection
@@ -325,11 +303,9 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
            this, SLOT(SelectionIntoArgument()));
   }
   else {
-    if ( myEditCurrentArgument == GroupPoints->LineEdit1 ||
-        myEditCurrentArgument == GroupDimensions->LineEdit1 )
+    if ( myEditCurrentArgument == GroupArgs->LineEdit1 )
       myBase.nullify();
-    else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
-             myEditCurrentArgument == GroupDimensions->LineEdit2 )
+    else if ( myEditCurrentArgument == GroupArgs->LineEdit2 )
       myVector.nullify();
     myEditCurrentArgument->setText("");
   }
@@ -348,33 +324,19 @@ void TransformationGUI_MultiRotationDlg::SetEditCurrentArgument()
   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
   globalSelection(GEOM_ALLSHAPES);
 
-  if (send == GroupPoints->PushButton1) {
-    myEditCurrentArgument = GroupPoints->LineEdit1;
-
-    GroupPoints->PushButton2->setDown(false);
-    GroupPoints->LineEdit2->setEnabled(false);
-  }
-  else if (send == GroupPoints->PushButton2) {
-    myEditCurrentArgument = GroupPoints->LineEdit2;
-
-    localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
-
-    GroupPoints->PushButton1->setDown(false);
-    GroupPoints->LineEdit1->setEnabled(false);
-  }
-  else if (send == GroupDimensions->PushButton1) {
-    myEditCurrentArgument = GroupDimensions->LineEdit1;
+  if (send == GroupArgs->PushButton1) {
+    myEditCurrentArgument = GroupArgs->LineEdit1;
 
-    GroupDimensions->PushButton2->setDown(false);
-    GroupDimensions->LineEdit2->setEnabled(false);
+    GroupArgs->PushButton2->setDown(false);
+    GroupArgs->LineEdit2->setEnabled(false);
   }
-  else if (send == GroupDimensions->PushButton2) {
-    myEditCurrentArgument = GroupDimensions->LineEdit2;
+  else if (send == GroupArgs->PushButton2) {
+    myEditCurrentArgument = GroupArgs->LineEdit2;
 
     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
 
-    GroupDimensions->PushButton1->setDown(false);
-    GroupDimensions->LineEdit1->setEnabled(false);
+    GroupArgs->PushButton1->setDown(false);
+    GroupArgs->LineEdit1->setEnabled(false);
   }
   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
           this, SLOT(SelectionIntoArgument()));
@@ -416,12 +378,13 @@ void TransformationGUI_MultiRotationDlg::enterEvent (QEvent*)
 // function : TextValueChangedInSpinBox()
 // purpose  :
 //=================================================================================
-void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox(const QString& s){
+void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox (const QString& s)
+{
   bool isDigit;
   s.toDouble(&isDigit);
-  if(!isDigit)
-    GroupDimensions->CheckButton1->setChecked(false);
-  GroupDimensions->CheckButton1->setEnabled(isDigit);
+  if (!isDigit)
+    GroupArgs->CheckButton1->setChecked(false);
+  GroupArgs->CheckButton1->setEnabled(isDigit);
 }
 
 //=================================================================================
@@ -432,9 +395,9 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (double newValue)
 {
   QObject* send = (QObject*)sender();
 
-  if (send == GroupDimensions->SpinBox_DX1)
+  if (send == GroupArgs->SpinBox_DX1)
     myAng = newValue;
-  else if (send == GroupDimensions->SpinBox_DX2)
+  else if (send == GroupArgs->SpinBox_DX2)
     myStep = newValue;
 
   processPreview();
@@ -448,9 +411,9 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
 {
   QObject* send = (QObject*)sender();
 
-  if (send == GroupPoints->SpinBox_DX || send == GroupDimensions->SpinBox_DY1)
+  if (send == GroupArgs->SpinBox_DY1)
     myNbTimes1 = newValue;
-  else if (send == GroupDimensions->SpinBox_DY2)
+  else if (send == GroupArgs->SpinBox_DY2)
     myNbTimes2 = newValue;
 
   processPreview();
@@ -458,7 +421,7 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
 
 //=================================================================================
 // function : ReverseAngle()
-// purpose  : 'state' not used here
+// purpose  :
 //=================================================================================
 void TransformationGUI_MultiRotationDlg::ReverseAngle()
 {
@@ -467,11 +430,22 @@ void TransformationGUI_MultiRotationDlg::ReverseAngle()
   int aConstructorId = getConstructorId();
 
   if (aConstructorId == 1)
-    GroupDimensions->SpinBox_DX1->setValue(myAng);
+    GroupArgs->SpinBox_DX1->setValue(myAng);
 
   processPreview();
 }
 
+//=================================================================================
+// function : CheckAngleStep()
+// purpose  :
+//=================================================================================
+void TransformationGUI_MultiRotationDlg::CheckAngleStep (bool isOn)
+{
+  GroupArgs->SpinBox_DX1->setEnabled(isOn);
+  GroupArgs->CheckButton1->setEnabled(isOn);
+  processPreview();
+}
+
 //=================================================================================
 // function : createOperation
 // purpose  :
@@ -488,16 +462,20 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiRotationDlg::createOperation()
 bool TransformationGUI_MultiRotationDlg::isValid (QString& msg)
 {
   bool ok = false;
-  switch(getConstructorId()){
+  switch (getConstructorId()) {
   case 0:
-    ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) &&  myBase && myVector;
+    ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
+          GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
+          //myBase && myVector); // myVector = DZ by default
+          myBase);
     break;
   case 1:
-    ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
-         GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
-         GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
-         GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
-         myBase && myVector;
+    ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
+          GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
+          GroupArgs->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
+          GroupArgs->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
+          //myBase && myVector); // myVector = DZ by default
+          myBase);
     break;
   default:
     break;
@@ -520,29 +498,38 @@ bool TransformationGUI_MultiRotationDlg::execute (ObjectList& objects)
 
   switch (getConstructorId()) {
   case 0:
-    if ( myBase && myVector ) {
+    if (GroupArgs->CheckAngleStep->isChecked())
+      anObj = anOper->MultiRotate1DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1);
+    else
       anObj = anOper->MultiRotate1D(myBase.get(), myVector.get(), myNbTimes1);
-      if(!IsPreview())
-        aParameters<<GroupPoints->SpinBox_DX->text();
-      res = true;
+
+    if (!IsPreview()) {
+      if (GroupArgs->CheckAngleStep->isChecked())
+        aParameters << GroupArgs->SpinBox_DX1->text();
+      aParameters << GroupArgs->SpinBox_DY1->text();
     }
+    res = true;
     break;
   case 1:
-    if ( myBase && myVector ) {
-      anObj = anOper->MultiRotate2D(myBase.get(), myVector.get(), myAng, myNbTimes1, myStep, myNbTimes2);
-      if(!IsPreview()) {
-        aParameters<<GroupDimensions->SpinBox_DX1->text();
-        aParameters<<GroupDimensions->SpinBox_DY1->text();
-        aParameters<<GroupDimensions->SpinBox_DX2->text();
-        aParameters<<GroupDimensions->SpinBox_DY2->text();
-      }
-      res = true;
+    if (GroupArgs->CheckAngleStep->isChecked())
+      anObj = anOper->MultiRotate2DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1,
+                                          myStep, myNbTimes2);
+    else
+      anObj = anOper->MultiRotate2DNbTimes(myBase.get(), myVector.get(), myNbTimes1, myStep, myNbTimes2);
+
+    if (!IsPreview()) {
+      if (GroupArgs->CheckAngleStep->isChecked())
+        aParameters << GroupArgs->SpinBox_DX1->text();
+      aParameters << GroupArgs->SpinBox_DY1->text();
+      aParameters << GroupArgs->SpinBox_DX2->text();
+      aParameters << GroupArgs->SpinBox_DY2->text();
     }
+    res = true;
     break;
   }
 
   if (!anObj->_is_nil()) {
-    if(!IsPreview())
+    if (!IsPreview())
       anObj->SetParameters(aParameters.join(":").toLatin1().constData());
     objects.push_back(anObj._retn());
   }
@@ -586,3 +573,82 @@ void TransformationGUI_MultiRotationDlg::restoreSubShapes (SALOMEDS::Study_ptr
                                         mainFrame()->CheckBoxAddPrefix->isChecked());
   }
 }
+
+//=================================================================================
+// function : TransformationGUI_2Sel4Spin1Check
+// purpose  :
+//=================================================================================
+TransformationGUI_2Sel4Spin1Check::TransformationGUI_2Sel4Spin1Check (QWidget *parent)
+{
+  gridLayout = new QGridLayout (parent);
+  gridLayout->setSpacing(6);
+  gridLayout->setContentsMargins(11, 11, 11, 11);
+  gridLayout->setHorizontalSpacing(0);
+  gridLayout->setVerticalSpacing(0);
+  gridLayout->setContentsMargins(0, 0, 0, 0);
+
+  GroupBox1 = new QGroupBox (parent);
+
+  gridLayout1 = new QGridLayout (GroupBox1);
+  gridLayout1->setSpacing(6);
+  gridLayout1->setContentsMargins(11, 11, 11, 11);
+  gridLayout1->setHorizontalSpacing(6);
+  gridLayout1->setVerticalSpacing(6);
+  gridLayout1->setContentsMargins(9, 9, 9, 9);
+
+  // 2Sel
+  TextLabel1 = new QLabel(GroupBox1);
+  TextLabel2 = new QLabel(GroupBox1);
+
+  PushButton1 = new QPushButton (GroupBox1);
+  PushButton2 = new QPushButton (GroupBox1);
+
+  LineEdit2 = new QLineEdit(GroupBox1);
+  LineEdit1 = new QLineEdit(GroupBox1);
+
+  gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1);
+  gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1);
+  gridLayout1->addWidget(PushButton1, 0, 1, 1, 1);
+  gridLayout1->addWidget(PushButton2, 1, 1, 1, 1);
+  gridLayout1->addWidget(LineEdit1, 0, 2, 1, 1);
+  gridLayout1->addWidget(LineEdit2, 1, 2, 1, 1);
+
+  // 4Spin (double-int-double-int)
+  //TextLabel3 = new QLabel (GroupBox1);
+  CheckAngleStep = new QCheckBox (GroupBox1);
+  TextLabel4 = new QLabel (GroupBox1);
+  TextLabel5 = new QLabel (GroupBox1);
+  TextLabel6 = new QLabel (GroupBox1);
+
+  SpinBox_DX1 = new SalomeApp_DoubleSpinBox (GroupBox1);
+  SpinBox_DY1 = new SalomeApp_IntSpinBox (GroupBox1);
+  SpinBox_DX2 = new SalomeApp_DoubleSpinBox (GroupBox1);
+  SpinBox_DY2 = new SalomeApp_IntSpinBox (GroupBox1);
+
+  //gridLayout1->addWidget(TextLabel3, 2, 0, 1, 1);
+  gridLayout1->addWidget(CheckAngleStep, 2, 0, 1, 1);
+  gridLayout1->addWidget(TextLabel4, 3, 0, 1, 1);
+  gridLayout1->addWidget(TextLabel5, 5, 0, 1, 1);
+  gridLayout1->addWidget(TextLabel6, 6, 0, 1, 1);
+
+  gridLayout1->addWidget(SpinBox_DX1, 2, 1, 1, 2);
+  gridLayout1->addWidget(SpinBox_DY1, 3, 1, 1, 2);
+  gridLayout1->addWidget(SpinBox_DX2, 5, 1, 1, 2);
+  gridLayout1->addWidget(SpinBox_DY2, 6, 1, 1, 2);
+
+  // 1Check
+  CheckButton1 = new QCheckBox (GroupBox1);
+
+  gridLayout1->addWidget(CheckButton1, 4, 0, 1, 3);
+
+  gridLayout->addWidget(GroupBox1, 0, 0, 1, 1);
+}
+
+//=================================================================================
+// function : ~TransformationGUI_2Sel4Spin1Check()
+// purpose  : Destroys the object and frees any allocated resources
+//=================================================================================
+TransformationGUI_2Sel4Spin1Check::~TransformationGUI_2Sel4Spin1Check()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
index fac7bd50215dac1fec7c34223544baec0c98243f..ed4268145104eeec5d82fb3b0c43358921727a81 100644 (file)
 // 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_MultiRotationDlg.h
 // Author : Damien COQUERET, Open CASCADE S.A.S.
-//
+
 #ifndef TRANSFORMATIONGUI_MULTIROTATIONDLG_H
 #define TRANSFORMATIONGUI_MULTIROTATIONDLG_H
 
 #include "GEOMBase_Skeleton.h"
 #include "GEOM_GenericObjPtr.h"
 
-class DlgRef_2Sel4Spin1Check;
-class DlgRef_2Sel1SpinInt;
+#include <SalomeApp_IntSpinBox.h>
+
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QLineEdit>
+#include <QCheckBox>
+
+//=================================================================================
+// class    : TransformationGUI_2Sel4Spin1Check
+// purpose  :
+//=================================================================================
+class TransformationGUI_2Sel4Spin1Check : public QWidget
+{
+  Q_OBJECT
+
+ public:
+  TransformationGUI_2Sel4Spin1Check (QWidget *parent);
+  ~TransformationGUI_2Sel4Spin1Check();
+
+ public:
+  QGridLayout *gridLayout;
+  QGroupBox *GroupBox1;
+  QGridLayout *gridLayout1;
+
+  // 2Sel
+  QLabel *TextLabel1;
+  QLabel *TextLabel2;
+  QPushButton *PushButton1;
+  QPushButton *PushButton2;
+  QLineEdit *LineEdit1;
+  QLineEdit *LineEdit2;
+
+  // 4Spin (double-int-double-int)
+  QCheckBox *CheckAngleStep;
+  QLabel *TextLabel4;
+  QLabel *TextLabel5;
+  QLabel *TextLabel6;
+  SalomeApp_DoubleSpinBox *SpinBox_DX1;
+  SalomeApp_IntSpinBox *SpinBox_DY1;
+  SalomeApp_DoubleSpinBox *SpinBox_DX2;
+  SalomeApp_IntSpinBox *SpinBox_DY2;
+
+  // 1Check
+  QCheckBox *CheckButton1;
+};
 
 //=================================================================================
 // class    : TransformationGUI_MultiRotationDlg
 // purpose  :
 //=================================================================================
 class TransformationGUI_MultiRotationDlg : public GEOMBase_Skeleton
-{ 
+{
   Q_OBJECT
 
 public:
-  TransformationGUI_MultiRotationDlgGeometryGUI*, QWidget* = 0,
-                                      bool = false, Qt::WindowFlags = 0 );
+  TransformationGUI_MultiRotationDlg (GeometryGUI*, QWidget* = 0,
+                                      bool = false, Qt::WindowFlags = 0);
   ~TransformationGUI_MultiRotationDlg();
-  
+
 protected:
   // redefined from GEOMBase_Helper
   virtual GEOM::GEOM_IOperations_ptr createOperation();
@@ -57,7 +101,7 @@ protected:
 private:
   void                               Init();
   void                               enterEvent( QEvent* );
+
 private:
   GEOM::GeomObjPtr                   myBase, myVector;
   int                                myNbTimes1;
@@ -67,9 +111,8 @@ private:
 
   // to initialize the first selection field with a selected object on the dialog creation
   bool                               myInitial;
-  
-  DlgRef_2Sel1SpinInt*               GroupPoints;
-  DlgRef_2Sel4Spin1Check*            GroupDimensions;
+
+  TransformationGUI_2Sel4Spin1Check* GroupArgs;
 
 private slots:
   void                               ClickOnOk();
@@ -77,6 +120,7 @@ private slots:
   void                               ActivateThisDialog();
   void                               SelectionIntoArgument();
   void                               SetEditCurrentArgument();
+  void                               CheckAngleStep (bool);
   void                               ReverseAngle();
   void                               ValueChangedInSpinBox( double );
   void                               ValueChangedInSpinBox( int );
index 352f88c2e27158f6c26725cf48bb80e477a6bd80..60eb1f9817ad1eb291e34ce88fa3c58119127860 100644 (file)
@@ -82,10 +82,10 @@ TransformationGUI_MultiTranslationDlg::TransformationGUI_MultiTranslationDlg
   GroupPoints = new DlgRef_2Sel2Spin1Check(centralWidget());
   GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTITRANSLATION_SIMPLE"));
   GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR_U"));
-  GroupPoints->TextLabel3->setText(tr("GEOM_STEP_U"));
-  GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES_U"));
-  GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_U"));
+  GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
+  GroupPoints->TextLabel3->setText(tr("GEOM_STEP"));
+  GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES"));
+  GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_DIRECTION"));
   GroupPoints->PushButton1->setIcon(image2);
   GroupPoints->PushButton2->setIcon(image2);
   GroupPoints->LineEdit1->setReadOnly(true);
@@ -142,7 +142,7 @@ void TransformationGUI_MultiTranslationDlg::Init()
   int SpecificStep = 1;
   // init variables
   myStepU = myStepV = 50.0;
-  myNbTimesU = myNbTimesV = 2;
+  myNbTimesU = myNbTimesV = 3;
 
   // min, max, step and decimals for spin boxes & initial values
   initSpinBox(GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
@@ -328,9 +328,20 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
   if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
     QString aName = GEOMBase::GetName( aSelectedObject.get() );
     myEditCurrentArgument->setText( aName );
+
     if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
       myBase = aSelectedObject;
-      if ( !myVectorU )
+
+      // recompute myStepU (Mantis issue 0021718)
+      GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
+      double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
+      anOper->GetBoundingBox(myBase.get(), Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
+      if (anOper->IsDone()) {
+        myStepU = floor(1.5 * (Xmax - Xmin));
+        GroupPoints->SpinBox_DX->setValue(myStepU);
+      }
+
+      if (!myVectorU)
        GroupPoints->PushButton2->click();
     }
     else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
@@ -340,6 +351,18 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
     }
     else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
       myBase = aSelectedObject;
+
+      // recompute myStepU and myStepV (Mantis issue 0021718)
+      GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
+      double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
+      anOper->GetBoundingBox(myBase.get(), Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
+      if (anOper->IsDone()) {
+        myStepU = floor(1.5 * (Xmax - Xmin));
+        myStepV = floor(1.5 * (Ymax - Ymin));
+        GroupDimensions->SpinBox_DX1->setValue(myStepU);
+        GroupDimensions->SpinBox_DX2->setValue(myStepV);
+      }
+
       if ( !myVectorU )
        GroupDimensions->PushButton2->click();
       else if ( !myVectorV )
@@ -597,18 +620,20 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperatio
 bool TransformationGUI_MultiTranslationDlg::isValid (QString& msg)
 {
   bool ok = false;
-  switch ( getConstructorId() ) {
+  switch (getConstructorId()) {
   case 0:
     ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) &&
          GroupPoints->SpinBox_DY->isValid( msg, !IsPreview() ) &&
-         myBase && myVectorU;
+         myBase;
+         //myBase && myVectorU; // Mantis issue 0021718
     break;
   case 1:
     ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
-         myBase && myVectorU && myVectorV;
+         myBase;
+         //myBase && myVectorU && myVectorV; // Mantis issue 0021718
     break;
   default:
     break;
@@ -625,43 +650,38 @@ bool TransformationGUI_MultiTranslationDlg::execute (ObjectList& objects)
   bool res = false;
 
   GEOM::GEOM_Object_var anObj;
-
   QStringList aParameters;
 
   GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
 
   switch (getConstructorId()) {
   case 0:
-    if ( myBase && myVectorU ) {
-      createPathPreview ( myVectorU.get() );
-      anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
-      if(!IsPreview()) {
-        aParameters<<GroupPoints->SpinBox_DX->text();
-        aParameters<<GroupPoints->SpinBox_DY->text();
-      }
-      res = true;
+    createPathPreview(myVectorU.get());
+    anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
+    if (!IsPreview()) {
+      aParameters << GroupPoints->SpinBox_DX->text();
+      aParameters << GroupPoints->SpinBox_DY->text();
     }
+    res = true;
     break;
   case 1:
-    if ( myBase && myVectorU && myVectorV ) {
-      createPathPreview ( myVectorU.get() );
-      createPathPreview ( myVectorV.get() );
-      anObj = anOper->MultiTranslate2D(myBase.get(),
-                                       myVectorU.get(), myStepU, myNbTimesU,
-                                       myVectorV.get(), myStepV, myNbTimesV);
-      if(!IsPreview()) {
-        aParameters<<GroupDimensions->SpinBox_DX1->text();
-        aParameters<<GroupDimensions->SpinBox_DY1->text();
-        aParameters<<GroupDimensions->SpinBox_DX2->text();
-        aParameters<<GroupDimensions->SpinBox_DY2->text();
-      }
-      res = true;
+    createPathPreview(myVectorU.get());
+    createPathPreview(myVectorV.get());
+    anObj = anOper->MultiTranslate2D(myBase.get(),
+                                     myVectorU.get(), myStepU, myNbTimesU,
+                                     myVectorV.get(), myStepV, myNbTimesV);
+    if (!IsPreview()) {
+      aParameters << GroupDimensions->SpinBox_DX1->text();
+      aParameters << GroupDimensions->SpinBox_DY1->text();
+      aParameters << GroupDimensions->SpinBox_DX2->text();
+      aParameters << GroupDimensions->SpinBox_DY2->text();
     }
+    res = true;
     break;
   }
 
   if (!anObj->_is_nil()) {
-    if(!IsPreview())
+    if (!IsPreview())
       anObj->SetParameters(aParameters.join(":").toLatin1().constData());
     objects.push_back(anObj._retn());
   }
@@ -716,6 +736,7 @@ void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_pt
 void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Object_ptr thePath )
 {
   if ( IsPreview() ) {
+    if (thePath->_is_nil()) return;
     TopoDS_Shape aShape;
     GEOMBase::GetShape( thePath, aShape, TopAbs_SHAPE );
     TopoDS_Edge anEdge = TopoDS::Edge( aShape );