From fa79fcc326fdf4489d418aa69bcb46801abfc461 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 11 Jan 2013 14:20:45 +0000 Subject: [PATCH] Mantis issue 0021718: EDF 1874: Ergonomic of multi-translation / multi-rotation --- doc/salome/gui/GEOM/images/mtrans1.png | Bin 15614 -> 27480 bytes doc/salome/gui/GEOM/images/mtrans2.png | Bin 19232 -> 33003 bytes doc/salome/gui/GEOM/images/neo-mrot1.png | Bin 14322 -> 26689 bytes doc/salome/gui/GEOM/images/neo-mrot2.png | Bin 17422 -> 30397 bytes .../GEOM/input/multi_rotation_operation.doc | 58 +-- .../input/multi_translation_operation.doc | 44 +- .../input/tui_transformation_operations.doc | 41 +- idl/GEOM_Gen.idl | 103 ++++- src/DlgRef/DlgRef.cxx | 15 - src/DlgRef/DlgRef.h | 17 - src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui | 237 ----------- src/DlgRef/Makefile.am | 3 - src/GEOMGUI/GEOM_msg_en.ts | 8 + .../GEOMImpl_ITransformOperations.cxx | 188 ++++++-- .../GEOMImpl_ITransformOperations.hxx | 12 +- src/GEOMImpl/GEOMImpl_RotateDriver.cxx | 90 ++-- src/GEOMImpl/GEOMImpl_TranslateDriver.cxx | 52 +-- src/GEOMImpl/GEOMImpl_Types.hxx | 1 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 46 ++ src/GEOM_I/GEOM_IMeasureOperations_i.hh | 4 + src/GEOM_I/GEOM_ITransformOperations_i.cc | 110 ++++- src/GEOM_I/GEOM_ITransformOperations_i.hh | 133 +++--- src/GEOM_SWIG/GEOM_TestAll.py | 5 +- src/GEOM_SWIG/GEOM_TestOthers.py | 4 +- src/GEOM_SWIG/geompyDC.py | 255 +++++++++-- src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx | 2 +- src/MeasureGUI/MeasureGUI_DistanceDlg.cxx | 279 ++++++++---- src/MeasureGUI/MeasureGUI_DistanceDlg.h | 46 +- .../TransformationGUI_MultiRotationDlg.cxx | 400 ++++++++++-------- .../TransformationGUI_MultiRotationDlg.h | 68 ++- .../TransformationGUI_MultiTranslationDlg.cxx | 85 ++-- 31 files changed, 1443 insertions(+), 863 deletions(-) delete mode 100644 src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui diff --git a/doc/salome/gui/GEOM/images/mtrans1.png b/doc/salome/gui/GEOM/images/mtrans1.png index f5752e4b19fa64c4d082b1a746de90460f91131b..2e968557405882f45d9f953712c26aba7795d726 100755 GIT binary patch literal 27480 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 VY;Ga?0{CX4y%&>yTPULA^FPy$R_Oo$ literal 15614 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 DBkyg! diff --git a/doc/salome/gui/GEOM/images/mtrans2.png b/doc/salome/gui/GEOM/images/mtrans2.png index c61b1c3c140ce43d3b64ef77e8333bcaf23dfc7d..8f051425b4a8fa2be92f66fa5a3c1d79414659fd 100755 GIT binary patch literal 33003 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 RAN(2e?ya4VK>ZMq-lhA|druHTKmnx$ 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⩔Rmw!@6p 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 diff --git a/doc/salome/gui/GEOM/images/neo-mrot2.png b/doc/salome/gui/GEOM/images/neo-mrot2.png index f3f3c347ef64ec51b60409adfd3f2c556ef86a7c..b17098a7591331e3c69ecc52fdbf846fcf098f6e 100755 GIT binary patch literal 30397 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 diff --git a/doc/salome/gui/GEOM/input/multi_rotation_operation.doc b/doc/salome/gui/GEOM/input/multi_rotation_operation.doc index cdc6234a1..0238f6334 100644 --- a/doc/salome/gui/GEOM/input/multi_rotation_operation.doc +++ b/doc/salome/gui/GEOM/input/multi_rotation_operation.doc @@ -5,24 +5,28 @@ \n To produce a Multi Rotation in the Main Menu select Operations - > Transformation - > Multi Rotation -\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 Simple Multi Rotation (in one dimension) you -need to define a \b Shape to be rotated, an \b Axis of rotation and a -Number of Times the shape must be rotated. Rotation Angle 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 TUI Command: geompy.MultiRotate1D(Shape, Axis, NbTimes) -\n Arguments: 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 Number of Times +the shape must be rotated. If Angular step 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 TUI Commands: +\n geompy.MultiRotate1DNbTimes(Shape, Axis, NbTimes) +\n geompy.MultiRotate1DByStep(Shape, Axis, AngleStep, NbTimes) \b NB! There is another way to execute a Multi-rotation operation, which is currently accessible only via TUI commands: -geompy.MakeMultiRotation1D(Shape, Dir, Point, NbTimes) which works in -the same way, but the Axis is defined by direction and point. +geompy.MakeMultiRotation1DNbTimes(Shape, Dir, Point, NbTimes), +geompy.MakeMultiRotation1DByStep(Shape, Dir, Point, AngleStep, NbTimes), +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 Double Multi Rotation (in two dimensions) rotates the given -\b Object around the given \b Axis on the given \b Angle a given -Number of Times 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 Number of Times and +multi-translates each rotation result. +If Angular step 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 TUI Command: geompy.MultiRotate2D(Shape, Axis, Angle, NbTimes1, Step, NbTimes2) -\n Arguments: Name + 1 shape + 1 vector for direction + 1 angle -+ 1 value (repetition) + 1 step value + 1 value (repetition). + +\n TUI Commands: +\n geompy.MultiRotate2DNbTimes(Shape, Axis, NbTimes1, RadialStep, NbTimes2) +\n geompy.MultiRotate2DByStep(Shape, Axis, AngleStep, NbTimes1, RadialStep, NbTimes2) NB! There is another way to execute a Double Multi-rotation operation, which is currently accessible only via TUI commands: -geompy.MakeMultiRotation2D(Shape, Dir, Point, Angle, nbtimes1, Step,nbtimes2) -which works in the same way, -but the Axis is defined by direction and point. +geompy.MakeMultiRotation2DNbTimes(Shape, Dir, Point, NbTimes1, RadialStep, NbTimes2), +geompy.MakeMultiRotation2DByStep(Shape, Dir, Point, AngleStep, NbTimes1, RadialStep, NbTimes2), +which works in the same way, but the Axis is defined by direction and point. \image html neo-mrot2.png diff --git a/doc/salome/gui/GEOM/input/multi_translation_operation.doc b/doc/salome/gui/GEOM/input/multi_translation_operation.doc index 0d084f3c1..6274ad9b4 100644 --- a/doc/salome/gui/GEOM/input/multi_translation_operation.doc +++ b/doc/salome/gui/GEOM/input/multi_translation_operation.doc @@ -7,9 +7,8 @@ select Operations - > Transformation - > Multi Translation \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 Simple Multi Translation (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 Number of Times 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 TUI Command: geompy.MakeMultiTranslation1D(Shape, Dir, -Step, NbTimes) -\n Arguments: Name + 1 shape + 1 vector (for direction) + 1 -step value + 1 value (repetition). +translation (DX by default), a \b Step of translation and a Number +of Times 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 TUI Command: geompy.MakeMultiTranslation1D(Shape, Dir, +Step, NbTimes) +\n Arguments: Name + 1 shape + 1 vector (for direction) + 1 +step value + 1 value (repetition). + \anchor double_multi_translation \n To produce a Double Multi Translation (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 Number of Times 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 Number of Times 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 TUI Command: geompy.MakeMultiTranslation2D(Shape, Dir1, Step1, NbTimes1, Dir2, Step2, NbTimes2), where \em Shape is a shape @@ -53,12 +63,6 @@ along \em Dir2. \n Arguments: 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 TUI Scripts provide you with useful examples of the use of \ref tui_multi_translation "Transformation Operations". diff --git a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc index 09744cddf..9c582a897 100644 --- a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc @@ -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 diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 4c0c92b2a..af98eeb8a 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -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. diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index 164f483b4..01be686b6 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -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 ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.h b/src/DlgRef/DlgRef.h index bda6da5b5..bb707a511 100644 --- a/src/DlgRef/DlgRef.h +++ b/src/DlgRef/DlgRef.h @@ -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 index 5d0afce71..000000000 --- a/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.ui +++ /dev/null @@ -1,237 +0,0 @@ - - DlgRef_2Sel4Spin1Check_QTD - - - - 0 - 0 - 156 - 197 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - 9 - - - 9 - - - 9 - - - 9 - - - 6 - - - 6 - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - TL6 - - - false - - - - - - - - 0 - 0 - - - - TL5 - - - false - - - - - - - - 0 - 0 - - - - TL4 - - - false - - - - - - - - 0 - 0 - - - - TL3 - - - false - - - - - - - - 0 - 0 - - - - TL2 - - - false - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - 0 - 0 - - - - TL1 - - - false - - - - - - - - - - - 0 - 0 - - - - - - - - - - - - - - qPixmapFromMimeSource - - - SalomeApp_DoubleSpinBox - QDoubleSpinBox -
SalomeApp_DoubleSpinBox.h
-
- - SalomeApp_IntSpinBox - QSpinBox -
SalomeApp_IntSpinBox.h
-
-
- - PushButton1 - LineEdit1 - PushButton2 - LineEdit2 - SpinBox_DX1 - SpinBox_DY1 - CheckButton1 - SpinBox_DX2 - SpinBox_DY2 - - - -
diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index deaa27026..3e5d05b63 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -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 \ diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 1eeee7c48..c0ec2c792 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -125,6 +125,10 @@ Please, select face, shell or solid and try again GEOM_ANGLE_1 Angle + + GEOM_ANGLE_STEP + Angular step : + GEOM_ARC_ELLIPSE Arc of ellipse @@ -1950,6 +1954,10 @@ Please, select face, shell or solid and try again GEOM_STEP Step : + + GEOM_STEP_R + Radial step : + GEOM_STEP_TITLE Step value for GUI constructions diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 9b754517f..c296d9c58 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -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 @@ -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(); diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 270854229..a003f0fb9 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -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, diff --git a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx index 9f1e3035b..036538018 100644 --- a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx @@ -18,36 +18,42 @@ // 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 #include #include #include + #include -#include -#include -#include -#include -#include + +#include + #include -#include -#include -#include -#include +#include +#include +#include + #include #include +#include +#include #include +#include #include -#include -#include + #include #include #include -#include + #include +#include +#include +#include +#include +#include + //======================================================================= //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); diff --git a/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx index 575cbaea9..1f6de2170 100644 --- a/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx @@ -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 @@ -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++) { diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 687eb7f15..0419dd169 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -153,6 +153,7 @@ #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 diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index 66bcb5288..257822004 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -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 diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index 0f68c3510..e8269bd22 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -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); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index 59bc4a293..05b132959 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -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 @@ -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); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index f01f08c22..7f7964ce4 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -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); diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index 4eb309e4c..bffea27ea 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -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 diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py index 42429b3ca..afd2a0af5 100644 --- a/src/GEOM_SWIG/GEOM_TestOthers.py +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -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") diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 64cfe0346..9d750572a 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -169,6 +169,7 @@ ## @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 diff --git a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx index 062b94d7f..790c0a41c 100644 --- a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx @@ -162,7 +162,7 @@ void MeasureGUI_BndBoxDlg::ActivateThisDialog() this, SLOT(SelectionIntoArgument())); globalSelection(); - displayPreview(true); + redisplayPreview(); } //================================================================================= diff --git a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx index ffd630a9a..d0d9fda91 100644 --- a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx @@ -18,12 +18,11 @@ // 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 #include #include +#include #include #include #include @@ -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); + } } diff --git a/src/MeasureGUI/MeasureGUI_DistanceDlg.h b/src/MeasureGUI/MeasureGUI_DistanceDlg.h index 2c4e9c56d..83a44272c 100644 --- a/src/MeasureGUI/MeasureGUI_DistanceDlg.h +++ b/src/MeasureGUI/MeasureGUI_DistanceDlg.h @@ -18,16 +18,15 @@ // 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 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 diff --git a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx index f450a2f8c..5a0fd01f3 100644 --- a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx @@ -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<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<SpinBox_DX1->text(); - aParameters<SpinBox_DY1->text(); - aParameters<SpinBox_DX2->text(); - aParameters<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 +} diff --git a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.h b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.h index fac7bd502..ed4268145 100644 --- a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.h +++ b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.h @@ -18,34 +18,78 @@ // 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 + +#include +#include +#include +#include +#include +#include + +//================================================================================= +// 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_MultiRotationDlg( GeometryGUI*, 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 ); diff --git a/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx index 352f88c2e..60eb1f981 100644 --- a/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx @@ -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<SpinBox_DX->text(); - aParameters<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<SpinBox_DX1->text(); - aParameters<SpinBox_DY1->text(); - aParameters<SpinBox_DX2->text(); - aParameters<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 ); -- 2.39.2