Mantis issue 0021718: EDF 1874: Ergonomic of multi-translation / multi-rotation

This commit is contained in:
jfa 2013-01-11 14:20:45 +00:00
parent c749b0fe0f
commit fa79fcc326
31 changed files with 1470 additions and 890 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -5,24 +5,28 @@
\n To produce a <b>Multi Rotation</b> in the <b>Main Menu</b> select
<b>Operations - > Transformation - > Multi Rotation</b>
\n This operation creates several geometrical objects rotated in one
or two dimensions basing on the initial geometrical object.
\n The \b Result will be one or several \b GEOM_Objects (compound).
\n This operation creates a compound of several shapes rotated in one
or two dimensions basing on the initial shape.
\n The \b Result will be one \b GEOM_Object (compound).
\n To produce a <b>Simple Multi Rotation</b> (in one dimension) you
need to define a \b Shape to be rotated, an \b Axis of rotation and a
<b>Number of Times</b> the shape must be rotated. <b>Rotation Angle</b> will
be 2 * \a PI / \a NbTimes. Number of shapes in the resulting compound will be equal
to \a NbTimes (if \a NbTimes = 1, the result will contain only the initial
non-transformed shape).
\n <b>TUI Command:</b> <em>geompy.MultiRotate1D(Shape, Axis, NbTimes)</em>
\n <b>Arguments:</b> Name + 1 shape + 1 vector for direction + 1 value
(repetition).
need to define a \b Shape to be rotated, an \b Axis of rotation (DZ by
default), Angle of rotation (optionally) and a <b>Number of Times</b>
the shape must be rotated. If <b>Angular step</b> is not defined
(checkbox is not checked), it will be 2 * \a PI / \a NbTimes. Number
of shape's copies in the resulting compound will be equal to
\a NbTimes (if \a NbTimes = 1, the result will contain only the
initial non-transformed shape).
\n <b>TUI Commands:</b>
\n <em>geompy.MultiRotate1DNbTimes(Shape, Axis, NbTimes)</em>
\n <em>geompy.MultiRotate1DByStep(Shape, Axis, AngleStep, NbTimes)</em>
\b <b>NB!</b> There is another way to execute a Multi-rotation
operation, which is currently accessible only via TUI commands:
<em>geompy.MakeMultiRotation1D(Shape, Dir, Point, NbTimes)</em> which works in
the same way, but the Axis is defined by direction and point.
<em>geompy.MakeMultiRotation1DNbTimes(Shape, Dir, Point, NbTimes)</em>,
<em>geompy.MakeMultiRotation1DByStep(Shape, Dir, Point, AngleStep, NbTimes)</em>,
which works in the same way, but the Axis is defined by direction and point.
\image html neo-mrot1.png
@ -31,23 +35,27 @@ the same way, but the Axis is defined by direction and point.
\image html multi_rotation1d2.png "The result of a simple multi-rotation"
\n <b>Double Multi Rotation</b> (in two dimensions) rotates the given
\b Object around the given \b Axis on the given \b Angle a given
<b>Number of Times</b> and multi-translates each rotation
result. Translation direction passes through the center of gravity of
the rotated shape and its projection on the rotation axis. Number of
shapes in the resulting compound will be equal to \a NbTimes1 x \a NbTimes2 (if
both \a NbTimes1 and \a NbTimes2 are equal to 1, the result will contain
\b Object around the given \b Axis (DZ by default) on the given
\b Angle (optional) a given <b>Number of Times</b> and
multi-translates each rotation result.
If <b>Angular step</b> is not defined (checkbox is not checked), it
will be 2 * \a PI / \a NbTimes.
Translation direction passes through the center of gravity of the
initial shape and its projection on the rotation axis. Number of
shape's copies in the resulting compound will be equal to \a NbTimes1 x \a NbTimes2
(if both \a NbTimes1 and \a NbTimes2 are equal to 1, the result will contain
only the initial non-transformed shape).
\b Reverse checkbox allows to set the direction of rotation.
\n <b>TUI Command:</b> <em>geompy.MultiRotate2D(Shape, Axis, Angle, NbTimes1, Step, NbTimes2)</em>
\n <b>Arguments:</b> Name + 1 shape + 1 vector for direction + 1 angle
+ 1 value (repetition) + 1 step value + 1 value (repetition).
\n <b>TUI Commands:</b>
\n <em>geompy.MultiRotate2DNbTimes(Shape, Axis, NbTimes1, RadialStep, NbTimes2)</em>
\n <em>geompy.MultiRotate2DByStep(Shape, Axis, AngleStep, NbTimes1, RadialStep, NbTimes2)</em>
<b>NB!</b> There is another way to execute a Double Multi-rotation
operation, which is currently accessible only via TUI commands:
<em>geompy.MakeMultiRotation2D(Shape, Dir, Point, Angle, nbtimes1, Step,nbtimes2)</em>
which works in the same way,
but the Axis is defined by direction and point.
<em>geompy.MakeMultiRotation2DNbTimes(Shape, Dir, Point, NbTimes1, RadialStep, NbTimes2)</em>,
<em>geompy.MakeMultiRotation2DByStep(Shape, Dir, Point, AngleStep, NbTimes1, RadialStep, NbTimes2)</em>,
which works in the same way, but the Axis is defined by direction and point.
\image html neo-mrot2.png

View File

@ -7,9 +7,8 @@ select <b>Operations - > Transformation - > Multi Translation</b>
\n This operation makes several translations of a shape in \b one or \b
two directions.
\n The \b Result will be one or several \b GEOM_Objects
(compound). The total number of shapes in the resulting compound (for
a single initial selected shape) will be equal to:
\n The \b Result will be one \b GEOM_Object (compound). The total
number of shape copies in the resulting compound will be equal to:
- in case of \ref single_multi_translation "Single multi translation":
\a NbTimes (if \a NbTimes parameter is equal to 1, the result will
contain only the initial non-translated shape).
@ -21,14 +20,11 @@ initial shape).
\anchor single_multi_translation
\n To produce a <b>Simple Multi Translation</b> (in one direction) you
need to indicate an \b Object to be translated, a \b Vector of
translation, a \b Step of translation and a <b>Number of Times</b> the
Object should be duplicated. If a curve has been selected instead of
the Vector, only its first and last vertices will be used to get the vector direction
and the dialog preview will display the vector along which the object will be translated.
\n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation1D(Shape, Dir,
Step, NbTimes)</em>
\n <b>Arguments:</b> Name + 1 shape + 1 vector (for direction) + 1
step value + 1 value (repetition).
translation (DX by default), a \b Step of translation and a <b>Number
of Times</b> the Object should be duplicated. If a curve has been
selected instead of the Vector, only its first and last vertices will
be used to get the vector direction and the dialog preview will
display the vector along which the object will be translated.
\image html mtrans1.png
@ -36,12 +32,26 @@ step value + 1 value (repetition).
\image html multi_translation1dsn.png "The result of a simple multi-translation"
\n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation1D(Shape, Dir,
Step, NbTimes)</em>
\n <b>Arguments:</b> Name + 1 shape + 1 vector (for direction) + 1
step value + 1 value (repetition).
\anchor double_multi_translation
\n To produce a <b>Double Multi Translation</b> (in two directions) you need to
indicate an \b Object to be translated, and, for both axes, a \b
Vector of translation, a \b Step of translation and a <b>Number of Times</b> the shape must be duplicated.
If a curve has been selected instead of the Vector, only its first and last vertices will be used to get the vector direction
and the dialog preview will display the vector along which the object will be translated.
Vector of translation (DX and DY by default), a \b Step of translation
and a <b>Number of Times</b> the shape must be duplicated.
If a curve has been selected instead of the Vector, only its first and
last vertices will be used to get the vector direction and the dialog
preview will display the vector along which the object will be
translated.
\image html mtrans2.png
\image html multi_translation_initialsn.png "The initial object"
\image html multi_translation2dsn.png "The result of a double multi-translation"
\n <b>TUI Command:</b> <em>geompy.MakeMultiTranslation2D(Shape, Dir1,
Step1, NbTimes1, Dir2, Step2, NbTimes2),</em> where \em Shape is a shape
@ -53,12 +63,6 @@ along \em Dir2.
\n <b>Arguments:</b> Name + 1 shape + 2 vectors defining the direction
+ 2 step values + 2 values (repetitions).
\image html mtrans2.png
\image html multi_translation_initialsn.png "The initial object"
\image html multi_translation2dsn.png "The result of a double multi-translation"
Our <b>TUI Scripts</b> provide you with useful examples of the use of
\ref tui_multi_translation "Transformation Operations".

View File

@ -340,6 +340,7 @@ gg.setDisplayMode(id_tr2d,1)
import geompy
import salome
gg = salome.ImportComponentGUI("GEOM")
import math
# create vertices and vectors
p0 = geompy.MakeVertex( 0., 0., 0.)
@ -349,7 +350,7 @@ pz = geompy.MakeVertex( 0., 0., 20.)
pxyz = geompy.MakeVertex( 50., 50., 10.)
vz = geompy.MakeVector(p0, pz)
vxy = geompy.MakeVector(px, py)
vrot1d = geompy.MakeVector(p0, pxyz)
vrot = geompy.MakeVector(p0, pxyz)
# create an arc
arc = geompy.MakeArc(py, pz, px)
@ -363,25 +364,41 @@ face = geompy.MakeFace(wire, 1)
# create a prism
prism = geompy.MakePrismVecH(face, vz, 20.0)
# rotate the given object around the given axis by the given angle a given number of times
rot1d = geompy.MultiRotate1D(prism, vrot1d, 4)
# 1. Rotate the prism around the axis vrot 4 times
# 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)
# 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)
# 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

View File

@ -804,7 +804,7 @@ module GEOM
/*!
* \brief Translate the given object along the given vector a given number times
* \param theObject The object to be translated.
* \param theVector Direction of the translation.
* \param theVector Direction of the translation. DX if None.
* \param theStep Distance to translate on.
* \param theNbTimes Quantity of translations to be done.
* \return New GEOM_Object, containing compound of all
@ -818,10 +818,10 @@ module GEOM
/*!
* \brief Conseqently apply two specified translations to theObject specified number of times.
* \param theObject The object to be translated.
* \param theVector1 Direction of the first translation.
* \param theVector1 Direction of the first translation. DX if None.
* \param theStep1 Step of the first translation.
* \param theNbTimes1 Quantity of translations to be done along theVector1.
* \param theVector2 Direction of the second translation.
* \param theVector2 Direction of the second translation. DY if None.
* \param theStep2 Step of the second translation.
* \param theNbTimes2 Quantity of translations to be done along theVector2.
* \return New GEOM_Object, containing compound of all
@ -888,20 +888,56 @@ module GEOM
in GEOM_Object theAxis,
in double theAngle);
/*!
* \brief Rotate the given object around the given axis a given number times.
*
* Rotation angle will be 2*PI/theNbTimes.
* Rotation angle will be 2*PI/theNbObjects.
* \param theObject The object to be rotated.
* \param theAxis The rotation axis.
* \param theNbTimes Quantity of rotations to be done.
* \param theAxis The rotation axis. DZ if None.
* \param theNbObjects Quantity of rotations to be done.
* \return New GEOM_Object, containing compound of all the
* shapes, obtained after each rotation.
*/
GEOM_Object MultiRotate1D (in GEOM_Object theObject,
in GEOM_Object theAxis,
in long theNbTimes);
in long theNbObjects);
/*!
* \brief Rotate the given object around the given axis
* a given number times on the given angle.
*
* \param theObject The object to be rotated.
* \param theAxis The rotation axis. DZ if None.
* \param theAngleStep Rotation angle in radians.
* \param theNbSteps Quantity of rotations to be done.
* \return New GEOM_Object, containing compound of all the
* shapes, obtained after each rotation.
*/
GEOM_Object MultiRotate1DByStep (in GEOM_Object theObject,
in GEOM_Object theAxis,
in double theAngleStep,
in long theNbSteps);
/*!
* \brief Rotate the given object around the given axis
* a given number times and multi-translate each rotation result.
*
* Rotation angle will be 2*PI/theNbObjects.
* Translation direction passes through center of gravity
* of rotated shape and its projection on the rotation axis.
* \param theObject The object to be rotated.
* \param theAxis Rotation axis. DZ if None.
* \param theNbObjects Quantity of rotations to be done.
* \param theRadialStep Translation distance.
* \param theNbSteps Quantity of translations to be done.
* \return New GEOM_Object, containing compound of all the
* shapes, obtained after each transformation.
*/
GEOM_Object MultiRotate2DNbTimes (in GEOM_Object theObject,
in GEOM_Object theAxis,
in long theNbObjects,
in double theRadialStep,
in long theNbSteps);
/*!
* \brief Rotate the given object around the
@ -911,20 +947,43 @@ module GEOM
* Translation direction passes through center of gravity
* of rotated shape and its projection on the rotation axis.
* \param theObject The object to be rotated.
* \param theAxis Rotation axis.
* \param theAngle Rotation angle in graduces.
* \param theNbTimes1 Quantity of rotations to be done.
* \param theStep Translation distance.
* \param theNbTimes2 Quantity of translations to be done.
* \param theAxis Rotation axis. DZ if None.
* \param theAngleStep Rotation angle in radians.
* \param theNbSteps1 Quantity of rotations to be done.
* \param theRadialStep Translation distance.
* \param theNbSteps2 Quantity of translations to be done.
* \return New GEOM_Object, containing compound of all the
* shapes, obtained after each transformation.
*/
GEOM_Object MultiRotate2DByStep (in GEOM_Object theObject,
in GEOM_Object theAxis,
in double theAngleStep,
in long theNbSteps1,
in double theRadialStep,
in long theNbSteps2);
/*!
* \brief Rotate the given object around the
* given axis on the given angle a given number
* times and multi-translate each rotation result.
*
* Translation direction passes through center of gravity
* of rotated shape and its projection on the rotation axis.
* \param theObject The object to be rotated.
* \param theAxis Rotation axis. DZ if None.
* \param theAngleStep Rotation angle in degrees.
* \param theNbSteps1 Quantity of rotations to be done.
* \param theRadialStep Translation distance.
* \param theNbSteps2 Quantity of translations to be done.
* \return New GEOM_Object, containing compound of all the
* shapes, obtained after each transformation.
*/
GEOM_Object MultiRotate2D (in GEOM_Object theObject,
in GEOM_Object theAxis,
in double theAngle,
in long theNbTimes1,
in double theStep,
in long theNbTimes2);
in double theAngleStep,
in long theNbSteps1,
in double theRadialStep,
in long theNbSteps2);
/*!
* \brief Replace the given object by an object,
@ -3629,6 +3688,16 @@ module GEOM
out double X1, out double Y1, out double Z1,
out double X2, out double Y2, out double Z2);
/*!
* \brief Get closest points of the given shapes.
* \param theShape1,theShape2 Shapes to find closest points of.
* \param theCoords Output. List of (X, Y, Z) coordinates for all couples of points.
* \return The number of found solutions (-1 in case of infinite number of solutions).
*/
long ClosestPoints (in GEOM_Object theShape1,
in GEOM_Object theShape2,
out ListOfDouble theCoords);
/*!
* \brief Get angle between the given lines or linear edges.
* \param theShape1,theShape2 Shapes to find angle between. Lines or linear edges.

View File

@ -15,7 +15,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : DlgRef.cxx
// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
@ -526,20 +525,6 @@ DlgRef_2Sel3Spin::~DlgRef_2Sel3Spin()
{
}
//////////////////////////////////////////
// DlgRef_2Sel4Spin1Check
//////////////////////////////////////////
DlgRef_2Sel4Spin1Check::DlgRef_2Sel4Spin1Check( QWidget* parent, Qt::WindowFlags f )
: QWidget( parent, f )
{
setupUi( this );
}
DlgRef_2Sel4Spin1Check::~DlgRef_2Sel4Spin1Check()
{
}
//////////////////////////////////////////
// DlgRef_2Sel
//////////////////////////////////////////

View File

@ -15,7 +15,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : DlgRef.h
// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
@ -611,22 +610,6 @@ public:
~DlgRef_2Sel3Spin();
};
//////////////////////////////////////////
// DlgRef_2Sel4Spin1Check
//////////////////////////////////////////
#include "ui_DlgRef_2Sel4Spin1Check_QTD.h"
class DLGREF_EXPORT DlgRef_2Sel4Spin1Check : public QWidget,
public Ui::DlgRef_2Sel4Spin1Check_QTD
{
Q_OBJECT
public:
DlgRef_2Sel4Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 );
~DlgRef_2Sel4Spin1Check();
};
//////////////////////////////////////////
// DlgRef_2Sel
//////////////////////////////////////////

View File

@ -1,237 +0,0 @@
<ui version="4.0" >
<class>DlgRef_2Sel4Spin1Check_QTD</class>
<widget class="QWidget" name="DlgRef_2Sel4Spin1Check_QTD" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>156</width>
<height>197</height>
</rect>
</property>
<property name="windowTitle" >
<string/>
</property>
<layout class="QGridLayout" >
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<property name="horizontalSpacing" >
<number>0</number>
</property>
<property name="verticalSpacing" >
<number>0</number>
</property>
<item row="0" column="0" >
<widget class="QGroupBox" name="GroupBox1" >
<property name="title" >
<string/>
</property>
<layout class="QGridLayout" >
<property name="leftMargin" >
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number>
</property>
<property name="horizontalSpacing" >
<number>6</number>
</property>
<property name="verticalSpacing" >
<number>6</number>
</property>
<item row="4" column="0" colspan="3" >
<widget class="QCheckBox" name="CheckButton1" >
<property name="text" >
<string/>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2" >
<widget class="SalomeApp_IntSpinBox" name="SpinBox_DY2" />
</item>
<item row="5" column="1" colspan="2" >
<widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DX2" />
</item>
<item row="3" column="1" colspan="2" >
<widget class="SalomeApp_IntSpinBox" name="SpinBox_DY1" />
</item>
<item row="2" column="1" colspan="2" >
<widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DX1" />
</item>
<item row="6" column="0" >
<widget class="QLabel" name="TextLabel6" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL6</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0" >
<widget class="QLabel" name="TextLabel5" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL5</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0" >
<widget class="QLabel" name="TextLabel4" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL4</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QLabel" name="TextLabel3" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL3</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="TextLabel2" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL2</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QPushButton" name="PushButton2" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string/>
</property>
</widget>
</item>
<item row="0" column="2" >
<widget class="QLineEdit" name="LineEdit1" />
</item>
<item row="0" column="0" >
<widget class="QLabel" name="TextLabel1" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>TL1</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2" >
<widget class="QLineEdit" name="LineEdit2" />
</item>
<item row="0" column="1" >
<widget class="QPushButton" name="PushButton1" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11" />
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
<customwidgets>
<customwidget>
<class>SalomeApp_DoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header location="global" >SalomeApp_DoubleSpinBox.h</header>
</customwidget>
<customwidget>
<class>SalomeApp_IntSpinBox</class>
<extends>QSpinBox</extends>
<header location="global" >SalomeApp_IntSpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>PushButton1</tabstop>
<tabstop>LineEdit1</tabstop>
<tabstop>PushButton2</tabstop>
<tabstop>LineEdit2</tabstop>
<tabstop>SpinBox_DX1</tabstop>
<tabstop>SpinBox_DY1</tabstop>
<tabstop>CheckButton1</tabstop>
<tabstop>SpinBox_DX2</tabstop>
<tabstop>SpinBox_DY2</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -15,9 +15,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
# GEOM DLGREF :
# File : Makefile.am
# Author : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com)
# Package : DlgRef
@ -72,7 +70,6 @@ UIC_FILES = \
ui_DlgRef_2Sel2Spin2Push_QTD.h \
ui_DlgRef_2Sel3Spin2Rb_QTD.h \
ui_DlgRef_2Sel3Spin_QTD.h \
ui_DlgRef_2Sel4Spin1Check_QTD.h \
ui_DlgRef_2Sel_QTD.h \
ui_DlgRef_2SelExt_QTD.h \
ui_DlgRef_2Spin_QTD.h \

View File

@ -125,6 +125,10 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_ANGLE_1</source>
<translation>Angle</translation>
</message>
<message>
<source>GEOM_ANGLE_STEP</source>
<translation>Angular step :</translation>
</message>
<message>
<source>GEOM_ARC_ELLIPSE</source>
<translation>Arc of ellipse</translation>
@ -1950,6 +1954,10 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_STEP</source>
<translation>Step :</translation>
</message>
<message>
<source>GEOM_STEP_R</source>
<translation>Radial step :</translation>
</message>
<message>
<source>GEOM_STEP_TITLE</source>
<translation>Step value for GUI constructions</translation>

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx>
@ -500,7 +499,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D
{
SetErrorCode(KO);
if (theObject.IsNull() || theVector.IsNull()) return NULL;
if (theObject.IsNull()) return NULL;
Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved
@ -515,9 +514,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL;
GEOMImpl_ITranslate aTI(aFunction);
aTI.SetVector(theVector->GetLastFunction());
GEOMImpl_ITranslate aTI (aFunction);
aTI.SetOriginal(aLastFunction);
if (!theVector.IsNull())
aTI.SetVector(theVector->GetLastFunction());
aTI.SetStep1(theStep);
aTI.SetNbIter1(theNbTimes);
@ -560,7 +560,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
{
SetErrorCode(KO);
if (theObject.IsNull() || theVector.IsNull() || theVector2.IsNull()) return NULL;
if (theObject.IsNull()) return NULL;
Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved
@ -576,11 +576,13 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje
if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL;
GEOMImpl_ITranslate aTI (aFunction);
aTI.SetVector(theVector->GetLastFunction());
aTI.SetVector2(theVector2->GetLastFunction());
aTI.SetOriginal(aLastFunction);
if (!theVector.IsNull())
aTI.SetVector(theVector->GetLastFunction());
aTI.SetStep1(theStep1);
aTI.SetNbIter1(theNbTimes1);
if (!theVector2.IsNull())
aTI.SetVector2(theVector2->GetLastFunction());
aTI.SetStep2(theStep2);
aTI.SetNbIter2(theNbTimes2);
@ -1675,10 +1677,12 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) t
//=============================================================================
/*!
* Rotate
* RotateCopy
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle)
Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) theAxis,
double theAngle)
{
SetErrorCode(KO);
@ -1728,7 +1732,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Objec
//=============================================================================
/*!
* Rotate1D
* Rotate1D (for MultiRotate1DNbTimes)
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject,
@ -1737,7 +1741,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
{
SetErrorCode(KO);
if (theObject.IsNull() || theAxis.IsNull()) return NULL;
if (theObject.IsNull()) return NULL;
Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated
@ -1754,7 +1758,8 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
GEOMImpl_IRotate aRI(aFunction);
aRI.SetOriginal(aLastFunction);
aRI.SetAxis(theAxis->GetLastFunction());
if (!theAxis.IsNull())
aRI.SetAxis(theAxis->GetLastFunction());
aRI.SetNbIter1(theNbTimes);
//Compute the translation
@ -1774,7 +1779,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
}
//Make a Python command
GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1D("
GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1DNbTimes("
<< theObject << ", " << theAxis << ", " << theNbTimes << ")";
SetErrorCode(OK);
@ -1783,19 +1788,17 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object)
//=============================================================================
/*!
* Rotate2D
* Rotate1D (for MultiRotate1DByStep)
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) theAxis,
double theAngle,
Standard_Integer theNbTimes1,
double theStep,
Standard_Integer theNbTimes2)
double theAngleStep,
Standard_Integer theNbSteps)
{
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
@ -1804,19 +1807,21 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object)
Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType());
//Add a rotate function
aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D);
aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D_STEP);
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);
aRI.SetNbIter1(theNbTimes1);
aRI.SetNbIter2(theNbTimes2);
aRI.SetAngle(theAngle);
aRI.SetStep(theStep);
if (!theAxis.IsNull())
aRI.SetAxis(theAxis->GetLastFunction());
aRI.SetAngle(anAngleStep);
aRI.SetNbIter1(theNbSteps);
//Compute the translation
try {
@ -1835,9 +1840,140 @@ 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.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,
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()) 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;
//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.SetStep(theStep);
aRI.SetNbIter2(theNbTimes2);
//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.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();

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#ifndef _GEOMImpl_ITransformOperations_HXX_
#define _GEOMImpl_ITransformOperations_HXX_
@ -154,6 +153,17 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
Handle(GEOM_Object) theAxis,
Standard_Integer theNbTimes);
Standard_EXPORT Handle(GEOM_Object) Rotate1D (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) theAxis,
double theAngleStep,
Standard_Integer theNbSteps);
Standard_EXPORT Handle(GEOM_Object) Rotate2D (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) theAxis,
Standard_Integer theNbObjects,
double theRadialStep,
Standard_Integer theNbSteps);
Standard_EXPORT Handle(GEOM_Object) Rotate2D (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) theAxis,
double theAngle,

View File

@ -18,35 +18,41 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx>
#include <GEOMImpl_RotateDriver.hxx>
#include <GEOMImpl_IRotate.hxx>
#include <GEOMImpl_Types.hxx>
#include <GEOM_Function.hxx>
#include <GEOMUtils.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepGProp.hxx>
#include <TopAbs.hxx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Edge.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <Geom_Line.hxx>
#include <GProp_GProps.hxx>
#include <Precision.hxx>
#include <gp_Trsf.hxx>
#include <gp_Pnt.hxx>
#include <gp_Vec.hxx>
#include <gp_Dir.hxx>
#include <gp_Ax1.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <TopAbs.hxx>
#include <TopExp.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <BRep_Tool.hxx>
#include <BRep_Builder.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <Geom_Line.hxx>
#include <GProp_GProps.hxx>
#include <BRepGProp.hxx>
#include <Precision.hxx>
//=======================================================================
//function : GetID
@ -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);

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx>
@ -173,13 +172,14 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
B.MakeCompound( aCompound );
Handle(GEOM_Function) aVector = TI.GetVector();
if(aVector.IsNull()) return 0;
TopoDS_Shape aV = aVector->GetValue();
if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
gp_Vec Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec.Normalize();
gp_Vec Vec = gp::DX();
if (!aVector.IsNull()) {
TopoDS_Shape aV = aVector->GetValue();
if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
Vec = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec.Normalize();
}
TopLoc_Location aLocOrig = anOriginal.Location();
gp_Trsf aTrsfOrig = aLocOrig.Transformation();
@ -202,32 +202,36 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const
}
else if (aType == TRANSLATE_2D) {
Standard_Integer nbtimes1 = TI.GetNbIter1(), nbtimes2 = TI.GetNbIter2();
Standard_Real DX, DY, DZ, step1 = TI.GetStep1(), step2 = TI.GetStep2();
gp_Vec aVec;
Standard_Real DX, DY, DZ, step1 = TI.GetStep1(), step2 = TI.GetStep2();
Handle(GEOM_Function) aVector = TI.GetVector();
if(aVector.IsNull()) return 0;
TopoDS_Shape aV = aVector->GetValue();
if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0;
TopoDS_Edge anEdge = TopoDS::Edge(aV);
gp_Vec Vec1(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec1.Normalize();
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);
gp_Vec Vec2(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge)));
Vec2.Normalize();
gp_Vec Vec1 = gp::DX();
gp_Vec Vec2 = gp::DY();
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();
}
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++) {

View File

@ -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

View File

@ -518,6 +518,52 @@ CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
}
//=============================================================================
/*!
* ClosestPoints
*/
//=============================================================================
CORBA::Long GEOM_IMeasureOperations_i::ClosestPoints
(GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
GEOM::ListOfDouble_out theCoords)
{
//Set a not done flag
GetOperations()->SetNotDone();
// allocate the CORBA array
int nbSols = -1;
GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble();
//Get the reference shape
Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
if (!aShape1.IsNull() && !aShape2.IsNull()) {
Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal;
// Get shape parameters
//nbSols = GetOperations()->ClosestPoints(aShape1, aShape2, aDoubles);
//int nbDbls = aDoubles->Length();
//aDoublesArray->length(nbDbls);
//for (int id = 0; id < nbDbls; id++) {
// aDoublesArray[id] = aDoubles->Value(id + 1);
//}
// tmp
double X1, Y1, Z1, X2, Y2, Z2;
GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
aDoublesArray->length(6);
aDoublesArray[0] = X1;
aDoublesArray[1] = Y1;
aDoublesArray[2] = Z1;
aDoublesArray[3] = X2;
aDoublesArray[4] = Y2;
aDoublesArray[5] = Z2;
nbSols = 1;
}
theCoords = aDoublesArray._retn();
return nbSols;
}
//=============================================================================
/*!
* PointCoordinates

View File

@ -103,6 +103,10 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i :
CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2);
CORBA::Long ClosestPoints (GEOM::GEOM_Object_ptr theShape1,
GEOM::GEOM_Object_ptr theShape2,
GEOM::ListOfDouble_out theCoords);
void PointCoordinates (GEOM::GEOM_Object_ptr theShape,
CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z);

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Standard_Stream.hxx>
@ -958,7 +957,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate1D
//Get the vector of translation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
if (aVector.IsNull()) return aGEOMObject._retn();
//if (aVector.IsNull()) return aGEOMObject._retn(); // DX by default
//Perform the translation
Handle(GEOM_Object) anObject =
@ -992,11 +991,11 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate2D (GEOM::GEOM_
//Get the vector1 of translation
Handle(GEOM_Object) aVector1 = GetObjectImpl(theVector1);
if (aVector1.IsNull()) return aGEOMObject._retn();
//if (aVector1.IsNull()) return aGEOMObject._retn(); // DX by default
//Get the vector2 of translation
Handle(GEOM_Object) aVector2 = GetObjectImpl(theVector2);
if (aVector2.IsNull()) return aGEOMObject._retn();
//if (aVector2.IsNull()) return aGEOMObject._retn(); // DY by default
//Perform the translation
Handle(GEOM_Object) anObject = GetOperations()->Translate2D
@ -1026,7 +1025,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Obj
//Get the a directon of rotation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
if (aVector.IsNull()) return aGEOMObject._retn();
//if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
//Perform the rotation
Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theNbTimes);
@ -1035,6 +1034,101 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Obj
return GetObject(anObject);
}
//=============================================================================
/*!
* MultiRotate1DByStep
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1DByStep (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theAngleStep,
CORBA::Long theNbSteps)
{
//Set a not done flag
GetOperations()->SetNotDone();
GEOM::GEOM_Object_var aGEOMObject;
//Get the object itself
Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
if (aBasicObject.IsNull()) return aGEOMObject._retn();
//Get the a directon of rotation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
//if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
//Perform the rotation
Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theAngleStep, theNbSteps);
if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
return GetObject(anObject);
}
//=============================================================================
/*!
* MultiRotate2DNbTimes
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DNbTimes (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Long theNbObjects,
CORBA::Double theRadialStep,
CORBA::Long theNbSteps)
{
//Set a not done flag
GetOperations()->SetNotDone();
GEOM::GEOM_Object_var aGEOMObject;
//Get the object itself
Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
if (aBasicObject.IsNull()) return aGEOMObject._retn();
//Get the a directon of rotation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
//if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
//Perform the rotation
Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
(aBasicObject, aVector, theNbObjects, theRadialStep, theNbSteps);
if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
return GetObject(anObject);
}
//=============================================================================
/*!
* MultiRotate2DByStep
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DByStep (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theAngle,
CORBA::Long theNbTimes1,
CORBA::Double theStep,
CORBA::Long theNbTimes2)
{
//Set a not done flag
GetOperations()->SetNotDone();
GEOM::GEOM_Object_var aGEOMObject;
//Get the object itself
Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
if (aBasicObject.IsNull()) return aGEOMObject._retn();
//Get the a directon of rotation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
//if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
//Perform the rotation
Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
(aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2);
if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
return GetObject(anObject);
}
//=============================================================================
/*!
* MultiRotate2D
@ -1058,11 +1152,13 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2D (GEOM::GEOM_Obj
//Get the a directon of rotation
Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
if (aVector.IsNull()) return aGEOMObject._retn();
//if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
double anAngle = M_PI * theAngle / 180.;
//Perform the rotation
Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
(aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2);
(aBasicObject, aVector, anAngle, theNbTimes1, theStep, theNbTimes2);
if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
return GetObject(anObject);

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#ifndef _GEOM_ITransformOperations_i_HeaderFile
#define _GEOM_ITransformOperations_i_HeaderFile
@ -39,17 +38,17 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
{
public:
GEOM_ITransformOperations_i (PortableServer::POA_ptr thePOA,
GEOM::GEOM_Gen_ptr theEngine,
::GEOMImpl_ITransformOperations* theImpl);
GEOM::GEOM_Gen_ptr theEngine,
::GEOMImpl_ITransformOperations* theImpl);
~GEOM_ITransformOperations_i();
GEOM::GEOM_Object_ptr TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
@ -59,15 +58,15 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ);
GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector);
GEOM::GEOM_Object_ptr theVector);
GEOM::GEOM_Object_ptr TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector);
GEOM::GEOM_Object_ptr theVector);
GEOM::GEOM_Object_ptr TranslateVectorDistance (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theDistance,
CORBA::Boolean theCopy);
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theDistance,
CORBA::Boolean theCopy);
GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
@ -81,93 +80,111 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis,
CORBA::Double theAngle);
CORBA::Double theAngle);
GEOM::GEOM_Object_ptr MultiRotate1D (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Long theNbTimes);
GEOM::GEOM_Object_ptr theVector,
CORBA::Long theNbTimes);
GEOM::GEOM_Object_ptr MultiRotate1DByStep (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis,
CORBA::Double theAngleStep,
CORBA::Long theNbSteps);
GEOM::GEOM_Object_ptr MultiRotate2DNbTimes (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis,
CORBA::Long theNbObjects,
CORBA::Double theRadialStep,
CORBA::Long theNbSteps);
GEOM::GEOM_Object_ptr MultiRotate2DByStep (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theAngle,
CORBA::Long theNbTimes1,
CORBA::Double theStep,
CORBA::Long theNbTimes2);
GEOM::GEOM_Object_ptr MultiRotate2D (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theAngle,
CORBA::Long theNbTimes1,
CORBA::Double theStep,
CORBA::Long theNbTimes2);
GEOM::GEOM_Object_ptr theVector,
CORBA::Double theAngle,
CORBA::Long theNbTimes1,
CORBA::Double theStep,
CORBA::Long theNbTimes2);
GEOM::GEOM_Object_ptr RotateCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis,
CORBA::Double theAngle);
GEOM::GEOM_Object_ptr theAxis,
CORBA::Double theAngle);
GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePlane);
GEOM::GEOM_Object_ptr thePlane);
GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePlane);
GEOM::GEOM_Object_ptr thePlane);
GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis);
GEOM::GEOM_Object_ptr theAxis);
GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theAxis);
GEOM::GEOM_Object_ptr theAxis);
GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint);
GEOM::GEOM_Object_ptr thePoint);
GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint);
GEOM::GEOM_Object_ptr thePoint);
GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset);
CORBA::Double theOffset);
GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset);
CORBA::Double theOffset);
GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource,
GEOM::GEOM_Object_ptr theTarget);
GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactor);
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactor);
GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactor);
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactor);
GEOM::GEOM_Object_ptr ScaleShapeAlongAxes (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactorX,
CORBA::Double theFactorY,
CORBA::Double theFactorZ);
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactorX,
CORBA::Double theFactorY,
CORBA::Double theFactorZ);
GEOM::GEOM_Object_ptr ScaleShapeAlongAxesCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactorX,
CORBA::Double theFactorY,
CORBA::Double theFactorZ);
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactorX,
CORBA::Double theFactorY,
CORBA::Double theFactorZ);
GEOM::GEOM_Object_ptr PositionShape (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theStartLCS,
GEOM::GEOM_Object_ptr theEndLCS);
GEOM::GEOM_Object_ptr theStartLCS,
GEOM::GEOM_Object_ptr theEndLCS);
GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theStartLCS,
GEOM::GEOM_Object_ptr theEndLCS);
GEOM::GEOM_Object_ptr theStartLCS,
GEOM::GEOM_Object_ptr theEndLCS);
GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePath,
CORBA::Double theDistance,
CORBA::Boolean theCopy,
CORBA::Boolean theReverse);
GEOM::GEOM_Object_ptr thePath,
CORBA::Double theDistance,
CORBA::Boolean theCopy,
CORBA::Boolean theReverse);
GEOM::GEOM_Object_ptr RotateThreePoints (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theCentPoint,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr theCentPoint,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr RotateThreePointsCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theCentPoint,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr theCentPoint,
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
GEOM::GEOM_Object_ptr TransformLikeOtherCopy (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr theSample);

View File

@ -290,9 +290,8 @@ def TestAll (geompy, math):
#Create Patterns
MultiTrans1D = geompy.MakeMultiTranslation1D(Fillet, vz, step1, nbtimes1)
MultiTrans2D = geompy.MakeMultiTranslation2D(Fillet, vz, step1, nbtimes1, vy, step2, nbtimes2)
#!!!!Angle In Degree!!!!
MultiRot1D = geompy.MultiRotate1D(Chamfer, vx, nbtimes1)
MultiRot2D = geompy.MultiRotate2D(Chamfer, vx, angle, nbtimes1, step1, nbtimes2)
MultiRot1D = geompy.MultiRotate1DNbTimes(Chamfer, vx, nbtimes1)
MultiRot2D = geompy.MultiRotate2DByStep(Chamfer, vx, angle1, nbtimes1, step1, nbtimes2)
#Create Informations objects
CDG = geompy.MakeCDG(Prism) #(GEOM_Object)->GEOM_Object

View File

@ -186,8 +186,8 @@ def TestOtherOperations (geompy, math):
pz = geompy.MakeVertex(0, 0, 100)
vy = geompy.MakeVectorDXDYDZ(0, 100, 0)
MultiRot1D = geompy.MakeMultiRotation1D(f12, vy, pz, 6)
MultiRot2D = geompy.MakeMultiRotation2D(f12, vy, pz, 45, 6, 30, 3)
MultiRot1D = geompy.MakeMultiRotation1DNbTimes(f12, vy, pz, 6)
MultiRot2D = geompy.MakeMultiRotation2DByStep(f12, vy, pz, math.pi/4, 6, 30, 3)
id_MultiRot1D = geompy.addToStudy(MultiRot1D, "MakeMultiRotation1D")
id_MultiRot2D = geompy.addToStudy(MultiRot2D, "MakeMultiRotation2D")

View File

@ -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,26 +7772,68 @@ 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 on the given angle a given number
# times and multi-translate each rotation result.
## 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.
# @param theAngle Rotation angle in degrees.
# @param theAxis Rotation axis. DZ if None.
# @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 +7843,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 MultiRotate2DNbTimes(self, theObject, theAxis, theNbTimes1, theRadialStep, theNbTimes2, theName=None):
"""
Rotate the given object around the
given axis on the given angle a given number
@ -7810,10 +7853,9 @@ 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.
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
@ -7827,6 +7869,163 @@ class geompyDC(GEOM._objref_GEOM_Gen):
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
## 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 radians.
# @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 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
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.
theAngleStep Rotation angle in radians.
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, 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

View File

@ -162,7 +162,7 @@ void MeasureGUI_BndBoxDlg::ActivateThisDialog()
this, SLOT(SelectionIntoArgument()));
globalSelection();
displayPreview(true);
redisplayPreview();
}
//=================================================================================

View File

@ -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 <SUIT_ResourceMgr.h>
#include <SUIT_ViewWindow.h>
#include <SUIT_ViewManager.h>
#include <SUIT_OverrideCursor.h>
#include <SOCC_Prs.h>
#include <SOCC_ViewModel.h>
#include <SalomeApp_Tools.h>
@ -61,7 +61,7 @@
// true to construct a modal dialog.
//=================================================================================
MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* parent)
: MeasureGUI_Skeleton(GUI, parent)
: GEOMBase_Skeleton(GUI, parent)
{
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MINDIST")));
@ -72,8 +72,12 @@ MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* paren
/***************************************************************/
mainFrame()->GroupConstructors->setTitle(tr("GEOM_DISTANCE"));
mainFrame()->RadioButton1->setIcon(image0);
mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton3->close();
myGrp = new MeasureGUI_2Sel4LineEdit(centralWidget());
myGrp = new MeasureGUI_2Sel4LineEdit (centralWidget());
myGrp->GroupBox1->setTitle(tr("GEOM_MINDIST_OBJ"));
myGrp->TextLabel1->setText(tr("GEOM_OBJECT_I").arg("1"));
myGrp->TextLabel2->setText(tr("GEOM_OBJECT_I").arg("2"));
@ -90,12 +94,12 @@ MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* paren
myGrp->LineEdit5->setReadOnly(true);
myGrp->LineEdit6->setReadOnly(true);
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
QVBoxLayout* layout = new QVBoxLayout (centralWidget());
layout->setMargin(0); layout->setSpacing(6);
layout->addWidget(myGrp);
/***************************************************************/
myHelpFileName = "using_measurement_tools_page.html#min_distance_anchor";
myHelpFileName = "min_distance_page.html";
// Initialisation
Init();
@ -115,21 +119,69 @@ MeasureGUI_DistanceDlg::~MeasureGUI_DistanceDlg()
//=================================================================================
void MeasureGUI_DistanceDlg::Init()
{
// init variables
myGrp->LineEdit1->setText("");
myGrp->LineEdit2->setText("");
myObj = myObj2 = GEOM::GEOM_Object::_nil();
mySelBtn = myGrp->PushButton1;
mySelEdit = myGrp->LineEdit1;
myEditCurrentArgument = myGrp->LineEdit1;
// signals and slots connections
connect(myGrp->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(myGrp->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
MeasureGUI_Skeleton::Init();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
initName(tr("GEOM_DISTANCE"));
globalSelection();
SelectionIntoArgument();
}
//=================================================================================
// function : ClickOnOk()
// purpose :
//=================================================================================
void MeasureGUI_DistanceDlg::ClickOnOk()
{
if (ClickOnApply())
ClickOnCancel();
}
//=================================================================================
// function : ClickOnApply()
// purpose :
//=================================================================================
bool MeasureGUI_DistanceDlg::ClickOnApply()
{
if (!onAccept())
return false;
initName();
return true;
}
//=================================================================================
// function : ActivateThisDialog()
// purpose :
//=================================================================================
void MeasureGUI_DistanceDlg::ActivateThisDialog()
{
GEOMBase_Skeleton::ActivateThisDialog();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
globalSelection();
redisplayPreview();
}
//=================================================================================
// function : enterEvent()
// purpose :
//=================================================================================
void MeasureGUI_DistanceDlg::enterEvent(QEvent*)
{
if (!mainFrame()->GroupConstructors->isEnabled())
ActivateThisDialog();
}
//=================================================================================
@ -145,7 +197,7 @@ void MeasureGUI_DistanceDlg::SelectionIntoArgument()
GEOM::GEOM_Object_var aSelectedObject = GEOM::GEOM_Object::_nil();
if (aSelList.Extent() > 0) {
aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First());
}
// clear selection
@ -155,82 +207,19 @@ 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 : processObject()
// purpose : Fill dialogs fields in accordance with myObj and myObj2
//=================================================================================
void MeasureGUI_DistanceDlg::processObject()
{
myGrp->LineEdit1->setText(!myObj->_is_nil() ? GEOMBase::GetName(myObj ) : "");
myGrp->LineEdit2->setText(!myObj2->_is_nil() ? GEOMBase::GetName(myObj2) : "");
gp_Pnt aPnt1, aPnt2;
double aDist = 0.;
if (getParameters(aDist, aPnt1, aPnt2)) {
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 );
myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist, aPrecision));
gp_XYZ aVec = aPnt2.XYZ() - aPnt1.XYZ();
myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X(), aPrecision));
myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y(), aPrecision));
myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z(), aPrecision));
redisplayPreview();
}
else {
myGrp->LineEdit3->setText("");
myGrp->LineEdit4->setText("");
myGrp->LineEdit5->setText("");
myGrp->LineEdit6->setText("");
erasePreview();
}
}
//=================================================================================
// function : getParameters()
// purpose : Get distance between objects
//=================================================================================
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() );
try {
double x1, y1, z1, x2, y2, z2;
theDistance = anOper->GetMinDistance(myObj, myObj2, x1, y1, z1, x2, y2, z2);
thePnt1.SetCoord(x1, y1, z1);
thePnt2.SetCoord(x2, y2, z2);
}
catch(const SALOME::SALOME_Exception& e) {
SalomeApp_Tools::QtCatchCorbaException(e);
return false;
}
return anOper->IsDone();
}
return false;
}
//=================================================================================
// function : SetEditCurrentArgument()
// purpose :
@ -263,23 +252,64 @@ void MeasureGUI_DistanceDlg::SetEditCurrentArgument()
}
//=================================================================================
// function : LineEditReturnPressed()
// purpose :
// function : processObject()
// purpose : Fill dialogs fields in accordance with myObj1 and myObj2
//=================================================================================
void MeasureGUI_DistanceDlg::LineEditReturnPressed()
void MeasureGUI_DistanceDlg::processObject()
{
QLineEdit* send = (QLineEdit*)sender();
myGrp->LineEdit1->setText(!myObj1->_is_nil() ? GEOMBase::GetName(myObj1) : "");
myGrp->LineEdit2->setText(!myObj2->_is_nil() ? GEOMBase::GetName(myObj2) : "");
if (send == myGrp->LineEdit1 || send == myGrp->LineEdit2) {
myEditCurrentArgument = send;
gp_Pnt aPnt1, aPnt2;
double aDist = 0.;
if (getParameters(aDist, aPnt1, aPnt2)) {
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 );
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
SALOME_ListIO aSelList;
aSelMgr->selectedObjects(aSelList);
myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist, aPrecision));
if (GEOMBase::SelectionByNameInDialogs(this, myGrp->LineEdit1->text(), aSelList))
myGrp->LineEdit1->setText(myGrp->LineEdit1->text());
gp_XYZ aVec = aPnt2.XYZ() - aPnt1.XYZ();
myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X(), aPrecision));
myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y(), aPrecision));
myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z(), aPrecision));
redisplayPreview();
}
else {
myGrp->LineEdit3->setText("");
myGrp->LineEdit4->setText("");
myGrp->LineEdit5->setText("");
myGrp->LineEdit6->setText("");
erasePreview();
}
}
//=================================================================================
// function : getParameters()
// purpose : Get distance between objects
//=================================================================================
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());
try {
double 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) {
SalomeApp_Tools::QtCatchCorbaException(e);
return false;
}
return anOper->IsDone();
}
return false;
}
//=================================================================================
@ -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);
}
}

View File

@ -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 <GEOMBase_Skeleton.h>
class MeasureGUI_2Sel4LineEdit;
class gp_Pnt;
@ -36,36 +35,41 @@ class gp_Pnt;
// class : MeasureGUI_DistanceDlg
// purpose :
//=================================================================================
class MeasureGUI_DistanceDlg : public MeasureGUI_Skeleton
class MeasureGUI_DistanceDlg : public GEOMBase_Skeleton
{
Q_OBJECT
public:
MeasureGUI_DistanceDlg( GeometryGUI*, QWidget* );
MeasureGUI_DistanceDlg (GeometryGUI*, QWidget*);
~MeasureGUI_DistanceDlg();
protected:
// redefined from GEOMBase_Helper and MeasureGUI_Skeleton
// redefined from GEOMBase_Helper and GEOMBase_Skeleton
virtual GEOM::GEOM_IOperations_ptr createOperation();
virtual bool isValid (QString&);
virtual bool execute (ObjectList&);
void redisplayPreview();
virtual void processObject();
virtual SALOME_Prs* buildPrs();
virtual void SelectionIntoArgument();
virtual void LineEditReturnPressed();
virtual void SetEditCurrentArgument();
virtual bool isValid( QString& );
private:
void Init();
bool getParameters( double&,
gp_Pnt&,
gp_Pnt& );
void enterEvent (QEvent*);
bool getParameters (double&, gp_Pnt&, gp_Pnt&);
private:
QLineEdit* myEditCurrentArgument;
QLineEdit* mySelEdit2;
QPushButton* mySelBtn2;
GEOM::GEOM_Object_var myObj1;
GEOM::GEOM_Object_var myObj2;
MeasureGUI_2Sel4LineEdit* myGrp;
GEOM::GEOM_Object_var myObj2;
private slots:
void ClickOnOk();
bool ClickOnApply();
void ActivateThisDialog();
void SelectionIntoArgument();
void SetEditCurrentArgument();
};
#endif // MEASUREGUI_DISTANCEDLG_H

View File

@ -69,34 +69,29 @@ TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton3->close();
GroupPoints = new DlgRef_2Sel1SpinInt(centralWidget());
GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE"));
GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
GroupPoints->TextLabel3->setText(tr("GEOM_NB_TIMES"));
GroupPoints->PushButton1->setIcon(image2);
GroupPoints->PushButton2->setIcon(image2);
GroupPoints->LineEdit1->setReadOnly(true);
GroupPoints->LineEdit2->setReadOnly(true);
bool isAngleStep = 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);
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);
myBase.nullify();
myVector.nullify();
GroupArgs->LineEdit1->setText("");
GroupArgs->LineEdit2->setText("");
GroupArgs->SpinBox_DX1->setValue(myAng);
GroupArgs->SpinBox_DY1->setValue(myNbTimes1);
GroupArgs->SpinBox_DX2->setValue(myStep);
GroupArgs->SpinBox_DY2->setValue(myNbTimes2);
switch (constructorId) {
case 0: // Rotate simple
{
GroupDimensions->hide();
GroupPoints->show();
GroupPoints->LineEdit1->setText("");
GroupPoints->LineEdit2->setText("");
myBase.nullify();
myVector.nullify();
GroupPoints->SpinBox_DX->setValue(myNbTimes1);
GroupPoints->PushButton1->click();
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 ) {
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 )
GroupPoints->PushButton2->click();
GroupArgs->PushButton2->click();
}
else if ( myEditCurrentArgument == GroupPoints->LineEdit2) {
else if ( myEditCurrentArgument == GroupArgs->LineEdit2 ) {
myVector = aSelectedObject;
if ( !myBase )
GroupPoints->PushButton1->click();
}
else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
myBase = aSelectedObject;
if ( !myVector )
GroupDimensions->PushButton2->click();
}
else if ( myEditCurrentArgument == GroupDimensions->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;
if (send == GroupArgs->PushButton1) {
myEditCurrentArgument = GroupArgs->LineEdit1;
GroupPoints->PushButton2->setDown(false);
GroupPoints->LineEdit2->setEnabled(false);
GroupArgs->PushButton2->setDown(false);
GroupArgs->LineEdit2->setEnabled(false);
}
else if (send == GroupPoints->PushButton2) {
myEditCurrentArgument = GroupPoints->LineEdit2;
else if (send == GroupArgs->PushButton2) {
myEditCurrentArgument = GroupArgs->LineEdit2;
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
GroupPoints->PushButton1->setDown(false);
GroupPoints->LineEdit1->setEnabled(false);
}
else if (send == GroupDimensions->PushButton1) {
myEditCurrentArgument = GroupDimensions->LineEdit1;
GroupDimensions->PushButton2->setDown(false);
GroupDimensions->LineEdit2->setEnabled(false);
}
else if (send == GroupDimensions->PushButton2) {
myEditCurrentArgument = GroupDimensions->LineEdit2;
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
GroupDimensions->PushButton1->setDown(false);
GroupDimensions->LineEdit1->setEnabled(false);
GroupArgs->PushButton1->setDown(false);
GroupArgs->LineEdit1->setEnabled(false);
}
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
@ -416,12 +378,13 @@ void TransformationGUI_MultiRotationDlg::enterEvent (QEvent*)
// function : TextValueChangedInSpinBox()
// purpose :
//=================================================================================
void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox(const QString& s){
void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox (const QString& s)
{
bool isDigit;
s.toDouble(&isDigit);
if(!isDigit)
GroupDimensions->CheckButton1->setChecked(false);
GroupDimensions->CheckButton1->setEnabled(isDigit);
if (!isDigit)
GroupArgs->CheckButton1->setChecked(false);
GroupArgs->CheckButton1->setEnabled(isDigit);
}
//=================================================================================
@ -432,9 +395,9 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (double newValue)
{
QObject* send = (QObject*)sender();
if (send == GroupDimensions->SpinBox_DX1)
if (send == GroupArgs->SpinBox_DX1)
myAng = newValue;
else if (send == GroupDimensions->SpinBox_DX2)
else if (send == GroupArgs->SpinBox_DX2)
myStep = newValue;
processPreview();
@ -448,9 +411,9 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
{
QObject* send = (QObject*)sender();
if (send == GroupPoints->SpinBox_DX || send == GroupDimensions->SpinBox_DY1)
if (send == GroupArgs->SpinBox_DY1)
myNbTimes1 = newValue;
else if (send == GroupDimensions->SpinBox_DY2)
else if (send == GroupArgs->SpinBox_DY2)
myNbTimes2 = newValue;
processPreview();
@ -458,7 +421,7 @@ void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
//=================================================================================
// function : ReverseAngle()
// purpose : 'state' not used here
// purpose :
//=================================================================================
void TransformationGUI_MultiRotationDlg::ReverseAngle()
{
@ -467,11 +430,22 @@ void TransformationGUI_MultiRotationDlg::ReverseAngle()
int aConstructorId = getConstructorId();
if (aConstructorId == 1)
GroupDimensions->SpinBox_DX1->setValue(myAng);
GroupArgs->SpinBox_DX1->setValue(myAng);
processPreview();
}
//=================================================================================
// function : CheckAngleStep()
// purpose :
//=================================================================================
void TransformationGUI_MultiRotationDlg::CheckAngleStep (bool isOn)
{
GroupArgs->SpinBox_DX1->setEnabled(isOn);
GroupArgs->CheckButton1->setEnabled(isOn);
processPreview();
}
//=================================================================================
// function : createOperation
// purpose :
@ -488,16 +462,20 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiRotationDlg::createOperation()
bool TransformationGUI_MultiRotationDlg::isValid (QString& msg)
{
bool ok = false;
switch(getConstructorId()){
switch (getConstructorId()) {
case 0:
ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) && myBase && myVector;
ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
//myBase && myVector); // myVector = DZ by default
myBase);
break;
case 1:
ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
myBase && myVector;
ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
GroupArgs->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
GroupArgs->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
//myBase && myVector); // myVector = DZ by default
myBase);
break;
default:
break;
@ -520,29 +498,38 @@ bool TransformationGUI_MultiRotationDlg::execute (ObjectList& objects)
switch (getConstructorId()) {
case 0:
if ( myBase && myVector ) {
if (GroupArgs->CheckAngleStep->isChecked())
anObj = anOper->MultiRotate1DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1);
else
anObj = anOper->MultiRotate1D(myBase.get(), myVector.get(), myNbTimes1);
if(!IsPreview())
aParameters<<GroupPoints->SpinBox_DX->text();
res = true;
if (!IsPreview()) {
if (GroupArgs->CheckAngleStep->isChecked())
aParameters << GroupArgs->SpinBox_DX1->text();
aParameters << GroupArgs->SpinBox_DY1->text();
}
res = true;
break;
case 1:
if ( myBase && myVector ) {
anObj = anOper->MultiRotate2D(myBase.get(), myVector.get(), myAng, myNbTimes1, myStep, myNbTimes2);
if(!IsPreview()) {
aParameters<<GroupDimensions->SpinBox_DX1->text();
aParameters<<GroupDimensions->SpinBox_DY1->text();
aParameters<<GroupDimensions->SpinBox_DX2->text();
aParameters<<GroupDimensions->SpinBox_DY2->text();
}
res = true;
if (GroupArgs->CheckAngleStep->isChecked())
anObj = anOper->MultiRotate2DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1,
myStep, myNbTimes2);
else
anObj = anOper->MultiRotate2DNbTimes(myBase.get(), myVector.get(), myNbTimes1, myStep, myNbTimes2);
if (!IsPreview()) {
if (GroupArgs->CheckAngleStep->isChecked())
aParameters << GroupArgs->SpinBox_DX1->text();
aParameters << GroupArgs->SpinBox_DY1->text();
aParameters << GroupArgs->SpinBox_DX2->text();
aParameters << GroupArgs->SpinBox_DY2->text();
}
res = true;
break;
}
if (!anObj->_is_nil()) {
if(!IsPreview())
if (!IsPreview())
anObj->SetParameters(aParameters.join(":").toLatin1().constData());
objects.push_back(anObj._retn());
}
@ -586,3 +573,82 @@ void TransformationGUI_MultiRotationDlg::restoreSubShapes (SALOMEDS::Study_ptr
mainFrame()->CheckBoxAddPrefix->isChecked());
}
}
//=================================================================================
// function : TransformationGUI_2Sel4Spin1Check
// purpose :
//=================================================================================
TransformationGUI_2Sel4Spin1Check::TransformationGUI_2Sel4Spin1Check (QWidget *parent)
{
gridLayout = new QGridLayout (parent);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
gridLayout->setHorizontalSpacing(0);
gridLayout->setVerticalSpacing(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
GroupBox1 = new QGroupBox (parent);
gridLayout1 = new QGridLayout (GroupBox1);
gridLayout1->setSpacing(6);
gridLayout1->setContentsMargins(11, 11, 11, 11);
gridLayout1->setHorizontalSpacing(6);
gridLayout1->setVerticalSpacing(6);
gridLayout1->setContentsMargins(9, 9, 9, 9);
// 2Sel
TextLabel1 = new QLabel(GroupBox1);
TextLabel2 = new QLabel(GroupBox1);
PushButton1 = new QPushButton (GroupBox1);
PushButton2 = new QPushButton (GroupBox1);
LineEdit2 = new QLineEdit(GroupBox1);
LineEdit1 = new QLineEdit(GroupBox1);
gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1);
gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1);
gridLayout1->addWidget(PushButton1, 0, 1, 1, 1);
gridLayout1->addWidget(PushButton2, 1, 1, 1, 1);
gridLayout1->addWidget(LineEdit1, 0, 2, 1, 1);
gridLayout1->addWidget(LineEdit2, 1, 2, 1, 1);
// 4Spin (double-int-double-int)
//TextLabel3 = new QLabel (GroupBox1);
CheckAngleStep = new QCheckBox (GroupBox1);
TextLabel4 = new QLabel (GroupBox1);
TextLabel5 = new QLabel (GroupBox1);
TextLabel6 = new QLabel (GroupBox1);
SpinBox_DX1 = new SalomeApp_DoubleSpinBox (GroupBox1);
SpinBox_DY1 = new SalomeApp_IntSpinBox (GroupBox1);
SpinBox_DX2 = new SalomeApp_DoubleSpinBox (GroupBox1);
SpinBox_DY2 = new SalomeApp_IntSpinBox (GroupBox1);
//gridLayout1->addWidget(TextLabel3, 2, 0, 1, 1);
gridLayout1->addWidget(CheckAngleStep, 2, 0, 1, 1);
gridLayout1->addWidget(TextLabel4, 3, 0, 1, 1);
gridLayout1->addWidget(TextLabel5, 5, 0, 1, 1);
gridLayout1->addWidget(TextLabel6, 6, 0, 1, 1);
gridLayout1->addWidget(SpinBox_DX1, 2, 1, 1, 2);
gridLayout1->addWidget(SpinBox_DY1, 3, 1, 1, 2);
gridLayout1->addWidget(SpinBox_DX2, 5, 1, 1, 2);
gridLayout1->addWidget(SpinBox_DY2, 6, 1, 1, 2);
// 1Check
CheckButton1 = new QCheckBox (GroupBox1);
gridLayout1->addWidget(CheckButton1, 4, 0, 1, 3);
gridLayout->addWidget(GroupBox1, 0, 0, 1, 1);
}
//=================================================================================
// function : ~TransformationGUI_2Sel4Spin1Check()
// purpose : Destroys the object and frees any allocated resources
//=================================================================================
TransformationGUI_2Sel4Spin1Check::~TransformationGUI_2Sel4Spin1Check()
{
// no need to delete child widgets, Qt does it all for us
}

View File

@ -18,20 +18,64 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// GEOM GEOMGUI : GUI for Geometry component
// File : TransformationGUI_MultiRotationDlg.h
// Author : Damien COQUERET, Open CASCADE S.A.S.
//
#ifndef TRANSFORMATIONGUI_MULTIROTATIONDLG_H
#define TRANSFORMATIONGUI_MULTIROTATIONDLG_H
#include "GEOMBase_Skeleton.h"
#include "GEOM_GenericObjPtr.h"
class DlgRef_2Sel4Spin1Check;
class DlgRef_2Sel1SpinInt;
#include <SalomeApp_IntSpinBox.h>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QCheckBox>
//=================================================================================
// class : TransformationGUI_2Sel4Spin1Check
// purpose :
//=================================================================================
class TransformationGUI_2Sel4Spin1Check : public QWidget
{
Q_OBJECT
public:
TransformationGUI_2Sel4Spin1Check (QWidget *parent);
~TransformationGUI_2Sel4Spin1Check();
public:
QGridLayout *gridLayout;
QGroupBox *GroupBox1;
QGridLayout *gridLayout1;
// 2Sel
QLabel *TextLabel1;
QLabel *TextLabel2;
QPushButton *PushButton1;
QPushButton *PushButton2;
QLineEdit *LineEdit1;
QLineEdit *LineEdit2;
// 4Spin (double-int-double-int)
QCheckBox *CheckAngleStep;
QLabel *TextLabel4;
QLabel *TextLabel5;
QLabel *TextLabel6;
SalomeApp_DoubleSpinBox *SpinBox_DX1;
SalomeApp_IntSpinBox *SpinBox_DY1;
SalomeApp_DoubleSpinBox *SpinBox_DX2;
SalomeApp_IntSpinBox *SpinBox_DY2;
// 1Check
QCheckBox *CheckButton1;
};
//=================================================================================
// class : TransformationGUI_MultiRotationDlg
@ -42,8 +86,8 @@ 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:
@ -68,8 +112,7 @@ 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 );

View File

@ -82,10 +82,10 @@ TransformationGUI_MultiTranslationDlg::TransformationGUI_MultiTranslationDlg
GroupPoints = new DlgRef_2Sel2Spin1Check(centralWidget());
GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTITRANSLATION_SIMPLE"));
GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR_U"));
GroupPoints->TextLabel3->setText(tr("GEOM_STEP_U"));
GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES_U"));
GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_U"));
GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
GroupPoints->TextLabel3->setText(tr("GEOM_STEP"));
GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES"));
GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_DIRECTION"));
GroupPoints->PushButton1->setIcon(image2);
GroupPoints->PushButton2->setIcon(image2);
GroupPoints->LineEdit1->setReadOnly(true);
@ -142,7 +142,7 @@ void TransformationGUI_MultiTranslationDlg::Init()
int SpecificStep = 1;
// init variables
myStepU = myStepV = 50.0;
myNbTimesU = myNbTimesV = 2;
myNbTimesU = myNbTimesV = 3;
// min, max, step and decimals for spin boxes & initial values
initSpinBox(GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
@ -328,9 +328,20 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
QString aName = GEOMBase::GetName( aSelectedObject.get() );
myEditCurrentArgument->setText( aName );
if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
myBase = aSelectedObject;
if ( !myVectorU )
// recompute myStepU (Mantis issue 0021718)
GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
anOper->GetBoundingBox(myBase.get(), Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
if (anOper->IsDone()) {
myStepU = floor(1.5 * (Xmax - Xmin));
GroupPoints->SpinBox_DX->setValue(myStepU);
}
if (!myVectorU)
GroupPoints->PushButton2->click();
}
else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
@ -340,6 +351,18 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
}
else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
myBase = aSelectedObject;
// recompute myStepU and myStepV (Mantis issue 0021718)
GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
anOper->GetBoundingBox(myBase.get(), Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
if (anOper->IsDone()) {
myStepU = floor(1.5 * (Xmax - Xmin));
myStepV = floor(1.5 * (Ymax - Ymin));
GroupDimensions->SpinBox_DX1->setValue(myStepU);
GroupDimensions->SpinBox_DX2->setValue(myStepV);
}
if ( !myVectorU )
GroupDimensions->PushButton2->click();
else if ( !myVectorV )
@ -597,18 +620,20 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperatio
bool TransformationGUI_MultiTranslationDlg::isValid (QString& msg)
{
bool ok = false;
switch ( getConstructorId() ) {
switch (getConstructorId()) {
case 0:
ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) &&
GroupPoints->SpinBox_DY->isValid( msg, !IsPreview() ) &&
myBase && myVectorU;
myBase;
//myBase && myVectorU; // Mantis issue 0021718
break;
case 1:
ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
myBase && myVectorU && myVectorV;
myBase;
//myBase && myVectorU && myVectorV; // Mantis issue 0021718
break;
default:
break;
@ -625,43 +650,38 @@ bool TransformationGUI_MultiTranslationDlg::execute (ObjectList& objects)
bool res = false;
GEOM::GEOM_Object_var anObj;
QStringList aParameters;
GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
switch (getConstructorId()) {
case 0:
if ( myBase && myVectorU ) {
createPathPreview ( myVectorU.get() );
anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
if(!IsPreview()) {
aParameters<<GroupPoints->SpinBox_DX->text();
aParameters<<GroupPoints->SpinBox_DY->text();
}
res = true;
createPathPreview(myVectorU.get());
anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
if (!IsPreview()) {
aParameters << GroupPoints->SpinBox_DX->text();
aParameters << GroupPoints->SpinBox_DY->text();
}
res = true;
break;
case 1:
if ( myBase && myVectorU && myVectorV ) {
createPathPreview ( myVectorU.get() );
createPathPreview ( myVectorV.get() );
anObj = anOper->MultiTranslate2D(myBase.get(),
myVectorU.get(), myStepU, myNbTimesU,
myVectorV.get(), myStepV, myNbTimesV);
if(!IsPreview()) {
aParameters<<GroupDimensions->SpinBox_DX1->text();
aParameters<<GroupDimensions->SpinBox_DY1->text();
aParameters<<GroupDimensions->SpinBox_DX2->text();
aParameters<<GroupDimensions->SpinBox_DY2->text();
}
res = true;
createPathPreview(myVectorU.get());
createPathPreview(myVectorV.get());
anObj = anOper->MultiTranslate2D(myBase.get(),
myVectorU.get(), myStepU, myNbTimesU,
myVectorV.get(), myStepV, myNbTimesV);
if (!IsPreview()) {
aParameters << GroupDimensions->SpinBox_DX1->text();
aParameters << GroupDimensions->SpinBox_DY1->text();
aParameters << GroupDimensions->SpinBox_DX2->text();
aParameters << GroupDimensions->SpinBox_DY2->text();
}
res = true;
break;
}
if (!anObj->_is_nil()) {
if(!IsPreview())
if (!IsPreview())
anObj->SetParameters(aParameters.join(":").toLatin1().constData());
objects.push_back(anObj._retn());
}
@ -716,6 +736,7 @@ void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_pt
void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Object_ptr thePath )
{
if ( IsPreview() ) {
if (thePath->_is_nil()) return;
TopoDS_Shape aShape;
GEOMBase::GetShape( thePath, aShape, TopAbs_SHAPE );
TopoDS_Edge anEdge = TopoDS::Edge( aShape );