From 3a84ec0f0834dccb4d3705edd4d63d89031c12e5 Mon Sep 17 00:00:00 2001 From: vsr Date: Mon, 13 Apr 2009 12:51:18 +0000 Subject: [PATCH] 0020154: Implement major axis support for ellipse creation (merge development from series 5x) --- doc/salome/gui/GEOM/images/ellipse.png | Bin 22761 -> 21998 bytes .../gui/GEOM/input/creating_ellipse.doc | 22 +- .../gui/GEOM/input/tui_basic_geom_objs.doc | 29 +- idl/GEOM_Gen.idl | 15 + idl/GEOM_Superv.idl | 5 + src/BasicGUI/BasicGUI_EllipseDlg.cxx | 34 ++- src/BasicGUI/BasicGUI_EllipseDlg.h | 6 +- src/DlgRef/DlgRef_3Sel2Spin.cxx | 56 ++++ src/DlgRef/DlgRef_3Sel2Spin.h | 49 ++++ src/DlgRef/DlgRef_3Sel2Spin_QTD.cxx | 148 ++++++++++ src/DlgRef/DlgRef_3Sel2Spin_QTD.h | 60 ++++ src/DlgRef/Makefile.am | 6 + src/DlgRef/UIFiles/DlgRef_3Sel2Spin_QTD.ui | 262 ++++++++++++++++++ src/DlgRef/UIFiles/ui_to_cxx | 7 +- src/GEOMGUI/GEOM_msg_en.po | 8 + src/GEOMImpl/GEOMImpl_EllipseDriver.cxx | 63 ++++- src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 22 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 3 +- src/GEOMImpl/GEOMImpl_IEllipse.hxx | 13 +- src/GEOM_I/GEOM_ICurvesOperations_i.cc | 41 ++- src/GEOM_I/GEOM_ICurvesOperations_i.hh | 5 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 17 ++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 4 + src/GEOM_SWIG/geompyDC.py | 9 +- 24 files changed, 836 insertions(+), 48 deletions(-) create mode 100644 src/DlgRef/DlgRef_3Sel2Spin.cxx create mode 100644 src/DlgRef/DlgRef_3Sel2Spin.h create mode 100644 src/DlgRef/DlgRef_3Sel2Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Sel2Spin_QTD.h create mode 100644 src/DlgRef/UIFiles/DlgRef_3Sel2Spin_QTD.ui diff --git a/doc/salome/gui/GEOM/images/ellipse.png b/doc/salome/gui/GEOM/images/ellipse.png index 6bce2c24723e0534b0141ddda998378812e25a9f..bc35ecf47eed8ce9e07f696b9f8ffdc7456e24f0 100755 GIT binary patch literal 21998 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

O$rf+`SAY29S8+}fF)q|zIyks`}UD!8aF2$|s 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 Menu select New Entity - > Basic - > Ellipse -\n You can define an \b Ellipse by its Center Point, a \b -Vector giving its normal, and its Major & Minor Radiuses. +\n You can define an \b Ellipse by its Center point, a \b +Vector giving its normal, another vector specifying the direction of +ellipse's Major Axis (optionally) and its Major & Minor Radiuses. \n The \b Result of the operation will be a GEOM_Object (edge). -\n TUI Command: geompy.MakeEllipse(Point, Vector, RadiusMajor, RadiusMinor) +\note The parameter Major Axis is optional. It is calculated +automatically basing on the direction of the normal vector (by default +it corresponds to the OX axis of the global coordinate system). + +\note Actual direction of the major axis vector is defined as + Vmaj' = (Vn * Vmaj) * Vn where \em Vn is a normal vector and +\em Vmaj is an original vector of the major axis. + +\n TUI Command (no major axis): geompy.MakeEllipse(Point, Vector, RadiusMajor, RadiusMinor) \n Arguments: Name + 1 vertex (for the center) + 1 edge (for the direction) + 1 X Radius + 1 Y Radius. +\n TUI Command (use major axis): geompy.MakeEllipseVec(Point, Vector, RadiusMajor, RadiusMinor, VectorMajor) +\n Arguments: Name + 1 vertex (for the center) + 1 edge (for +the normal direction) + 1 X Radius + 1 Y Radius + 1 edge (for the +major axis direction) + \image html ellipse.png Example: @@ -21,4 +35,4 @@ the direction) + 1 X Radius + 1 Y Radius. Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_ellipse "Basic Geometric Objects". -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc index d9c30a23b..55e843010 100644 --- a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc @@ -116,21 +116,32 @@ gg = salome.ImportComponentGUI("GEOM") # create vertices p0 = geompy.MakeVertex(0., 0., 0.) -p50 = geompy.MakeVertex(50., 50., 50.) +p1 = geompy.MakeVertex(50., 50., 50.) +p2 = geompy.MakeVertex(0., 50., 0.) -# create a vector from two points -vector = geompy.MakeVector(p0, p50) +# create a normal vector from two points +normal = geompy.MakeVector(p0, p1) + +# create a major axis vector from two points +major = geompy.MakeVector(p0, p2) # create an ellipse from a point, a vector and radiuses -ellipse = geompy.MakeEllipse(p50, vector, 50, 25) +ellipse1 = geompy.MakeEllipse(p1, normal, 50, 25) + +# create an ellipse from a point, a normal vector, radiuses and a major axis vector +ellipse2 = geompy.MakeEllipse(p1, normal, 50, 25, major) # add objects in the study -id_vector = geompy.addToStudy(vector, "Vector") -id_ellipse = geompy.addToStudy(ellipse,"Ellipse") +id_normal = geompy.addToStudy(normal, "Normal") +id_major = geompy.addToStudy(major, "Major Axis") +id_ellipse1 = geompy.addToStudy(ellipse1, "Ellipse 1") +id_ellipse2 = geompy.addToStudy(ellipse2, "Ellipse 2") # display the ellipse and its normal vector -gg.createAndDisplayGO(id_vector) -gg.createAndDisplayGO(id_ellipse) +gg.createAndDisplayGO(id_normal) +gg.createAndDisplayGO(id_major) +gg.createAndDisplayGO(id_ellipse1) +gg.createAndDisplayGO(id_ellipse2) \endcode \anchor tui_creation_curve @@ -269,4 +280,4 @@ gg.setDisplayMode(id_plane3,1) gg.setTransparency(id_plane3,0.5) \endcode -*/ \ No newline at end of file +*/ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index eb23ae6c7..4cc2a6c16 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2014,6 +2014,21 @@ module GEOM in double theRMajor, in double theRMinor); + /*! + * Create an ellipse with given center, normal vector, main axis vector and radiuses. + * \param thePnt Ellipse center. + * \param theVec Vector, normal to the plane of the ellipse. + * \param theRMajor Major ellipse radius. + * \param theRMinor Minor ellipse radius. + * \param theVecMaj Vector, direction of the ellipse's main axis. + * \return New GEOM_Object, containing the created ellipse. + */ + GEOM_Object MakeEllipseVec (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theRMajor, + in double theRMinor, + in GEOM_Object theVecMaj); + /*! * Create an arc of circle, passing through three given points. * \param thePnt1 Start point of the arc. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 57bd686ed..76316bd57 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -459,6 +459,11 @@ module GEOM in GEOM_Object theVec, in double theRMajor, in double theRMinor) ; + GEOM_Object MakeEllipseVec (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theRMajor, + in double theRMinor, + in GEOM_Object theVecMaj) ; GEOM_Object MakeArc (in GEOM_Object thePnt1, in GEOM_Object thePnt2, in GEOM_Object thePnt3) ; diff --git a/src/BasicGUI/BasicGUI_EllipseDlg.cxx b/src/BasicGUI/BasicGUI_EllipseDlg.cxx index fa364a92e..d2aa86f28 100644 --- a/src/BasicGUI/BasicGUI_EllipseDlg.cxx +++ b/src/BasicGUI/BasicGUI_EllipseDlg.cxx @@ -70,17 +70,20 @@ BasicGUI_EllipseDlg::BasicGUI_EllipseDlg(GeometryGUI* theGeometryGUI, QWidget* p RadioButton2->close(TRUE); RadioButton3->close(TRUE); - GroupPoints = new DlgRef_2Sel2Spin(this, "GroupPoints"); + GroupPoints = new DlgRef_3Sel2Spin(this, "GroupPoints"); GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); GroupPoints->TextLabel1->setText(tr("GEOM_CENTER")); GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); - GroupPoints->TextLabel3->setText(tr("GEOM_RADIUS_MAJOR")); - GroupPoints->TextLabel4->setText(tr("GEOM_RADIUS_MINOR")); + GroupPoints->TextLabel3->setText(tr("%1 (%2)").arg(tr("GEOM_VECTOR_MAJOR")).arg(tr("GEOM_OPTIONAL"))); + GroupPoints->TextLabel4->setText(tr("GEOM_RADIUS_MAJOR")); + GroupPoints->TextLabel5->setText(tr("GEOM_RADIUS_MINOR")); GroupPoints->PushButton1->setPixmap(image1); GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->PushButton3->setPixmap(image1); GroupPoints->LineEdit1->setReadOnly( true ); GroupPoints->LineEdit2->setReadOnly( true ); + GroupPoints->LineEdit3->setReadOnly( true ); Layout1->addWidget(GroupPoints, 2, 0); /***************************************************************/ @@ -111,7 +114,7 @@ void BasicGUI_EllipseDlg::Init() globalSelection(); // close local contexts, if any localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); - myPoint = myDir = GEOM::GEOM_Object::_nil(); + myPoint = myDir = myMajor = GEOM::GEOM_Object::_nil(); /* Get setting of step value from file configuration */ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); @@ -135,9 +138,11 @@ void BasicGUI_EllipseDlg::Init() connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); @@ -175,9 +180,10 @@ bool BasicGUI_EllipseDlg::ClickOnApply() initName(); // reset - myPoint = myDir = GEOM::GEOM_Object::_nil(); + myPoint = myDir = myMajor = GEOM::GEOM_Object::_nil(); GroupPoints->LineEdit1->setText( "" ); GroupPoints->LineEdit2->setText( "" ); + GroupPoints->LineEdit3->setText( "" ); myEditCurrentArgument = GroupPoints->LineEdit1; //globalSelection(GEOM_POINT); globalSelection(); // close local contexts, if any @@ -207,6 +213,7 @@ void BasicGUI_EllipseDlg::SelectionIntoArgument() { if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myPoint = GEOM::GEOM_Object::_nil(); else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myDir = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPoints->LineEdit3 ) myMajor = GEOM::GEOM_Object::_nil(); return; } @@ -223,7 +230,7 @@ void BasicGUI_EllipseDlg::SelectionIntoArgument() if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull()) { TopAbs_ShapeEnum aNeedType = TopAbs_VERTEX; - if (myEditCurrentArgument == GroupPoints->LineEdit2) + if (myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupPoints->LineEdit3) aNeedType = TopAbs_EDGE; LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); @@ -260,6 +267,7 @@ void BasicGUI_EllipseDlg::SelectionIntoArgument() if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myPoint = aSelectedObject; else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myDir = aSelectedObject; + else if ( myEditCurrentArgument == GroupPoints->LineEdit3 ) myMajor = aSelectedObject; } displayPreview(); @@ -277,10 +285,11 @@ void BasicGUI_EllipseDlg::SetEditCurrentArgument() if ( send == GroupPoints->PushButton1 ) myEditCurrentArgument = GroupPoints->LineEdit1; else if ( send == GroupPoints->PushButton2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + else if ( send == GroupPoints->PushButton3 ) myEditCurrentArgument = GroupPoints->LineEdit3; myEditCurrentArgument->setFocus(); globalSelection(); // close local contexts, if any - if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + if ( myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupPoints->LineEdit3 ) localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); else localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); @@ -295,7 +304,8 @@ void BasicGUI_EllipseDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); if ( send == GroupPoints->LineEdit1 || - send == GroupPoints->LineEdit2 ) + send == GroupPoints->LineEdit2 || + send == GroupPoints->LineEdit3 ) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); @@ -318,6 +328,7 @@ void BasicGUI_EllipseDlg::ActivateThisDialog() GroupPoints->LineEdit1->setText( "" ); GroupPoints->LineEdit2->setText( "" ); + GroupPoints->LineEdit3->setText( "" ); myPoint = myDir = GEOM::GEOM_Object::_nil(); //globalSelection( GEOM_POINT ); @@ -387,7 +398,10 @@ bool BasicGUI_EllipseDlg::execute( ObjectList& objects ) { double aMajorR = GroupPoints->SpinBox_DX->GetValue(); double aMinorR = GroupPoints->SpinBox_DY->GetValue(); - GEOM::GEOM_Object_var anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeEllipse( myPoint, myDir, aMajorR, aMinorR ); + + GEOM::GEOM_Object_var anObj = myMajor->_is_nil() ? + GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeEllipse ( myPoint, myDir, aMajorR, aMinorR ) : + GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeEllipseVec( myPoint, myDir, aMajorR, aMinorR, myMajor ); if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); @@ -414,6 +428,8 @@ void BasicGUI_EllipseDlg::addSubshapesToStudy() objMap[GroupPoints->LineEdit1->text()] = myPoint; objMap[GroupPoints->LineEdit2->text()] = myDir; + if (!CORBA::is_nil(myMajor)) + objMap[GroupPoints->LineEdit3->text()] = myMajor; addSubshapesToFather( objMap ); } diff --git a/src/BasicGUI/BasicGUI_EllipseDlg.h b/src/BasicGUI/BasicGUI_EllipseDlg.h index c684cec90..619450e72 100644 --- a/src/BasicGUI/BasicGUI_EllipseDlg.h +++ b/src/BasicGUI/BasicGUI_EllipseDlg.h @@ -30,7 +30,7 @@ #include "GEOM_BasicGUI.hxx" #include "GEOMBase_Skeleton.h" -#include "DlgRef_2Sel2Spin.h" +#include "DlgRef_3Sel2Spin.h" #include "BasicGUI.h" @@ -59,9 +59,9 @@ private : void Init(); void enterEvent(QEvent* e); - GEOM::GEOM_Object_var myPoint, myDir; + GEOM::GEOM_Object_var myPoint, myDir, myMajor; - DlgRef_2Sel2Spin* GroupPoints; + DlgRef_3Sel2Spin* GroupPoints; private slots: void ClickOnOk(); diff --git a/src/DlgRef/DlgRef_3Sel2Spin.cxx b/src/DlgRef/DlgRef_3Sel2Spin.cxx new file mode 100644 index 000000000..6c256f2de --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel2Spin.cxx @@ -0,0 +1,56 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// GEOM GEOMGUI : GUI for Geometry component +// File : DlgRef_3Sel2Spin.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header: +// +#include "DlgRef_3Sel2Spin.h" + +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel1Spin which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + */ +DlgRef_3Sel2Spin::DlgRef_3Sel2Spin(QWidget* parent, const char* name, WFlags fl) + :DlgRef_3Sel2Spin_QTD(parent, name, fl) +{ + SpinBox1->close(TRUE); + SpinBox2->close(TRUE); + SpinBox_DX = new DlgRef_SpinBox(GroupBox1, "SpinBox_DX"); + Layout2->addWidget(SpinBox_DX, 0, 1); + SpinBox_DY = new DlgRef_SpinBox(GroupBox1, "SpinBox_DY"); + Layout2->addWidget(SpinBox_DY, 1, 1); +} + + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel2Spin::~DlgRef_3Sel2Spin() +{ + // no need to delete child widgets, Qt does it all for us +} diff --git a/src/DlgRef/DlgRef_3Sel2Spin.h b/src/DlgRef/DlgRef_3Sel2Spin.h new file mode 100644 index 000000000..c39ff6275 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel2Spin.h @@ -0,0 +1,49 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// GEOM GEOMGUI : GUI for Geometry component +// File : DlgRef_3Sel2Spin.h +// Author : Damien COQUERET +// Module : GEOM +// $Header: +// +#ifndef DLGREF_3SEL2SPIN_H +#define DLGREF_3SEL2SPIN_H + +#include "GEOM_DlgRef.hxx" + +#include "DlgRef_3Sel2Spin_QTD.h" +#include "DlgRef_SpinBox.h" + +class GEOM_DLGREF_EXPORT DlgRef_3Sel2Spin : public DlgRef_3Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel2Spin(QWidget* parent = 0, const char* name = 0, WFlags fl = 0); + ~DlgRef_3Sel2Spin(); + + DlgRef_SpinBox* SpinBox_DX; + DlgRef_SpinBox* SpinBox_DY; + +}; + +#endif // DLGREF_3SEL2SPIN_H diff --git a/src/DlgRef/DlgRef_3Sel2Spin_QTD.cxx b/src/DlgRef/DlgRef_3Sel2Spin_QTD.cxx new file mode 100644 index 000000000..2d38a170f --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel2Spin_QTD.cxx @@ -0,0 +1,148 @@ +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Sel2Spin_QTD.ui' +** +** Created: Mon Apr 13 11:59:12 2009 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#include "DlgRef_3Sel2Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel2Spin_QTD as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Sel2Spin_QTD::DlgRef_3Sel2Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Sel2Spin_QTD" ); + DlgRef_3Sel2Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Sel2Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + GroupBox1Layout->addWidget( LineEdit1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton1, 0, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel2, 1, 0 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + GroupBox1Layout->addWidget( LineEdit2, 1, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton2, 1, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel3, 2, 0 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton3, 2, 1 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + GroupBox1Layout->addWidget( LineEdit3, 2, 2 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( TextLabel5, 1, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( TextLabel4, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + GroupBox1Layout->addMultiCellLayout( Layout2, 3, 3, 0, 2 ); + Spacer5 = new QSpacerItem( 16, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + GroupBox1Layout->addItem( Spacer5, 4, 1 ); + + DlgRef_3Sel2Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); + languageChange(); + resize( QSize(124, 201).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, PushButton3 ); + setTabOrder( PushButton3, LineEdit3 ); + setTabOrder( LineEdit3, SpinBox1 ); + setTabOrder( SpinBox1, SpinBox2 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel2Spin_QTD::~DlgRef_3Sel2Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void DlgRef_3Sel2Spin_QTD::languageChange() +{ + setCaption( tr( "DlgRef_2Sel2Spin_QTD" ) ); + GroupBox1->setTitle( QString::null ); + TextLabel1->setText( tr( "TL1" ) ); + PushButton1->setText( QString::null ); + TextLabel2->setText( tr( "TL2" ) ); + PushButton2->setText( QString::null ); + TextLabel3->setText( tr( "TL3" ) ); + PushButton3->setText( QString::null ); + TextLabel5->setText( tr( "TL5" ) ); + TextLabel4->setText( tr( "TL4" ) ); +} + diff --git a/src/DlgRef/DlgRef_3Sel2Spin_QTD.h b/src/DlgRef/DlgRef_3Sel2Spin_QTD.h new file mode 100644 index 000000000..6a82abc93 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel2Spin_QTD.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Sel2Spin_QTD.ui' +** +** Created: Mon Apr 13 11:59:11 2009 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef DLGREF_3SEL2SPIN_QTD_H +#define DLGREF_3SEL2SPIN_QTD_H + +#include +#include + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QGroupBox; +class QLineEdit; +class QLabel; +class QPushButton; +class QSpinBox; + +class DlgRef_3Sel2Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Sel2Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Sel2Spin_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit1; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLabel* TextLabel2; + QLineEdit* LineEdit2; + QPushButton* PushButton2; + QLabel* TextLabel3; + QPushButton* PushButton3; + QLineEdit* LineEdit3; + QSpinBox* SpinBox2; + QLabel* TextLabel5; + QLabel* TextLabel4; + QSpinBox* SpinBox1; + +protected: + QGridLayout* DlgRef_3Sel2Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QSpacerItem* Spacer5; + QGridLayout* Layout2; + +protected slots: + virtual void languageChange(); + +}; + +#endif // DLGREF_3SEL2SPIN_QTD_H diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index c4ed8ecf1..12013a408 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -49,6 +49,7 @@ dist_libDlgRef_la_SOURCES = \ DlgRef_2Sel1Spin_QTD.cxx \ DlgRef_2Sel2Spin_QTD.cxx \ DlgRef_2Sel3Spin_QTD.cxx \ + DlgRef_3Sel2Spin_QTD.cxx \ DlgRef_1Sel1Spin1Check_QTD.cxx \ DlgRef_2Sel1Spin2Check_QTD.cxx \ DlgRef_2Sel2Spin1Check_QTD.cxx \ @@ -79,6 +80,7 @@ dist_libDlgRef_la_SOURCES = \ DlgRef_2Sel1Spin.cxx \ DlgRef_2Sel2Spin.cxx \ DlgRef_2Sel3Spin.cxx \ + DlgRef_3Sel2Spin.cxx \ DlgRef_1Sel1Spin1Check.cxx \ DlgRef_2Sel1Spin2Check.cxx \ DlgRef_2Sel2Spin1Check.cxx \ @@ -113,6 +115,7 @@ MOC_FILES = \ DlgRef_2Sel1Spin_QTD_moc.cxx \ DlgRef_2Sel2Spin_QTD_moc.cxx \ DlgRef_2Sel3Spin_QTD_moc.cxx \ + DlgRef_3Sel2Spin_QTD_moc.cxx \ DlgRef_2Sel3Spin2Rb_QTD_moc.cxx \ DlgRef_2Sel3Spin2Rb_moc.cxx \ DlgRef_1Sel1Spin1Check_QTD_moc.cxx \ @@ -143,6 +146,7 @@ MOC_FILES = \ DlgRef_2Sel1Spin_moc.cxx \ DlgRef_2Sel2Spin_moc.cxx \ DlgRef_2Sel3Spin_moc.cxx \ + DlgRef_3Sel2Spin_moc.cxx \ DlgRef_1Sel1Spin1Check_moc.cxx \ DlgRef_2Sel1Spin2Check_moc.cxx \ DlgRef_2Sel2Spin1Check_moc.cxx \ @@ -179,6 +183,7 @@ salomeinclude_HEADERS = \ DlgRef_2Sel1Spin_QTD.h \ DlgRef_2Sel2Spin_QTD.h \ DlgRef_2Sel3Spin_QTD.h \ + DlgRef_3Sel2Spin_QTD.h \ DlgRef_1Sel1Spin1Check_QTD.h \ DlgRef_2Sel1Spin2Check_QTD.h \ DlgRef_2Sel2Spin1Check_QTD.h \ @@ -209,6 +214,7 @@ salomeinclude_HEADERS = \ DlgRef_2Sel1Spin.h \ DlgRef_2Sel2Spin.h \ DlgRef_2Sel3Spin.h \ + DlgRef_3Sel2Spin.h \ DlgRef_1Sel1Spin1Check.h \ DlgRef_2Sel1Spin2Check.h \ DlgRef_2Sel2Spin1Check.h \ diff --git a/src/DlgRef/UIFiles/DlgRef_3Sel2Spin_QTD.ui b/src/DlgRef/UIFiles/DlgRef_3Sel2Spin_QTD.ui new file mode 100644 index 000000000..04f58e6be --- /dev/null +++ b/src/DlgRef/UIFiles/DlgRef_3Sel2Spin_QTD.ui @@ -0,0 +1,262 @@ + +DlgRef_3Sel2Spin_QTD + + + DlgRef_3Sel2Spin_QTD + + + + 0 + 0 + 124 + 201 + + + + DlgRef_2Sel2Spin_QTD + + + + unnamed + + + 0 + + + 6 + + + + GroupBox1 + + + + + + + unnamed + + + 11 + + + 6 + + + + LineEdit1 + + + + + TextLabel1 + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + + + PushButton1 + + + + 0 + 0 + 0 + 0 + + + + + + + + + TextLabel2 + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + + + LineEdit2 + + + + + PushButton2 + + + + 0 + 0 + 0 + 0 + + + + + + + + + TextLabel3 + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + + + PushButton3 + + + + 0 + 0 + 0 + 0 + + + + + + + + + LineEdit3 + + + + + Layout2 + + + + unnamed + + + 0 + + + 6 + + + + SpinBox2 + + + + 7 + 0 + 0 + 0 + + + + + + TextLabel5 + + + + 0 + 0 + 0 + 0 + + + + TL5 + + + + + TextLabel4 + + + + 0 + 0 + 0 + 0 + + + + TL4 + + + + + SpinBox1 + + + + 7 + 0 + 0 + 0 + + + + + + + + Spacer5 + + + Vertical + + + Expanding + + + + 16 + 16 + + + + + + + + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox1 + SpinBox2 + + + diff --git a/src/DlgRef/UIFiles/ui_to_cxx b/src/DlgRef/UIFiles/ui_to_cxx index 4f4e471f8..1e2a8bd8e 100755 --- a/src/DlgRef/UIFiles/ui_to_cxx +++ b/src/DlgRef/UIFiles/ui_to_cxx @@ -121,5 +121,8 @@ #uic -o DlgRef_3Sel1Check_QTD.h DlgRef_3Sel3Spin2Check_QTD.ui #uic -o DlgRef_3Sel1Check_QTD.cxx -impl DlgRef_3Sel1Check_QTD.h DlgRef_3Sel1Check_QTD.ui>>>>>>> 1.6.2.3 -uic -o DlgRef_3Sel3Spin2Check_QTD.h DlgRef_3Sel3Spin2Check_QTD.ui -uic -o DlgRef_3Sel3Spin2Check_QTD.cxx -impl DlgRef_3Sel3Spin2Check_QTD.h DlgRef_3Sel3Spin2Check_QTD.ui \ No newline at end of file +#uic -o DlgRef_3Sel3Spin2Check_QTD.h DlgRef_3Sel3Spin2Check_QTD.ui +#uic -o DlgRef_3Sel3Spin2Check_QTD.cxx -impl DlgRef_3Sel3Spin2Check_QTD.h DlgRef_3Sel3Spin2Check_QTD.ui + +uic -o DlgRef_3Sel2Spin_QTD.h DlgRef_3Sel2Spin_QTD.ui +uic -o DlgRef_3Sel2Spin_QTD.cxx -impl DlgRef_3Sel2Spin_QTD.h DlgRef_3Sel2Spin_QTD.ui diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po index 61da72d2e..df66b8bae 100644 --- a/src/GEOMGUI/GEOM_msg_en.po +++ b/src/GEOMGUI/GEOM_msg_en.po @@ -732,6 +732,14 @@ msgstr "Major radius :" msgid "GEOM_RADIUS_MINOR" msgstr "Minor radius :" +#Major axis +msgid "GEOM_VECTOR_MAJOR" +msgstr "Major Axis" + +#Optional tag +msgid "GEOM_OPTIONAL" +msgstr "optional" + #Compound msgid "GEOM_COMPOUND" msgstr "Compound" diff --git a/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx b/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx index 15de08566..98c874c60 100644 --- a/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx @@ -72,23 +72,68 @@ Standard_Integer GEOMImpl_EllipseDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShape; if (aType == ELLIPSE_PNT_VEC_RR) { + // Center Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); - Handle(GEOM_Function) aRefVector = aCI.GetVector(); TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapePnt.ShapeType() != TopAbs_VERTEX) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: invalid center argument, must be a point"); + } + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + // Normal + Handle(GEOM_Function) aRefVector = aCI.GetVector(); TopoDS_Shape aShapeVec = aRefVector->GetValue(); - if (aShapePnt.ShapeType() == TopAbs_VERTEX && - aShapeVec.ShapeType() == TopAbs_EDGE) { - gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + if (aShapeVec.ShapeType() != TopAbs_EDGE) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: invalid normal vector argument, must be a vector or an edge"); + } + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: invalid normal vector argument: cannot retrieve vertices"); + } + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (aV.Magnitude() < gp::Resolution()) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: normal vector of zero length is given"); + } + + // Axes + gp_Ax2 anAxes (aP, aV); + + // Main Axis vector (optional) + Handle(GEOM_Function) aRefVectorMaj = aCI.GetVectorMajor(); + if (!aRefVectorMaj.IsNull()) { + TopoDS_Shape aShapeVec = aRefVectorMaj->GetValue(); + if (aShapeVec.ShapeType() != TopAbs_EDGE) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: invalid major axis vector argument, must be a vector or an edge"); + } TopoDS_Edge anE = TopoDS::Edge(aShapeVec); TopoDS_Vertex V1, V2; TopExp::Vertices(anE, V1, V2, Standard_True); - if (!V1.IsNull() && !V2.IsNull()) { - gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); - gp_Ax2 anAxes (aP, aV); - gp_Elips anEll (anAxes, aCI.GetRMajor(), aCI.GetRMinor()); - aShape = BRepBuilderAPI_MakeEdge(anEll).Edge(); + if (V1.IsNull() || V2.IsNull()) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: invalid major axis vector argument: cannot retrieve vertices"); } + gp_Vec aVM (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (aVM.Magnitude() < gp::Resolution()) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: major axis vector of zero length is given"); + } + if (aV.IsParallel(aVM, Precision::Angular())) { + Standard_ConstructionError::Raise + ("Ellipse creation aborted: normal and major axis vectors are parallel"); + } + // Axes defined with main axis vector + anAxes = gp_Ax2 (aP, aV, aVM); } + + // Ellipse + gp_Elips anEll (anAxes, aCI.GetRMajor(), aCI.GetRMinor()); + aShape = BRepBuilderAPI_MakeEdge(anEll).Edge(); } else { } diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index 73b962508..951366f50 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -325,7 +325,8 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR //============================================================================= Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, - double theRMajor, double theRMinor) + double theRMajor, double theRMinor, + Handle(GEOM_Object) theVecMaj) { SetErrorCode(KO); @@ -354,6 +355,13 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse aCI.SetRMajor(theRMajor); aCI.SetRMinor(theRMinor); + // vector of major axis is optional parameter + if (!theVecMaj.IsNull()) { + Handle(GEOM_Function) aRefVecMaj = theVecMaj->GetLastFunction(); + if (aRefVecMaj.IsNull()) return NULL; + aCI.SetVectorMajor(aRefVecMaj); + } + //Compute the Ellipse value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -371,8 +379,16 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse } //Make a Python command - GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeEllipse(" - << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")"; + //Make a Python command + if (!theVecMaj.IsNull()) { + GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeEllipse(" + << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor + << ", " << theVecMaj << ")"; + } + else { + GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeEllipse(" + << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")"; + } SetErrorCode(OK); return anEll; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index 2231b42ac..36109f8c3 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -49,7 +49,8 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeEllipse (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, - double theRMajor, double theRMinor); + double theRMajor, double theRMinor, + Handle(GEOM_Object) theVecMaj); Standard_EXPORT Handle(GEOM_Object) MakeArc (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2, diff --git a/src/GEOMImpl/GEOMImpl_IEllipse.hxx b/src/GEOMImpl/GEOMImpl_IEllipse.hxx index 8a199e760..8fe39a5f3 100644 --- a/src/GEOMImpl/GEOMImpl_IEllipse.hxx +++ b/src/GEOMImpl/GEOMImpl_IEllipse.hxx @@ -23,10 +23,11 @@ // #include "GEOM_Function.hxx" -#define ELLIPS_ARG_CC 1 -#define ELLIPS_ARG_VV 2 -#define ELLIPS_ARG_RMAJ 3 -#define ELLIPS_ARG_RMIN 4 +#define ELLIPS_ARG_CC 1 +#define ELLIPS_ARG_VV 2 +#define ELLIPS_ARG_RMAJ 3 +#define ELLIPS_ARG_RMIN 4 +#define ELLIPS_ARG_VVMAJ 5 class GEOMImpl_IEllipse { @@ -40,12 +41,16 @@ class GEOMImpl_IEllipse void SetRMajor(double theR) { _func->SetReal(ELLIPS_ARG_RMAJ, theR); } void SetRMinor(double theR) { _func->SetReal(ELLIPS_ARG_RMIN, theR); } + void SetVectorMajor(Handle(GEOM_Function) theV) { _func->SetReference(ELLIPS_ARG_VVMAJ, theV); } + Handle(GEOM_Function) GetCenter() { return _func->GetReference(ELLIPS_ARG_CC); } Handle(GEOM_Function) GetVector() { return _func->GetReference(ELLIPS_ARG_VV); } double GetRMajor() { return _func->GetReal(ELLIPS_ARG_RMAJ); } double GetRMinor() { return _func->GetReal(ELLIPS_ARG_RMIN); } + Handle(GEOM_Function) GetVectorMajor() { return _func->GetReference(ELLIPS_ARG_VVMAJ); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index b0097a5af..21adb1d0c 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -173,17 +173,54 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipse if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); - //Get the reference points + //Get the arguments Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject (thePnt->GetStudyID(), thePnt->GetEntry()); Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject (theVec->GetStudyID(), theVec->GetEntry()); + Handle(GEOM_Object) aVecMaj; if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); // Make Ellipse Handle(GEOM_Object) anObject = - GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor); + GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor, aVecMaj); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeEllipseVec + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipseVec + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, double theRMinor, + GEOM::GEOM_Object_ptr theVecMaj) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the arguments + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + Handle(GEOM_Object) aVecMaj; + if (!CORBA::is_nil(theVecMaj)) { + aVecMaj = GetOperations()->GetEngine()->GetObject + (theVecMaj->GetStudyID(), theVecMaj->GetEntry()); + if (aVecMaj.IsNull()) return aGEOMObject._retn(); + } + + // Make Ellipse + Handle(GEOM_Object) anObject = + GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor, aVecMaj); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index f26eef628..950839198 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -57,6 +57,11 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr theVector, double theRMajor, double theRMinor); + GEOM::GEOM_Object_ptr MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + double theRMajor, double theRMinor, + GEOM::GEOM_Object_ptr theVectorMajor); + GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3); diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 7918c6cfd..c43faf91d 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -2412,6 +2412,23 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEllipse (GEOM::GEOM_Object_ptr theCente return anObj; } +//============================================================================= +// MakeEllipseVec: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, + CORBA::Double theRMinor, + GEOM::GEOM_Object_ptr theVectorMajor) +{ + beginService( " GEOM_Superv_i::MakeEllipseVec" ); + MESSAGE("GEOM_Superv_i::MakeEllipseVec"); + getCurvesOp(); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeEllipseVec(theCenter, theVector, theRMajor, theRMinor, theVectorMajor); + endService( " GEOM_Superv_i::MakeEllipseVec" ); + return anObj; +} + //============================================================================= // MakeArc: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 3e94148f5..ae5934130 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -530,6 +530,10 @@ public: GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter, GEOM::GEOM_Object_ptr theVector, CORBA::Double theRMajor, CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, CORBA::Double theRMinor, + GEOM::GEOM_Object_ptr theVectorMajor); GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3); diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 944ee7ccf..d4fc3a2d9 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -534,12 +534,17 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theVec Vector, normal to the plane of the ellipse. # @param theRMajor Major ellipse radius. # @param theRMinor Minor ellipse radius. + # @param theVecMaj Vector, direction of the ellipse's main axis. # @return New GEOM_Object, containing the created ellipse. # # @ref tui_creation_ellipse "Example" - def MakeEllipse(self,thePnt, theVec, theRMajor, theRMinor): + def MakeEllipse(self,thePnt, theVec, theRMajor, theRMinor, theVecMaj=None): # Example: see GEOM_TestAll.py - anObj = self.CurvesOp.MakeEllipse(thePnt, theVec, theRMajor, theRMinor) + if theVecMaj is not None: + anObj = self.CurvesOp.MakeEllipseVec(thePnt, theVec, theRMajor, theRMinor, theVecMaj) + else: + anObj = self.CurvesOp.MakeEllipse(thePnt, theVec, theRMajor, theRMinor) + pass RaiseIfFailed("MakeEllipse", self.CurvesOp) return anObj -- 2.39.2