From ce07ba70beb68cd740469c399212bb03dc1e5b18 Mon Sep 17 00:00:00 2001 From: skv Date: Mon, 8 Jun 2015 13:06:39 +0300 Subject: [PATCH] 0022776: [CEA 1269] Project a wire or a face on a cylinder: add rotation angle --- .../gui/GEOM/images/proj_on_cyl_angles.png | Bin 0 -> 14235 bytes .../gui/GEOM/images/proj_on_cyl_dlg.png | Bin 25225 -> 27219 bytes .../projection_on_cylinder_operation.doc | 12 ++- idl/GEOM_Gen.idl | 6 +- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_IProjOnCyl.hxx | 21 +++-- .../GEOMImpl_ITransformOperations.cxx | 18 ++-- .../GEOMImpl_ITransformOperations.hxx | 3 +- src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx | 81 ++++++++++++++---- src/GEOMImpl/GEOMImpl_ProjectionDriver.hxx | 3 +- src/GEOM_I/GEOM_ITransformOperations_i.cc | 5 +- src/GEOM_I/GEOM_ITransformOperations_i.hh | 3 +- src/GEOM_SWIG/geomBuilder.py | 20 ++++- .../TransformationGUI_ProjectionOnCylDlg.cxx | 19 +++- .../TransformationGUI_ProjectionOnCylDlg.h | 1 + 15 files changed, 147 insertions(+), 49 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/proj_on_cyl_angles.png diff --git a/doc/salome/gui/GEOM/images/proj_on_cyl_angles.png b/doc/salome/gui/GEOM/images/proj_on_cyl_angles.png new file mode 100644 index 0000000000000000000000000000000000000000..0d36e4e381af19ad4bc4c5ef71bf0b310b2c48c9 GIT binary patch literal 14235 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 F{{v+YC}#iw literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/proj_on_cyl_dlg.png b/doc/salome/gui/GEOM/images/proj_on_cyl_dlg.png index 38d81b51e0461caac799cb46997592cb84b20fa2..7ce80c1e897a60b40a0bbb02acbd830a3d34a59a 100644 GIT binary patch literal 27219 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 angle where the total length of the wire should be projected. If it is unchecked the projection is not scaled and the natural wire length is kept for the projection. +- Rotation angle the desired angle between the tangent vector to +the first curve at the first point of the theObject's projection in 2D space +and U-direction of cylinder's 2D space. - \ref restore_presentation_parameters_page "Advanced options". \image html proj_on_cyl_dlg.png +\n The following figure explains meaning of each input angle: + +\image html proj_on_cyl_angles.png "Input angles of projection on the cylinder" + \n Example: \image html proj_on_cyl_preview.png "The curve (in red) and its projection on the cylinder" \n TUI Command: geompy.MakeProjectionOnCylinder(theObject, theRadius, -theStartAngle=0.0, theAngleLength=-1.0), +theStartAngle=0.0, theAngleLength=-1.0, theAngleRotation=0.0), where \em theObject is a shape to be projected, \em theRadius is a cylinder radius, \em theStartAngle is the starting angle of projection in -radians, \em theAngleLength the projection length angle in radians. +radians, \em theAngleLength the projection length angle in radians, +\em theAngleRotation projection rotation angle in radians. The \em Result will be a \em GEOM_Object. Our TUI Scripts provide you with useful examples of the use of diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 88edc8f07..c301b79ae 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1439,13 +1439,17 @@ module GEOM * to project the total length of the wire. If it is negative the * projection is not scaled and natural wire length is kept for * the projection. + * \param theAngleRotation the desired angle between the tangent vector + * to the first curve at the first point of the theObject's + * projection in 2D space and U-direction of cylinder's 2D space. * \return A wire or a face or a compound of faces that represents a * projection of the source shape onto a cylinder. */ GEOM_Object MakeProjectionOnCylinder (in GEOM_Object theObject, in double theRadius, in double theStartAngle, - in double theAngleLength); + in double theAngleLength, + in double theAngleRotation); }; /*! diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 9d86a99db..9bed663c4 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -7572,5 +7572,9 @@ Do you want to create new material? GEOM_PROJ_ON_CYL_LENGTH_ANGLE Length angle + + GEOM_PROJ_ON_CYL_ROTATION_ANGLE + Rotation angle + diff --git a/src/GEOMImpl/GEOMImpl_IProjOnCyl.hxx b/src/GEOMImpl/GEOMImpl_IProjOnCyl.hxx index a5162534e..8e0dd2bb5 100644 --- a/src/GEOMImpl/GEOMImpl_IProjOnCyl.hxx +++ b/src/GEOMImpl/GEOMImpl_IProjOnCyl.hxx @@ -28,6 +28,7 @@ #define PROJCYL_ARG_RADIUS 2 #define PROJCYL_ARG_START_ANGLE 3 #define PROJCYL_ARG_ANGLE_LENGTH 4 +#define PROJCYL_ARG_ANGLE_ROTATION 5 class GEOMImpl_IProjOnCyl { @@ -36,14 +37,16 @@ public: GEOMImpl_IProjOnCyl(Handle(GEOM_Function) theFunction): _func(theFunction) {} - void SetShape (const Handle(GEOM_Function) &theShape) - { _func->SetReference(PROJCYL_ARG_SHAPE, theShape); } - void SetRadius (const Standard_Real theRadius) - { _func->SetReal(PROJCYL_ARG_RADIUS, theRadius); } - void SetStartAngle (const Standard_Real theStartAngle) - { _func->SetReal(PROJCYL_ARG_START_ANGLE, theStartAngle); } - void SetAngleLength (const Standard_Real theAngleLength) - { _func->SetReal(PROJCYL_ARG_ANGLE_LENGTH, theAngleLength); } + void SetShape (const Handle(GEOM_Function) &theShape) + { _func->SetReference(PROJCYL_ARG_SHAPE, theShape); } + void SetRadius (const Standard_Real theRadius) + { _func->SetReal(PROJCYL_ARG_RADIUS, theRadius); } + void SetStartAngle (const Standard_Real theStartAngle) + { _func->SetReal(PROJCYL_ARG_START_ANGLE, theStartAngle); } + void SetAngleLength (const Standard_Real theAngleLength) + { _func->SetReal(PROJCYL_ARG_ANGLE_LENGTH, theAngleLength); } + void SetAngleRotation (const Standard_Real theAngleLength) + { _func->SetReal(PROJCYL_ARG_ANGLE_ROTATION, theAngleLength); } Handle(GEOM_Function) GetShape() { return _func->GetReference(PROJCYL_ARG_SHAPE); } @@ -53,6 +56,8 @@ public: { return _func->GetReal(PROJCYL_ARG_START_ANGLE ); } Standard_Real GetAngleLength() { return _func->GetReal(PROJCYL_ARG_ANGLE_LENGTH ); } + Standard_Real GetAngleRotation() + { return _func->GetReal(PROJCYL_ARG_ANGLE_ROTATION ); } private: diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 0373f9b05..6cc201000 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -2278,7 +2278,8 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MakeProjectionOnCylinder (const Handle(GEOM_Object) &theObject, const Standard_Real theRadius, const Standard_Real theStartAngle, - const Standard_Real theAngleLength) + const Standard_Real theAngleLength, + const Standard_Real theAngleRotation) { SetErrorCode(KO); @@ -2312,6 +2313,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MakeProjectionOnCylinder aProj.SetRadius(theRadius); aProj.SetStartAngle(theStartAngle); aProj.SetAngleLength(theAngleLength); + aProj.SetAngleRotation(theAngleRotation); //Compute the Projection try { @@ -2328,16 +2330,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MakeProjectionOnCylinder } //Make a Python command - GEOM::TPythonDump pd(aFunction); - - pd << aResult << " = geompy.MakeProjectionOnCylinder(" - << theObject << ", " << theRadius << ", " << theStartAngle; - - if (theAngleLength >= 0.) { - pd << ", " << theAngleLength; - } - - pd << ")"; + GEOM::TPythonDump(aFunction) + << aResult << " = geompy.MakeProjectionOnCylinder(" + << theObject << ", " << theRadius << ", " << theStartAngle + << ", " << theAngleLength << ", " << theAngleRotation << ")"; SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 155dbfdd9..3742157bf 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -195,7 +195,8 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations (const Handle(GEOM_Object) &theObject, const Standard_Real theRadius, const Standard_Real theStartAngle, - const Standard_Real theAngleLength); + const Standard_Real theAngleLength, + const Standard_Real theAngleRotation); }; diff --git a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx index 0c34bc8c2..db0fae349 100644 --- a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include #include @@ -428,10 +430,11 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons } // Get the face. - const TopAbs_ShapeEnum aType = aShape.ShapeType(); - const Standard_Real aRadius = aProj.GetRadius(); - const Standard_Real aStartAngle = aProj.GetStartAngle(); - const Standard_Real aLengthAngle = aProj.GetAngleLength(); + const TopAbs_ShapeEnum aType = aShape.ShapeType(); + const Standard_Real aRadius = aProj.GetRadius(); + const Standard_Real aStartAngle = aProj.GetStartAngle(); + const Standard_Real aLengthAngle = aProj.GetAngleLength(); + const Standard_Real aRotationAngle = aProj.GetAngleRotation(); if (aType != TopAbs_WIRE && aType != TopAbs_FACE) { return 0; @@ -441,8 +444,8 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons return 0; } - TopoDS_Shape aProjShape = - projectOnCylinder(aShape, aRadius, aStartAngle, aLengthAngle); + TopoDS_Shape aProjShape = projectOnCylinder + (aShape, aRadius, aStartAngle, aLengthAngle, aRotationAngle); if (aProjShape.IsNull()) { return 0; @@ -504,6 +507,8 @@ GetCreationInformation(std::string& theOperationName, AddParam(theParams, "Length angle", aLengthAngle); } + AddParam(theParams, "Rotation angle", aProj.GetAngleRotation()); + break; } default: @@ -523,7 +528,8 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder (const TopoDS_Shape &theShape, const Standard_Real theRadius, const Standard_Real theStartAngle, - const Standard_Real theAngleLength) const + const Standard_Real theAngleLength, + const Standard_Real theAngleRotation) const { TopoDS_Shape aResult; @@ -596,8 +602,6 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder // Compute 2d translation transformation. TopoDS_Wire anOuterWire = BRepTools::OuterWire(aFace); - Standard_Real aU[2]; - Standard_Real aV[2]; BRepTools_WireExplorer aOWExp(anOuterWire, aFace); if (!aOWExp.More()) { @@ -605,21 +609,63 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder return aResult; } - // Compute anisotropic transformation from a face's 2d space - // to cylinder's 2d space. - BRepTools::UVBounds(aFace, anOuterWire, aU[0], aU[1], aV[0], aV[1]); - + // Rotate 2D presentation of face. TopoDS_Vertex aFirstVertex = aOWExp.CurrentVertex(); TopoDS_Edge aFirstEdge = aOWExp.Current(); gp_Pnt aPnt = BRep_Tool::Pnt(aFirstVertex); BRepAdaptor_Curve2d anAdaptorCurve(aFirstEdge, aFace); Standard_Real aParam = BRep_Tool::Parameter(aFirstVertex, aFirstEdge, aFace); - gp_Pnt2d aPntUV = anAdaptorCurve.Value(aParam); + gp_Pnt2d aPntUV; + gp_Vec2d aVecUV; + gp_Vec2d aVecU0(1., 0); + anAdaptorCurve.D1(aParam, aPntUV, aVecUV); + + if (aVecUV.Magnitude() <= gp::Resolution()) { + return aResult; + } + + if (aFirstEdge.Orientation() == TopAbs_REVERSED) { + aVecUV.Reverse(); + } + + const Standard_Real anAngle = aVecUV.Angle(aVecU0) + theAngleRotation; + const Standard_Boolean isToRotate = Abs(anAngle) > Precision::Angular(); + gp_Trsf2d aRotTrsf; + Bnd_Box2d aUVBox; + Standard_Real aPar[2]; + + if (isToRotate) { + aRotTrsf.SetRotation(aPntUV, anAngle); + } + + for (; aOWExp.More(); aOWExp.Next()) { + TopoDS_Edge anEdge = aOWExp.Current(); + Handle(Geom2d_Curve) aCurve = + BRep_Tool::CurveOnSurface(anEdge, aFace, aPar[0], aPar[1]); + + if (aCurve.IsNull()) { + continue; + } + + if (isToRotate) { + aCurve = Handle(Geom2d_Curve)::DownCast(aCurve->Transformed(aRotTrsf)); + } + + BndLib_Add2dCurve::Add(aCurve, aPar[0], aPar[1], 0., aUVBox); + } + + Standard_Real aU[2]; + Standard_Real aV[2]; + + aUVBox.Get(aU[0], aV[0], aU[1], aV[1]); + + // Compute anisotropic transformation from a face's 2d space + // to cylinder's 2d space. GEOMUtils::Trsf2d aTrsf2d (1./theRadius, 0., theStartAngle - aU[0]/theRadius, - 0., 1., aPnt.Z() - 0.5*(aV[1] - aV[0]) - aPntUV.Y()); + 0., 1., aPnt.Z() - aPntUV.Y()); // Compute scaling trsf. const Standard_Boolean isToScale = theAngleLength >= Precision::Angular(); @@ -640,7 +686,6 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder new Geom_CylindricalSurface(gp_Ax3(), theRadius); GeomAdaptor_Surface aGACyl(aCylinder); TopExp_Explorer anExp(aFace, TopAbs_WIRE); - Standard_Real aPar[2]; TopTools_ListOfShape aWires; Standard_Real aUResol = aGACyl.UResolution(Precision::Confusion()); Standard_Real aVResol = aGACyl.VResolution(Precision::Confusion()); @@ -659,6 +704,10 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder continue; } + if (isToRotate) { + aCurve = Handle(Geom2d_Curve)::DownCast(aCurve->Transformed(aRotTrsf)); + } + // Transform the curve to cylinder's parametric space. GEOMUtils::Handle(HTrsfCurve2d) aTrsfCurve = new GEOMUtils::HTrsfCurve2d(aCurve, aPar[0], aPar[1], aTrsf2d); diff --git a/src/GEOMImpl/GEOMImpl_ProjectionDriver.hxx b/src/GEOMImpl/GEOMImpl_ProjectionDriver.hxx index ee703af55..47dfc4413 100644 --- a/src/GEOMImpl/GEOMImpl_ProjectionDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_ProjectionDriver.hxx @@ -87,7 +87,8 @@ private: TopoDS_Shape projectOnCylinder(const TopoDS_Shape &theShape, const Standard_Real theRadius, const Standard_Real theStartAngle, - const Standard_Real theAngleLength) const; + const Standard_Real theAngleLength, + const Standard_Real theAngleRotation) const; public: diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index c18c87b6c..fbfe591f1 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -1402,7 +1402,8 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MakeProjectionOnCylinder (GEOM::GEOM_Object_ptr theObject, CORBA::Double theRadius, CORBA::Double theStartAngle, - CORBA::Double theAngleLength) + CORBA::Double theAngleLength, + CORBA::Double theAngleRotation) { GEOM::GEOM_Object_var aGEOMObject; @@ -1418,7 +1419,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MakeProjectionOnCylinder //Perform the transformation Handle(GEOM_Object) aResObject = GetOperations()->MakeProjectionOnCylinder - (anObject, theRadius, theStartAngle, theAngleLength); + (anObject, theRadius, theStartAngle, theAngleLength, theAngleRotation); if (!GetOperations()->IsDone() || aResObject.IsNull()) { return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index e507c1f77..96aa0c23d 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -201,7 +201,8 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i : (GEOM::GEOM_Object_ptr theObject, CORBA::Double theRadius, CORBA::Double theStartAngle, - CORBA::Double theAngleLength); + CORBA::Double theAngleLength, + CORBA::Double theAngleRotation); ::GEOMImpl_ITransformOperations* GetOperations() { return (::GEOMImpl_ITransformOperations*)GetImpl(); } }; diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 982a45dc5..0a3d2c832 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -9581,6 +9581,10 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # The angle in which to project the total length of the wire. # If it is negative the projection is not scaled and natural # wire length is kept for the projection. + # @param theAngleRotation The desired angle in radians between + # the tangent vector to the first curve at the first point of + # the theObject's projection in 2D space and U-direction of + # cylinder's 2D space. # @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. @@ -9592,6 +9596,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # @ref tui_projection "Example" def MakeProjectionOnCylinder (self, theObject, theRadius, theStartAngle=0.0, theAngleLength=-1.0, + theAngleRotation=0.0, theName=None): """ Compute a wire or a face that represents a projection of the source @@ -9608,6 +9613,10 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): to project the total length of the wire. If it is negative the projection is not scaled and natural wire length is kept for the projection. + theAngleRotation The desired angle in radians between + the tangent vector to the first curve at the first + point of the theObject's projection in 2D space and + U-direction of cylinder's 2D space. 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. @@ -9624,14 +9633,19 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): flagAngleLength = False if isinstance(theAngleLength,str): flagAngleLength = True - theRadius, theStartAngle, theAngleLength, Parameters = ParseParameters( - theRadius, theStartAngle, theAngleLength) + flagAngleRotation = False + if isinstance(theAngleRotation,str): + flagAngleRotation = True + theRadius, theStartAngle, theAngleLength, theAngleRotation, Parameters = ParseParameters( + theRadius, theStartAngle, theAngleLength, theAngleRotation) if flagStartAngle: theStartAngle = theStartAngle*math.pi/180. if flagAngleLength: theAngleLength = theAngleLength*math.pi/180. + if flagAngleRotation: + theAngleRotation = theAngleRotation*math.pi/180. anObj = self.TrsfOp.MakeProjectionOnCylinder(theObject, theRadius, - theStartAngle, theAngleLength) + theStartAngle, theAngleLength, theAngleRotation) RaiseIfFailed("MakeProjectionOnCylinder", self.TrsfOp) anObj.SetParameters(Parameters) self._autoPublish(anObj, theName, "projection") diff --git a/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.cxx b/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.cxx index 7c5dd6176..21125e57e 100644 --- a/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.cxx @@ -60,7 +60,8 @@ TransformationGUI_ProjectionOnCylDlg::TransformationGUI_ProjectionOnCylDlg myRadiusSpin (0), myStartAngleSpin (0), myUseAngleLen (0), - myAngleLenSpin (0) + myAngleLenSpin (0), + myAngleRotSpin (0) { SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr(); QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICO_DLG_PROJ_ON_CYL"))); @@ -85,6 +86,8 @@ TransformationGUI_ProjectionOnCylDlg::TransformationGUI_ProjectionOnCylDlg new QLabel(tr("GEOM_PROJ_ON_CYL_START_ANGLE"), aGrpParams); QLabel *anAngleLenLbl = new QLabel(tr("GEOM_PROJ_ON_CYL_LENGTH_ANGLE"), aGrpParams); + QLabel *anAngleRotLbl = + new QLabel(tr("GEOM_PROJ_ON_CYL_ROTATION_ANGLE"), aGrpParams); myObjectName = new QLineEdit(aGrpParams); mySelButton = new QPushButton(aGrpParams); @@ -92,6 +95,7 @@ TransformationGUI_ProjectionOnCylDlg::TransformationGUI_ProjectionOnCylDlg myStartAngleSpin = new SalomeApp_DoubleSpinBox(aGrpParams); myUseAngleLen = new QCheckBox(aGrpParams); myAngleLenSpin = new SalomeApp_DoubleSpinBox(aGrpParams); + myAngleRotSpin = new SalomeApp_DoubleSpinBox(aGrpParams); myObjectName->setReadOnly(true); mySelButton->setIcon(image1); @@ -110,6 +114,8 @@ TransformationGUI_ProjectionOnCylDlg::TransformationGUI_ProjectionOnCylDlg aParamsLayout->addWidget(myUseAngleLen, 3, 0); aParamsLayout->addWidget(anAngleLenLbl, 3, 1); aParamsLayout->addWidget(myAngleLenSpin, 3, 2, 1, 2); + aParamsLayout->addWidget(anAngleRotLbl, 4, 1); + aParamsLayout->addWidget(myAngleRotSpin, 4, 2, 1, 2); QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); @@ -145,14 +151,17 @@ void TransformationGUI_ProjectionOnCylDlg::Init() double aRadius = 100.0; double aStartAngle = 0.; double anAngleLen = 360.; + double aRotAngle = 0.; initSpinBox(myRadiusSpin, 0.00001, COORD_MAX, aStep, "length_precision"); initSpinBox(myStartAngleSpin, -180., 180., aSpecificStep, "angle_precision"); initSpinBox(myAngleLenSpin, 0.00001, COORD_MAX, aSpecificStep, "angle_precision"); + initSpinBox(myAngleRotSpin, -180., 180., aSpecificStep, "angle_precision"); myRadiusSpin->setValue(aRadius); myStartAngleSpin->setValue(aStartAngle); myAngleLenSpin->setValue(anAngleLen); + myAngleRotSpin->setValue(aRotAngle); myObjectName->setText(""); myUseAngleLen->setChecked(true); @@ -165,6 +174,7 @@ void TransformationGUI_ProjectionOnCylDlg::Init() connect(myRadiusSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); connect(myStartAngleSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); connect(myAngleLenSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); + connect(myAngleRotSpin, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); connect(myUseAngleLen, SIGNAL(clicked()), this, SLOT(SetUseLengthAngle())); connect(myGeomGUI->getApp()->selectionMgr(),SIGNAL(currentSelectionChanged()), @@ -319,7 +329,8 @@ bool TransformationGUI_ProjectionOnCylDlg::isValid (QString &msg) if (!myObj->_is_nil() && myRadiusSpin->isValid(msg, !IsPreview()) && - myStartAngleSpin->isValid(msg, !IsPreview())) { + myStartAngleSpin->isValid(msg, !IsPreview()) && + myAngleRotSpin->isValid(msg, !IsPreview())) { if (myUseAngleLen->isChecked()) { // Check length angle spin. isOk = myAngleLenSpin->isValid(msg, !IsPreview()); @@ -343,6 +354,7 @@ bool TransformationGUI_ProjectionOnCylDlg::execute (ObjectList& objects) double aRadius = myRadiusSpin->value(); double aStartAngle = myStartAngleSpin->value()*M_PI/180.; + double aRotAngle = myAngleRotSpin->value()*M_PI/180.; double aLengthAngle = -1.; if (myUseAngleLen->isChecked()) { @@ -350,7 +362,7 @@ bool TransformationGUI_ProjectionOnCylDlg::execute (ObjectList& objects) } GEOM::GEOM_Object_var anObj = anOper->MakeProjectionOnCylinder - (myObj, aRadius, aStartAngle, aLengthAngle); + (myObj, aRadius, aStartAngle, aLengthAngle, aRotAngle); if (!anObj->_is_nil()) { if (!IsPreview()) { @@ -359,6 +371,7 @@ bool TransformationGUI_ProjectionOnCylDlg::execute (ObjectList& objects) aParameters << myStartAngleSpin->text(); if (myUseAngleLen->isChecked()) aParameters << myAngleLenSpin->text(); + aParameters << myAngleRotSpin->text(); anObj->SetParameters(aParameters.join(":").toUtf8().constData()); } objects.push_back(anObj._retn()); diff --git a/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.h b/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.h index beb16d976..eab7ee34a 100644 --- a/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.h +++ b/src/TransformationGUI/TransformationGUI_ProjectionOnCylDlg.h @@ -72,6 +72,7 @@ private: SalomeApp_DoubleSpinBox *myStartAngleSpin; QCheckBox *myUseAngleLen; SalomeApp_DoubleSpinBox *myAngleLenSpin; + SalomeApp_DoubleSpinBox *myAngleRotSpin; };