From 723f0c59fbe9ee4bc11f11513a971fd4e691b55d Mon Sep 17 00:00:00 2001 From: jfa Date: Mon, 28 Mar 2011 12:36:29 +0000 Subject: [PATCH] IMPs 21188, 21053, 21064 --- doc/salome/gui/GEOM/images/edge1.png | Bin 16136 -> 14749 bytes doc/salome/gui/GEOM/images/edge2.png | Bin 18023 -> 17324 bytes doc/salome/gui/GEOM/images/edge3.png | Bin 0 -> 17146 bytes doc/salome/gui/GEOM/images/point3.png | Bin 27072 -> 23917 bytes doc/salome/gui/GEOM/images/point3_2.png | Bin 32033 -> 28126 bytes doc/salome/gui/GEOM/images/point3_3.png | Bin 29169 -> 26947 bytes doc/salome/gui/GEOM/input/creating_edge.doc | 18 +- doc/salome/gui/GEOM/input/creating_point.doc | 13 +- .../gui/GEOM/input/tui_advanced_geom_objs.doc | 16 + idl/GEOM_Gen.idl | 38 +- idl/GEOM_Superv.idl | 12 +- resources/Makefile.am | 3 +- resources/build_edge_curve.png | Bin 0 -> 394 bytes src/BasicGUI/BasicGUI_PointDlg.cxx | 748 +++++++++--------- src/BasicGUI/BasicGUI_PointDlg.h | 7 +- src/BuildGUI/BuildGUI_EdgeDlg.cxx | 240 ++++-- src/BuildGUI/BuildGUI_EdgeDlg.h | 20 +- src/BuildGUI/BuildGUI_SolidDlg.cxx | 75 +- src/BuildGUI/BuildGUI_SolidDlg.h | 5 +- src/EntityGUI/EntityGUI_SubShapeDlg.cxx | 26 +- src/GEOMGUI/GEOM_images.ts | 4 + src/GEOMGUI/GEOM_msg_en.ts | 12 + src/GEOMImpl/GEOMImpl_IBasicOperations.cxx | 16 +- src/GEOMImpl/GEOMImpl_IBasicOperations.hxx | 7 +- src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 21 +- src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 167 +++- src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 9 +- src/GEOMImpl/GEOMImpl_IPoint.hxx | 11 +- src/GEOMImpl/GEOMImpl_IShapes.hxx | 7 +- src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 95 ++- src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 5 + src/GEOMImpl/GEOMImpl_IVector.hxx | 5 +- src/GEOMImpl/GEOMImpl_PointDriver.cxx | 111 ++- src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 157 +++- src/GEOMImpl/GEOMImpl_Types.hxx | 4 +- src/GEOMImpl/GEOMImpl_VectorDriver.cxx | 1 - src/GEOM_I/GEOM_IBasicOperations_i.cc | 14 +- src/GEOM_I/GEOM_IBasicOperations_i.hh | 5 +- src/GEOM_I/GEOM_IMeasureOperations_i.cc | 44 +- src/GEOM_I/GEOM_IMeasureOperations_i.hh | 78 +- src/GEOM_I/GEOM_IShapesOperations_i.cc | 34 + src/GEOM_I/GEOM_IShapesOperations_i.hh | 5 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 19 +- src/GEOM_I_Superv/GEOM_Superv_i.hh | 5 +- src/GEOM_SWIG/GEOM_TestAll.py | 197 ++--- src/GEOM_SWIG/geompyDC.py | 26 +- 46 files changed, 1495 insertions(+), 785 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/edge3.png create mode 100644 resources/build_edge_curve.png diff --git a/doc/salome/gui/GEOM/images/edge1.png b/doc/salome/gui/GEOM/images/edge1.png index 03840b25efa3830163e859b5bb3869a656fa2ede..1ef12aecbc5167e4bb17f6504c448ee59fe8550d 100644 GIT binary patch literal 14749 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 literal 16136 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 om383b%7 diff --git a/doc/salome/gui/GEOM/images/edge2.png b/doc/salome/gui/GEOM/images/edge2.png index b17336e0694a647750f3ce86cb4880ec04e30f03..273ce86bc06c7c843a60850fc6577a7cd9ce0003 100644 GIT binary patch literal 17324 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 literal 18023 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 diff --git a/doc/salome/gui/GEOM/images/edge3.png b/doc/salome/gui/GEOM/images/edge3.png new file mode 100644 index 0000000000000000000000000000000000000000..d234053ed9e4a555996fbe6a190a610eef6e8c3b GIT binary patch literal 17146 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 Z>yLR((Y-}d1u#Y(p{H%Am7`&O?;r61=vn{( literal 27072 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

m8lDG-|qQ5oynSM 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 LNdr6@=E4639s~iW literal 32033 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 T9A@DT<*1tqcjYr>ANu_lb_fGc diff --git a/doc/salome/gui/GEOM/images/point3_3.png b/doc/salome/gui/GEOM/images/point3_3.png index 823d34ca53a17e5012b39afa8971f3b4470529ee..d4f2c9adb19b09ec3c16771be0d5cc2a32e037b9 100644 GIT binary patch literal 26947 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 literal 29169 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 diff --git a/doc/salome/gui/GEOM/input/creating_edge.doc b/doc/salome/gui/GEOM/input/creating_edge.doc index ffbfa69de..ce4f7b8b0 100644 --- a/doc/salome/gui/GEOM/input/creating_edge.doc +++ b/doc/salome/gui/GEOM/input/creating_edge.doc @@ -5,10 +5,10 @@ To create an \b Edge, in the Main Menu select New Entity > Build > Edge -There are two ways to create an edge. In both cases the \b Result +There are three ways to create an edge. In all cases the \b Result will be a \b GEOM_Object (EDGE). -Firstly, you can create an \b Edge by specifying two points (\b Point1 and +Firstly, you can create a linear \b Edge by specifying two points (\b Point1 and \b Point2), which are the first and the last vertices of the edge. TUI Command: geompy.MakeEdge(Vertex1, Vertex2)
@@ -41,6 +41,20 @@ the connection points (sharp bend) is not processed. \image html edge2.png "Create edge from wire" +The third case allows building edges of desired length on any existing +curve (selected existing edge). Start Point parameter is optional. +Any point can be selected for it, the new edge will begin at the end +of initial edge, close to the selected point. Length can exceed +the initial edge's length or be negative to extrapolate existing edge +along its curve (except bezier and b-spline curves). + +TUI Command: geompy.MakeEdgeOnCurveByLength(Edge, Length, StartPoint = None)
+Arguments: Name + 1 edge + Length + 1 Vertex +(StartPoint parameter is optional, it allows switching from one end of +initial edge to another. Length can exceed the initial edge's length or be negative). + +\image html edge3.png "Create edge on curve" + Example: \image html edgesn.png "Edge" diff --git a/doc/salome/gui/GEOM/input/creating_point.doc b/doc/salome/gui/GEOM/input/creating_point.doc index 295e3ede1..7b3e4cba9 100644 --- a/doc/salome/gui/GEOM/input/creating_point.doc +++ b/doc/salome/gui/GEOM/input/creating_point.doc @@ -34,11 +34,14 @@ position of the point on the given edge. \image html point3.png Alternatively, it is possible to define the point by \b Edge and \b Length, -the given length must not exceed the length of the edge. The orientation of the edge can be reversed. -\n TUI Command: geompy.MakeVertexOnCurveByLength(Edge,Length,Reverse). -\n Arguments: Name + 1 edge + 1 Length defining the -position of the point on the given edge + 1 Reverse flag defining the direction for the -calculation of the length (False = forward, True = reversed). +the given length can exceed the length of the edge or be negative +(except bezier and b-spline curves). The orientation of the edge can +be reversed by the \b StartPoint selection. +\n TUI Command: geompy.MakeVertexOnCurveByLength(Edge,Length,StartPoint=None). +\n Arguments: Name + 1 edge + 1 Length defining the position +of the point on the given edge + 1 Point defining the direction for +the calculation of the length (if not defined, the first vertex of +Edge is used, else the vertex of Edge closest to StartPoint is used). \image html point3_3.png It is also possible to define 3D coordinates of the point diff --git a/doc/salome/gui/GEOM/input/tui_advanced_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_advanced_geom_objs.doc index 0e8861511..1be354d79 100644 --- a/doc/salome/gui/GEOM/input/tui_advanced_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_advanced_geom_objs.doc @@ -46,6 +46,22 @@ id_edge = geompy.addToStudy(edge,"Edge_2") # display an edge gg.createAndDisplayGO(id_edge) +# +# create edge from existing curve and a length +# + +# create a circle +c = geompy.MakeCircle(None, None, 100) + +# create an edge of length 25.0 from the circle +edge = geompy.MakeEdgeOnCurveByLength(c, 25.0) + +# add object in the study +id_edge = geompy.addToStudy(edge,"Edge_3") + +# display an edge +gg.createAndDisplayGO(id_edge) + \endcode \anchor tui_creation_wire diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 4e8d98733..006cf9b45 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -428,13 +428,15 @@ module GEOM /*! * Create a point, corresponding to the given length on the given curve. * \param theRefCurve The referenced curve. - * \param theLength Length on the referenced curve. - * \param theReverse Direction for the calculation of the length (false = forward or true = reversed). + * \param theLength Length on the referenced curve. It can be negative. + * \param theStartPoint Any vertex close to one of edge's + * ends to select start point among them. + * If NULL, fist vertex is used. * \return New GEOM_Object, containing the created point. */ GEOM_Object MakePointOnCurveByLength (in GEOM_Object theRefCurve, - in double theLength, - in boolean theReverse); + in double theLength, + in GEOM_Object theStartPoint); /*! * Create a point on the given curve, projecting given point @@ -1379,6 +1381,20 @@ module GEOM */ GEOM_Object MakeEdge (in GEOM_Object thePnt1, in GEOM_Object thePnt2); + /*! + * Create an edge on another edge, corresponding to the given length on the given edge. + * \param theRefCurve The referenced edge. + * \param theLength Length on the referenced edge. It can be + * negative for extrapolation on base curve. + * \param theStartPoint Any vertex close to one of edge's + * ends to select start point among them. + * If NULL, fist vertex is used. + * \return New GEOM_Object, containing the created edge. + */ + GEOM_Object MakeEdgeOnCurveByLength (in GEOM_Object theRefCurve, + in double theLength, + in GEOM_Object theStartPoint); + /*! * Create an edge from specified wire. * \param theWire source Wire. @@ -3158,6 +3174,13 @@ module GEOM boolean CheckShapeWithGeometry (in GEOM_Object theShape, out string theDescription); + /*! + * Check if the given shape can be an argument for MakeSolid operation + * \param theShape Shape to be described. + * \return Empty string if a solid can be made on this shape, error code otherwise. + */ + string IsGoodForSolid (in GEOM_Object theShape); + /*! * Obtain description of the given shape * \param theShape Shape to be described. @@ -3193,6 +3216,13 @@ module GEOM */ double GetAngle (in GEOM_Object theShape1, in GEOM_Object theShape2); + /*! + * Get angle between the given vectors. + * \param theShape1,theShape2 Vectors to find angle between. + * \return Value of the angle between the given vectors. + */ + double GetAngleBtwVectors (in GEOM_Object theShape1, in GEOM_Object theShape2); + /*! * Get point coordinates */ diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 3db909adf..bef0ecdf4 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -65,13 +65,16 @@ module GEOM //-----------------------------------------------------------// GEOM_Object MakePointXYZ (in double theX, in double theY, - in double theZ) ; + in double theZ); GEOM_Object MakePointWithReference (in GEOM_Object theReference, in double theX, in double theY, - in double theZ) ; + in double theZ); GEOM_Object MakePointOnCurve (in GEOM_Object theRefCurve, - in double theParameter) ; + in double theParameter); + GEOM_Object MakePointOnCurveByLength (in GEOM_Object theRefCurve, + in double theLength, + in GEOM_Object theStartPoint); GEOM_Object MakeTangentOnCurve (in GEOM_Object theRefCurve, in double theParameter); @@ -368,6 +371,9 @@ module GEOM //-----------------------------------------------------------// GEOM_Object MakeEdge (in GEOM_Object thePnt1, in GEOM_Object thePnt2) ; + GEOM_Object MakeEdgeOnCurveByLength (in GEOM_Object theRefCurve, + in double theLength, + in GEOM_Object theStartPoint); GEOM_Object MakeWire (in GEOM_List theEdgesAndWires, in double theTolerance) ; GEOM_Object MakeFace (in GEOM_Object theWire, diff --git a/resources/Makefile.am b/resources/Makefile.am index 02d6e15bb..57529e357 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -47,7 +47,8 @@ box2points.png \ boxdxyz.png \ build_compound.png \ build_edge.png \ -build_edge_wire.png \ +build_edge_wire.png \ +build_edge_curve.png \ build_face.png \ build_shell.png \ build_solid.png \ diff --git a/resources/build_edge_curve.png b/resources/build_edge_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..e87abea5c71eedd6f577af582c3abd3773f0ff87 GIT binary patch literal 394 zcmV;50d@X~P)rlrc`kKnz9SSajK*^w6_Ky1f8B2gm^^DWHcw7oel% z032XxIl+Co1!Ej z_bH%z2M|USrl5BN3lOsBI)0#xdk)|nSkNas=o;9K9WAb3()&7ww*#Pv*taSHo+IcL z_&ib;M8s6}A%eG<8D@rvSXDPBA_m+7o2d9G%)s~5z~%t-1mI=~EQQA0bD$7ksOrX4 z)r;Md)ojXCHN@O6pp%*WlkNY2B7@Y)efdHgeMR0aR2}S literal 0 HcmV?d00001 diff --git a/src/BasicGUI/BasicGUI_PointDlg.cxx b/src/BasicGUI/BasicGUI_PointDlg.cxx index 2b364705c..78fdec2b7 100644 --- a/src/BasicGUI/BasicGUI_PointDlg.cxx +++ b/src/BasicGUI/BasicGUI_PointDlg.cxx @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : BasicGUI_PointDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #include "BasicGUI_PointDlg.h" #include @@ -77,131 +76,132 @@ enum { SelectEdge, SelectWire }; // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. //================================================================================= -BasicGUI_PointDlg::BasicGUI_PointDlg( GeometryGUI* theGeometryGUI, QWidget* parent, - bool modal, Qt::WindowFlags fl ) - : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ), - myBusy ( false ) +BasicGUI_PointDlg::BasicGUI_PointDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myBusy (false) { - QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_POINT") ) ); - QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_POINT_EDGE" ) ) ); - QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); - QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_POINT_REF" ) ) ); - QPixmap image4( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_POINT_LINES") ) ); - QPixmap image5( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_POINT_FACE" ) ) ); - QPixmap image6( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICO_LINE" ) ) ); - QPixmap image7( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICO_WIRE" ) ) ); - - setWindowTitle( tr( "GEOM_POINT_TITLE" ) ); + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT"))); + QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_EDGE"))); + QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image3 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_REF"))); + QPixmap image4 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_LINES"))); + QPixmap image5 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_FACE"))); + QPixmap image6 (aResMgr->loadPixmap("GEOM", tr("ICO_LINE"))); + QPixmap image7 (aResMgr->loadPixmap("GEOM", tr("ICO_WIRE"))); + + setWindowTitle(tr("GEOM_POINT_TITLE")); /***************************************************************/ - mainFrame()->GroupConstructors->setTitle( tr( "GEOM_POINTS" ) ); - mainFrame()->RadioButton1->setIcon( image0 ); - mainFrame()->RadioButton2->setIcon( image3 ); - mainFrame()->RadioButton3->setIcon( image1 ); + mainFrame()->GroupConstructors->setTitle(tr("GEOM_POINTS")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setIcon(image3); + mainFrame()->RadioButton3->setIcon(image1); mainFrame()->RadioButton4->show(); - mainFrame()->RadioButton4->setIcon( image4 ); + mainFrame()->RadioButton4->setIcon(image4); mainFrame()->RadioButton5->show(); - mainFrame()->RadioButton5->setIcon( image5 ); - - myParamGroup = new QGroupBox( centralWidget() ); - myParamCoord = new QButtonGroup( myParamGroup ); - QHBoxLayout* boxLayout = new QHBoxLayout( myParamGroup ); - boxLayout->setMargin( MARGIN ); boxLayout->setSpacing( SPACING ); - QRadioButton* btn = new QRadioButton( tr( "GEOM_PARAM_VALUE" ), myParamGroup ); - myParamCoord->addButton( btn, PARAM_VALUE ); - boxLayout->addWidget( btn ); - btn = new QRadioButton( tr( "GEOM_LENGTH_VALUE" ), myParamGroup ); - myParamCoord->addButton( btn, LENGTH_VALUE ); - boxLayout->addWidget( btn ); - btn = new QRadioButton( tr( "GEOM_COORD_VALUE" ), myParamGroup ); - myParamCoord->addButton( btn, COORD_VALUE ); - boxLayout->addWidget( btn ); - myParamCoord->setExclusive( true ); - myParamCoord->button( PARAM_VALUE )->setChecked( true ); - - GroupXYZ = new DlgRef_3Spin( centralWidget() ); - GroupXYZ->GroupBox1->setTitle( tr( "GEOM_COORDINATES" ) ); - GroupXYZ->TextLabel1->setText( tr( "GEOM_X" ) ); - GroupXYZ->TextLabel2->setText( tr( "GEOM_Y" ) ); - GroupXYZ->TextLabel3->setText( tr( "GEOM_Z" ) ); - - GroupOnCurve = new DlgRef_1Sel1Spin1Check( centralWidget() ); - GroupOnCurve->GroupBox1->setTitle( tr( "GEOM_POINT_ON_EDGE" ) ); - GroupOnCurve->TextLabel1->setText( tr( "GEOM_EDGE" ) ); - GroupOnCurve->TextLabel2->setText( tr( "GEOM_PARAMETER" ) ); - GroupOnCurve->CheckButton1->setText( tr( "GEOM_REVERSE" ) ); - GroupOnCurve->PushButton1->setIcon( image2 ); - - - GroupOnSurface = new DlgRef_1Sel2Spin( centralWidget() ); - GroupOnSurface->GroupBox1->setTitle( tr( "GEOM_POINT_ON_FACE" ) ); - GroupOnSurface->TextLabel1->setText( tr( "GEOM_FACE" ) ); - GroupOnSurface->TextLabel2->setText( tr( "GEOM_UPARAMETER" ) ); - GroupOnSurface->TextLabel3->setText( tr( "GEOM_VPARAMETER" ) ); - GroupOnSurface->PushButton1->setIcon( image2 ); - - GroupRefPoint = new DlgRef_1Sel3Spin( centralWidget() ); - GroupRefPoint->GroupBox1->setTitle( tr( "GEOM_REF_POINT" ) ); - GroupRefPoint->TextLabel1->setText( tr( "GEOM_POINT" ) ); - GroupRefPoint->PushButton1->setIcon( image2 ); - GroupRefPoint->TextLabel2->setText( tr( "GEOM_DX" ) ); - GroupRefPoint->TextLabel3->setText( tr( "GEOM_DY" ) ); - GroupRefPoint->TextLabel4->setText( tr( "GEOM_DZ" ) ); + mainFrame()->RadioButton5->setIcon(image5); + + myParamGroup = new QGroupBox(centralWidget()); + myParamCoord = new QButtonGroup(myParamGroup); + QHBoxLayout* boxLayout = new QHBoxLayout(myParamGroup); + boxLayout->setMargin(MARGIN); boxLayout->setSpacing(SPACING); + QRadioButton* btn = new QRadioButton(tr("GEOM_PARAM_VALUE"), myParamGroup); + myParamCoord->addButton(btn, PARAM_VALUE); + boxLayout->addWidget(btn); + btn = new QRadioButton(tr("GEOM_LENGTH_VALUE"), myParamGroup); + myParamCoord->addButton(btn, LENGTH_VALUE); + boxLayout->addWidget(btn); + btn = new QRadioButton(tr("GEOM_COORD_VALUE"), myParamGroup); + myParamCoord->addButton(btn, COORD_VALUE); + boxLayout->addWidget(btn); + myParamCoord->setExclusive(true); + myParamCoord->button(PARAM_VALUE)->setChecked(true); + + GroupXYZ = new DlgRef_3Spin(centralWidget()); + GroupXYZ->GroupBox1->setTitle(tr("GEOM_COORDINATES")); + GroupXYZ->TextLabel1->setText(tr("GEOM_X")); + GroupXYZ->TextLabel2->setText(tr("GEOM_Y")); + GroupXYZ->TextLabel3->setText(tr("GEOM_Z")); + + GroupOnCurve = new DlgRef_2Sel1Spin(centralWidget()); + GroupOnCurve->GroupBox1->setTitle(tr("GEOM_POINT_ON_EDGE")); + GroupOnCurve->TextLabel1->setText(tr("GEOM_EDGE")); + GroupOnCurve->TextLabel2->setText(tr("GEOM_START_POINT")); + GroupOnCurve->TextLabel3->setText(tr("GEOM_PARAMETER")); + GroupOnCurve->PushButton1->setIcon(image2); + GroupOnCurve->PushButton2->setIcon(image2); + + GroupOnSurface = new DlgRef_1Sel2Spin(centralWidget()); + GroupOnSurface->GroupBox1->setTitle(tr("GEOM_POINT_ON_FACE")); + GroupOnSurface->TextLabel1->setText(tr("GEOM_FACE")); + GroupOnSurface->TextLabel2->setText(tr("GEOM_UPARAMETER")); + GroupOnSurface->TextLabel3->setText(tr("GEOM_VPARAMETER")); + GroupOnSurface->PushButton1->setIcon(image2); + + GroupRefPoint = new DlgRef_1Sel3Spin(centralWidget()); + GroupRefPoint->GroupBox1->setTitle(tr("GEOM_REF_POINT")); + GroupRefPoint->TextLabel1->setText(tr("GEOM_POINT")); + GroupRefPoint->PushButton1->setIcon(image2); + GroupRefPoint->TextLabel2->setText(tr("GEOM_DX")); + GroupRefPoint->TextLabel3->setText(tr("GEOM_DY")); + GroupRefPoint->TextLabel4->setText(tr("GEOM_DZ")); /* popup menu for line intersect buttons */ myBtnPopup = new QMenu(this); - QIcon ico_line = QIcon( image6 ); - QIcon ico_wire = QIcon( image7 ); - myActions[myBtnPopup->addAction( ico_line, tr( "GEOM_EDGE" ) )] = SelectEdge; - myActions[myBtnPopup->addAction( ico_wire, tr( "GEOM_WIRE" ) )] = SelectWire; - - GroupLineIntersection = new DlgRef_2Sel( centralWidget() ); - GroupLineIntersection->GroupBox1->setTitle( tr( "GEOM_LINE_INTERSECTION" ) ); - GroupLineIntersection->TextLabel1->setText( tr( "GEOM_LINE1" ) ); - GroupLineIntersection->TextLabel2->setText( tr( "GEOM_LINE2" ) ); - GroupLineIntersection->PushButton1->setIcon( image2 ); - GroupLineIntersection->PushButton1->setMenu( myBtnPopup ); - GroupLineIntersection->PushButton2->setIcon( image2 ); - GroupLineIntersection->PushButton2->setMenu( myBtnPopup ); + QIcon ico_line = QIcon(image6); + QIcon ico_wire = QIcon(image7); + myActions[myBtnPopup->addAction(ico_line, tr("GEOM_EDGE"))] = SelectEdge; + myActions[myBtnPopup->addAction(ico_wire, tr("GEOM_WIRE"))] = SelectWire; + + GroupLineIntersection = new DlgRef_2Sel(centralWidget()); + GroupLineIntersection->GroupBox1->setTitle(tr("GEOM_LINE_INTERSECTION")); + GroupLineIntersection->TextLabel1->setText(tr("GEOM_LINE1")); + GroupLineIntersection->TextLabel2->setText(tr("GEOM_LINE2")); + GroupLineIntersection->PushButton1->setIcon(image2); + GroupLineIntersection->PushButton1->setMenu(myBtnPopup); + GroupLineIntersection->PushButton2->setIcon(image2); + GroupLineIntersection->PushButton2->setMenu(myBtnPopup); GroupLineIntersection->LineEdit2->setEnabled(false); - myCoordGrp = new QGroupBox( tr( "GEOM_COORDINATES_RES" ), centralWidget() ); - QGridLayout* myCoordGrpLayout = new QGridLayout( myCoordGrp ); - myCoordGrpLayout->addWidget( new QLabel( tr( "GEOM_X" ), myCoordGrp ), 0, 0 ); - myX = new QLineEdit( myCoordGrp ); - myCoordGrpLayout->addWidget( myX, 0, 1 ); - myCoordGrpLayout->addWidget( new QLabel( tr( "GEOM_Y" ), myCoordGrp ), 1, 0 ); - myY = new QLineEdit( myCoordGrp ); - myCoordGrpLayout->addWidget( myY, 1, 1 ); - myCoordGrpLayout->addWidget( new QLabel( tr( "GEOM_Z" ), myCoordGrp ), 2, 0 ); - myZ = new QLineEdit( myCoordGrp ); - myCoordGrpLayout->addWidget( myZ, 2, 1 ); - - QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); - layout->setMargin( 0 ); layout->setSpacing( 6 ); - layout->addWidget( myParamGroup ); - layout->addWidget( GroupXYZ ); - layout->addWidget( GroupOnCurve ); - layout->addWidget( GroupOnSurface ); - layout->addWidget( GroupRefPoint ); - layout->addWidget( GroupLineIntersection ); - layout->addWidget( myCoordGrp ); - - myX->setReadOnly( true ); - myY->setReadOnly( true ); - myZ->setReadOnly( true ); - - myX->setEnabled( false ); - myY->setEnabled( false ); - myZ->setEnabled( false ); + myCoordGrp = new QGroupBox(tr("GEOM_COORDINATES_RES"), centralWidget()); + QGridLayout* myCoordGrpLayout = new QGridLayout(myCoordGrp); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_X"), myCoordGrp), 0, 0); + myX = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myX, 0, 1); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_Y"), myCoordGrp), 1, 0); + myY = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myY, 1, 1); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_Z"), myCoordGrp), 2, 0); + myZ = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myZ, 2, 1); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(myParamGroup); + layout->addWidget(GroupXYZ); + layout->addWidget(GroupOnCurve); + layout->addWidget(GroupOnSurface); + layout->addWidget(GroupRefPoint); + layout->addWidget(GroupLineIntersection); + layout->addWidget(myCoordGrp); + + myX->setReadOnly(true); + myY->setReadOnly(true); + myZ->setReadOnly(true); + + myX->setEnabled(false); + myY->setEnabled(false); + myZ->setEnabled(false); QPalette aPal = myX->palette(); - aPal.setColor( QPalette::Disabled, QPalette::Text, QColor( 0, 0, 0 ) ); - myX->setPalette( aPal ); - myY->setPalette( aPal ); - myZ->setPalette( aPal ); + aPal.setColor(QPalette::Disabled, QPalette::Text, QColor(0, 0, 0)); + myX->setPalette(aPal); + myY->setPalette(aPal); + myZ->setPalette(aPal); - setHelpFileName( "create_point_page.html" ); + setHelpFileName("create_point_page.html"); Init(); } @@ -222,13 +222,14 @@ BasicGUI_PointDlg::~BasicGUI_PointDlg() //================================================================================= void BasicGUI_PointDlg::Init() { - GroupOnCurve->LineEdit1->setReadOnly( true ); - GroupOnSurface->LineEdit1->setReadOnly( true ); - GroupRefPoint->LineEdit1->setReadOnly( true ); - GroupLineIntersection->LineEdit1->setReadOnly( true ); - GroupLineIntersection->LineEdit2->setReadOnly( true ); - GroupLineIntersection->LineEdit1->setEnabled( true ); - GroupLineIntersection->LineEdit2->setEnabled( false ); + GroupOnCurve->LineEdit1->setReadOnly(true); + GroupOnCurve->LineEdit2->setReadOnly(true); + GroupOnSurface->LineEdit1->setReadOnly(true); + GroupRefPoint->LineEdit1->setReadOnly(true); + GroupLineIntersection->LineEdit1->setReadOnly(true); + GroupLineIntersection->LineEdit2->setReadOnly(true); + GroupLineIntersection->LineEdit1->setEnabled(true); + GroupLineIntersection->LineEdit2->setEnabled(false); myEdge.nullify(); myFace.nullify(); @@ -241,78 +242,77 @@ void BasicGUI_PointDlg::Init() /* Get setting of step value from file configuration */ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100 ); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); /* min, max, step and decimals for spin boxes */ - initSpinBox( GroupXYZ->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox( GroupXYZ->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox( GroupXYZ->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); - GroupXYZ->SpinBox_DX->setValue( 0.0 ); - GroupXYZ->SpinBox_DY->setValue( 0.0 ); - GroupXYZ->SpinBox_DZ->setValue( 0.0 ); - - initSpinBox( GroupRefPoint->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox( GroupRefPoint->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox( GroupRefPoint->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); - GroupRefPoint->SpinBox_DX->setValue( 0.0 ); - GroupRefPoint->SpinBox_DY->setValue( 0.0 ); - GroupRefPoint->SpinBox_DZ->setValue( 0.0 ); + initSpinBox(GroupXYZ->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupXYZ->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupXYZ->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupXYZ->SpinBox_DX->setValue(0.0); + GroupXYZ->SpinBox_DY->setValue(0.0); + GroupXYZ->SpinBox_DZ->setValue(0.0); + + initSpinBox(GroupRefPoint->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupRefPoint->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupRefPoint->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupRefPoint->SpinBox_DX->setValue(0.0); + GroupRefPoint->SpinBox_DY->setValue(0.0); + GroupRefPoint->SpinBox_DZ->setValue(0.0); step = 0.1; - initSpinBox( GroupOnCurve->SpinBox_DX, 0., 1., step, "parametric_precision" ); - GroupOnCurve->SpinBox_DX->setValue( 0.5 ); + initSpinBox(GroupOnCurve->SpinBox_DX, 0., 1., step, "parametric_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.5); - initSpinBox( GroupOnSurface->SpinBox_DX, 0., 1., step, "parametric_precision" ); - GroupOnSurface->SpinBox_DX->setValue( 0.5 ); - initSpinBox( GroupOnSurface->SpinBox_DY, 0., 1., step, "parametric_precision" ); - GroupOnSurface->SpinBox_DY->setValue( 0.5 ); + initSpinBox(GroupOnSurface->SpinBox_DX, 0., 1., step, "parametric_precision"); + GroupOnSurface->SpinBox_DX->setValue(0.5); + initSpinBox(GroupOnSurface->SpinBox_DY, 0., 1., step, "parametric_precision"); + GroupOnSurface->SpinBox_DY->setValue(0.5); /* signals and slots connections */ - connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); - connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); - - connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect( myParamCoord, SIGNAL( buttonClicked( int ) ), this, SLOT( ClickParamCoord( int ) ) ); + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); - connect( GroupOnCurve->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupOnSurface->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupLineIntersection->PushButton1, SIGNAL( pressed() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupLineIntersection->PushButton2, SIGNAL( pressed() ), this, SLOT( SetEditCurrentArgument() ) ); + connect(myParamCoord, SIGNAL(buttonClicked(int)), this, SLOT(ClickParamCoord(int))); - connect( myBtnPopup, SIGNAL( triggered( QAction* ) ), this, SLOT( onBtnPopup( QAction* ) ) ); + connect(GroupOnCurve->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnCurve->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnSurface->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupLineIntersection->PushButton1, SIGNAL(pressed()), this, SLOT(SetEditCurrentArgument())); + connect(GroupLineIntersection->PushButton2, SIGNAL(pressed()), this, SLOT(SetEditCurrentArgument())); - connect( GroupOnCurve->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupOnSurface->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupOnSurface->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupXYZ->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupXYZ->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupXYZ->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupRefPoint->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupRefPoint->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupRefPoint->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + connect(myBtnPopup, SIGNAL(triggered(QAction*)), this, SLOT(onBtnPopup(QAction*))); - connect( GroupOnCurve->CheckButton1, SIGNAL( stateChanged( int ) ), this, SLOT( CheckBoxClicked( int ) ) ); + connect(GroupOnCurve->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupOnSurface->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupOnSurface->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); - connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) ); + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged() ), - this, SLOT(SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); - initName( tr( "GEOM_VERTEX" ) ); + initName(tr("GEOM_VERTEX")); - ConstructorsClicked( 0 ); + ConstructorsClicked(0); } //================================================================================= // function : SetDoubleSpinBoxStep() // purpose : Double spin box management //================================================================================= -void BasicGUI_PointDlg::SetDoubleSpinBoxStep( double step ) +void BasicGUI_PointDlg::SetDoubleSpinBoxStep(double step) { GroupOnCurve->SpinBox_DX->setSingleStep(step); GroupXYZ->SpinBox_DX->setSingleStep(step); @@ -330,12 +330,12 @@ void BasicGUI_PointDlg::SetDoubleSpinBoxStep( double step ) //================================================================================= void BasicGUI_PointDlg::ConstructorsClicked(int constructorId) { - switch ( constructorId ) { + switch (constructorId) { case GEOM_POINT_XYZ: { globalSelection(); // close local contexts, if any myNeedType = TopAbs_VERTEX; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); GroupRefPoint->hide(); GroupOnCurve->hide(); @@ -350,10 +350,10 @@ void BasicGUI_PointDlg::ConstructorsClicked(int constructorId) { globalSelection(); // close local contexts, if any myNeedType = TopAbs_VERTEX; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); myEditCurrentArgument = GroupRefPoint->LineEdit1; - myEditCurrentArgument->setText( "" ); + myEditCurrentArgument->setText(""); myRefPoint.nullify(); GroupRefPoint->PushButton1->setDown(true); myParamGroup->hide(); @@ -369,34 +369,35 @@ void BasicGUI_PointDlg::ConstructorsClicked(int constructorId) { globalSelection(); // close local contexts, if any myNeedType = TopAbs_EDGE; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); myEditCurrentArgument = GroupOnCurve->LineEdit1; - myEditCurrentArgument->setText( "" ); + myEditCurrentArgument->setText(""); myEdge.nullify(); + myRefPoint.nullify(); GroupOnCurve->PushButton1->setDown(true); GroupRefPoint->hide(); GroupLineIntersection->hide(); GroupOnSurface->hide(); myParamGroup->show(); - myParamCoord->button( LENGTH_VALUE )->show(); - myParamCoord->button( PARAM_VALUE )->setChecked( true ); + myParamCoord->button(LENGTH_VALUE)->show(); + myParamCoord->button(PARAM_VALUE)->setChecked(true); GroupOnCurve->show(); myCoordGrp->show(); - updateParamCoord( false ); + updateParamCoord(false); break; } case GEOM_POINT_INTINT: { globalSelection(); // close local contexts, if any myNeedType = TopAbs_EDGE; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); myEditCurrentArgument = GroupLineIntersection->LineEdit1; - GroupLineIntersection->LineEdit1->setText( "" ); - GroupLineIntersection->LineEdit2->setText( "" ); - GroupLineIntersection->LineEdit1->setEnabled( true ); - GroupLineIntersection->LineEdit2->setEnabled( false ); + GroupLineIntersection->LineEdit1->setText(""); + GroupLineIntersection->LineEdit2->setText(""); + GroupLineIntersection->LineEdit1->setEnabled(true); + GroupLineIntersection->LineEdit2->setEnabled(false); myLine1.nullify(); myLine2.nullify(); GroupLineIntersection->PushButton1->setDown(true); @@ -414,58 +415,56 @@ void BasicGUI_PointDlg::ConstructorsClicked(int constructorId) { globalSelection(); // close local contexts, if any myNeedType = TopAbs_FACE; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); myEditCurrentArgument = GroupOnSurface->LineEdit1; - myEditCurrentArgument->setText( "" ); + myEditCurrentArgument->setText(""); myFace.nullify(); GroupOnSurface->PushButton1->setDown(true); GroupRefPoint->hide(); GroupOnCurve->hide(); GroupLineIntersection->hide(); myParamGroup->show(); - myParamCoord->button( LENGTH_VALUE )->hide(); - myParamCoord->button( PARAM_VALUE )->setChecked(true); + myParamCoord->button(LENGTH_VALUE)->hide(); + myParamCoord->button(PARAM_VALUE)->setChecked(true); GroupOnSurface->show(); myCoordGrp->show(); - updateParamCoord( false ); + updateParamCoord(false); break; } } - myX->setText( "" ); - myY->setText( "" ); - myZ->setText( "" ); + myX->setText(""); + myY->setText(""); + myZ->setText(""); QTimer::singleShot(50, this, SLOT(updateSize())); SelectionIntoArgument(); } - //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= void BasicGUI_PointDlg::ClickOnOk() { - setIsApplyAndClose( true ); - if ( onAccept() ) + setIsApplyAndClose(true); + if (onAccept()) ClickOnCancel(); } - //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= bool BasicGUI_PointDlg::ClickOnApply() { - if ( !onAccept() ) + if (!onAccept()) return false; initName(); - ConstructorsClicked( getConstructorId() ); + ConstructorsClicked(getConstructorId()); return true; } @@ -479,70 +478,85 @@ void BasicGUI_PointDlg::SelectionIntoArgument() erasePreview(); const int id = getConstructorId(); - if ( ( id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF ) && myEditCurrentArgument != 0 ) + if ((id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF) + && myEditCurrentArgument != 0) { - myEditCurrentArgument->setText( "" ); - myX->setText( "" ); - myY->setText( "" ); - myZ->setText( "" ); - myRefPoint.nullify(); - myEdge.nullify(); + myEditCurrentArgument->setText(""); + myX->setText(""); + myY->setText(""); + myZ->setText(""); myFace.nullify(); - } else if ( id == GEOM_POINT_INTINT ) { - myEditCurrentArgument->setText( "" ); - if ( myEditCurrentArgument == GroupLineIntersection->LineEdit1 ) + if (myEditCurrentArgument == GroupOnCurve->LineEdit1) + myEdge.nullify(); + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) + myRefPoint.nullify(); + } + else if (id == GEOM_POINT_INTINT) { + myEditCurrentArgument->setText(""); + if (myEditCurrentArgument == GroupLineIntersection->LineEdit1) myLine1.nullify(); - else if ( myEditCurrentArgument == GroupLineIntersection->LineEdit2 ) + else if (myEditCurrentArgument == GroupLineIntersection->LineEdit2) myLine2.nullify(); } - GEOM::GeomObjPtr aSelectedObject = getSelected( myNeedType ); + GEOM::GeomObjPtr aSelectedObject = getSelected(myNeedType); TopoDS_Shape aShape; - if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) { - QString aName = GEOMBase::GetName( aSelectedObject.get() ); + if (aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull()) { + QString aName = GEOMBase::GetName(aSelectedObject.get()); myBusy = true; - if ( id == GEOM_POINT_XYZ ) { - gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); - GroupXYZ->SpinBox_DX->setValue( aPnt.X() ); - GroupXYZ->SpinBox_DY->setValue( aPnt.Y() ); - GroupXYZ->SpinBox_DZ->setValue( aPnt.Z() ); + if (id == GEOM_POINT_XYZ) { + gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + GroupXYZ->SpinBox_DX->setValue(aPnt.X()); + GroupXYZ->SpinBox_DY->setValue(aPnt.Y()); + GroupXYZ->SpinBox_DZ->setValue(aPnt.Z()); } - else if ( id == GEOM_POINT_REF ) { + else if (id == GEOM_POINT_REF) { myRefPoint = aSelectedObject; - GroupRefPoint->LineEdit1->setText( aName ); + GroupRefPoint->LineEdit1->setText(aName); } - else if ( id == GEOM_POINT_EDGE ) { - myEdge = aSelectedObject; - GroupOnCurve->LineEdit1->setText( aName ); + else if (id == GEOM_POINT_EDGE) { + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == GroupOnCurve->LineEdit1) { + myEdge = aSelectedObject; + if (myEdge && !myRefPoint) { + GroupOnCurve->PushButton2->click(); + } + } + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) { + myRefPoint = aSelectedObject; + if (myRefPoint && !myEdge) { + GroupOnCurve->PushButton1->click(); + } + } } - else if ( id == GEOM_POINT_INTINT ) { - myEditCurrentArgument->setText( aName ); - if ( myEditCurrentArgument == GroupLineIntersection->LineEdit1 ) { - myLine1 = aSelectedObject; - if ( myLine1 && !myLine2 ) { - GroupLineIntersection->PushButton2->setMenu( 0 ); - GroupLineIntersection->PushButton2->click(); - GroupLineIntersection->PushButton2->setDown(true); - GroupLineIntersection->PushButton2->setMenu( myBtnPopup ); - } + else if (id == GEOM_POINT_INTINT) { + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == GroupLineIntersection->LineEdit1) { + myLine1 = aSelectedObject; + if (myLine1 && !myLine2) { + GroupLineIntersection->PushButton2->setMenu(0); + GroupLineIntersection->PushButton2->click(); + GroupLineIntersection->PushButton2->setDown(true); + GroupLineIntersection->PushButton2->setMenu(myBtnPopup); + } } - else if ( myEditCurrentArgument == GroupLineIntersection->LineEdit2 ) { - myLine2 = aSelectedObject; - if ( myLine2 && !myLine1 ) { - GroupLineIntersection->PushButton1->setMenu( 0 ); - GroupLineIntersection->PushButton1->click(); - GroupLineIntersection->PushButton1->setDown(true); - GroupLineIntersection->PushButton1->setMenu( myBtnPopup ); - } + else if (myEditCurrentArgument == GroupLineIntersection->LineEdit2) { + myLine2 = aSelectedObject; + if (myLine2 && !myLine1) { + GroupLineIntersection->PushButton1->setMenu(0); + GroupLineIntersection->PushButton1->click(); + GroupLineIntersection->PushButton1->setDown(true); + GroupLineIntersection->PushButton1->setMenu(myBtnPopup); + } } } - else if ( id == GEOM_POINT_SURF ) { + else if (id == GEOM_POINT_SURF) { myFace = aSelectedObject; - GroupOnSurface->LineEdit1->setText( aName ); + GroupOnSurface->LineEdit1->setText(aName); } myBusy = false; } - + displayPreview(true); } @@ -555,43 +569,57 @@ void BasicGUI_PointDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - if ( send == GroupRefPoint->PushButton1 ) { + if (send == GroupRefPoint->PushButton1) { GroupRefPoint->LineEdit1->setFocus(); myEditCurrentArgument = GroupRefPoint->LineEdit1; globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); } - else if ( send == GroupOnCurve->PushButton1 ) { + else if (send == GroupOnCurve->PushButton1) { GroupOnCurve->LineEdit1->setFocus(); myEditCurrentArgument = GroupOnCurve->LineEdit1; globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE ); + myNeedType = TopAbs_EDGE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + GroupOnCurve->PushButton2->setDown(false); + GroupOnCurve->LineEdit1->setEnabled(true); + GroupOnCurve->LineEdit2->setEnabled(false); + } + else if (send == GroupOnCurve->PushButton2) { + GroupOnCurve->LineEdit2->setFocus(); + myEditCurrentArgument = GroupOnCurve->LineEdit2; + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_VERTEX; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + GroupOnCurve->PushButton1->setDown(false); + GroupOnCurve->LineEdit2->setEnabled(true); + GroupOnCurve->LineEdit1->setEnabled(false); } - else if ( send == GroupOnSurface->PushButton1 ) + else if (send == GroupOnSurface->PushButton1) { GroupOnSurface->LineEdit1->setFocus(); myEditCurrentArgument = GroupOnSurface->LineEdit1; globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_FACE ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_FACE); } - else if ( send == GroupLineIntersection->PushButton1 ) { + else if (send == GroupLineIntersection->PushButton1) { GroupLineIntersection->LineEdit1->setFocus(); myEditCurrentArgument = GroupLineIntersection->LineEdit1; - GroupLineIntersection->PushButton2->setDown( false ); + GroupLineIntersection->PushButton2->setDown(false); GroupLineIntersection->LineEdit1->setEnabled(true); GroupLineIntersection->LineEdit2->setEnabled(false); } - else if ( send == GroupLineIntersection->PushButton2 ) { + else if (send == GroupLineIntersection->PushButton2) { GroupLineIntersection->LineEdit2->setFocus(); myEditCurrentArgument = GroupLineIntersection->LineEdit2; - GroupLineIntersection->PushButton1->setDown( false ); + GroupLineIntersection->PushButton1->setDown(false); GroupLineIntersection->LineEdit1->setEnabled(false); GroupLineIntersection->LineEdit2->setEnabled(true); } send->setDown(true); - if ( ( send == GroupLineIntersection->PushButton1 || - send == GroupLineIntersection->PushButton2 ) && !myBusy ) + if ((send == GroupLineIntersection->PushButton1 || + send == GroupLineIntersection->PushButton2) && !myBusy) SelectionIntoArgument(); } @@ -600,9 +628,9 @@ void BasicGUI_PointDlg::SetEditCurrentArgument() // function : enterEvent() // purpose : to reactivate this dialog box when mouse enter onto the window //================================================================================= -void BasicGUI_PointDlg::enterEvent( QEvent* ) +void BasicGUI_PointDlg::enterEvent(QEvent*) { - if ( !mainFrame()->GroupConstructors->isEnabled() ) + if (!mainFrame()->GroupConstructors->isEnabled()) ActivateThisDialog(); } @@ -611,14 +639,14 @@ void BasicGUI_PointDlg::enterEvent( QEvent* ) // function : ActivateThisDialog() // purpose : //================================================================================= -void BasicGUI_PointDlg::ActivateThisDialog( ) +void BasicGUI_PointDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); - ConstructorsClicked( getConstructorId() ); + ConstructorsClicked(getConstructorId()); } @@ -628,7 +656,7 @@ void BasicGUI_PointDlg::ActivateThisDialog( ) //================================================================================= void BasicGUI_PointDlg::DeactivateActiveDialog() { - // myGeomGUI->SetState( -1 ); + // myGeomGUI->SetState(-1); GEOMBase_Skeleton::DeactivateActiveDialog(); } @@ -646,7 +674,7 @@ void BasicGUI_PointDlg::ValueChangedInSpinBox(double newValue) // function : CheckBoxClicked() // purpose : Check Boxes Management //================================================================================= -void BasicGUI_PointDlg::CheckBoxClicked( int State ) +void BasicGUI_PointDlg::CheckBoxClicked(int State) { displayPreview(true); } @@ -686,12 +714,12 @@ double BasicGUI_PointDlg::getVParameter() const // function : OnPointSelected // purpose : //================================================================================= -void BasicGUI_PointDlg::OnPointSelected( const gp_Pnt& thePnt ) +void BasicGUI_PointDlg::OnPointSelected(const gp_Pnt& thePnt) { - if ( getConstructorId() == GEOM_POINT_XYZ ) { - GroupXYZ->SpinBox_DX->setValue( thePnt.X() ); - GroupXYZ->SpinBox_DY->setValue( thePnt.Y() ); - GroupXYZ->SpinBox_DZ->setValue( thePnt.Z() ); + if (getConstructorId() == GEOM_POINT_XYZ) { + GroupXYZ->SpinBox_DX->setValue(thePnt.X()); + GroupXYZ->SpinBox_DY->setValue(thePnt.Y()); + GroupXYZ->SpinBox_DZ->setValue(thePnt.Z()); displayPreview(true); } @@ -703,48 +731,48 @@ void BasicGUI_PointDlg::OnPointSelected( const gp_Pnt& thePnt ) //================================================================================= GEOM::GEOM_IOperations_ptr BasicGUI_PointDlg::createOperation() { - return myGeomGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); + return myGeomGUI->GetGeomGen()->GetIBasicOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool BasicGUI_PointDlg::isValid( QString& msg ) +bool BasicGUI_PointDlg::isValid(QString& msg) { bool ok = false; - switch ( getConstructorId() ) { + switch (getConstructorId()) { case GEOM_POINT_XYZ : - ok = GroupXYZ->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DY->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DZ->isValid( msg, !IsPreview() ); + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); break; case GEOM_POINT_REF: - ok = GroupRefPoint->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupRefPoint->SpinBox_DY->isValid( msg, !IsPreview() ) && - GroupRefPoint->SpinBox_DZ->isValid( msg, !IsPreview() ) && + ok = GroupRefPoint->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupRefPoint->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupRefPoint->SpinBox_DZ->isValid(msg, !IsPreview()) && myRefPoint; break; case GEOM_POINT_EDGE: - if ( myParamCoord->checkedId() == PARAM_VALUE || myParamCoord->checkedId() == LENGTH_VALUE ) - ok = GroupOnCurve->SpinBox_DX->isValid( msg, !IsPreview() ); + if (myParamCoord->checkedId() == PARAM_VALUE || myParamCoord->checkedId() == LENGTH_VALUE) + ok = GroupOnCurve->SpinBox_DX->isValid(msg, !IsPreview()); else - ok = GroupXYZ->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DY->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DZ->isValid( msg, !IsPreview() ); + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); ok = myEdge && ok; break; case GEOM_POINT_INTINT: ok = myLine1 && myLine2; break; case GEOM_POINT_SURF: - if ( myParamCoord->checkedId() == PARAM_VALUE ) - ok = GroupOnSurface->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupOnSurface->SpinBox_DY->isValid( msg, !IsPreview() ); + if (myParamCoord->checkedId() == PARAM_VALUE) + ok = GroupOnSurface->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupOnSurface->SpinBox_DY->isValid(msg, !IsPreview()); else - ok = GroupXYZ->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DY->isValid( msg, !IsPreview() ) && - GroupXYZ->SpinBox_DZ->isValid( msg, !IsPreview() ); + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); ok = myFace && ok; break; default: @@ -757,16 +785,16 @@ bool BasicGUI_PointDlg::isValid( QString& msg ) // function : execute // purpose : //================================================================================= -bool BasicGUI_PointDlg::execute( ObjectList& objects ) +bool BasicGUI_PointDlg::execute(ObjectList& objects) { bool res = false; GEOM::GEOM_Object_var anObj; QStringList aParameters; - GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow( getOperation() ); + GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow(getOperation()); - switch ( getConstructorId() ) { + switch (getConstructorId()) { case GEOM_POINT_XYZ : { double x = GroupXYZ->SpinBox_DX->value(); @@ -777,7 +805,7 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) aParameters << GroupXYZ->SpinBox_DY->text(); aParameters << GroupXYZ->SpinBox_DZ->text(); - anObj = anOper->MakePointXYZ( x, y, z ); + anObj = anOper->MakePointXYZ(x, y, z); res = true; break; } @@ -791,24 +819,21 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) aParameters << GroupRefPoint->SpinBox_DY->text(); aParameters << GroupRefPoint->SpinBox_DZ->text(); - anObj = anOper->MakePointWithReference( myRefPoint.get(), dx, dy, dz ); + anObj = anOper->MakePointWithReference(myRefPoint.get(), dx, dy, dz); res = true; break; } case GEOM_POINT_EDGE : { - if ( myParamCoord->checkedId() == PARAM_VALUE ) { - anObj = anOper->MakePointOnCurve( myEdge.get(), getParameter() ); + if (myParamCoord->checkedId() == PARAM_VALUE) { + anObj = anOper->MakePointOnCurve(myEdge.get(), getParameter()); + aParameters<SpinBox_DX->text(); + } + else if (myParamCoord->checkedId() == LENGTH_VALUE) { + anObj = anOper->MakePointOnCurveByLength(myEdge.get(), getParameter(), myRefPoint.get()); aParameters<SpinBox_DX->text(); - } - else if ( myParamCoord->checkedId() == LENGTH_VALUE ) { - bool reversed = GroupOnCurve->CheckButton1->isChecked(); - anObj = anOper->MakePointOnCurveByLength( myEdge.get(), getParameter(), reversed ); - - aParameters<SpinBox_DX->text(); - aParameters<checkedId() == COORD_VALUE ) { + else if (myParamCoord->checkedId() == COORD_VALUE) { double x = GroupXYZ->SpinBox_DX->value(); double y = GroupXYZ->SpinBox_DY->value(); double z = GroupXYZ->SpinBox_DZ->value(); @@ -817,26 +842,26 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) aParameters << GroupXYZ->SpinBox_DY->text(); aParameters << GroupXYZ->SpinBox_DZ->text(); - anObj = anOper->MakePointOnCurveByCoord( myEdge.get(), x, y, z ); + anObj = anOper->MakePointOnCurveByCoord(myEdge.get(), x, y, z); } res = true; break; } case GEOM_POINT_INTINT : - anObj = anOper->MakePointOnLinesIntersection( myLine1.get(), myLine2.get() ); - if ( !anObj->_is_nil() ) { + anObj = anOper->MakePointOnLinesIntersection(myLine1.get(), myLine2.get()); + if (!anObj->_is_nil()) { QString aName = getNewObjectName(); - if ( anObj->GetShapeType() == GEOM::COMPOUND && aName.startsWith("Vertex") ) - initName( tr( "GEOM_COMPOUND" ) ); - else if ( anObj->GetShapeType() == GEOM::VERTEX && aName.startsWith("Compound")) - initName( tr( "GEOM_VERTEX" ) ); + if (anObj->GetShapeType() == GEOM::COMPOUND && aName.startsWith("Vertex")) + initName(tr("GEOM_COMPOUND")); + else if (anObj->GetShapeType() == GEOM::VERTEX && aName.startsWith("Compound")) + initName(tr("GEOM_VERTEX")); } res = true; break; case GEOM_POINT_SURF : { - if ( myParamCoord->checkedId() == PARAM_VALUE ) { - anObj = anOper->MakePointOnSurface( myFace.get(), getUParameter(), getVParameter() ); + if (myParamCoord->checkedId() == PARAM_VALUE) { + anObj = anOper->MakePointOnSurface(myFace.get(), getUParameter(), getVParameter()); aParameters<SpinBox_DX->text(); aParameters<SpinBox_DY->text(); } else { @@ -848,7 +873,7 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) aParameters << GroupXYZ->SpinBox_DY->text(); aParameters << GroupXYZ->SpinBox_DZ->text(); - anObj = anOper->MakePointOnSurfaceByCoord( myFace.get(), x, y, z ); + anObj = anOper->MakePointOnSurfaceByCoord(myFace.get(), x, y, z); } res = true; break; @@ -859,30 +884,30 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) if(!anObj->_is_nil() && !IsPreview() && (id == GEOM_POINT_XYZ || id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || - id == GEOM_POINT_SURF) ) { + id == GEOM_POINT_SURF)) { anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } - if ( id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF ) { + if (id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF) { TopoDS_Shape aShape; - if ( GEOMBase::GetShape( anObj, aShape ) && !aShape.IsNull() && - aShape.ShapeType() == TopAbs_VERTEX ) { - gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + if (GEOMBase::GetShape(anObj, aShape) && !aShape.IsNull() && + aShape.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); - myX->setText( DlgRef::PrintDoubleValue( aPnt.X(), aPrecision ) ); - myY->setText( DlgRef::PrintDoubleValue( aPnt.Y(), aPrecision ) ); - myZ->setText( DlgRef::PrintDoubleValue( aPnt.Z(), aPrecision ) ); + int aPrecision = resMgr->integerValue("Geometry", "length_precision", 6); + myX->setText(DlgRef::PrintDoubleValue(aPnt.X(), aPrecision)); + myY->setText(DlgRef::PrintDoubleValue(aPnt.Y(), aPrecision)); + myZ->setText(DlgRef::PrintDoubleValue(aPnt.Z(), aPrecision)); } else { - myX->setText( "" ); - myY->setText( "" ); - myZ->setText( "" ); + myX->setText(""); + myY->setText(""); + myZ->setText(""); } } - if ( !anObj->_is_nil() ) { - objects.push_back( anObj._retn() ); + if (!anObj->_is_nil()) { + objects.push_back(anObj._retn()); } return res; @@ -894,19 +919,19 @@ bool BasicGUI_PointDlg::execute( ObjectList& objects ) //================================================================================= void BasicGUI_PointDlg::addSubshapesToStudy() { - switch ( getConstructorId() ) { + switch (getConstructorId()) { case GEOM_POINT_REF: - GEOMBase::PublishSubObject( myRefPoint.get() ); + GEOMBase::PublishSubObject(myRefPoint.get()); break; case GEOM_POINT_EDGE: - GEOMBase::PublishSubObject( myEdge.get() ); + GEOMBase::PublishSubObject(myEdge.get()); break; case GEOM_POINT_INTINT: - GEOMBase::PublishSubObject( myLine1.get() ); - GEOMBase::PublishSubObject( myLine2.get() ); + GEOMBase::PublishSubObject(myLine1.get()); + GEOMBase::PublishSubObject(myLine2.get()); break; case GEOM_POINT_SURF: - GEOMBase::PublishSubObject( myFace.get() ); + GEOMBase::PublishSubObject(myFace.get()); break; default: break; @@ -917,9 +942,9 @@ void BasicGUI_PointDlg::addSubshapesToStudy() // function : ClickParamCoord() // purpose : //================================================================================= -void BasicGUI_PointDlg::ClickParamCoord( int id ) +void BasicGUI_PointDlg::ClickParamCoord(int id) { - updateParamCoord( true ); + updateParamCoord(true); displayPreview(true); } @@ -933,35 +958,36 @@ void BasicGUI_PointDlg::updateParamCoord(bool theIsUpdate) bool isLength = myParamCoord->checkedId() == LENGTH_VALUE; SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100 ); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); const int id = getConstructorId(); - if ( id == GEOM_POINT_EDGE ) { - GroupOnCurve->TextLabel2->setVisible( isParam || isLength ); - GroupOnCurve->SpinBox_DX->setVisible( isParam || isLength ); - if ( isParam ){ - initSpinBox( GroupOnCurve->SpinBox_DX, 0., 1., 0.1, "parametric_precision" ); - GroupOnCurve->SpinBox_DX->setValue( 0.5 ); - GroupOnCurve->TextLabel2->setText(tr( "GEOM_PARAMETER" )); - GroupOnCurve->CheckButton1->setVisible(false); + if (id == GEOM_POINT_EDGE) { + GroupOnCurve->TextLabel2->setVisible(isLength); + GroupOnCurve->PushButton2->setVisible(isLength); + GroupOnCurve->LineEdit2->setVisible(isLength); + GroupOnCurve->TextLabel3->setVisible(isParam || isLength); + GroupOnCurve->SpinBox_DX->setVisible(isParam || isLength); + if (isParam){ + initSpinBox(GroupOnCurve->SpinBox_DX, 0., 1., 0.1, "parametric_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.5); + GroupOnCurve->TextLabel3->setText(tr("GEOM_PARAMETER")); } - else if ( isLength ){ - initSpinBox( GroupOnCurve->SpinBox_DX, 0.0, COORD_MAX, step, "length_precision" ); - GroupOnCurve->SpinBox_DX->setValue( 0.0 ); - GroupOnCurve->TextLabel2->setText(tr( "GEOM_LENGTH" )); - GroupOnCurve->CheckButton1->setVisible(true); + else if (isLength){ + initSpinBox(GroupOnCurve->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.0); + GroupOnCurve->TextLabel3->setText(tr("GEOM_LENGTH")); } - } - else if ( id == GEOM_POINT_SURF ) { - GroupOnSurface->TextLabel2->setShown( isParam ); - GroupOnSurface->TextLabel3->setShown( isParam ); - GroupOnSurface->SpinBox_DX->setShown( isParam ); - GroupOnSurface->SpinBox_DY->setShown( isParam ); } - - GroupXYZ->setShown( !isParam && !isLength ); + else if (id == GEOM_POINT_SURF) { + GroupOnSurface->TextLabel2->setShown(isParam); + GroupOnSurface->TextLabel3->setShown(isParam); + GroupOnSurface->SpinBox_DX->setShown(isParam); + GroupOnSurface->SpinBox_DY->setShown(isParam); + } + + GroupXYZ->setShown(!isParam && !isLength); - if ( theIsUpdate ) + if (theIsUpdate) QTimer::singleShot(50, this, SLOT(updateSize())); } @@ -969,20 +995,20 @@ void BasicGUI_PointDlg::updateParamCoord(bool theIsUpdate) // function : onBtnPopup() // purpose : //================================================================================= -void BasicGUI_PointDlg::onBtnPopup( QAction* a ) +void BasicGUI_PointDlg::onBtnPopup(QAction* a) { globalSelection(); // close local contexts, if any myNeedType = myActions[a] == SelectEdge ? TopAbs_EDGE : TopAbs_WIRE; - localSelection( GEOM::GEOM_Object::_nil(), myNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); } //================================================================================= // function : updateSize // purpose : adjust dialog size to minimum //================================================================================= -void BasicGUI_PointDlg::updateSize() +void BasicGUI_PointDlg::updateSize() { qApp->processEvents(); updateGeometry(); - resize( minimumSizeHint() ); + resize(minimumSizeHint()); } diff --git a/src/BasicGUI/BasicGUI_PointDlg.h b/src/BasicGUI/BasicGUI_PointDlg.h index 67bfae79b..a9813c160 100644 --- a/src/BasicGUI/BasicGUI_PointDlg.h +++ b/src/BasicGUI/BasicGUI_PointDlg.h @@ -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 : BasicGUI_PointDlg.h // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #ifndef BASICGUI_POINTDLG_H #define BASICGUI_POINTDLG_H @@ -31,7 +30,7 @@ #include "GEOM_GenericObjPtr.h" #include -class DlgRef_1Sel1Spin1Check; +class DlgRef_2Sel1Spin; class DlgRef_3Spin; class DlgRef_2Sel; class DlgRef_1Sel3Spin; @@ -87,7 +86,7 @@ private: DlgRef_3Spin* GroupXYZ; DlgRef_1Sel3Spin* GroupRefPoint; - DlgRef_1Sel1Spin1Check* GroupOnCurve; + DlgRef_2Sel1Spin* GroupOnCurve; DlgRef_2Sel* GroupLineIntersection; DlgRef_1Sel2Spin* GroupOnSurface; diff --git a/src/BuildGUI/BuildGUI_EdgeDlg.cxx b/src/BuildGUI/BuildGUI_EdgeDlg.cxx index 5e332f957..fa268ffae 100644 --- a/src/BuildGUI/BuildGUI_EdgeDlg.cxx +++ b/src/BuildGUI/BuildGUI_EdgeDlg.cxx @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : BuildGUI_EdgeDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #include "BuildGUI_EdgeDlg.h" #include @@ -48,9 +47,11 @@ BuildGUI_EdgeDlg::BuildGUI_EdgeDlg (GeometryGUI* theGeometryGUI, QWidget* parent) : GEOMBase_Skeleton(theGeometryGUI, parent) { - QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); - QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BUILD_EDGE"))); - QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BUILD_EDGE_WIRE"))); + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_BUILD_EDGE"))); + QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_BUILD_EDGE_WIRE"))); + QPixmap image3 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_BUILD_EDGE_CURVE"))); setWindowTitle(tr("GEOM_EDGE_TITLE")); @@ -58,8 +59,7 @@ BuildGUI_EdgeDlg::BuildGUI_EdgeDlg (GeometryGUI* theGeometryGUI, QWidget* parent mainFrame()->GroupConstructors->setTitle(tr("GEOM_EDGE")); mainFrame()->RadioButton1->setIcon(image1); mainFrame()->RadioButton2->setIcon(image2); - mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); - mainFrame()->RadioButton3->close(); + mainFrame()->RadioButton3->setIcon(image3); // two points @@ -79,22 +79,38 @@ BuildGUI_EdgeDlg::BuildGUI_EdgeDlg (GeometryGUI* theGeometryGUI, QWidget* parent GroupWire->TextLabel1->setText(tr("GEOM_WIRE")); GroupWire->PushButton1->setIcon(image0); GroupWire->LineEdit1->setReadOnly(true); - GroupWire->TextLabel2->setText( tr( "GEOM_LINEAR_TOLERANCE" ) ); - GroupWire->TextLabel3->setText( tr( "GEOM_ANGULAR_TOLERANCE" ) ); + GroupWire->TextLabel2->setText(tr("GEOM_LINEAR_TOLERANCE")); + GroupWire->TextLabel3->setText(tr("GEOM_ANGULAR_TOLERANCE")); double SpecificStep = 0.0001; double prec1 = Precision::Confusion(); double prec2 = Precision::Angular(); - initSpinBox(GroupWire->SpinBox_DX, prec1, MAX_NUMBER, SpecificStep, "len_tol_precision" ); - initSpinBox(GroupWire->SpinBox_DY, prec2, MAX_NUMBER, SpecificStep, "ang_tol_precision" ); + initSpinBox(GroupWire->SpinBox_DX, prec1, MAX_NUMBER, SpecificStep, "len_tol_precision"); + initSpinBox(GroupWire->SpinBox_DY, prec2, MAX_NUMBER, SpecificStep, "ang_tol_precision"); GroupWire->SpinBox_DX->setValue(prec1); GroupWire->SpinBox_DY->setValue(prec2); + // on curve + + GroupOnCurve = new DlgRef_2Sel1Spin(centralWidget()); + GroupOnCurve->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupOnCurve->TextLabel1->setText(tr("GEOM_EDGE")); + GroupOnCurve->PushButton1->setIcon(image0); + GroupOnCurve->LineEdit1->setReadOnly(true); + GroupOnCurve->TextLabel2->setText(tr("GEOM_START_POINT")); + GroupOnCurve->PushButton2->setIcon(image0); + GroupOnCurve->LineEdit2->setReadOnly(true); + GroupOnCurve->TextLabel3->setText(tr("GEOM_LENGTH")); + double step = aResMgr->doubleValue("Geometry", "SettingsGeomStep", 100.0); + initSpinBox(GroupOnCurve->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupOnCurve->SpinBox_DX->setValue(step); + // layout QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(GroupPoints); layout->addWidget(GroupWire); + layout->addWidget(GroupOnCurve); /***************************************************************/ setHelpFileName("create_edge_page.html"); @@ -122,30 +138,37 @@ void BuildGUI_EdgeDlg::Init() myPoint1.nullify(); myPoint2.nullify(); myWire.nullify(); + myCurve.nullify(); + myStartPoint.nullify(); + myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->PushButton1->setDown(true); globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); // signals and slots connections - connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); - connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupWire->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupWire->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnCurve->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnCurve->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupOnCurve->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); initName(tr("GEOM_EDGE")); - ConstructorsClicked( 0 ); + ConstructorsClicked(0); } //================================================================================= @@ -170,8 +193,8 @@ bool BuildGUI_EdgeDlg::ClickOnApply() initName(); - myEditCurrentArgument->setText( "" ); - ConstructorsClicked( getConstructorId() ); + myEditCurrentArgument->setText(""); + ConstructorsClicked(getConstructorId()); return true; } @@ -180,17 +203,17 @@ bool BuildGUI_EdgeDlg::ClickOnApply() // function : ConstructorsClicked() // purpose : Radio button management //================================================================================= -void BuildGUI_EdgeDlg::ConstructorsClicked( int constructorId ) +void BuildGUI_EdgeDlg::ConstructorsClicked(int constructorId) { - switch ( constructorId ) { + switch (constructorId) { case 0: { globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); myEditCurrentArgument = GroupPoints->LineEdit1; - GroupPoints->LineEdit1->setText( "" ); - GroupPoints->LineEdit2->setText( "" ); + GroupPoints->LineEdit1->setText(""); + GroupPoints->LineEdit2->setText(""); myPoint1.nullify(); myPoint2.nullify(); GroupPoints->PushButton1->setDown(true); @@ -199,12 +222,13 @@ void BuildGUI_EdgeDlg::ConstructorsClicked( int constructorId ) GroupPoints->LineEdit2->setEnabled(false); GroupPoints->show(); GroupWire->hide(); + GroupOnCurve->hide(); break; } case 1: { globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_WIRE ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_WIRE); myEditCurrentArgument = GroupWire->LineEdit1; GroupWire->LineEdit1->setText(""); @@ -212,14 +236,34 @@ void BuildGUI_EdgeDlg::ConstructorsClicked( int constructorId ) GroupWire->PushButton1->setDown(true); GroupWire->LineEdit1->setEnabled(true); GroupPoints->hide(); + GroupOnCurve->hide(); GroupWire->show(); break; } + case 2: + { + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); + + myEditCurrentArgument = GroupOnCurve->LineEdit1; + GroupOnCurve->LineEdit1->setText(""); + GroupOnCurve->LineEdit2->setText(""); + myCurve.nullify(); + myStartPoint.nullify(); + GroupOnCurve->PushButton1->setDown(true); + GroupOnCurve->PushButton2->setDown(false); + GroupOnCurve->LineEdit1->setEnabled(true); + GroupOnCurve->LineEdit2->setEnabled(false); + GroupPoints->hide(); + GroupWire->hide(); + GroupOnCurve->show(); + break; + } } qApp->processEvents(); updateGeometry(); - resize( minimumSizeHint() ); + resize(minimumSizeHint()); SelectionIntoArgument(); } @@ -237,36 +281,51 @@ void BuildGUI_EdgeDlg::SelectionIntoArgument() aSelMgr->selectedObjects(aSelList); if (aSelList.Extent() != 1) { - if (myEditCurrentArgument == GroupPoints->LineEdit1) myPoint1.nullify(); - else if (myEditCurrentArgument == GroupPoints->LineEdit2) myPoint2.nullify(); - else if (myEditCurrentArgument == GroupWire->LineEdit1) myWire.nullify(); + if (myEditCurrentArgument == GroupPoints->LineEdit1) myPoint1.nullify(); + else if (myEditCurrentArgument == GroupPoints->LineEdit2) myPoint2.nullify(); + else if (myEditCurrentArgument == GroupWire->LineEdit1) myWire.nullify(); + else if (myEditCurrentArgument == GroupOnCurve->LineEdit1) myCurve.nullify(); + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) myStartPoint.nullify(); displayPreview(true); return; } - TopAbs_ShapeEnum aNeedType = myEditCurrentArgument == GroupWire->LineEdit1 ? TopAbs_WIRE : TopAbs_VERTEX; - GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType ); + TopAbs_ShapeEnum aNeedType = TopAbs_VERTEX; + if (myEditCurrentArgument == GroupWire->LineEdit1) aNeedType = TopAbs_WIRE; + else if (myEditCurrentArgument == GroupOnCurve->LineEdit1) aNeedType = TopAbs_EDGE; + 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 (aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull()) { + QString aName = GEOMBase::GetName(aSelectedObject.get()); + myEditCurrentArgument->setText(aName); globalSelection(); - localSelection( GEOM::GEOM_Object::_nil(), aNeedType ); + localSelection(GEOM::GEOM_Object::_nil(), aNeedType); - if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) { + if (myEditCurrentArgument == GroupPoints->LineEdit1) { myPoint1 = aSelectedObject; - if ( myPoint1 && !myPoint2 ) + if (myPoint1 && !myPoint2) GroupPoints->PushButton2->click(); } - else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { + else if (myEditCurrentArgument == GroupPoints->LineEdit2) { myPoint2 = aSelectedObject; - if ( myPoint2 && !myPoint1 ) + if (myPoint2 && !myPoint1) GroupPoints->PushButton1->click(); } - else if ( myEditCurrentArgument == GroupWire->LineEdit1 ) { + else if (myEditCurrentArgument == GroupWire->LineEdit1) { myWire = aSelectedObject; } + else if (myEditCurrentArgument == GroupOnCurve->LineEdit1) { + myCurve = aSelectedObject; + if (myCurve && !myStartPoint) + GroupOnCurve->PushButton2->click(); + } + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) { + myStartPoint = aSelectedObject; + if (myStartPoint && !myCurve) + GroupOnCurve->PushButton1->click(); + } } displayPreview(true); @@ -293,6 +352,22 @@ void BuildGUI_EdgeDlg::SetEditCurrentArgument() else if (send == GroupWire->PushButton1) { myEditCurrentArgument = GroupWire->LineEdit1; } + else if (send == GroupOnCurve->PushButton1) { + myEditCurrentArgument = GroupOnCurve->LineEdit1; + GroupOnCurve->PushButton2->setDown(false); + GroupOnCurve->LineEdit2->setEnabled(false); + + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); + } + else if (send == GroupOnCurve->PushButton2) { + myEditCurrentArgument = GroupOnCurve->LineEdit2; + GroupOnCurve->PushButton1->setDown(false); + GroupOnCurve->LineEdit1->setEnabled(false); + + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); + } // enable line edit myEditCurrentArgument->setEnabled(true); @@ -309,10 +384,10 @@ void BuildGUI_EdgeDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); - ConstructorsClicked( getConstructorId() ); + ConstructorsClicked(getConstructorId()); } //================================================================================= @@ -325,6 +400,15 @@ void BuildGUI_EdgeDlg::enterEvent (QEvent*) ActivateThisDialog(); } +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::ValueChangedInSpinBox(double newValue) +{ + displayPreview(true); +} + //================================================================================= // function : createOperation // purpose : @@ -341,15 +425,19 @@ GEOM::GEOM_IOperations_ptr BuildGUI_EdgeDlg::createOperation() bool BuildGUI_EdgeDlg::isValid (QString& msg) { bool ok = false; - switch ( getConstructorId() ) { + switch (getConstructorId()) { case 0: ok = myPoint1 && myPoint2; break; case 1: - ok = GroupWire->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupWire->SpinBox_DY->isValid( msg, !IsPreview() ) && + ok = GroupWire->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupWire->SpinBox_DY->isValid(msg, !IsPreview()) && myWire; break; + case 2: + ok = GroupOnCurve->SpinBox_DX->isValid(msg, !IsPreview()) && + myCurve; + break; default: break; } @@ -365,12 +453,12 @@ bool BuildGUI_EdgeDlg::execute (ObjectList& objects) bool res = false; GEOM::GEOM_Object_var anObj; - GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); - switch ( getConstructorId() ) { - case 0 : + switch (getConstructorId()) { + case 0: { - anObj = anOper->MakeEdge( myPoint1.get(), myPoint2.get() ); + anObj = anOper->MakeEdge(myPoint1.get(), myPoint2.get()); res = true; break; } @@ -378,22 +466,34 @@ bool BuildGUI_EdgeDlg::execute (ObjectList& objects) { double aLinearTolerance = GroupWire->SpinBox_DX->value(); double anAngularTolerance = GroupWire->SpinBox_DY->value(); - + QStringList aParameters; aParameters << GroupWire->SpinBox_DX->text(); aParameters << GroupWire->SpinBox_DY->text(); - - anObj = anOper->MakeEdgeWire( myWire.get(), aLinearTolerance, anAngularTolerance ); - - if ( !anObj->_is_nil() && !IsPreview() ) - anObj->SetParameters( aParameters.join(":").toLatin1().constData() ); - + + anObj = anOper->MakeEdgeWire(myWire.get(), aLinearTolerance, anAngularTolerance); + + if (!anObj->_is_nil() && !IsPreview()) + anObj->SetParameters(aParameters.join(":").toLatin1().constData()); + + res = true; + break; + } + case 2: + { + double aLength = GroupOnCurve->SpinBox_DX->value(); + + anObj = anOper->MakeEdgeOnCurveByLength(myCurve.get(), aLength, myStartPoint.get()); + + if (!anObj->_is_nil() && !IsPreview()) + anObj->SetParameters(GroupOnCurve->SpinBox_DX->text().toLatin1().constData()); + res = true; break; } } - if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + if (!anObj->_is_nil()) objects.push_back(anObj._retn()); return res; } @@ -404,13 +504,17 @@ bool BuildGUI_EdgeDlg::execute (ObjectList& objects) //================================================================================= void BuildGUI_EdgeDlg::addSubshapesToStudy() { - switch ( getConstructorId() ) { - case 0 : - GEOMBase::PublishSubObject( myPoint1.get() ); - GEOMBase::PublishSubObject( myPoint2.get() ); + switch (getConstructorId()) { + case 0: + GEOMBase::PublishSubObject(myPoint1.get()); + GEOMBase::PublishSubObject(myPoint2.get()); + break; + case 1: + GEOMBase::PublishSubObject(myWire.get()); break; - case 1 : - GEOMBase::PublishSubObject( myWire.get() ); + case 2: + GEOMBase::PublishSubObject(myCurve.get()); + GEOMBase::PublishSubObject(myStartPoint.get()); break; default: break; diff --git a/src/BuildGUI/BuildGUI_EdgeDlg.h b/src/BuildGUI/BuildGUI_EdgeDlg.h index 9ead7e356..115574ee0 100644 --- a/src/BuildGUI/BuildGUI_EdgeDlg.h +++ b/src/BuildGUI/BuildGUI_EdgeDlg.h @@ -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 : BuildGUI_EdgeDlg.h // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #ifndef BUILDGUI_EDGEDLG_H #define BUILDGUI_EDGEDLG_H @@ -32,6 +31,7 @@ class DlgRef_1Sel2Spin; class DlgRef_2Sel; +class DlgRef_2Sel1Spin; //================================================================================= // class : BuildGUI_EdgeDlg @@ -42,34 +42,38 @@ class BuildGUI_EdgeDlg : public GEOMBase_Skeleton Q_OBJECT public: - BuildGUI_EdgeDlg( GeometryGUI*, QWidget* = 0 ); + BuildGUI_EdgeDlg (GeometryGUI*, QWidget* = 0); ~BuildGUI_EdgeDlg(); protected: // redefined from GEOMBase_Helper virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid( QString& ); - virtual bool execute( ObjectList& ); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); virtual void addSubshapesToStudy(); private: void Init(); - void enterEvent( QEvent* ); + void enterEvent (QEvent*); private: - GEOM::GeomObjPtr myPoint1, myPoint2; /* Points containing the edge */ + GEOM::GeomObjPtr myPoint1, myPoint2; /* Points */ GEOM::GeomObjPtr myWire; /* Wire */ + GEOM::GeomObjPtr myCurve; /* Edge */ + GEOM::GeomObjPtr myStartPoint; /* Point */ DlgRef_2Sel* GroupPoints; DlgRef_1Sel2Spin* GroupWire; + DlgRef_2Sel1Spin* GroupOnCurve; private slots: - void ConstructorsClicked( int ); + void ConstructorsClicked (int); void ClickOnOk(); bool ClickOnApply(); void ActivateThisDialog(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void ValueChangedInSpinBox (double); }; #endif // BUILDGUI_EDGEDLG_H diff --git a/src/BuildGUI/BuildGUI_SolidDlg.cxx b/src/BuildGUI/BuildGUI_SolidDlg.cxx index c619ee15b..8f9ab2761 100644 --- a/src/BuildGUI/BuildGUI_SolidDlg.cxx +++ b/src/BuildGUI/BuildGUI_SolidDlg.cxx @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : BuildGUI_SolidDlg.cxx // Author : Damien COQUERET, Open CASCADE S.A.S. -// + #include "BuildGUI_SolidDlg.h" #include @@ -38,9 +37,11 @@ #include #include +#include + //================================================================================= // class : BuildGUI_SolidDlg() -// purpose : Constructs a BuildGUI_SolidDlg which is a child of 'parent', with the +// purpose : Constructs a BuildGUI_SolidDlg which is a child of 'parent', with the // name 'name' and widget flags set to 'f'. // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. @@ -52,7 +53,7 @@ BuildGUI_SolidDlg::BuildGUI_SolidDlg( GeometryGUI* theGeometryGUI, QWidget* pare QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); setWindowTitle( tr( "GEOM_SOLID_TITLE" ) ); - + /***************************************************************/ mainFrame()->GroupConstructors->setTitle( tr( "GEOM_SOLID" ) ); mainFrame()->RadioButton1->setIcon( image0 ); @@ -68,7 +69,7 @@ BuildGUI_SolidDlg::BuildGUI_SolidDlg( GeometryGUI* theGeometryGUI, QWidget* pare GroupSolid->CheckButton1->setText( tr( "GEOM_CREATE_SINGLE_SOLID" ) ); GroupSolid->PushButton1->setIcon( image1 ); GroupSolid->LineEdit1->setReadOnly( true ); - + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupSolid ); @@ -103,8 +104,14 @@ void BuildGUI_SolidDlg::Init() GroupSolid->CheckButton1->setChecked( true ); myShells.clear(); - - globalSelection( GEOM_SHELL ); + + //globalSelection( GEOM_SHELL ); + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_COMPOUNDFILTER ); + QList aSubShapes; + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); @@ -154,7 +161,10 @@ void BuildGUI_SolidDlg::SelectionIntoArgument() { myEditCurrentArgument->setText( "" ); - myShells = getSelected( TopAbs_SHELL, -1 ); + //myShells = getSelected( TopAbs_SHELL, -1 ); + QList types; + types << TopAbs_SHELL << TopAbs_COMPOUND; + myShells = getSelected( types, -1 ); if ( !myShells.isEmpty() ) { QString aName = myShells.count() > 1 ? QString( "%1_objects").arg( myShells.count() ) : GEOMBase::GetName( myShells[0].get() ); @@ -171,8 +181,15 @@ void BuildGUI_SolidDlg::SetEditCurrentArgument() QPushButton* send = (QPushButton*)sender(); if ( send != GroupSolid->PushButton1 ) return; - - globalSelection( GEOM_SHELL ); + + //globalSelection( GEOM_SHELL ); + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_COMPOUNDFILTER ); + QList aSubShapes; + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); + myEditCurrentArgument = GroupSolid->LineEdit1; myEditCurrentArgument->setFocus(); @@ -189,7 +206,14 @@ void BuildGUI_SolidDlg::ActivateThisDialog() GEOMBase_Skeleton::ActivateThisDialog(); connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - globalSelection( GEOM_SHELL ); + + //globalSelection( GEOM_SHELL ); + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_COMPOUNDFILTER ); + QList aSubShapes; + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); } @@ -210,7 +234,7 @@ void BuildGUI_SolidDlg::enterEvent( QEvent* ) //================================================================================= void BuildGUI_SolidDlg::EnableNameField( bool toEnable ) { - mainFrame()->GroupBoxName->setEnabled( toEnable ); + mainFrame()->GroupBoxName->setEnabled( toEnable ); } //================================================================================= @@ -226,17 +250,24 @@ GEOM::GEOM_IOperations_ptr BuildGUI_SolidDlg::createOperation() // function : isValid // purpose : //================================================================================= -bool BuildGUI_SolidDlg::isValid( QString& msg ) +bool BuildGUI_SolidDlg::isValid (QString& msg) { bool ok = !myShells.isEmpty(); + + GEOM::MeasureOpPtr anOp; + anOp.take(myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId())); + for ( int i = 0, n = myShells.count(); i < n && ok; i++ ) { - ok = isClosed( myShells[i].get() ); - if ( !ok ) - msg = QObject::tr("WRN_SHAPE_UNCLOSED").arg( GEOMBase::GetName( myShells[i].get() ) ); + CORBA::String_var aRes = anOp->IsGoodForSolid(myShells[i].get()); + if (strlen(aRes.in())) { + msg = QObject::tr(aRes.in()).arg(GEOMBase::GetName(myShells[i].get())); + ok = false; + } } return ok; } +/* //================================================================================= // function : isClosed // purpose : Check the object 'i' in myShells list is closed or unclosed @@ -252,15 +283,15 @@ bool BuildGUI_SolidDlg::isClosed( GEOM::GEOM_Object_ptr shell ) if ( !CORBA::is_nil( shell ) ) { GEOM::MeasureOpPtr anOp; anOp.take( myGeomGUI->GetGeomGen()->GetIMeasureOperations( getStudyId() ) ); - + // Detect kind of shape and parameters aKind = anOp->KindOfShape(shell, anInts, aDbls); - + if ( anOp->IsDone() ) { if ( anInts[0] == 1 ) - ok = true; + ok = true; else if ( anInts[0] == 2 ) - ok = false; + ok = false; } else { MESSAGE ("KindOfShape Operation is NOT DONE!!!"); @@ -272,6 +303,7 @@ bool BuildGUI_SolidDlg::isClosed( GEOM::GEOM_Object_ptr shell ) return ok; } +*/ //================================================================================= // function : execute @@ -280,7 +312,7 @@ bool BuildGUI_SolidDlg::isClosed( GEOM::GEOM_Object_ptr shell ) bool BuildGUI_SolidDlg::execute( ObjectList& objects ) { GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); - + if ( GroupSolid->CheckButton1->isChecked() ) { GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); objlist->length( myShells.count() ); @@ -303,4 +335,3 @@ bool BuildGUI_SolidDlg::execute( ObjectList& objects ) return true; } - diff --git a/src/BuildGUI/BuildGUI_SolidDlg.h b/src/BuildGUI/BuildGUI_SolidDlg.h index 2ce9bcb96..8c0238efd 100644 --- a/src/BuildGUI/BuildGUI_SolidDlg.h +++ b/src/BuildGUI/BuildGUI_SolidDlg.h @@ -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 : BuildGUI_SolidDlg.h // Author : Damien COQUERET, Open CASCADE S.A.S. -// + #ifndef BUILDGUI_SOLIDDLG_H #define BUILDGUI_SOLIDDLG_H @@ -52,7 +51,7 @@ protected: private: void Init(); - bool isClosed( GEOM::GEOM_Object_ptr shell ); + //bool isClosed( GEOM::GEOM_Object_ptr shell ); void enterEvent( QEvent* ); private: diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index c8fe70499..9650843b4 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -18,7 +18,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 GEOMGUI : GUI for Geometry component // File : EntityGUI_SubShapeDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. @@ -125,7 +125,7 @@ void EntityGUI_SubShapeDlg::Init() GroupPoints->ComboBox1->insertItem( GroupPoints->ComboBox1->count(), "Vertex" ); GroupPoints->ComboBox1->insertItem( GroupPoints->ComboBox1->count(), "Shape" ); - if ( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + if ( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() != OCCViewer_Viewer::Type() ) GroupPoints->CheckButton1->setEnabled( false ); @@ -169,7 +169,7 @@ void EntityGUI_SubShapeDlg::ClickOnOk() bool EntityGUI_SubShapeDlg::ClickOnApply() { SUIT_Session::session()->activeApplication()->putInfo( "" ); - + /* Explode all sub shapes */ if ( isAllSubShapes() ) { /* More than 30 subshapes : ask confirmation */ @@ -301,7 +301,7 @@ void EntityGUI_SubShapeDlg::SetEditCurrentArgument() { GroupPoints->LineEdit1->setFocus(); myEditCurrentArgument = GroupPoints->LineEdit1; - + GroupPoints->CheckButton1->setChecked( false ); SubShapeToggled(); SelectionIntoArgument(); @@ -313,7 +313,7 @@ void EntityGUI_SubShapeDlg::SetEditCurrentArgument() // purpose : //================================================================================= void EntityGUI_SubShapeDlg::LineEditReturnPressed() -{ +{ QLineEdit* send = (QLineEdit*)sender(); if ( send == GroupPoints->LineEdit1 ) SetEditCurrentArgument(); @@ -386,9 +386,9 @@ void EntityGUI_SubShapeDlg::ResetStateOfDialog() GroupPoints->ComboBox1->insertItem( GroupPoints->ComboBox1->count(), "Edge" ); GroupPoints->ComboBox1->insertItem( GroupPoints->ComboBox1->count(), "Vertex" ); GroupPoints->ComboBox1->insertItem( GroupPoints->ComboBox1->count(), "Shape" ); - + myWithShape = true; - + GroupPoints->ComboBox1->setCurrentIndex( 8 - count + SelectedShapeType ); ComboTextChanged(); @@ -412,13 +412,13 @@ void EntityGUI_SubShapeDlg::SubShapeToggled() //================================================================================= // function : ComboTextChanged() -// purpose : +// purpose : //================================================================================= void EntityGUI_SubShapeDlg::ComboTextChanged() { /* Select sub shapes mode not checked */ updateButtonState(); - SubShapeToggled(); + SubShapeToggled(); } @@ -448,7 +448,7 @@ unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes( const TopoDS_Shape& S, } } } - } + } else { TopExp_Explorer Exp ( S, TopAbs_ShapeEnum( shapeType ) ); for ( ; Exp.More(); Exp.Next() ) { @@ -563,7 +563,7 @@ bool EntityGUI_SubShapeDlg::execute (ObjectList& objects) if (!aList->length()) return false; - // Throw away sub-shapes not selected by user if not in preview mode + // Throw away sub-shapes not selected by user if not in preview mode // and manual selection is active if (!isAllSubShapes()) { LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); @@ -578,7 +578,7 @@ bool EntityGUI_SubShapeDlg::execute (ObjectList& objects) TColStd_IndexedMapOfInteger aMapIndex; aSelMgr->GetIndexes(aSelList.First(), aMapIndex); - GEOM::GEOM_ILocalOperations_var aLocOp = + GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations(getStudyId()); for (int i = 0, n = aList->length(); i < n; i++) @@ -590,7 +590,7 @@ bool EntityGUI_SubShapeDlg::execute (ObjectList& objects) else for (int i = 0, n = aList->length(); i < n; i++) objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); - + return objects.size(); } diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index a99fc90cd..3051bf90c 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -113,6 +113,10 @@ ICON_DLG_BUILD_EDGE_WIRE build_edge_wire.png + + ICON_DLG_BUILD_EDGE_CURVE + build_edge_curve.png + ICON_DLG_BUILD_FACE build_face.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 4215459aa..667d6a26b 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1205,6 +1205,10 @@ Please, select face, shell or solid and try again GEOM_POINT_TITLE Point Construction + + GEOM_START_POINT + Start Point + GEOM_POLYLINE Polyline @@ -2085,6 +2089,14 @@ Please, select face, shell or solid and try again WRN_SHAPE_UNCLOSED Unable to create solid from unclosed shape %1 + + WRN_SHAPE_NOT_SHELL + Unable to create solid from shape %1 as it is not a shell + + + WRN_NULL_OBJECT_OR_SHAPE + Shape %1 for solid creation is null + GEOM_X X : diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx index 07b40dc68..3cac51381 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -192,7 +191,7 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom double theParam2, double theParam3, const PointLocation theLocation, - bool theReverse) + Handle(GEOM_Object) theRefPoint) { SetErrorCode(KO); @@ -231,7 +230,10 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom case PointOn_CurveByLength: aPI.SetCurve(aRefFunction); aPI.SetLength(theParam1); - aPI.SetReversed(theReverse); + if (!theRefPoint.IsNull()) { + Handle(GEOM_Function) aRefPoint = theRefPoint->GetLastFunction(); + aPI.SetRef(aRefPoint); + } break; case PointOn_CurveByCoord: aPI.SetCurve(aRefFunction); @@ -277,7 +279,7 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom break; case PointOn_CurveByLength: GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnCurveByLength(" - << theGeomObj << ", " << theParam1 << ", " << theReverse << ")"; + << theGeomObj << ", " << theParam1 << ", " << theRefPoint << ")"; break; case PointOn_CurveByCoord: GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnCurveByCoord(" @@ -332,10 +334,10 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnCurveByCoord //============================================================================= Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnCurveByLength (Handle(GEOM_Object) theCurve, - double theLength, - bool theReverse) + double theLength, + Handle(GEOM_Object) theStartPoint) { - return makePointOnGeom(theCurve, theLength, 0.0, 0.0, PointOn_CurveByLength, theReverse); + return makePointOnGeom(theCurve, theLength, 0.0, 0.0, PointOn_CurveByLength, theStartPoint); } //============================================================================= diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx index 64d65f552..bd0e3abb4 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IBasicOperations_HXX_ #define _GEOMImpl_IBasicOperations_HXX_ @@ -44,8 +43,8 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations { double theParameter); Standard_EXPORT Handle(GEOM_Object) MakePointOnCurveByLength (Handle(GEOM_Object) theCurve, - double theLength, - bool theReverse); + double theLength, + Handle(GEOM_Object) theStartPoint); Standard_EXPORT Handle(GEOM_Object) MakePointOnCurveByCoord (Handle(GEOM_Object) theCurve, double theXParam, @@ -136,7 +135,7 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations { double theParam2, double theParam3, const PointLocation theLocation, - bool theReverse = false); + Handle(GEOM_Object) theRefPoint = 0); }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 374aa589f..5aa0feb07 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifdef WNT #pragma warning( disable:4786 ) @@ -35,6 +34,7 @@ #include #include #include +#include #include #include @@ -3283,6 +3283,10 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IBlocksOperations::Propagate TopTools_MapOfShape mapAcceptedEdges; TCollection_AsciiString aListRes, anEntry; + // Sort shapes in current chain (Mantis issue 21053) + TopTools_DataMapOfShapeListOfShape aMapChains; + TopTools_ListOfShape aFirstInChains; + for (ie = 1; ie <= nbEdges; ie++) { TopoDS_Shape curE = MEW.FindKey(ie); @@ -3343,6 +3347,21 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IBlocksOperations::Propagate listPrevEdges = listCurEdges; } // while (listPrevEdges.Extent() > 0) + // Sort shapes in current chain (Mantis issue 21053) + GEOMImpl_IShapesOperations::SortShapes(currentChain, Standard_False); + aFirstInChains.Append(currentChain.First()); + aMapChains.Bind(currentChain.First(), currentChain); + } + + // Sort chains (Mantis issue 21053) + GEOMImpl_IShapesOperations::SortShapes(aFirstInChains, Standard_False); + + // Store sorted chains in the document + TopTools_ListIteratorOfListOfShape aChainsIt (aFirstInChains); + for (; aChainsIt.More(); aChainsIt.Next()) { + TopoDS_Shape aFirstInChain = aChainsIt.Value(); + const TopTools_ListOfShape& currentChain = aMapChains.Find(aFirstInChain); + // Store the chain in the document Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger (1, currentChain.Extent()); diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index d6a259787..46ce5f9c5 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -60,6 +59,7 @@ #include #include +#include #include #include #include @@ -157,13 +157,13 @@ GEOMImpl_IMeasureOperations::ShapeKind GEOMImpl_IMeasureOperations::KindOfShape if (aShape.IsNull()) return aKind; int geom_type = theShape->GetType(); - + // check if it's advanced shape if ( geom_type > ADVANCED_BASE ) { SetErrorCode(OK); return SK_ADVANCED; } - + // Call algorithm GEOMAlgo_ShapeInfoFiller aSF; aSF.SetShape(aShape); @@ -1299,6 +1299,53 @@ bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, return isValid; } +//============================================================================= +/*! + * IsGoodForSolid + */ +//============================================================================= +TCollection_AsciiString GEOMImpl_IMeasureOperations::IsGoodForSolid (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + TCollection_AsciiString aRes = ""; + + if (theShape.IsNull()) { + aRes = "WRN_NULL_OBJECT_OR_SHAPE"; + } + else { + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) { + aRes = "WRN_NULL_OBJECT_OR_SHAPE"; + } + else { + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + aRes = "WRN_NULL_OBJECT_OR_SHAPE"; + } + else { + if (aShape.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator It (aShape, Standard_True, Standard_True); + if (It.More()) aShape = It.Value(); + } + if (aShape.ShapeType() == TopAbs_SHELL) { + if (!aShape.Closed()) { + aRes = "WRN_SHAPE_UNCLOSED"; + } + } + else { + aRes = "WRN_SHAPE_NOT_SHELL"; + } + } + } + } + + if (aRes.IsEmpty()) + SetErrorCode(OK); + + return aRes; +} + //============================================================================= /*! * WhatIs @@ -1411,9 +1458,9 @@ static double CheckSingularCase(const TopoDS_Shape& aSh1, //S->Bounds(U1,U2,V1,V2); changed by ShapeAnalysis::GetFaceUVBounds(TopoDS::Face(tmpSh1),U1,U2,V1,V2); // end of changes for 020677 (dmv) - Handle(Geom_RectangularTrimmedSurface) TrS1 = + Handle(Geom_RectangularTrimmedSurface) TrS1 = new Geom_RectangularTrimmedSurface(S,U1,(U1+U2)/2.,V1,V2); - Handle(Geom_RectangularTrimmedSurface) TrS2 = + Handle(Geom_RectangularTrimmedSurface) TrS2 = new Geom_RectangularTrimmedSurface(S,(U1+U2)/2.,U2,V1,V2); BRep_Builder B; TopoDS_Face F1,F2; @@ -1481,9 +1528,9 @@ static double CheckSingularCase(const TopoDS_Shape& aSh1, double U1,U2,V1,V2; //S->Bounds(U1,U2,V1,V2); ShapeAnalysis::GetFaceUVBounds(TopoDS::Face(tmpSh2),U1,U2,V1,V2); - Handle(Geom_RectangularTrimmedSurface) TrS1 = + Handle(Geom_RectangularTrimmedSurface) TrS1 = new Geom_RectangularTrimmedSurface(S,U1,(U1+U2)/2.,V1,V2); - Handle(Geom_RectangularTrimmedSurface) TrS2 = + Handle(Geom_RectangularTrimmedSurface) TrS2 = new Geom_RectangularTrimmedSurface(S,(U1+U2)/2.,U2,V1,V2); BRep_Builder B; TopoDS_Face F1,F2; @@ -1686,8 +1733,8 @@ static bool CheckSingularCase(const TopoDS_Shape& aSh1, */ //============================================================================= std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, - const std::vector& coords, - double tolerance) + const std::vector& coords, + double tolerance) { std::vector res; if (!theShape.IsNull()) { @@ -1695,16 +1742,16 @@ std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Objec if (!aRefShape.IsNull()) { TopoDS_Shape aShape = aRefShape->GetValue(); if (!aShape.IsNull()) { - BRepClass3d_SolidClassifier SC(aShape); - unsigned int nb_points = coords.size()/3; - for (int i = 0; i < nb_points; i++) { - double x = coords[3*i]; - double y = coords[3*i+1]; - double z = coords[3*i+2]; - gp_Pnt aPnt(x, y, z); - SC.Perform(aPnt, tolerance); - res.push_back( ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ) ); - } + BRepClass3d_SolidClassifier SC(aShape); + unsigned int nb_points = coords.size()/3; + for (int i = 0; i < nb_points; i++) { + double x = coords[3*i]; + double y = coords[3*i+1]; + double z = coords[3*i+2]; + gp_Pnt aPnt(x, y, z); + SC.Perform(aPnt, tolerance); + res.push_back( ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ) ); + } } } } @@ -1912,6 +1959,72 @@ Standard_Real GEOMImpl_IMeasureOperations::GetAngle (Handle(GEOM_Object) theLine anAngle = aLin1.Angle(aLin2); anAngle /= PI180; // convert radians into degrees + if (anAngle > 90.0) { + anAngle = 180.0 - anAngle; + } + + SetErrorCode(OK); + } + catch (Standard_Failure) + { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + } + + return anAngle; +} + +//======================================================================= +/*! + * Compute angle (in degrees) between two vectors + */ +//======================================================================= +Standard_Real GEOMImpl_IMeasureOperations::GetAngleBtwVectors (Handle(GEOM_Object) theVec1, + Handle(GEOM_Object) theVec2) +{ + SetErrorCode(KO); + + Standard_Real anAngle = -1.0; + + if (theVec1.IsNull() || theVec2.IsNull()) + return anAngle; + + Handle(GEOM_Function) aRefVec1 = theVec1->GetLastFunction(); + Handle(GEOM_Function) aRefVec2 = theVec2->GetLastFunction(); + if (aRefVec1.IsNull() || aRefVec2.IsNull()) + return anAngle; + + TopoDS_Shape aVec1 = aRefVec1->GetValue(); + TopoDS_Shape aVec2 = aRefVec2->GetValue(); + if (aVec1.IsNull() || aVec2.IsNull() || + aVec1.ShapeType() != TopAbs_EDGE || + aVec2.ShapeType() != TopAbs_EDGE) + { + SetErrorCode("Two edges must be given"); + return anAngle; + } + + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + TopoDS_Edge aE1 = TopoDS::Edge(aVec1); + TopoDS_Edge aE2 = TopoDS::Edge(aVec2); + + TopoDS_Vertex aP11, aP12, aP21, aP22; + TopExp::Vertices(aE1, aP11, aP12, Standard_True); + TopExp::Vertices(aE2, aP21, aP22, Standard_True); + if (aP11.IsNull() || aP12.IsNull() || aP21.IsNull() || aP22.IsNull()) { + SetErrorCode("Bad edge given"); + return anAngle; + } + + gp_Vec aV1 (BRep_Tool::Pnt(aP11), BRep_Tool::Pnt(aP12)); + gp_Vec aV2 (BRep_Tool::Pnt(aP21), BRep_Tool::Pnt(aP22)) ; + + anAngle = aV1.Angle(aV2); + anAngle /= PI180; // convert radians into degrees + SetErrorCode(OK); } catch (Standard_Failure) @@ -1957,7 +2070,7 @@ Standard_Real GEOMImpl_IMeasureOperations::CurveCurvatureByParam #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif - GeomLProp_CLProps Prop = GeomLProp_CLProps + GeomLProp_CLProps Prop = GeomLProp_CLProps (aCurve, aP, 2, Precision::Confusion()); aRes = fabs(Prop.Curvature()); SetErrorCode(OK); @@ -1972,7 +2085,7 @@ Standard_Real GEOMImpl_IMeasureOperations::CurveCurvatureByParam aRes = 1/aRes; else aRes = RealLast(); - + return aRes; } @@ -2013,7 +2126,7 @@ Standard_Real GEOMImpl_IMeasureOperations::CurveCurvatureByPoint #endif GeomAPI_ProjectPointOnCurve PPCurve(aPoint, aCurve, aFP, aLP); if(PPCurve.NbPoints()>0) { - GeomLProp_CLProps Prop = GeomLProp_CLProps + GeomLProp_CLProps Prop = GeomLProp_CLProps (aCurve, PPCurve.LowerDistanceParameter(), 2, Precision::Confusion()); aRes = fabs(Prop.Curvature()); SetErrorCode(OK); @@ -2029,7 +2142,7 @@ Standard_Real GEOMImpl_IMeasureOperations::CurveCurvatureByPoint aRes = 1/aRes; else aRes = RealLast(); - + return aRes; } @@ -2054,7 +2167,7 @@ Standard_Real GEOMImpl_IMeasureOperations::getSurfaceCurvatures #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif - GeomLProp_SLProps Prop = GeomLProp_SLProps + GeomLProp_SLProps Prop = GeomLProp_SLProps (aSurf, theUParam, theVParam, 2, Precision::Confusion()); if(Prop.IsCurvatureDefined()) { if(Prop.IsUmbilic()) { @@ -2083,7 +2196,7 @@ Standard_Real GEOMImpl_IMeasureOperations::getSurfaceCurvatures aRes = 1/aRes; else aRes = RealLast(); - + return aRes; } @@ -2120,7 +2233,7 @@ Standard_Real GEOMImpl_IMeasureOperations::MaxSurfaceCurvatureByParam ShapeAnalysis::GetFaceUVBounds(F,U1,U2,V1,V2); Standard_Real U = U1 + (U2-U1)*theUParam; Standard_Real V = V1 + (V2-V1)*theVParam; - + return getSurfaceCurvatures(aSurf, U, V, true); } @@ -2193,7 +2306,7 @@ Standard_Real GEOMImpl_IMeasureOperations::MinSurfaceCurvatureByParam ShapeAnalysis::GetFaceUVBounds(F,U1,U2,V1,V2); Standard_Real U = U1 + (U2-U1)*theUParam; Standard_Real V = V1 + (V2-V1)*theVParam; - + return getSurfaceCurvatures(aSurf, U, V, false); } diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index 5696d48cc..471bfb851 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IMeasureOperations_HXX_ #define _GEOMImpl_IMeasureOperations_HXX_ @@ -127,11 +126,13 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { const Standard_Boolean theIsCheckGeom, TCollection_AsciiString& theDump); + Standard_EXPORT TCollection_AsciiString IsGoodForSolid (Handle(GEOM_Object) theShape); + Standard_EXPORT TCollection_AsciiString WhatIs (Handle(GEOM_Object) theShape); Standard_EXPORT std::vector AreCoordsInside (Handle(GEOM_Object) theShape, - const std::vector& coords, - double tolerance = Precision::Confusion()); + const std::vector& coords, + double tolerance = Precision::Confusion()); Standard_EXPORT Standard_Real GetMinDistance (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, @@ -143,6 +144,8 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Standard_EXPORT Standard_Real GetAngle (Handle(GEOM_Object) theLine1, Handle(GEOM_Object) theLine2); + Standard_EXPORT Standard_Real GetAngleBtwVectors (Handle(GEOM_Object) theVec1, Handle(GEOM_Object) theVec2); + // Methods for recieving radiuses of curvature of curves and surfaces // in the given point diff --git a/src/GEOMImpl/GEOMImpl_IPoint.hxx b/src/GEOMImpl/GEOMImpl_IPoint.hxx index c11569533..94d156e35 100755 --- a/src/GEOMImpl/GEOMImpl_IPoint.hxx +++ b/src/GEOMImpl/GEOMImpl_IPoint.hxx @@ -18,10 +18,9 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -//NOTE: This is an intreface to a function for the point creation. -// +//NOTE: This is an interface to a function for the point creation. + #include "GEOM_Function.hxx" #define ARG_X 1 @@ -40,7 +39,7 @@ #define ARG_LENGTH 11 -#define ARG_FLAG 12 +//#define ARG_FLAG 12 class GEOMImpl_IPoint { @@ -73,12 +72,12 @@ class GEOMImpl_IPoint void SetParameter(double theParam) { _func->SetReal(ARG_PARAM, theParam); } void SetParameter2(double theParam) { _func->SetReal(ARG_PARAM2, theParam); } void SetLength(double theLength) { _func->SetReal(ARG_LENGTH, theLength); } - void SetReversed(bool theReversed) { _func->SetInteger(ARG_FLAG, theReversed); } + //void SetReversed(bool theReversed) { _func->SetInteger(ARG_FLAG, theReversed); } double GetParameter() { return _func->GetReal(ARG_PARAM); } double GetParameter2() { return _func->GetReal(ARG_PARAM2); } double GetLength() { return _func->GetReal(ARG_LENGTH); } - bool GetReversed() { return _func->GetInteger(ARG_FLAG); } + //bool GetReversed() { return _func->GetInteger(ARG_FLAG); } private: diff --git a/src/GEOMImpl/GEOMImpl_IShapes.hxx b/src/GEOMImpl/GEOMImpl_IShapes.hxx index dcdb59265..214ed6a7c 100644 --- a/src/GEOMImpl/GEOMImpl_IShapes.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapes.hxx @@ -18,11 +18,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// NOTE: This is an intreface to a function for the Shapes -// (Wire, Face, Shell, Solid and Compound) creation. -// +// NOTE: This is an interface to a function for the Shapes +// (Edge, Wire, Face, Shell, Solid and Compound) creation. + #include "GEOM_Function.hxx" #include "TColStd_HSequenceOfTransient.hxx" diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 920d2c943..9b4f0e9b8 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -18,7 +18,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 -// + // File : GEOMImpl_IShapesOperations.cxx // Created : // Author : modified by Lioka RAZAFINDRAZAKA (CEA) 22/06/2007 @@ -209,6 +209,67 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeEdge return anEdge; } +//============================================================================= +/*! + * MakeEdgeOnCurveByLength + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeEdgeOnCurveByLength + (Handle(GEOM_Object) theRefCurve, + const Standard_Real theLength, + Handle(GEOM_Object) theStartPoint) +{ + SetErrorCode(KO); + + if (theRefCurve.IsNull()) return NULL; + + //Add a new Edge object + Handle(GEOM_Object) anEdge = GetEngine()->AddObject(GetDocID(), GEOM_EDGE); + + //Add a new Vector function + Handle(GEOM_Function) aFunction = + anEdge->AddFunction(GEOMImpl_ShapeDriver::GetID(), EDGE_CURVE_LENGTH); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IVector aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theRefCurve->GetLastFunction(); + if (aRef1.IsNull()) return NULL; + aPI.SetPoint1(aRef1); + + if (!theStartPoint.IsNull()) { + Handle(GEOM_Function) aRef2 = theStartPoint->GetLastFunction(); + aPI.SetPoint2(aRef2); + } + + aPI.SetParameter(theLength); + + //Compute the Edge value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Vector 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) << anEdge << " = geompy.MakeEdgeOnCurveByLength(" + << theRefCurve << ", " << theLength << ", " << theStartPoint << ")"; + + SetErrorCode(OK); + return anEdge; +} + //============================================================================= /*! * MakeEdgeWire @@ -4089,7 +4150,17 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSame(const Handle(GEOM_Object TopoDS_Shape aSubShape; TopTools_MapOfShape aMap; - switch(aWhat.ShapeType()) { + if (aWhat.ShapeType() == TopAbs_COMPOUND || aWhat.ShapeType() == TopAbs_COMPSOLID) { + TopoDS_Iterator It (aWhat, Standard_True, Standard_True); + if (It.More()) aWhat = It.Value(); + It.Next(); + if (It.More()) { + SetErrorCode("Compounds of two or more shapes are not allowed for aWhat argument"); + return NULL; + } + } + + switch (aWhat.ShapeType()) { case TopAbs_VERTEX: { gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aWhat)); TopExp_Explorer E(aWhere, TopAbs_VERTEX); @@ -4104,12 +4175,12 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSame(const Handle(GEOM_Object } break; } - case TopAbs_FACE: { - TopoDS_Face aFace = TopoDS::Face(aWhat); - TopExp_Explorer E(aWhere, TopAbs_FACE); + case TopAbs_EDGE: { + TopoDS_Edge anEdge = TopoDS::Edge(aWhat); + TopExp_Explorer E(aWhere, TopAbs_EDGE); for(; E.More(); E.Next()) { if(!aMap.Add(E.Current())) continue; - if(isSameFace(aFace, TopoDS::Face(E.Current()))) { + if(isSameEdge(anEdge, TopoDS::Edge(E.Current()))) { aSubShape = E.Current(); isFound = true; break; @@ -4117,12 +4188,12 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSame(const Handle(GEOM_Object } break; } - case TopAbs_EDGE: { - TopoDS_Edge anEdge = TopoDS::Edge(aWhat); - TopExp_Explorer E(aWhere, TopAbs_EDGE); + case TopAbs_FACE: { + TopoDS_Face aFace = TopoDS::Face(aWhat); + TopExp_Explorer E(aWhere, TopAbs_FACE); for(; E.More(); E.Next()) { if(!aMap.Add(E.Current())) continue; - if(isSameEdge(anEdge, TopoDS::Edge(E.Current()))) { + if(isSameFace(aFace, TopoDS::Face(E.Current()))) { aSubShape = E.Current(); isFound = true; break; @@ -4147,14 +4218,14 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSame(const Handle(GEOM_Object return NULL; } - if(isFound) { + if (isFound) { TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(aWhere, anIndices); if (anIndices.Contains(aSubShape)) anIndex = anIndices.FindIndex(aSubShape); } - if(anIndex < 0) return NULL; + if (anIndex < 0) return NULL; Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index 607a1283f..53583e14c 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -54,6 +54,11 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations Standard_EXPORT Handle(GEOM_Object) MakeEdge (Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) MakeEdgeOnCurveByLength (Handle(GEOM_Object) theCurve, + const Standard_Real theLength, + Handle(GEOM_Object) theStartPoint); + Standard_EXPORT Handle(GEOM_Object) MakeEdgeWire (Handle(GEOM_Object) theWire, const Standard_Real theLinearTolerance, const Standard_Real theAngularTolerance); diff --git a/src/GEOMImpl/GEOMImpl_IVector.hxx b/src/GEOMImpl/GEOMImpl_IVector.hxx index 6e07703ee..7aedebf0e 100644 --- a/src/GEOMImpl/GEOMImpl_IVector.hxx +++ b/src/GEOMImpl/GEOMImpl_IVector.hxx @@ -18,10 +18,9 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -//NOTE: This is an intreface to a function for the vector creation. -// +//NOTE: This is an interface to a function for the vector creation. + #include "GEOM_Function.hxx" #define VEC_ARG_DX 1 diff --git a/src/GEOMImpl/GEOMImpl_PointDriver.cxx b/src/GEOMImpl/GEOMImpl_PointDriver.cxx index 4d08102d7..f39665e6c 100644 --- a/src/GEOMImpl/GEOMImpl_PointDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PointDriver.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -27,27 +26,34 @@ #include #include +#include + +#include #include +#include #include #include -#include -#include -#include + #include +#include #include #include +#include #include #include #include +#include +#include + #include #include + #include -#include -#include -#include -#include +#include + +#include //======================================================================= //function : GetID @@ -73,23 +79,22 @@ GEOMImpl_PointDriver::GEOMImpl_PointDriver() //purpose : local function //======================================================================= static Standard_Boolean getExtremaSolution -(GEOMImpl_IPoint& thePI, - TopoDS_Shape& theRefShape, +(const gp_Pnt& theInitPnt, + const TopoDS_Shape& theRefShape, gp_Pnt& thePnt) { - gp_Pnt anInitPnt( thePI.GetX(), thePI.GetY(), thePI.GetZ() ); - BRepBuilderAPI_MakeVertex mkVertex (anInitPnt); + BRepBuilderAPI_MakeVertex mkVertex (theInitPnt); TopoDS_Vertex anInitV = TopoDS::Vertex(mkVertex.Shape()); - BRepExtrema_DistShapeShape anExt( anInitV, theRefShape ); + BRepExtrema_DistShapeShape anExt (anInitV, theRefShape); if ( !anExt.IsDone() || anExt.NbSolution() < 1 ) return Standard_False; thePnt = anExt.PointOnShape2(1); - Standard_Real aMinDist2 = anInitPnt.SquareDistance( thePnt ); + Standard_Real aMinDist2 = theInitPnt.SquareDistance( thePnt ); for ( Standard_Integer j = 2, jn = anExt.NbSolution(); j <= jn; j++ ) { gp_Pnt aPnt = anExt.PointOnShape2(j); - Standard_Real aDist2 = anInitPnt.SquareDistance( aPnt ); + Standard_Real aDist2 = theInitPnt.SquareDistance( aPnt ); if ( aDist2 > aMinDist2) continue; aMinDist2 = aDist2; @@ -116,10 +121,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const if (aType == POINT_XYZ) { aPnt = gp_Pnt(aPI.GetX(), aPI.GetY(), aPI.GetZ()); - } else if (aType == POINT_XYZ_REF) { - Handle(GEOM_Function) aRefPoint = aPI.GetRef(); TopoDS_Shape aRefShape = aRefPoint->GetValue(); if (aRefShape.ShapeType() != TopAbs_VERTEX) { @@ -148,35 +151,72 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const Standard_TypeMismatch::Raise ("Point On Curve creation aborted : curve shape is not an edge"); } - if (!getExtremaSolution( aPI, aRefShape, aPnt ) ) { + gp_Pnt anInitPnt (aPI.GetX(), aPI.GetY(), aPI.GetZ()); + if (!getExtremaSolution(anInitPnt, aRefShape, aPnt)) { Standard_ConstructionError::Raise ("Point On Curve creation aborted : cannot project point"); } } else if (aType == POINT_CURVE_LENGTH) { + // RefCurve Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); - Standard_Real theLength = aPI.GetLength(); - Standard_Integer theReversed = aPI.GetReversed(); - TopoDS_Shape aRefShape = aRefCurve->GetValue(); - Standard_Real UFirst = 0; - Standard_Real ULast = 0; - if (aRefShape.ShapeType() != TopAbs_EDGE) { + if (aRefCurve.IsNull()) { + Standard_NullObject::Raise + ("Point On Curve creation aborted : curve object is null"); + } + TopoDS_Shape aRefShape1 = aRefCurve->GetValue(); + if (aRefShape1.ShapeType() != TopAbs_EDGE) { Standard_TypeMismatch::Raise ("Point On Curve creation aborted : curve shape is not an edge"); - } - Standard_Real theCurveLength = IntTools::Length(TopoDS::Edge(aRefShape)); - if (theLength > theCurveLength) { - Standard_ConstructionError::Raise - ("Point On Curve creation aborted : given length is greater than edges length"); } - Handle(Geom_Curve) EdgeCurve = BRep_Tool::Curve(TopoDS::Edge(aRefShape), UFirst, ULast); + TopoDS_Edge aRefEdge = TopoDS::Edge(aRefShape1); + TopoDS_Vertex V1, V2; + TopExp::Vertices(aRefEdge, V1, V2, Standard_True); + + // RefPoint + TopoDS_Vertex aRefVertex; + Handle(GEOM_Function) aRefPoint = aPI.GetRef(); + if (aRefPoint.IsNull()) { + aRefVertex = V1; + } + else { + TopoDS_Shape aRefShape2 = aRefPoint->GetValue(); + if (aRefShape2.ShapeType() != TopAbs_VERTEX) { + Standard_TypeMismatch::Raise + ("Point On Curve creation aborted : start point shape is not a vertex"); + } + aRefVertex = TopoDS::Vertex(aRefShape2); + } + gp_Pnt aRefPnt = BRep_Tool::Pnt(aRefVertex); + + // Length + Standard_Real aLength = aPI.GetLength(); + //Standard_Real theCurveLength = IntTools::Length(aRefEdge); + //if (aLength > theCurveLength) { + // Standard_ConstructionError::Raise + // ("Point On Curve creation aborted : given length is greater than edges length"); + //} + + // Check orientation + Standard_Real UFirst, ULast; + Handle(Geom_Curve) EdgeCurve = BRep_Tool::Curve(aRefEdge, UFirst, ULast); Handle(Geom_Curve) ReOrientedCurve = EdgeCurve; - if ( theReversed ) { - ReOrientedCurve = EdgeCurve -> Reversed(); - UFirst = EdgeCurve -> ReversedParameter(ULast); + + Standard_Real dU = ULast - UFirst; + Standard_Real par1 = UFirst + 0.1 * dU; + Standard_Real par2 = ULast - 0.1 * dU; + + gp_Pnt P1 = EdgeCurve->Value(par1); + gp_Pnt P2 = EdgeCurve->Value(par2); + + if (aRefPnt.SquareDistance(P2) < aRefPnt.SquareDistance(P1)) { + ReOrientedCurve = EdgeCurve->Reversed(); + UFirst = EdgeCurve->ReversedParameter(ULast); } + + // Get the point by length GeomAdaptor_Curve AdapCurve = GeomAdaptor_Curve(ReOrientedCurve); - GCPnts_AbscissaPoint anAbsPnt(AdapCurve, theLength, UFirst); + GCPnts_AbscissaPoint anAbsPnt (AdapCurve, aLength, UFirst); Standard_Real aParam = anAbsPnt.Parameter(); aPnt = AdapCurve.Value(aParam); } @@ -203,7 +243,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const Standard_TypeMismatch::Raise ("Point On Surface creation aborted : surface shape is not a face"); } - if (!getExtremaSolution( aPI, aRefShape, aPnt ) ) { + gp_Pnt anInitPnt (aPI.GetX(), aPI.GetY(), aPI.GetZ()); + if (!getExtremaSolution(anInitPnt, aRefShape, aPnt)) { Standard_ConstructionError::Raise ("Point On Surface creation aborted : cannot project point"); } diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index 334bfbc09..f4e9fb3ec 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -18,11 +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 -// #include #include +#include #include #include @@ -33,26 +33,27 @@ #include #include -#include #include +#include +#include #include -#include #include +#include +#include +#include #include #include #include #include -#include -#include #include #include #include -#include #include -#include #include +#include +#include #include #include #include @@ -61,12 +62,20 @@ #include #include #include -#include -#include #include #include +#include + +#include + +#include +#include +#include +#include +#include + #include #include #include @@ -74,13 +83,8 @@ #include #include -#include -#include -#include -#include -#include - #include + #include #include #include @@ -145,7 +149,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire; aFW->Load(aWire); aFW->FixReorder(); - + if (aFW->StatusReorder(ShapeExtend_FAIL1)) { Standard_ConstructionError::Raise("Wire construction failed: several loops detected"); } else if (aFW->StatusReorder(ShapeExtend_FAIL)) { @@ -157,7 +161,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Standard_Real aTolerance = aCI.GetTolerance(); if (aTolerance < Precision::Confusion()) aTolerance = Precision::Confusion(); - + aFW->ClosedWireMode() = Standard_False; aFW->FixConnected(aTolerance); if (aFW->StatusConnected(ShapeExtend_FAIL)) { @@ -204,7 +208,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const if (!MW.IsDone()) { Standard_ConstructionError::Raise("Wire construction failed"); } - W = MW; + W = MW; } else { Standard_NullObject::Raise @@ -370,12 +374,16 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const else if (aType == SOLID_SHELL) { Handle(GEOM_Function) aRefShell = aCI.GetBase(); TopoDS_Shape aShapeShell = aRefShell->GetValue(); + if (!aShapeShell.IsNull() && aShapeShell.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator It (aShapeShell, Standard_True, Standard_True); + if (It.More()) aShapeShell = It.Value(); + } if (aShapeShell.IsNull() || aShapeShell.ShapeType() != TopAbs_SHELL) { Standard_NullObject::Raise("Shape for solid construction is null or not a shell"); } BRepCheck_Shell chkShell(TopoDS::Shell(aShapeShell)); - if(chkShell.Closed() == BRepCheck_NotClosed) return 0; + if (chkShell.Closed() == BRepCheck_NotClosed) return 0; TopoDS_Solid Sol; B.MakeSolid(Sol); @@ -404,12 +412,16 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const if (aShapeShell.IsNull()) { Standard_NullObject::Raise("Shell for solid construction is null"); } + if (aShapeShell.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator It (aShapeShell, Standard_True, Standard_True); + if (It.More()) aShapeShell = It.Value(); + } if (aShapeShell.ShapeType() == TopAbs_SHELL) { B.Add(Sol, aShapeShell); ish++; } } - if ( ish == 0 ) return 0; + if (ish == 0) return 0; BRepClass3d_SolidClassifier SC (Sol); SC.PerformInfinitePoint(Precision::Confusion()); if (SC.State() == TopAbs_IN) @@ -550,7 +562,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const case GeomAbs_Line: { gp_Lin aLine = BAcurve.Line(); - gp_Lin PrevLine = GAprevcurve.Line(); + gp_Lin PrevLine = GAprevcurve.Line(); if (aLine.Contains(PrevLine.Location(), LinTol) && aLine.Direction().IsParallel(PrevLine.Direction(), AngTol)) { @@ -719,33 +731,33 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Standard_Integer nb_curve = CurveSeq.Length(); //number of curves TColGeom_Array1OfBSplineCurve tab(0,nb_curve-1); //array of the curves TColStd_Array1OfReal tabtolvertex(0,nb_curve-1); //(0,nb_curve-2); //array of the tolerances - + Standard_Integer i; - + if (nb_curve > 1) { for (i = 1; i <= nb_curve; i++) { if (CurveSeq(i)->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) CurveSeq(i) = (*((Handle(Geom_TrimmedCurve)*)&(CurveSeq(i))))->BasisCurve(); - + Handle(Geom_TrimmedCurve) aTrCurve = new Geom_TrimmedCurve(CurveSeq(i), FparSeq(i), LparSeq(i)); tab(i-1) = GeomConvert::CurveToBSplineCurve(aTrCurve); tab(i-1)->Transform(LocSeq(i).Location().Transformation()); GeomConvert::C0BSplineToC1BSplineCurve(tab(i-1), Precision::Confusion()); if (LocSeq(i).Orientation() == TopAbs_REVERSED) tab(i-1)->Reverse(); - + //Temporary //char* name = new char[100]; //sprintf(name, "c%d", i); //DrawTrSurf::Set(name, tab(i-1)); - + if (i > 1) tabtolvertex(i-2) = TolSeq(i-1); } // end for (i = 1; i <= nb_curve; i++) tabtolvertex(nb_curve-1) = TolSeq(TolSeq.Length()); - + Standard_Boolean closed_flag = Standard_False; Standard_Real closed_tolerance = 0.; if (FirstVertex.IsSame(LastVertex) && @@ -757,7 +769,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const closed_flag = Standard_True ; closed_tolerance = BRep_Tool::Tolerance(FirstVertex); } - + Handle(TColGeom_HArray1OfBSplineCurve) concatcurve; //array of the concatenated curves Handle(TColStd_HArray1OfInteger) ArrayOfIndices; //array of the remining Vertex GeomConvert::ConcatC1(tab, @@ -766,17 +778,17 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const concatcurve, closed_flag, closed_tolerance); //C1 concatenation - + if (concatcurve->Length() > 1) { GeomConvert_CompCurveToBSplineCurve Concat(concatcurve->Value(concatcurve->Lower())); - + for (i = concatcurve->Lower()+1; i <= concatcurve->Upper(); i++) Concat.Add( concatcurve->Value(i), LinTol, Standard_True ); - + concatcurve->SetValue(concatcurve->Lower(), Concat.BSplineCurve()); } - + ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()), FirstVertex, LastVertex); } @@ -784,16 +796,93 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const { if (CurveSeq(1)->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) CurveSeq(1) = (*((Handle(Geom_TrimmedCurve)*)&(CurveSeq(i))))->BasisCurve(); - + CurveSeq(1)->Transform(LocSeq(1).Location().Transformation()); ResEdge = BRepLib_MakeEdge(CurveSeq(1), FirstVertex, LastVertex, FparSeq(1), LparSeq(1)); } } - + aShape = ResEdge; } + else if (aType == EDGE_CURVE_LENGTH) { + GEOMImpl_IVector aVI (aFunction); + + // RefCurve + Handle(GEOM_Function) aRefCurve = aVI.GetPoint1(); + if (aRefCurve.IsNull()) Standard_NullObject::Raise("Argument Curve is null"); + TopoDS_Shape aRefShape1 = aRefCurve->GetValue(); + if (aRefShape1.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise + ("Edge On Curve creation aborted : curve shape is not an edge"); + } + TopoDS_Edge aRefEdge = TopoDS::Edge(aRefShape1); + TopoDS_Vertex V1, V2; + TopExp::Vertices(aRefEdge, V1, V2, Standard_True); + + // RefPoint + TopoDS_Vertex aRefVertex; + Handle(GEOM_Function) aRefPoint = aVI.GetPoint2(); + if (aRefPoint.IsNull()) { + aRefVertex = V1; + } + else { + TopoDS_Shape aRefShape2 = aRefPoint->GetValue(); + if (aRefShape2.ShapeType() != TopAbs_VERTEX) { + Standard_TypeMismatch::Raise + ("Edge On Curve creation aborted : start point shape is not a vertex"); + } + aRefVertex = TopoDS::Vertex(aRefShape2); + } + gp_Pnt aRefPnt = BRep_Tool::Pnt(aRefVertex); + + // Length + Standard_Real aLength = aVI.GetParameter(); + //Standard_Real aCurveLength = IntTools::Length(aRefEdge); + //if (aLength > aCurveLength) { + // Standard_ConstructionError::Raise + // ("Edge On Curve creation aborted : given length is greater than edges length"); + //} + if (fabs(aLength) < Precision::Confusion()) { + Standard_ConstructionError::Raise + ("Edge On Curve creation aborted : given length is smaller than Precision::Confusion()"); + } + + // Check orientation + Standard_Real UFirst, ULast; + Handle(Geom_Curve) EdgeCurve = BRep_Tool::Curve(aRefEdge, UFirst, ULast); + Handle(Geom_Curve) ReOrientedCurve = EdgeCurve; + + Standard_Real dU = ULast - UFirst; + Standard_Real par1 = UFirst + 0.1 * dU; + Standard_Real par2 = ULast - 0.1 * dU; + + gp_Pnt P1 = EdgeCurve->Value(par1); + gp_Pnt P2 = EdgeCurve->Value(par2); + + if (aRefPnt.SquareDistance(P2) < aRefPnt.SquareDistance(P1)) { + ReOrientedCurve = EdgeCurve->Reversed(); + UFirst = EdgeCurve->ReversedParameter(ULast); + } + + // Get the point by length + GeomAdaptor_Curve AdapCurve = GeomAdaptor_Curve(ReOrientedCurve); + GCPnts_AbscissaPoint anAbsPnt (AdapCurve, aLength, UFirst); + Standard_Real aParam = anAbsPnt.Parameter(); + + if (AdapCurve.IsClosed() && aLength < 0.0) { + Standard_Real aTmp = aParam; + aParam = UFirst; + UFirst = aTmp; + } + + BRepBuilderAPI_MakeEdge aME (ReOrientedCurve, UFirst, aParam); + if (aME.IsDone()) + aShape = aME.Shape(); + } + else { + } if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 6b98bf77b..b9c6f2bdf 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -18,10 +18,9 @@ // 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_Object types -// + #define GEOM_COPY 0 #define GEOM_IMPORT 1 @@ -259,6 +258,7 @@ #define FACE_WIRES 9 #define REVERSE_ORIENTATION 10 #define EDGE_WIRE 11 +#define EDGE_CURVE_LENGTH 12 #define ARCHIMEDE_TYPE 1 diff --git a/src/GEOMImpl/GEOMImpl_VectorDriver.cxx b/src/GEOMImpl/GEOMImpl_VectorDriver.cxx index c7a67168f..98a9a600e 100644 --- a/src/GEOMImpl/GEOMImpl_VectorDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_VectorDriver.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.cc b/src/GEOM_I/GEOM_IBasicOperations_i.cc index d11abf3db..4bea49cc2 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.cc +++ b/src/GEOM_I/GEOM_IBasicOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -162,8 +161,8 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnCurve //============================================================================= GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnCurveByLength (GEOM::GEOM_Object_ptr theCurve, - CORBA::Double theLength, - CORBA::Boolean theReverse) + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint) { GEOM::GEOM_Object_var aGEOMObject; @@ -174,10 +173,15 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnCurveByLength Handle(GEOM_Object) aReference = GetObjectImpl(theCurve); if (aReference.IsNull()) return aGEOMObject._retn(); + //Get the reference point (can be NULL) + Handle(GEOM_Object) aRefPoint; + if (!CORBA::is_nil(theStartPoint)) { + aRefPoint = GetObjectImpl(theStartPoint); + } + //Create the point Handle(GEOM_Object) anObject = - GetOperations()->MakePointOnCurveByLength(aReference, theLength, - theReverse); + GetOperations()->MakePointOnCurveByLength(aReference, theLength, aRefPoint); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.hh b/src/GEOM_I/GEOM_IBasicOperations_i.hh index 7fa357065..6b9a68cfe 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.hh +++ b/src/GEOM_I/GEOM_IBasicOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IBasicOperations_i_HeaderFile #define _GEOM_IBasicOperations_i_HeaderFile @@ -56,8 +55,8 @@ class GEOM_I_EXPORT GEOM_IBasicOperations_i : CORBA::Double theParameter); GEOM::GEOM_Object_ptr MakePointOnCurveByLength (GEOM::GEOM_Object_ptr theCurve, - CORBA::Double theLength, - CORBA::Boolean theReverse); + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint); GEOM::GEOM_Object_ptr MakePointOnCurveByCoord (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theXParameter, diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index dc6f9c0c6..94816c6ed 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -367,6 +366,25 @@ CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry (GEOM::GEOM_Obj return 0; } +//============================================================================= +/*! + * IsGoodForSolid + */ +//============================================================================= +char* GEOM_IMeasureOperations_i::IsGoodForSolid (GEOM::GEOM_Object_ptr theShape) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference shape + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + if (aShape.IsNull()) return CORBA::string_dup("WRN_NULL_OBJECT_OR_SHAPE"); + + // Get shape parameters + TCollection_AsciiString aDescription = GetOperations()->IsGoodForSolid(aShape); + return CORBA::string_dup(aDescription.ToCString()); +} + //============================================================================= /*! * WhatIs @@ -392,8 +410,8 @@ char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape) */ //============================================================================= GEOM::ListOfBool* GEOM_IMeasureOperations_i::AreCoordsInside (GEOM::GEOM_Object_ptr theShape, - const GEOM::ListOfDouble& theCoords, - CORBA::Double tolerance) + const GEOM::ListOfDouble& theCoords, + CORBA::Double tolerance) { //Set a not done flag GetOperations()->SetNotDone(); @@ -477,6 +495,26 @@ CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShap return GetOperations()->GetAngle(aShape1, aShape2); } +//============================================================================= +/*! + * GetAngle + */ +//============================================================================= +CORBA::Double GEOM_IMeasureOperations_i::GetAngleBtwVectors (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference shapes + Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1); + Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2); + if (aShape1.IsNull() || aShape2.IsNull()) return -1.0; + + // Get the angle + return GetOperations()->GetAngleBtwVectors(aShape1, aShape2); +} + //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index af88d448f..e869ecb10 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IMeasureOperations_i_HeaderFile #define _GEOM_IMeasureOperations_i_HeaderFile @@ -39,91 +38,96 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i : { public: GEOM_IMeasureOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IMeasureOperations* theImpl); + ::GEOMImpl_IMeasureOperations* theImpl); ~GEOM_IMeasureOperations_i(); GEOM::GEOM_IKindOfShape::shape_kind KindOfShape (GEOM::GEOM_Object_ptr theShape, - GEOM::ListOfLong_out theIntegers, - GEOM::ListOfDouble_out theDoubles); + GEOM::ListOfLong_out theIntegers, + GEOM::ListOfDouble_out theDoubles); void GetPosition (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& Ox, CORBA::Double& Oy, CORBA::Double& Oz, - CORBA::Double& Zx, CORBA::Double& Zy, CORBA::Double& Zz, - CORBA::Double& Xx, CORBA::Double& Xy, CORBA::Double& Xz); + CORBA::Double& Ox, CORBA::Double& Oy, CORBA::Double& Oz, + CORBA::Double& Zx, CORBA::Double& Zy, CORBA::Double& Zz, + CORBA::Double& Xx, CORBA::Double& Xy, CORBA::Double& Xz); void GetBasicProperties (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& theLength, - CORBA::Double& theSurfArea, - CORBA::Double& theVolume); + CORBA::Double& theLength, + CORBA::Double& theSurfArea, + CORBA::Double& theVolume); GEOM::GEOM_Object_ptr GetCentreOfMass (GEOM::GEOM_Object_ptr theShape); GEOM::GEOM_Object_ptr GetNormal (GEOM::GEOM_Object_ptr theFace, - GEOM::GEOM_Object_ptr theOptionalPoint); + GEOM::GEOM_Object_ptr theOptionalPoint); - GEOM::GEOM_Object_ptr GetVertexByIndex (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr GetVertexByIndex (GEOM::GEOM_Object_ptr theObject, CORBA::Long theIndex); void GetInertia (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13, - CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23, - CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33, - CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz); + CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13, + CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23, + CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33, + CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz); void GetBoundingBox (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& Xmin, CORBA::Double& Xmax, - CORBA::Double& Ymin, CORBA::Double& Ymax, - CORBA::Double& Zmin, CORBA::Double& Zmax); + CORBA::Double& Xmin, CORBA::Double& Xmax, + CORBA::Double& Ymin, CORBA::Double& Ymax, + CORBA::Double& Zmin, CORBA::Double& Zmax); void GetTolerance (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& FaceMin, CORBA::Double& FaceMax, - CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, - CORBA::Double& VertMin, CORBA::Double& VertMax); + CORBA::Double& FaceMin, CORBA::Double& FaceMax, + CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, + CORBA::Double& VertMin, CORBA::Double& VertMax); CORBA::Boolean CheckShape (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription); + CORBA::String_out theDescription); CORBA::Boolean CheckShapeWithGeometry (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription); + CORBA::String_out theDescription); + + char* IsGoodForSolid (GEOM::GEOM_Object_ptr theShape); char* WhatIs (GEOM::GEOM_Object_ptr theShape); GEOM::ListOfBool* AreCoordsInside (GEOM::GEOM_Object_ptr theShape, - const GEOM::ListOfDouble& theCoords, - CORBA::Double theTolerance); + const GEOM::ListOfDouble& theCoords, + CORBA::Double theTolerance); CORBA::Double GetMinDistance (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2, + GEOM::GEOM_Object_ptr theShape2, CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1, CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2); void PointCoordinates (GEOM::GEOM_Object_ptr theShape, - CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z); + CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z); CORBA::Double GetAngle (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2); + GEOM::GEOM_Object_ptr theShape2); + + CORBA::Double GetAngleBtwVectors (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2); // Methods for recieving radiuses of curvature of curves and surfaces // in the given point CORBA::Double CurveCurvatureByParam (GEOM::GEOM_Object_ptr theCurve, - CORBA::Double theParam); + CORBA::Double theParam); CORBA::Double CurveCurvatureByPoint (GEOM::GEOM_Object_ptr theCurve, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); CORBA::Double MaxSurfaceCurvatureByParam (GEOM::GEOM_Object_ptr theSurf, - CORBA::Double theUParam, - CORBA::Double theVParam); + CORBA::Double theUParam, + CORBA::Double theVParam); CORBA::Double MaxSurfaceCurvatureByPoint (GEOM::GEOM_Object_ptr theSurf, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); CORBA::Double MinSurfaceCurvatureByParam (GEOM::GEOM_Object_ptr theSurf, - CORBA::Double theUParam, - CORBA::Double theVParam); + CORBA::Double theUParam, + CORBA::Double theVParam); CORBA::Double MinSurfaceCurvatureByPoint (GEOM::GEOM_Object_ptr theSurf, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); ::GEOMImpl_IMeasureOperations* GetOperations() { return (::GEOMImpl_IMeasureOperations*)GetImpl(); } diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index b6eb40db6..2b4e93e7a 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -85,6 +85,40 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdge return GetObject(anObject); } +//============================================================================= +/*! + * MakeEdgeOnCurveByLength + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeOnCurveByLength + (GEOM::GEOM_Object_ptr theCurve, + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference curve + Handle(GEOM_Object) aRefCurve = GetObjectImpl(theCurve); + if (aRefCurve.IsNull()) return aGEOMObject._retn(); + + //Get the reference point (can be NULL) + Handle(GEOM_Object) aRefPoint; + if (!CORBA::is_nil(theStartPoint)) { + aRefPoint = GetObjectImpl(theStartPoint); + } + + //Create the point + Handle(GEOM_Object) anObject = + GetOperations()->MakeEdgeOnCurveByLength(aRefCurve, theLength, aRefPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeEdgeWire diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index 9cc86a989..3317c0417 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -44,6 +44,11 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2); + + GEOM::GEOM_Object_ptr MakeEdgeOnCurveByLength (GEOM::GEOM_Object_ptr theCurve, + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint); + GEOM::GEOM_Object_ptr MakeEdgeWire (GEOM::GEOM_Object_ptr theWire, const CORBA::Double theLinearTolerance, const CORBA::Double theAngularTolerance); diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 6466983b1..e0ab44df4 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -591,12 +591,12 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointOnCurve (GEOM::GEOM_Object_ptr the //============================================================================= GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointOnCurveByLength (GEOM::GEOM_Object_ptr theRefCurve, CORBA::Double theLength, - CORBA::Boolean theReverse) + GEOM::GEOM_Object_ptr theStartPoint) { beginService( " GEOM_Superv_i::MakePointOnCurveByLength" ); MESSAGE("GEOM_Superv_i::MakePointOnCurveByLength"); getBasicOp(); - GEOM::GEOM_Object_ptr anObj = myBasicOp->MakePointOnCurveByLength(theRefCurve, theLength, theReverse); + GEOM::GEOM_Object_ptr anObj = myBasicOp->MakePointOnCurveByLength(theRefCurve, theLength, theStartPoint); endService( " GEOM_Superv_i::MakePointOnCurveByLength" ); return anObj; } @@ -2010,6 +2010,21 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEdge (GEOM::GEOM_Object_ptr thePnt1, return anObj; } +//============================================================================= +// MakeEdgeOnCurveByLength: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEdgeOnCurveByLength (GEOM::GEOM_Object_ptr theRefCurve, + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint) +{ + beginService( " GEOM_Superv_i::MakeEdgeOnCurveByLength" ); + MESSAGE("GEOM_Superv_i::MakeEdgeOnCurveByLength"); + getShapesOp(); + GEOM::GEOM_Object_ptr anObj = myShapesOp->MakeEdgeOnCurveByLength(theRefCurve, theLength, theStartPoint); + endService( " GEOM_Superv_i::MakeEdgeOnCurveByLength" ); + return anObj; +} + //============================================================================= // MakeWire: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 1dd848ad5..5f99b2465 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -151,7 +151,7 @@ public: CORBA::Double theParameter); GEOM::GEOM_Object_ptr MakePointOnCurveByLength (GEOM::GEOM_Object_ptr theRefCurve, CORBA::Double theLength, - CORBA::Boolean theReverse); + GEOM::GEOM_Object_ptr theStartPoint); GEOM::GEOM_Object_ptr MakePointOnCurveByCoord (GEOM::GEOM_Object_ptr theRefCurve, CORBA::Double theXParameter, CORBA::Double theYParameter, @@ -465,6 +465,9 @@ public: //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr MakeEdgeOnCurveByLength (GEOM::GEOM_Object_ptr theRefCurve, + CORBA::Double theLength, + GEOM::GEOM_Object_ptr theStartPoint); GEOM::GEOM_Object_ptr MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires, CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index b681efa1b..5b89c34ff 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -62,63 +62,63 @@ def TestAll (geompy, math): precision = 0.00001 #Create base points - p0 = geompy.MakeVertex(0. , 0. , 0. ) #(3 Doubles)->GEOM_Object_ptr + p0 = geompy.MakeVertex(0. , 0. , 0. ) #(3 Doubles)->GEOM_Object px = geompy.MakeVertex(100., 0. , 0. ) py = geompy.MakeVertex(0. , 100., 0. ) pz = geompy.MakeVertex(0. , 0. , 100.) pxyz = geompy.MakeVertex(100., 100., 100.) - p200 = geompy.MakeVertexWithRef(pxyz, 100., 100., 100.) #(GEOM_Object_ptr, 3 Doubles)->GEOM_Object_ptr + p200 = geompy.MakeVertexWithRef(pxyz, 100., 100., 100.) #(GEOM_Object, 3 Doubles)->GEOM_Object #Create base directions - vx = geompy.MakeVector(p0, px) #(GEOM_Object_ptr, GEOM_Object_ptr)->GEOM_Object_ptr + vx = geompy.MakeVector(p0, px) #(GEOM_Object, GEOM_Object)->GEOM_Object vy = geompy.MakeVector(p0, py) vz = geompy.MakeVector(p0, pz) vxy = geompy.MakeVector(px, py) - vxyz = geompy.MakeVectorDXDYDZ(100., 100., 100.) #(3 Doubles)->GEOM_Object_ptr + vxyz = geompy.MakeVectorDXDYDZ(100., 100., 100.) #(3 Doubles)->GEOM_Object #Create local coordinate systems - cs1 = geompy.MakeMarker(50,50,50, 1,0,0, 0,1,0) #(9 Doubles)->GEOM_Object_ptr - cs2 = geompy.MakeMarker(70,80,10, 1,0,1, 1,1,0) #(9 Doubles)->GEOM_Object_ptr - cs3 = geompy.MakeMarkerPntTwoVec(pz, vxy, vz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr + cs1 = geompy.MakeMarker(50,50,50, 1,0,0, 0,1,0) #(9 Doubles)->GEOM_Object + cs2 = geompy.MakeMarker(70,80,10, 1,0,1, 1,1,0) #(9 Doubles)->GEOM_Object + cs3 = geompy.MakeMarkerPntTwoVec(pz, vxy, vz) #(3 GEOM_Object)->GEOM_Object #Create base geometry 2D - Line = geompy.MakeLineTwoPnt(p0, pxyz) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Line1 = geompy.MakeLine(pz, vxy) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Line2 = geompy.MakeLineTwoPnt(pxyz, pz) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Plane = geompy.MakePlane(pz, vxyz, trimsize) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - Plane1 = geompy.MakePlaneThreePnt(px, pz, p200, trimsize) #(4 Doubles)->GEOM_Object_ptr - Plane2 = geompy.MakePlane2Vec(vx, vz, trimsize) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - Plane3 = geompy.MakePlaneLCS(cs1, trimsize, 3) #(1 GEOM_Object_ptr, 2 Double)->GEOM_Object_ptr - - Arc = geompy.MakeArc(py, pz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Arc2 = geompy.MakeArcCenter(py, pz, px,0) #(3 GEOM_Object_ptr,Boolean)->GEOM_Object_ptr - Arc3 = geompy.MakeArcOfEllipse(p0, px, pz) #(3 GEOM_Object_ptr,Boolean)->GEOM_Object_ptr - Circle = geompy.MakeCircle(p0, vz, radius1) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - Circle1 = geompy.MakeCircleThreePnt(p0, pxyz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Circle2 = geompy.MakeCircleCenter2Pnt(p0, pxyz, py) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Ellipse = geompy.MakeEllipse(p0, vy, radius2, radius1) #(2 GEOM_Object_ptr, 2 Doubles)->GEOM_Object_ptr - Polyline = geompy.MakePolyline([p0, pz, py, p200]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr - Bezier = geompy.MakeBezier([p0, pz, p200, px]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr - Interpol = geompy.MakeInterpol([px, py, p200, pxyz], True) #(List of GEOM_Object_ptr,Boolean)->GEOM_Object_ptr + Line = geompy.MakeLineTwoPnt(p0, pxyz) #(2 GEOM_Object)->GEOM_Object + Line1 = geompy.MakeLine(pz, vxy) #(2 GEOM_Object)->GEOM_Object + Line2 = geompy.MakeLineTwoPnt(pxyz, pz) #(2 GEOM_Object)->GEOM_Object + Plane = geompy.MakePlane(pz, vxyz, trimsize) #(2 GEOM_Object, Double)->GEOM_Object + Plane1 = geompy.MakePlaneThreePnt(px, pz, p200, trimsize) #(4 Doubles)->GEOM_Object + Plane2 = geompy.MakePlane2Vec(vx, vz, trimsize) #(2 GEOM_Object, Double)->GEOM_Object + Plane3 = geompy.MakePlaneLCS(cs1, trimsize, 3) #(1 GEOM_Object, 2 Double)->GEOM_Object + + Arc = geompy.MakeArc(py, pz, px) #(3 GEOM_Object)->GEOM_Object + Arc2 = geompy.MakeArcCenter(py, pz, px,0) #(3 GEOM_Object,Boolean)->GEOM_Object + Arc3 = geompy.MakeArcOfEllipse(p0, px, pz) #(3 GEOM_Object,Boolean)->GEOM_Object + Circle = geompy.MakeCircle(p0, vz, radius1) #(2 GEOM_Object, Double)->GEOM_Object + Circle1 = geompy.MakeCircleThreePnt(p0, pxyz, px) #(3 GEOM_Object)->GEOM_Object + Circle2 = geompy.MakeCircleCenter2Pnt(p0, pxyz, py) #(3 GEOM_Object)->GEOM_Object + Ellipse = geompy.MakeEllipse(p0, vy, radius2, radius1) #(2 GEOM_Object, 2 Doubles)->GEOM_Object + Polyline = geompy.MakePolyline([p0, pz, py, p200]) #(List of GEOM_Object)->GEOM_Object + Bezier = geompy.MakeBezier([p0, pz, p200, px]) #(List of GEOM_Object)->GEOM_Object + Interpol = geompy.MakeInterpol([px, py, p200, pxyz], True) #(List of GEOM_Object,Boolean)->GEOM_Object Sketcher = geompy.MakeSketcher("Sketcher:F -100 -100:TT 250 -100:R 0:C 100 150:R 0:L 300:WW", - [100,0,0, 1,1,1, -1,1,0]) #(String, List of Doubles)->GEOM_Object_ptr + [100,0,0, 1,1,1, -1,1,0]) #(String, List of Doubles)->GEOM_Object Sketcher3d = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) #Create local coordinate system from shape cs4 = geompy.MakeMarkerFromShape(Plane) #Test point on curve creation - p_on_arc = geompy.MakeVertexOnCurve(Arc, 0.25) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr - p_on_arc2 = geompy.MakeVertexOnCurveByCoord(Arc, 100, -10, 10 ) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr - p_on_arc3 = geompy.MakeVertexOnCurveByLength(Arc, 50, True) #(GEOM_Object_ptr, Double, Boolean)->GEOM_Object_ptr + p_on_arc = geompy.MakeVertexOnCurve(Arc, 0.25) #(GEOM_Object, Double)->GEOM_Object + p_on_arc2 = geompy.MakeVertexOnCurveByCoord(Arc, 100, -10, 10 ) #(GEOM_Object, Double)->GEOM_Object + p_on_arc3 = geompy.MakeVertexOnCurveByLength(Arc, 50, py) #(GEOM_Object, Double, GEOM_Object)->GEOM_Object #Test point on lines intersection - p_on_l1l2 = geompy.MakeVertexOnLinesIntersection(Line1, Line2) #(2 GEOM_Object_ptr)->GEOM_Object_ptr + p_on_l1l2 = geompy.MakeVertexOnLinesIntersection(Line1, Line2) #(2 GEOM_Object)->GEOM_Object #Test tangent on curve creation - tan_on_arc = geompy.MakeTangentOnCurve(Arc, 0.7) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr + tan_on_arc = geompy.MakeTangentOnCurve(Arc, 0.7) #(GEOM_Object, Double)->GEOM_Object #Test tangent on face creation tan_vertex_1 = geompy.MakeVertex(0, 0, 0) @@ -130,45 +130,46 @@ def TestAll (geompy, math): tan_on_face = geompy.MakeTangentPlaneOnFace(tan_extrusion, 0.7, 0.5, 150) #Create base geometry 3D - Box = geompy.MakeBoxTwoPnt(p0, p200) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Box1 = geompy.MakeBoxDXDYDZ(10, 20, 30) #(3 Doubles)->GEOM_Object_ptr - Box2 = geompy.MakeBox(10,20,30, 15,25,35) #(6 Doubles)->GEOM_Object_ptr - Cylinder = geompy.MakeCylinder(p0, vz, radius1, height) #(2 GEOM_Object_ptr, 2 Doubles)->GEOM_Object_ptr - Cyl1 = geompy.MakeCylinderRH(radius2, height) #(2 Doubles)->GEOM_Object_ptr - Sphere = geompy.MakeSpherePntR(p0, radius1) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr - Sphere1 = geompy.MakeSphereR(radius) #(Double)->GEOM_Object_ptr - Sphere2 = geompy.MakeSphere(50, 70, 30, radius) #(4 Doubles)->GEOM_Object_ptr - Cone = geompy.MakeCone(p0, vz, radius2, radius, height) #(2 GEOM_Object_ptr, 3 Doubles)->GEOM_Object_ptr - Cone1 = geompy.MakeConeR1R2H(radius1, radius, height) #(3 Doubles)->GEOM_Object_ptr - Torus = geompy.MakeTorus(p0, vz, radius2, radius) #(2 GEOM_Object_ptr, 2 Doubles)->GEOM_Object_ptr - Torus1 = geompy.MakeTorusRR(radius2, radius1) #(2 Doubles)->GEOM_Object_ptr + Box = geompy.MakeBoxTwoPnt(p0, p200) #(2 GEOM_Object)->GEOM_Object + Box1 = geompy.MakeBoxDXDYDZ(10, 20, 30) #(3 Doubles)->GEOM_Object + Box2 = geompy.MakeBox(10,20,30, 15,25,35) #(6 Doubles)->GEOM_Object + Cylinder = geompy.MakeCylinder(p0, vz, radius1, height) #(2 GEOM_Object, 2 Doubles)->GEOM_Object + Cyl1 = geompy.MakeCylinderRH(radius2, height) #(2 Doubles)->GEOM_Object + Sphere = geompy.MakeSpherePntR(p0, radius1) #(GEOM_Object, Double)->GEOM_Object + Sphere1 = geompy.MakeSphereR(radius) #(Double)->GEOM_Object + Sphere2 = geompy.MakeSphere(50, 70, 30, radius) #(4 Doubles)->GEOM_Object + Cone = geompy.MakeCone(p0, vz, radius2, radius, height) #(2 GEOM_Object, 3 Doubles)->GEOM_Object + Cone1 = geompy.MakeConeR1R2H(radius1, radius, height) #(3 Doubles)->GEOM_Object + Torus = geompy.MakeTorus(p0, vz, radius2, radius) #(2 GEOM_Object, 2 Doubles)->GEOM_Object + Torus1 = geompy.MakeTorusRR(radius2, radius1) #(2 Doubles)->GEOM_Object #Boolean (Common, Cut, Fuse, Section) - Common = geompy.MakeBoolean(Box, Sphere, 1) #(2 GEOM_Object_ptr, Short)->GEOM_Object_ptr + Common = geompy.MakeBoolean(Box, Sphere, 1) #(2 GEOM_Object, Short)->GEOM_Object Cut = geompy.MakeBoolean(Box, Sphere, 2) Fuse = geompy.MakeBoolean(Box, Sphere, 3) Section = geompy.MakeBoolean(Box, Sphere, 4) #Create base objects - Edge = geompy.MakeEdge(p0, pxyz) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Wire = geompy.MakeWire([vxy, Arc]) #(List Of GEOM_Object_ptr)->GEOM_Object_ptr - Face = geompy.MakeFace(Wire, WantPlanarFace) #(GEOM_Object_ptr, Boolean)->GEOM_Object_ptr + Edge = geompy.MakeEdge(p0, pxyz) #(2 GEOM_Object)->GEOM_Object + Edge1 = geompy.MakeEdgeOnCurveByLength(Arc, 50, px) #(GEOM_Object, Double, GEOM_Object)->GEOM_Object + Wire = geompy.MakeWire([vxy, Arc]) #(List Of GEOM_Object)->GEOM_Object + Face = geompy.MakeFace(Wire, WantPlanarFace) #(GEOM_Object, Boolean)->GEOM_Object Face1 = geompy.MakeFaceWires([Wire, Sketcher], - WantPlanarFace) #(List of GEOM_Object_ptr, Boolean)->GEOM_Object_ptr + WantPlanarFace) #(List of GEOM_Object, Boolean)->GEOM_Object Face2 = geompy.MakeFace(Sketcher, WantPlanarFace) - Face3 = geompy.MakeFaceHW (100., 200., 1) #(2 Doubles, 1 Int)->GEOM_Object_ptr - Face4 = geompy.MakeFaceObjHW (vz, 200., 100.) #(1 GEOM_Object_ptr, 2 Doubles)->GEOM_Object_ptr - Disk = geompy.MakeDiskPntVecR (p0, vz, radius) #(2 GEOM_Object_ptr, 1 Double)->GEOM_Object_ptr - Disk2 = geompy.MakeDiskThreePnt(p0, p200, pz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Disk3 = geompy.MakeDiskR(100., 1) #(1 Doubles, 1 Int)->GEOM_Object_ptr - Shell = geompy.MakeShell([Face, Face1]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr - - Prism1 = geompy.MakePrism(Face2, p0, pxyz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr + Face3 = geompy.MakeFaceHW (100., 200., 1) #(2 Doubles, 1 Int)->GEOM_Object + Face4 = geompy.MakeFaceObjHW (vz, 200., 100.) #(1 GEOM_Object, 2 Doubles)->GEOM_Object + Disk = geompy.MakeDiskPntVecR (p0, vz, radius) #(2 GEOM_Object, 1 Double)->GEOM_Object + Disk2 = geompy.MakeDiskThreePnt(p0, p200, pz) #(3 GEOM_Object)->GEOM_Object + Disk3 = geompy.MakeDiskR(100., 1) #(1 Doubles, 1 Int)->GEOM_Object + Shell = geompy.MakeShell([Face, Face1]) #(List of GEOM_Object)->GEOM_Object + + Prism1 = geompy.MakePrism(Face2, p0, pxyz) #(3 GEOM_Object)->GEOM_Object prism1_faces = geompy.SubShapeAllSortedCentres(Prism1, geompy.ShapeType["FACE"]) Shell1 = geompy.MakeShell([prism1_faces[0], prism1_faces[1], prism1_faces[3], prism1_faces[4], prism1_faces[5], prism1_faces[2]]) - Solid = geompy.MakeSolid([Shell1]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr + Solid = geompy.MakeSolid([Shell1]) #(List of GEOM_Object)->GEOM_Object ShapeListCompound = [] i = 0 @@ -176,58 +177,58 @@ def TestAll (geompy, math): S = geompy.MakeTranslation(Arc, i * 100., i * 100., i * 100.) ShapeListCompound.append(S) i = i + 1 - Compound = geompy.MakeCompound(ShapeListCompound) #(List of GEOM_Object_ptr)->GEOM_Object_ptr + Compound = geompy.MakeCompound(ShapeListCompound) #(List of GEOM_Object)->GEOM_Object #Test point on surface creation - p_on_face = geompy.MakeVertexOnSurface(Face, 0.1, 0.8) #(GEOM_Object_ptr, Double, Double)->GEOM_Object_ptr - p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(Face, 0., 0., 0.) #(GEOM_Object_ptr, Double, Double, Double)->GEOM_Object_ptr + p_on_face = geompy.MakeVertexOnSurface(Face, 0.1, 0.8) #(GEOM_Object, Double, Double)->GEOM_Object + p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(Face, 0., 0., 0.) #(GEOM_Object, Double, Double, Double)->GEOM_Object # Test plane from existing face creation - Plane2 = geompy.MakePlaneFace(Face, trimsize) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr + Plane2 = geompy.MakePlaneFace(Face, trimsize) #(GEOM_Object, Double)->GEOM_Object #ShapeList for Sewing S = geompy.MakeRotation(Face, vxy, angle1) #Test Line on Faces Intersection - Line3 = geompy.MakeLineTwoFaces(prism1_faces[0], prism1_faces[1]) #(2 GEOM_Object_ptr)->GEOM_Object_ptr + Line3 = geompy.MakeLineTwoFaces(prism1_faces[0], prism1_faces[1]) #(2 GEOM_Object)->GEOM_Object #Create advanced objects - Copy = geompy.MakeCopy(Box) #(GEOM_Object_ptr)->GEOM_Object_ptr - Prism = geompy.MakePrismVecH(Face, vz, 100.0) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - Prism2Ways = geompy.MakePrismVecH2Ways(Face, vz, 10.0) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - PrismTwoPnt = geompy.MakePrism(Face2, p0, pxyz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - PrismTwoPnt2Ways = geompy.MakePrism2Ways(Face2, p0, pxyz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - PrismDXDYDZ = geompy.MakePrismDXDYDZ(Face2, 10, 20, 100)#(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - PrismDXDYDZ2Ways = geompy.MakePrismDXDYDZ2Ways(Face, 30, -20, 200)#(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr + Copy = geompy.MakeCopy(Box) #(GEOM_Object)->GEOM_Object + Prism = geompy.MakePrismVecH(Face, vz, 100.0) #(2 GEOM_Object, Double)->GEOM_Object + Prism2Ways = geompy.MakePrismVecH2Ways(Face, vz, 10.0) #(2 GEOM_Object, Double)->GEOM_Object + PrismTwoPnt = geompy.MakePrism(Face2, p0, pxyz) #(3 GEOM_Object)->GEOM_Object + PrismTwoPnt2Ways = geompy.MakePrism2Ways(Face2, p0, pxyz) #(3 GEOM_Object)->GEOM_Object + PrismDXDYDZ = geompy.MakePrismDXDYDZ(Face2, 10, 20, 100)#(2 GEOM_Object, Double)->GEOM_Object + PrismDXDYDZ2Ways = geompy.MakePrismDXDYDZ2Ways(Face, 30, -20, 200)#(2 GEOM_Object, Double)->GEOM_Object Revolution = geompy.MakeRevolution(Face, vz, angle2) # Revolution2Ways = geompy.MakeRevolution(Face, vz, angle1) # Filling = geompy.MakeFilling(Compound, mindeg, maxdeg, - tol2d, tol3d, nbiter) #(GEOM_Object_ptr, 4 Doubles, Short)->GEOM_Object_ptr - Pipe = geompy.MakePipe(Wire, Edge) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Sewing = geompy.MakeSewing([Face, S], precision) #(List Of GEOM_Object_ptr, Double)->GEOM_Object_ptr + tol2d, tol3d, nbiter) #(GEOM_Object, 4 Doubles, Short)->GEOM_Object + Pipe = geompy.MakePipe(Wire, Edge) #(2 GEOM_Object)->GEOM_Object + Sewing = geompy.MakeSewing([Face, S], precision) #(List Of GEOM_Object, Double)->GEOM_Object #Transform objects - Translation = geompy.MakeTranslationTwoPoints(Box, px, pz) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - TranslVect = geompy.MakeTranslationVector(Box, vxyz) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - TranslVectD = geompy.MakeTranslationVectorDistance(Box, vxyz, 50.0) #(2 GEOM_Object_ptr)->GEOM_Object_ptr - Rotation = geompy.MakeRotation(Box, vz, angle1) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr - RotatPnt = geompy.MakeRotationThreePoints(Box, px, py, pz) #(4 GEOM_Object_ptr)->GEOM_Object_ptr + Translation = geompy.MakeTranslationTwoPoints(Box, px, pz) #(3 GEOM_Object)->GEOM_Object + TranslVect = geompy.MakeTranslationVector(Box, vxyz) #(2 GEOM_Object)->GEOM_Object + TranslVectD = geompy.MakeTranslationVectorDistance(Box, vxyz, 50.0) #(2 GEOM_Object)->GEOM_Object + Rotation = geompy.MakeRotation(Box, vz, angle1) #(2 GEOM_Object, Double)->GEOM_Object + RotatPnt = geompy.MakeRotationThreePoints(Box, px, py, pz) #(4 GEOM_Object)->GEOM_Object #Scale by factor relatively given point - Scale1 = geompy.MakeScaleTransform(Box, pxyz, factor) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr + Scale1 = geompy.MakeScaleTransform(Box, pxyz, factor) #(2 GEOM_Object, Double)->GEOM_Object #Scale by factor relatively the origin of global CS Scale2 = geompy.MakeScaleTransform(Box, None, factor) # #Scale along axes of global CS by different factors. Scale relatively given point - Scale3 = geompy.MakeScaleAlongAxes(Box, pxyz, 1.5, 0.5, 3) #(2 GEOM_Object_ptr, 3 Doubles)->GEOM_Object_ptr + Scale3 = geompy.MakeScaleAlongAxes(Box, pxyz, 1.5, 0.5, 3) #(2 GEOM_Object, 3 Doubles)->GEOM_Object #Scale along axes of global CS by different factors. Scale relatively the origin of global CS Scale4 = geompy.MakeScaleAlongAxes(Box, None, 1.5, 0.5, 3) # - Mirror = geompy.MakeMirrorByPlane(Box, Plane) #(2 GEOM_Object_ptr)->GEOM_Object_ptr + Mirror = geompy.MakeMirrorByPlane(Box, Plane) #(2 GEOM_Object)->GEOM_Object MirrorAxis = geompy.MakeMirrorByAxis(Box, Line1) # MirrorPnt = geompy.MakeMirrorByPoint(Box, p200) # - Position = geompy.MakePosition(Box, cs1, cs2) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Position2 = geompy.PositionAlongPath(Box, Arc, 0.5, 1, 0) #(2 GEOM_Object_ptr, 1 Double, 2 Bool)->GEOM_Object_ptr - Offset = geompy.MakeOffset(Box, 10.) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr + Position = geompy.MakePosition(Box, cs1, cs2) #(3 GEOM_Object)->GEOM_Object + Position2 = geompy.PositionAlongPath(Box, Arc, 0.5, 1, 0) #(2 GEOM_Object, 1 Double, 2 Bool)->GEOM_Object + Offset = geompy.MakeOffset(Box, 10.) #(GEOM_Object, Double)->GEOM_Object Orientation = geompy.ChangeOrientation(Box) #IDList for Fillet/Chamfer @@ -254,19 +255,19 @@ def TestAll (geompy, math): IDlist_f = [f_ind_1, f_ind_2] #Local operations - Fillet2d = geompy.MakeFillet2D(Face3, radius, [4, 7, 9]) #(GEOM_Object_ptr, Double, ListOfLong)->GEOM_Object_ptr + Fillet2d = geompy.MakeFillet2D(Face3, radius, [4, 7, 9]) #(GEOM_Object, Double, ListOfLong)->GEOM_Object Fillet = geompy.MakeFillet (Prism, radius, geompy.ShapeType["EDGE"], - IDlist_e) #(GEOM_Object_ptr, Double, Short, ListOfLong)->GEOM_Object_ptr + IDlist_e) #(GEOM_Object, Double, Short, ListOfLong)->GEOM_Object Fillet2 = geompy.MakeFilletR1R2 (Prism, 7., 13., geompy.ShapeType["EDGE"], - IDlist_e) #(GEOM_Object_ptr, Double, Double, Short, ListOfLong)->GEOM_Object_ptr + IDlist_e) #(GEOM_Object, Double, Double, Short, ListOfLong)->GEOM_Object Chamfer = geompy.MakeChamferEdge(Prism, d1, d2, - f_ind_1, f_ind_2) #(GEOM_Object_ptr, 2 Doubles, 2 Long)->GEOM_Object_ptr + f_ind_1, f_ind_2) #(GEOM_Object, 2 Doubles, 2 Long)->GEOM_Object Chamfer2 = geompy.MakeChamferFaces(Prism, d1, d2, - IDlist_f) #(GEOM_Object_ptr, 2 Doubles, ListOfLong)->GEOM_Object_ptr + IDlist_f) #(GEOM_Object, 2 Doubles, ListOfLong)->GEOM_Object Chamfer3 = geompy.MakeChamferEdges(Prism, d1, d2, - IDlist_e) #(GEOM_Object_ptr, 2 Doubles, ListOfLong)->GEOM_Object_ptr + IDlist_e) #(GEOM_Object, 2 Doubles, ListOfLong)->GEOM_Object Chamfer4 = geompy.MakeChamferFacesAD(Prism, d1, 20. * math.pi / 180., - IDlist_f) #(GEOM_Object_ptr, 2 Doubles, ListOfLong)->GEOM_Object_ptr + IDlist_f) #(GEOM_Object, 2 Doubles, ListOfLong)->GEOM_Object #End of Local operations #Create Patterns @@ -277,18 +278,18 @@ def TestAll (geompy, math): MultiRot2D = geompy.MultiRotate2D(Chamfer, vx, angle, nbtimes1, step1, nbtimes2) #Create Informations objects - CDG = geompy.MakeCDG(Prism) #(GEOM_Object_ptr)->GEOM_Object_ptr + CDG = geompy.MakeCDG(Prism) #(GEOM_Object)->GEOM_Object Archimede = geompy.Archimede(Box, weight, waterdensity, - meshingdeflection) #(GEOM_Object_ptr, 3 Doubles)->GEOM_Object_ptr - mindist = geompy.MinDistanceComponents(TranslVect, Mirror) #(2 GEOM_Object_ptr)->4 Doubles + meshingdeflection) #(GEOM_Object, 3 Doubles)->GEOM_Object + mindist = geompy.MinDistanceComponents(TranslVect, Mirror) #(2 GEOM_Object)->4 Doubles print "Minumal distance between TranslVect and Mirror is", mindist[0], print "by components:", mindist[1], ",", mindist[2], ",", mindist[3] - CheckShape = geompy.CheckShape(Prism) #(GEOM_Object_ptr)->Boolean + CheckShape = geompy.CheckShape(Prism) #(GEOM_Object)->Boolean print "CheckShape(Prism) = ", CheckShape #Partition objects - Partition = geompy.MakePartition([Box], [Plane]) #(2 Lists Of GEOM_Object_ptr)->GEOM_Object_ptr - Partition1 = geompy.MakeHalfPartition(Box, Plane) #(2 GEOM_Object_ptr)->GEOM_Object_ptr + Partition = geompy.MakePartition([Box], [Plane]) #(2 Lists Of GEOM_Object)->GEOM_Object + Partition1 = geompy.MakeHalfPartition(Box, Plane) #(2 GEOM_Object)->GEOM_Object #Add In Study id_p0 = geompy.addToStudy(p0, "Vertex 0") @@ -331,7 +332,8 @@ def TestAll (geompy, math): id_Sketcher3d = geompy.addToStudy(Sketcher3d, "Sketcher 3D") id_p_on_arc = geompy.addToStudy(p_on_arc, "Vertex on Arc (0.25)") - id_p_on_arc2 = geompy.addToStudy(p_on_arc2, "Vertex on Arc at(100, -10, 10)" ) + id_p_on_arc2 = geompy.addToStudy(p_on_arc2, "Vertex on Arc at(100, -10, 10)" ) + id_p_on_arc3 = geompy.addToStudy(p_on_arc3, "Vertex on Arc length 50 from Vertex X" ) id_p_on_l1l2 = geompy.addToStudy(p_on_l1l2, "Vertex on Lines Intersection") @@ -357,6 +359,7 @@ def TestAll (geompy, math): id_Section = geompy.addToStudy(Section, "Section") id_Edge = geompy.addToStudy(Edge, "Edge") + id_Edge1 = geompy.addToStudy(Edge1, "Edge on Arc length 50 from Vertex Y") id_Wire = geompy.addToStudy(Wire, "Wire") id_Face = geompy.addToStudy(Face, "Face") id_Face1 = geompy.addToStudy(Face1, "Face from two wires") diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 695b9db3e..c3d4ddf77 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -514,15 +514,16 @@ class geompyDC(GEOM._objref_GEOM_Gen): ## Create a point, corresponding to the given length on the given curve. # @param theRefCurve The referenced curve. - # @param theLength Length on the referenced curve. - # @param theReverse Flag allowing to choose the direction for the calculation of the length (False = forward or True = reversed). + # @param theLength Length on the referenced curve. It can be negative. + # @param theStartPoint Point allowing to choose the direction for the calculation + # of the length. If None, start from the first point of theRefCurve. # @return New GEOM_Object, containing the created point. # # @ref tui_creation_point "Example" - def MakeVertexOnCurveByLength(self,theRefCurve, theLength, theReverse = False): + def MakeVertexOnCurveByLength(self, theRefCurve, theLength, theStartPoint = None): # Example: see GEOM_TestAll.py theLength, Parameters = ParseParameters(theLength) - anObj = self.BasicOp.MakePointOnCurveByLength(theRefCurve, theLength, theReverse) + anObj = self.BasicOp.MakePointOnCurveByLength(theRefCurve, theLength, theStartPoint) RaiseIfFailed("MakePointOnCurveByLength", self.BasicOp) anObj.SetParameters(Parameters) return anObj @@ -1636,6 +1637,23 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("MakeEdge", self.ShapesOp) return anObj + ## Create a new edge, corresponding to the given length on the given curve. + # @param theRefCurve The referenced curve (edge). + # @param theLength Length on the referenced curve. It can be negative. + # @param theStartPoint Any point can be selected for it, the new edge will begin + # at the end of \a theRefCurve, close to the selected point. + # If None, start from the first point of \a theRefCurve. + # @return New GEOM_Object, containing the created edge. + # + # @ref tui_creation_edge "Example" + def MakeEdgeOnCurveByLength(self, theRefCurve, theLength, theStartPoint = None): + # Example: see GEOM_TestAll.py + theLength, Parameters = ParseParameters(theLength) + anObj = self.ShapesOp.MakeEdgeOnCurveByLength(theRefCurve, theLength, theStartPoint) + RaiseIfFailed("MakeEdgeOnCurveByLength", self.BasicOp) + anObj.SetParameters(Parameters) + return anObj + ## Create an edge from specified wire. # @param theWire source Wire. # @param theLinearTolerance linear tolerance value. -- 2.39.2