From 63db5e2dd5ad0075bacbd9a8de57d7545f5cfa64 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 18 Mar 2011 15:05:50 +0000 Subject: [PATCH] IMPs 21044, 21057, 21067 --- doc/salome/gui/GEOM/images/curve.png | Bin 14943 -> 16302 bytes doc/salome/gui/GEOM/images/curve1.png | Bin 0 -> 16208 bytes doc/salome/gui/GEOM/images/curve2.png | Bin 0 -> 18524 bytes doc/salome/gui/GEOM/images/extrusion1.png | Bin 22336 -> 26334 bytes doc/salome/gui/GEOM/images/extrusion2.png | Bin 22779 -> 26428 bytes doc/salome/gui/GEOM/images/extrusion3.png | Bin 22148 -> 26259 bytes idl/GEOM_Gen.idl | 27 +- idl/GEOM_Superv.idl | 9 +- src/BasicGUI/BasicGUI_CurveDlg.cxx | 48 +- src/BasicGUI/BasicGUI_CurveDlg.h | 7 +- src/DlgRef/DlgRef.cxx | 31 +- src/DlgRef/DlgRef.h | 35 +- src/DlgRef/DlgRef.pro | 7 +- src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui | 211 +++ src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui | 208 +++ src/DlgRef/Makefile.am | 5 +- src/GEOM/GEOM_PythonDump.cxx | 10 +- src/GEOM/GEOM_PythonDump.hxx | 4 +- src/GEOMGUI/GEOM_msg_en.ts | 12 + src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 124 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 26 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 153 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 13 +- src/GEOMImpl/GEOMImpl_IPolyline.hxx | 10 +- src/GEOMImpl/GEOMImpl_IPrism.hxx | 18 +- src/GEOMImpl/GEOMImpl_ISpline.hxx | 8 +- src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 1315 +++++++++--------- src/GEOMImpl/GEOMImpl_PipeDriver.hxx | 14 +- src/GEOMImpl/GEOMImpl_PolylineDriver.cxx | 6 +- src/GEOMImpl/GEOMImpl_PrismDriver.cxx | 159 ++- src/GEOMImpl/GEOMImpl_PrismDriver.hxx | 65 +- src/GEOMImpl/GEOMImpl_SplineDriver.cxx | 34 +- src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 94 +- src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 16 +- src/GEOM_I/GEOM_ICurvesOperations_i.cc | 16 +- src/GEOM_I/GEOM_ICurvesOperations_i.hh | 10 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 15 +- src/GEOM_I_Superv/GEOM_Superv_i.hh | 790 +++++------ src/GEOM_SWIG/geompyDC.py | 57 +- src/GenerationGUI/GenerationGUI_PrismDlg.cxx | 469 ++++--- src/GenerationGUI/GenerationGUI_PrismDlg.h | 17 +- 41 files changed, 2497 insertions(+), 1546 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/curve1.png create mode 100644 doc/salome/gui/GEOM/images/curve2.png create mode 100644 src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui create mode 100644 src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui diff --git a/doc/salome/gui/GEOM/images/curve.png b/doc/salome/gui/GEOM/images/curve.png index b9af501eba400155fc025dd37b751791e0c8bd26..c9d4a433f9cdbc6120d4acc5470c162515c1ffad 100755 GIT binary patch literal 16302 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 literal 14943 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 q?N>GK)D>X~1J}6!QP>6sca+k*Y literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/curve2.png b/doc/salome/gui/GEOM/images/curve2.png new file mode 100644 index 0000000000000000000000000000000000000000..48a7b7ccd3c459b0f6f2bc81da346689461e5d4e GIT binary patch literal 18524 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 literal 22336 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 T+t6S#E<*FPt_JDUFTwu?I}G8y diff --git a/doc/salome/gui/GEOM/images/extrusion2.png b/doc/salome/gui/GEOM/images/extrusion2.png index 28ef202172ef8275220865c0dc1d6ecccbeb4f6d..19b589279192dbb32ff8f632179e4d6e05cce521 100755 GIT binary patch literal 26428 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 literal 22779 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 diff --git a/doc/salome/gui/GEOM/images/extrusion3.png b/doc/salome/gui/GEOM/images/extrusion3.png index 5147f78c195e174415c7c4cfe1804ab774fa84c6..ce96d273f2994e636059b9bec37307c4f15818cd 100644 GIT binary patch literal 26259 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 d5%W9A%MzSOHcG}Wq5-DMBCzJx7`mBz%x_hDMd| @@ -70,7 +69,7 @@ BasicGUI_CurveDlg::BasicGUI_CurveDlg( GeometryGUI* theGeometryGUI, QWidget* pare mainFrame()->RadioButton2->setIcon( image3 ); mainFrame()->RadioButton3->setIcon( image2 ); - GroupPoints = new DlgRef_1Sel1Check( centralWidget() ); + GroupPoints = new DlgRef_1Sel3Check( centralWidget() ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_NODES" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_POINTS" ) ); @@ -81,7 +80,13 @@ BasicGUI_CurveDlg::BasicGUI_CurveDlg( GeometryGUI* theGeometryGUI, QWidget* pare GroupPoints->CheckButton1->setText( tr( "GEOM_IS_CLOSED" ) ); GroupPoints->CheckButton1->setChecked(false); - GroupPoints->CheckButton1->hide(); + //GroupPoints->CheckButton1->hide(); + + GroupPoints->CheckButton2->setText( tr( "GEOM_IS_REORDER" ) ); + GroupPoints->CheckButton2->setChecked(false); + GroupPoints->CheckButton2->hide(); + + GroupPoints->CheckButton3->hide(); QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); @@ -121,14 +126,15 @@ void BasicGUI_CurveDlg::Init() 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( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupPoints->CheckButton1,SIGNAL( toggled(bool) ), this, SLOT( CheckButtonToggled() ) ); + connect( GroupPoints->CheckButton1, SIGNAL( toggled(bool) ), this, SLOT( CheckButtonToggled() ) ); + connect( GroupPoints->CheckButton2, SIGNAL( toggled(bool) ), this, SLOT( CheckButtonToggled() ) ); connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); @@ -147,10 +153,21 @@ void BasicGUI_CurveDlg::ConstructorsClicked( int id ) QString aTitle = tr( id == 0 ? "GEOM_POLYLINE" : id == 1 ? "GEOM_BEZIER" : "GEOM_INTERPOL" ); mainFrame()->GroupConstructors->setTitle( aTitle ); - if (id == 2) // b-spline - GroupPoints->CheckButton1->show(); - else - GroupPoints->CheckButton1->hide(); + if (id == 0) { // polyline (wire) + //GroupPoints->CheckButton1->hide(); + GroupPoints->CheckButton1->setText( tr( "GEOM_BUILD_CLOSED_WIRE" ) ); + GroupPoints->CheckButton2->hide(); + } + else if (id == 1) { // bezier + //GroupPoints->CheckButton1->hide(); + GroupPoints->CheckButton1->setText( tr( "GEOM_IS_CLOSED" ) ); + GroupPoints->CheckButton2->hide(); + } + else { // b-spline + //GroupPoints->CheckButton1->show(); + GroupPoints->CheckButton1->setText( tr( "GEOM_IS_CLOSED" ) ); + GroupPoints->CheckButton2->show(); + } myPoints.clear(); @@ -323,15 +340,16 @@ bool BasicGUI_CurveDlg::execute( ObjectList& objects ) switch ( getConstructorId() ) { case 0 : - anObj = anOper->MakePolyline( points.in() ); + anObj = anOper->MakePolyline( points.in(), GroupPoints->CheckButton1->isChecked() ); res = true; break; case 1 : - anObj = anOper->MakeSplineBezier( points.in() ); + anObj = anOper->MakeSplineBezier( points.in(), GroupPoints->CheckButton1->isChecked() ); res = true; break; case 2 : - anObj = anOper->MakeSplineInterpolation( points.in(), GroupPoints->CheckButton1->isChecked() ); + anObj = anOper->MakeSplineInterpolation( points.in(), GroupPoints->CheckButton1->isChecked(), + GroupPoints->CheckButton2->isChecked() ); res = true; break; } diff --git a/src/BasicGUI/BasicGUI_CurveDlg.h b/src/BasicGUI/BasicGUI_CurveDlg.h index 797466eac..982579788 100644 --- a/src/BasicGUI/BasicGUI_CurveDlg.h +++ b/src/BasicGUI/BasicGUI_CurveDlg.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_CurveDlg.h // Author : Alexander SLADKOV, Open CASCADE S.A.S. (alexander.sladkov@opencascade.com) -// + #ifndef BASICGUI_CURVEDLG_H #define BASICGUI_CURVEDLG_H @@ -32,7 +31,7 @@ #include -class DlgRef_1Sel1Check; +class DlgRef_1Sel3Check; //================================================================================= // class : BasicGUI_CurveDlg @@ -58,7 +57,7 @@ private: void enterEvent( QEvent* ); private: - DlgRef_1Sel1Check* GroupPoints; + DlgRef_1Sel3Check* GroupPoints; QList myPoints; private slots: diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index 1ff6c6b87..6f849fb3d 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -15,11 +15,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 -// // File : DlgRef.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #include "DlgRef.h" ////////////////////////////////////////// @@ -190,6 +189,20 @@ DlgRef_1Sel3Spin1Check::~DlgRef_1Sel3Spin1Check() { } +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +DlgRef_1Sel4Spin2Check::DlgRef_1Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel4Spin2Check::~DlgRef_1Sel4Spin2Check() +{ +} + ////////////////////////////////////////// // DlgRef_1Sel4Spin ////////////////////////////////////////// @@ -386,6 +399,20 @@ DlgRef_2Sel2Spin1Check::~DlgRef_2Sel2Spin1Check() { } +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +DlgRef_2Sel2Spin3Check::DlgRef_2Sel2Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin3Check::~DlgRef_2Sel2Spin3Check() +{ +} + ////////////////////////////////////////// // DlgRef_2Sel2Spin ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.h b/src/DlgRef/DlgRef.h index a7b31a945..280a682d7 100644 --- a/src/DlgRef/DlgRef.h +++ b/src/DlgRef/DlgRef.h @@ -15,11 +15,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 -// // File : DlgRef.h // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #ifndef GEOM_DLGREF_H #define GEOM_DLGREF_H @@ -227,6 +226,22 @@ public: ~DlgRef_1Sel3Spin1Check(); }; +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel4Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel4Spin2Check : public QWidget, + public Ui::DlgRef_1Sel4Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel4Spin2Check(); +}; + ////////////////////////////////////////// // DlgRef_1Sel4Spin ////////////////////////////////////////// @@ -451,6 +466,22 @@ public: ~DlgRef_2Sel2Spin1Check(); }; +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel2Spin3Check : public QWidget, + public Ui::DlgRef_2Sel2Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin3Check(); +}; + ////////////////////////////////////////// // DlgRef_2Sel2Spin ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.pro b/src/DlgRef/DlgRef.pro index 2c1731dcb..516edca17 100644 --- a/src/DlgRef/DlgRef.pro +++ b/src/DlgRef/DlgRef.pro @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# TEMPLATE = lib TARGET = DlgRef @@ -63,8 +62,10 @@ HEADERS += DlgRef_2Sel2Spin_QTD.h HEADERS += DlgRef_2Sel3Spin_QTD.h HEADERS += DlgRef_1Sel1Spin1Check_QTD.h HEADERS += DlgRef_1Sel3Spin1Check_QTD.h +HEADERS += DlgRef_1Sel4Spin2Check_QTD.h HEADERS += DlgRef_2Sel1Spin2Check_QTD.h HEADERS += DlgRef_2Sel2Spin1Check_QTD.h +HEADERS += DlgRef_2Sel2Spin3Check_QTD.h HEADERS += DlgRef_2Sel4Spin1Check_QTD.h HEADERS += DlgRef_3Sel4Spin2Check_QTD.h HEADERS += DlgRef_4Sel1List_QTD.h @@ -89,8 +90,10 @@ HEADERS += DlgRef_2Sel2Spin.h HEADERS += DlgRef_2Sel3Spin.h HEADERS += DlgRef_1Sel1Spin1Check.h HEADERS += DlgRef_1Sel3Spin1Check.h +HEADERS += DlgRef_1Sel4Spin2Check.h HEADERS += DlgRef_2Sel1Spin2Check.h HEADERS += DlgRef_2Sel2Spin1Check.h +HEADERS += DlgRef_2Sel2Spin3Check.h HEADERS += DlgRef_2Sel4Spin1Check.h HEADERS += DlgRef_3Sel4Spin2Check.h HEADERS += DlgRef_3Sel3Spin1Check.h @@ -117,8 +120,10 @@ SOURCES += DlgRef_2Sel2Spin.cxx SOURCES += DlgRef_2Sel3Spin.cxx SOURCES += DlgRef_1Sel1Spin1Check.cxx SOURCES += DlgRef_1Sel3Spin1Check.cxx +SOURCES += DlgRef_1Sel4Spin2Check.cxx SOURCES += DlgRef_2Sel1Spin2Check.cxx SOURCES += DlgRef_2Sel2Spin1Check.cxx +SOURCES += DlgRef_2Sel2Spin3Check.cxx SOURCES += DlgRef_2Sel4Spin1Check.cxx SOURCES += DlgRef_3Sel4Spin2Check.cxx SOURCES += DlgRef_3Sel3Spin1Check.cxx diff --git a/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui b/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui new file mode 100644 index 000000000..a6c6a6391 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui @@ -0,0 +1,211 @@ + + DlgRef_1Sel4Spin2Check_QTD + + + + 0 + 0 + 156 + 120 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + + + + + 9 + + + 9 + + + 9 + + + 9 + + + 6 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
SalomeApp_DoubleSpinBox.h
+
+
+ + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + SpinBox_SC + CheckBox1 + CheckBox2 + + + +
diff --git a/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui b/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui new file mode 100644 index 000000000..1d7620087 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui @@ -0,0 +1,208 @@ + + DlgRef_2Sel2Spin3Check_QTD + + + + 0 + 0 + 156 + 197 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + 9 + + + 9 + + + 9 + + + 9 + + + 6 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
SalomeApp_DoubleSpinBox.h
+
+
+ + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + SpinBox_DY + CheckBox1 + CheckBox2 + CheckBox3 + + + +
diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index f7af410b2..72e0eacf2 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -15,13 +15,12 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# # GEOM DLGREF : # File : Makefile.am # Author : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com) # Package : DlgRef -# + include $(top_srcdir)/adm_local/unix/make_common_starter.am # Libraries targets @@ -48,6 +47,7 @@ UIC_FILES = \ ui_DlgRef_1Sel3Check_QTD.h \ ui_DlgRef_1Sel3Spin_QTD.h \ ui_DlgRef_1Sel3Spin1Check_QTD.h \ + ui_DlgRef_1Sel4Spin2Check_QTD.h \ ui_DlgRef_1Sel4Spin_QTD.h \ ui_DlgRef_1Sel5Spin1Check_QTD.h \ ui_DlgRef_1Sel5Spin_QTD.h \ @@ -62,6 +62,7 @@ UIC_FILES = \ ui_DlgRef_2Sel1SpinInt_QTD.h \ ui_DlgRef_2Sel2List_QTD.h \ ui_DlgRef_2Sel2Spin1Check_QTD.h \ + ui_DlgRef_2Sel2Spin3Check_QTD.h \ ui_DlgRef_2Sel2Spin_QTD.h \ ui_DlgRef_2Sel3Spin2Rb_QTD.h \ ui_DlgRef_2Sel3Spin_QTD.h \ diff --git a/src/GEOM/GEOM_PythonDump.cxx b/src/GEOM/GEOM_PythonDump.cxx index 7e62dfa62..858cb5378 100644 --- a/src/GEOM/GEOM_PythonDump.cxx +++ b/src/GEOM/GEOM_PythonDump.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 "GEOM_PythonDump.hxx" @@ -52,6 +51,15 @@ namespace GEOM } } + TPythonDump& TPythonDump::operator<< (bool theArg) + { + if (theArg) + myStream << "True"; + else + myStream << "False"; + return *this; + } + TPythonDump& TPythonDump::operator<< (long int theArg) { myStream< GEOM_EXTRUSION_TITLE Construction by Extrusion + + GEOM_SCALE_PRISM + Scale the face opposite to the base + GEOM_FACE Face @@ -4218,6 +4222,14 @@ Otherwise the dimensions will be kept without modifications. GEOM_IS_CLOSED Build a closed edge + + GEOM_BUILD_CLOSED_WIRE + Build a closed wire + + + GEOM_IS_REORDER + Reorder vertices taking into account distances + BasicGUI_EllipseDlg diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index cc2b9791b..d5473f280 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.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 @@ -68,6 +67,8 @@ #include #include +#include + #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -921,7 +922,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusPntVecRR //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Object) theBase, Handle(GEOM_Object) theVec, - double theH) + double theH, double theScaleFactor) { SetErrorCode(KO); @@ -948,6 +949,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Objec aCI.SetBase(aRefBase); aCI.SetVector(aRefVec); aCI.SetH(theH); + aCI.SetScale(theScaleFactor); //Compute the Prism value try { @@ -967,8 +969,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Objec } //Make a Python command - GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakePrismVecH(" - << theBase << ", " << theVec << ", " << theH << ")"; + GEOM::TPythonDump pd (aFunction); + pd << aPrism << " = geompy.MakePrismVecH(" << theBase << ", " << theVec << ", " << theH; + if (theScaleFactor > Precision::Confusion()) + pd << ", " << theScaleFactor << ")"; + else + pd << ")"; SetErrorCode(OK); return aPrism; @@ -1041,7 +1047,8 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH2Ways (Handle(GEOM_ //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2) + Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2, + double theScaleFactor) { SetErrorCode(KO); @@ -1069,6 +1076,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt aCI.SetBase(aRefBase); aCI.SetFirstPoint(aRefPnt1); aCI.SetLastPoint(aRefPnt2); + aCI.SetScale(theScaleFactor); //Compute the Prism value try { @@ -1088,8 +1096,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt } //Make a Python command - GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakePrism(" - << theBase << ", " << thePoint1 << ", " << thePoint2 << ")"; + GEOM::TPythonDump pd (aFunction); + pd << aPrism << " = geompy.MakePrism(" << theBase << ", " << thePoint1 << ", " << thePoint2; + if (theScaleFactor > Precision::Confusion()) + pd << ", " << theScaleFactor << ")"; + else + pd << ")"; SetErrorCode(OK); return aPrism; @@ -1162,7 +1174,8 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt2Ways */ //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ - (Handle(GEOM_Object) theBase, double theDX, double theDY, double theDZ) + (Handle(GEOM_Object) theBase, double theDX, double theDY, double theDZ, + double theScaleFactor) { SetErrorCode(KO); @@ -1189,6 +1202,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ aCI.SetDX(theDX); aCI.SetDY(theDY); aCI.SetDZ(theDZ); + aCI.SetScale(theScaleFactor); //Compute the Prism value try { @@ -1207,8 +1221,13 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ } //Make a Python command - GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakePrismDXDYDZ(" - << theBase << ", " << theDX << ", " << theDY << ", " << theDZ << ")"; + GEOM::TPythonDump pd (aFunction); + pd << aPrism << " = geompy.MakePrismDXDYDZ(" + << theBase << ", " << theDX << ", " << theDY << ", " << theDZ; + if (theScaleFactor > Precision::Confusion()) + pd << ", " << theScaleFactor << ")"; + else + pd << ")"; SetErrorCode(OK); return aPrism; @@ -1510,7 +1529,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling pd << aFilling << " = geompy.MakeFilling(" << theShape << ", " << theMinDeg << ", " << theMaxDeg << ", " << theTol2D << ", " << theTol3D << ", " << theNbIter << ", "; - if( theMethod==1 ) pd << "GEOM.FOM_UseOri"; + if( theMethod==1 ) pd << "GEOM.FOM_UseOri"; else if( theMethod==2 ) pd << "GEOM.FOM_AutoCorrect"; else pd << "GEOM.FOM_Default"; if(isApprox) @@ -1538,13 +1557,13 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( return anObj; Standard_Integer nbObj = theSeqSections->Length(); - if (!nbObj) + if (!nbObj) return anObj; //Add a new ThruSections object Handle(GEOM_Object) aThruSect = GetEngine()->AddObject(GetDocID(), GEOM_THRUSECTIONS); - + //Add a new ThruSections function int aTypeFunc = (theRuled ? THRUSECTIONS_RULED : THRUSECTIONS_SMOOTHED); @@ -1565,7 +1584,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( Handle(Standard_Transient) anItem = theSeqSections->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem); if(!aSectObj.IsNull()) { @@ -1607,7 +1626,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( Handle(Standard_Transient) anItem = theSeqSections->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem); if(!aSectObj.IsNull()) { pyDump<< aSectObj; @@ -1615,13 +1634,11 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( pyDump<<", "; } } - + pyDump<< "],"<Length(); - + if (!nbBases) return anObj; - + Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); - + //Add a new Pipe function Handle(GEOM_Function) aFunction = @@ -1675,7 +1692,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( Handle(Standard_Transient) anItem = theBases->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem); if(aBase.IsNull()) continue; @@ -1687,7 +1704,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( Handle(Standard_Transient) anItemLoc = theLocations->Value(i); if(anItemLoc.IsNull()) continue; - + Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc); if(aLoc.IsNull()) continue; @@ -1707,7 +1724,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( aCI.SetPath(aRefPath); aCI.SetWithContactMode(theWithContact); aCI.SetWithCorrectionMode(theWithCorrections); - + //Compute the Pipe value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -1733,38 +1750,35 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( Handle(Standard_Transient) anItem = theBases->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbBases) pyDump<<", "; } - } - + pyDump<< "], ["; - + for(i =1 ; i <= nbLocs; i++) { Handle(Standard_Transient) anItem = theLocations->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbLocs) pyDump<<", "; } - } + } pyDump<< "], "<Length(); - + if (!nbBases) return anObj; - + Standard_Integer nbSubBases = (theSubBases.IsNull() ? 0 :theSubBases->Length()); Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); - + //Add a new Pipe function Handle(GEOM_Function) aFunction = @@ -1869,7 +1883,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( aCI.SetPath(aRefPath); aCI.SetWithContactMode(theWithContact); aCI.SetWithCorrectionMode(theWithCorrections); - + //Compute the Pipe value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -1895,48 +1909,46 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( Handle(Standard_Transient) anItem = theBases->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbBases) pyDump<<", "; } - } - + pyDump<< "], ["; - + for(i =1 ; i <= nbSubBases; i++) { Handle(Standard_Transient) anItem = theSubBases->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbBases) pyDump<<", "; } - } - + pyDump<< "], ["; - + for(i =1 ; i <= nbLocs; i++) { Handle(Standard_Transient) anItem = theLocations->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbLocs) pyDump<<", "; } - } + } pyDump<< "], "<Length(); - + if (!nbBases) return anObj; - + Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); - + //Add a new Pipe function Handle(GEOM_Function) aFunction = @@ -2018,7 +2030,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); - + //Compute the Pipe value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -2044,31 +2056,30 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( Handle(Standard_Transient) anItem = theBases->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbBases) pyDump<<", "; } - } - + pyDump<< "], ["; - + for(i =1 ; i <= nbLocs; i++) { Handle(Standard_Transient) anItem = theLocations->Value(i); if(anItem.IsNull()) continue; - + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); if(!anObj.IsNull()) { pyDump<< anObj; if(i < nbLocs) pyDump<<", "; } - } + } pyDump<< "])"; @@ -2137,4 +2148,3 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han SetErrorCode(OK); return aPipe; } - diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index 8aad09ff4..8a96d33be 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.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_I3DPrimOperations_HXX_ #define _GEOMImpl_I3DPrimOperations_HXX_ @@ -68,31 +67,34 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { double theRMajor, double theRMinor); Standard_EXPORT Handle(GEOM_Object) MakePrismVecH (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) theVec, double theH); + Handle(GEOM_Object) theVec, + double theH, double theScaleFactor = -1.0); Standard_EXPORT Handle(GEOM_Object) MakePrismVecH2Ways (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) theVec, double theH); + Handle(GEOM_Object) theVec, double theH); Standard_EXPORT Handle(GEOM_Object) MakePrismTwoPnt (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePoint1, - Handle(GEOM_Object) thePoint2); + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2, + double theScaleFactor = -1.0); Standard_EXPORT Handle(GEOM_Object) MakePrismTwoPnt2Ways (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePoint1, - Handle(GEOM_Object) thePoint2); + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); Standard_EXPORT Handle(GEOM_Object) MakePrismDXDYDZ (Handle(GEOM_Object) theBase, - double theDX, double theDY, double theDZ); + double theDX, double theDY, double theDZ, + double theScaleFactor = -1.0); Standard_EXPORT Handle(GEOM_Object) MakePrismDXDYDZ2Ways (Handle(GEOM_Object) theBase, - double theDX, double theDY, double theDZ); + double theDX, double theDY, double theDZ); Standard_EXPORT Handle(GEOM_Object) MakePipe (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath); + Handle(GEOM_Object) thePath); Standard_EXPORT Handle(GEOM_Object) MakeRevolutionAxisAngle (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) theAxis, - double theAngle); + Handle(GEOM_Object) theAxis, + double theAngle); Standard_EXPORT Handle(GEOM_Object) MakeRevolutionAxisAngle2Ways (Handle(GEOM_Object) theBase, Handle(GEOM_Object) theAxis, diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index 463af06e3..3d53948c3 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.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 @@ -76,73 +75,6 @@ GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations() } -//============================================================================= -/*! - * MakePolyline - */ -//============================================================================= -Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline (std::list thePoints) -{ - SetErrorCode(KO); - - //Add a new Polyline object - Handle(GEOM_Object) aPolyline = GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE); - - //Add a new Polyline function for creation a polyline relatively to points set - Handle(GEOM_Function) aFunction = - aPolyline->AddFunction(GEOMImpl_PolylineDriver::GetID(), POLYLINE_POINTS); - if (aFunction.IsNull()) return NULL; - - //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) return NULL; - - GEOMImpl_IPolyline aCI (aFunction); - - int aLen = thePoints.size(); - aCI.SetLength(aLen); - - int ind = 1; - std::list::iterator it = thePoints.begin(); - for (; it != thePoints.end(); it++, ind++) { - Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction(); - if (aRefPnt.IsNull()) { - SetErrorCode("NULL point for Polyline"); - return NULL; - } - aCI.SetPoint(ind, aRefPnt); - } - - //Compute the Polyline value - try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 - OCC_CATCH_SIGNALS; -#endif - if (!GetSolver()->ComputeFunction(aFunction)) { - SetErrorCode("Polyline 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 pd (aFunction); - pd << aPolyline << " = geompy.MakePolyline(["; - - it = thePoints.begin(); - pd << (*it++); - while (it != thePoints.end()) { - pd << ", " << (*it++); - } - pd << "])"; - - SetErrorCode(OK); - return aPolyline; -} - //============================================================================= /*! * MakeCircleThreePnt @@ -592,13 +524,84 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArcOfEllipse (Handle(GEOM_Ob return anArc; } +//============================================================================= +/*! + * MakePolyline + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline (std::list thePoints, + bool theIsClosed) +{ + SetErrorCode(KO); + + //Add a new Polyline object + Handle(GEOM_Object) aPolyline = GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE); + + //Add a new Polyline function for creation a polyline relatively to points set + Handle(GEOM_Function) aFunction = + aPolyline->AddFunction(GEOMImpl_PolylineDriver::GetID(), POLYLINE_POINTS); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) return NULL; + + GEOMImpl_IPolyline aCI (aFunction); + + int aLen = thePoints.size(); + aCI.SetLength(aLen); + + int ind = 1; + std::list::iterator it = thePoints.begin(); + for (; it != thePoints.end(); it++, ind++) { + Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction(); + if (aRefPnt.IsNull()) { + SetErrorCode("NULL point for Polyline"); + return NULL; + } + aCI.SetPoint(ind, aRefPnt); + } + + aCI.SetIsClosed(theIsClosed); + + //Compute the Polyline value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Polyline 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 pd (aFunction); + pd << aPolyline << " = geompy.MakePolyline(["; + + it = thePoints.begin(); + pd << (*it++); + while (it != thePoints.end()) { + pd << ", " << (*it++); + } + pd << "], " << theIsClosed << ")"; + + SetErrorCode(OK); + return aPolyline; +} + //============================================================================= /*! * MakeSplineBezier */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier - (std::list thePoints) + (std::list thePoints, + bool theIsClosed) { SetErrorCode(KO); @@ -628,6 +631,8 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier aCI.SetPoint(ind, aRefPnt); } + aCI.SetIsClosed(theIsClosed); + //Compute the Spline value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -653,7 +658,7 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier while (it != thePoints.end()) { pd << ", " << (*it++); } - pd << "])"; + pd << "], " << theIsClosed << ")"; SetErrorCode(OK); return aSpline; @@ -666,7 +671,8 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier //============================================================================= Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation (std::list thePoints, - bool theIsClosed) + bool theIsClosed, + bool theDoReordering) { SetErrorCode(KO); @@ -697,6 +703,7 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation } aCI.SetIsClosed(theIsClosed); + aCI.SetDoReordering(theDoReordering); //Compute the Spline value try { @@ -723,9 +730,7 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation while (it != thePoints.end()) { pd << ", " << (*it++); } - pd << "]"; - if ( theIsClosed ) pd << ", True"; - pd << ")"; + pd << "], " << theIsClosed << ", " << theDoReordering << ")"; SetErrorCode(OK); return aSpline; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index cd7cb9db8..d85dcf14d 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.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_ICurvesOperations_HXX_ #define _GEOMImpl_ICurvesOperations_HXX_ @@ -37,8 +36,6 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Standard_EXPORT GEOMImpl_ICurvesOperations(GEOM_Engine* theEngine, int theDocID); Standard_EXPORT ~GEOMImpl_ICurvesOperations(); - Standard_EXPORT Handle(GEOM_Object) MakePolyline (std::list thePoints); - Standard_EXPORT Handle(GEOM_Object) MakeCircleThreePnt (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2, Handle(GEOM_Object) thePnt3); @@ -66,9 +63,15 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Handle(GEOM_Object) thePnt2, Handle(GEOM_Object) thePnt3); - Standard_EXPORT Handle(GEOM_Object) MakeSplineBezier (std::list thePoints); + Standard_EXPORT Handle(GEOM_Object) MakePolyline (std::list thePoints, + bool theIsClosed = false); + + Standard_EXPORT Handle(GEOM_Object) MakeSplineBezier (std::list thePoints, + bool theIsClosed = false); + Standard_EXPORT Handle(GEOM_Object) MakeSplineInterpolation (std::list thePoints, - bool theIsClosed = false); + bool theIsClosed = false, + bool theDoReordering = false); Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const char* theCommand, std::list theWorkingPlane); diff --git a/src/GEOMImpl/GEOMImpl_IPolyline.hxx b/src/GEOMImpl/GEOMImpl_IPolyline.hxx index 9ca4ee6d5..d4b3ae66f 100644 --- a/src/GEOMImpl/GEOMImpl_IPolyline.hxx +++ b/src/GEOMImpl/GEOMImpl_IPolyline.hxx @@ -18,14 +18,14 @@ // 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 Polyline creation. -// +//NOTE: This is an interface to a function for the Polyline creation. + #include "GEOM_Function.hxx" #define POLY_ARG_LENG 1 #define POLY_ARG_LAST 1 +#define POLY_ARG_CLOS 2 class GEOMImpl_IPolyline { @@ -37,10 +37,14 @@ class GEOMImpl_IPolyline void SetPoint(int theId, Handle(GEOM_Function) theP) { _func->SetReference(POLY_ARG_LAST + theId, theP); } + void SetIsClosed(bool theIsClosed) { _func->SetInteger(POLY_ARG_CLOS, (int)theIsClosed); } + int GetLength() { return _func->GetInteger(POLY_ARG_LENG); } Handle(GEOM_Function) GetPoint(int theId) { return _func->GetReference(POLY_ARG_LAST + theId); } + bool GetIsClosed() { return (bool)_func->GetInteger(POLY_ARG_CLOS); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_IPrism.hxx b/src/GEOMImpl/GEOMImpl_IPrism.hxx index 18aa9e262..2271967ed 100644 --- a/src/GEOMImpl/GEOMImpl_IPrism.hxx +++ b/src/GEOMImpl/GEOMImpl_IPrism.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 Prism creation. -// + #include "GEOM_Function.hxx" #define PRISM_ARG_H 1 @@ -32,6 +31,7 @@ #define PRISM_ARG_DX 6 #define PRISM_ARG_DY 7 #define PRISM_ARG_DZ 8 +#define PRISM_ARG_SCALE 9 class GEOMImpl_IPrism { @@ -44,6 +44,11 @@ class GEOMImpl_IPrism void SetFirstPoint(Handle(GEOM_Function) thePoint) { _func->SetReference(PRISM_ARG_PNT_F, thePoint); } void SetLastPoint (Handle(GEOM_Function) thePoint) { _func->SetReference(PRISM_ARG_PNT_L, thePoint); } + Handle(GEOM_Function) GetBase () { return _func->GetReference(PRISM_ARG_BASE); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(PRISM_ARG_VEC ); } + Handle(GEOM_Function) GetFirstPoint() { return _func->GetReference(PRISM_ARG_PNT_F ); } + Handle(GEOM_Function) GetLastPoint () { return _func->GetReference(PRISM_ARG_PNT_L ); } + void SetDX(double theDX) { _func->SetReal(PRISM_ARG_DX, theDX); } void SetDY(double theDY) { _func->SetReal(PRISM_ARG_DY, theDY); } void SetDZ(double theDZ) { _func->SetReal(PRISM_ARG_DZ, theDZ); } @@ -52,15 +57,14 @@ class GEOMImpl_IPrism double GetDY() { return _func->GetReal(PRISM_ARG_DY); } double GetDZ() { return _func->GetReal(PRISM_ARG_DZ); } - Handle(GEOM_Function) GetBase () { return _func->GetReference(PRISM_ARG_BASE); } - Handle(GEOM_Function) GetVector() { return _func->GetReference(PRISM_ARG_VEC ); } - Handle(GEOM_Function) GetFirstPoint() { return _func->GetReference(PRISM_ARG_PNT_F ); } - Handle(GEOM_Function) GetLastPoint () { return _func->GetReference(PRISM_ARG_PNT_L ); } - void SetH(double theH) { _func->SetReal(PRISM_ARG_H, theH); } double GetH() { return _func->GetReal(PRISM_ARG_H); } + void SetScale(double theH) { _func->SetReal(PRISM_ARG_SCALE, theH); } + + double GetScale() { return _func->GetReal(PRISM_ARG_SCALE); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_ISpline.hxx b/src/GEOMImpl/GEOMImpl_ISpline.hxx index d58b22e7e..d3304c162 100644 --- a/src/GEOMImpl/GEOMImpl_ISpline.hxx +++ b/src/GEOMImpl/GEOMImpl_ISpline.hxx @@ -18,14 +18,14 @@ // 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 interface to a function for the Spline creation. -// + #include "GEOM_Function.hxx" #define SPL_ARG_LENG 1 #define SPL_ARG_CLOS 2 +#define SPL_ARG_REOR 3 #define SPL_ARG_LAST 2 class GEOMImpl_ISpline @@ -38,12 +38,16 @@ class GEOMImpl_ISpline void SetIsClosed(bool theIsClosed) { _func->SetInteger(SPL_ARG_CLOS, (int)theIsClosed); } + void SetDoReordering(bool theDoReordering) { _func->SetInteger(SPL_ARG_REOR, (int)theDoReordering); } + void SetPoint(int theId, Handle(GEOM_Function) theP) { _func->SetReference(SPL_ARG_LAST + theId, theP); } int GetLength() { return _func->GetInteger(SPL_ARG_LENG); } bool GetIsClosed() { return (bool)_func->GetInteger(SPL_ARG_CLOS); } + bool GetDoReordering() { return (bool)_func->GetInteger(SPL_ARG_REOR); } + Handle(GEOM_Function) GetPoint(int theId) { return _func->GetReference(SPL_ARG_LAST + theId); } private: diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index aef2c9d33..89a6a0768 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.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 @@ -33,8 +32,6 @@ #include #include -//#include - #include #include #include @@ -66,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -147,21 +145,21 @@ static bool FillForOtherEdges(const TopoDS_Shape& F1, ShapeAnalysis_Edge sae; while(1) { - if(!aMapVertEdge1.Contains(VS1)) + if (!aMapVertEdge1.Contains(VS1)) MESSAGE (" FillForOtherEdges: map aMapVertEdge1 not contains key VS1"); const TopTools_ListOfShape& aList1 = aMapVertEdge1.FindFromKey(VS1); //TopoDS_Shape E1next; TopTools_ListIteratorOfListOfShape anIter1(aList1); - if(anIter1.Value().IsSame(ES1)) { + if (anIter1.Value().IsSame(ES1)) { anIter1.Next(); } //E1next = anIter1.Value(); - if(!aMapVertEdge2.Contains(VS2)) + if (!aMapVertEdge2.Contains(VS2)) MESSAGE (" FillForOtherEdges: map aMapVertEdge2 not contains key VS2"); const TopTools_ListOfShape& aList2 = aMapVertEdge2.FindFromKey(VS2); //TopoDS_Shape E2next; TopTools_ListIteratorOfListOfShape anIter2(aList2); - if(anIter2.Value().IsSame(ES2)) { + if (anIter2.Value().IsSame(ES2)) { anIter2.Next(); } //E2next = anIter2.Value(); @@ -169,20 +167,20 @@ static bool FillForOtherEdges(const TopoDS_Shape& F1, //ES2 = TopoDS::Edge(E2next); ES1 = TopoDS::Edge(anIter1.Value()); ES2 = TopoDS::Edge(anIter2.Value()); - if(!FF.Contains(ES1)) { + if (!FF.Contains(ES1)) { FF.Add(ES1,ES2); } - if(VS1.IsSame(sae.FirstVertex(ES1))) + if (VS1.IsSame(sae.FirstVertex(ES1))) VS1 = sae.LastVertex(ES1); else VS1 = sae.FirstVertex(ES1); - if(VS2.IsSame(sae.FirstVertex(ES2))) + if (VS2.IsSame(sae.FirstVertex(ES2))) VS2 = sae.LastVertex(ES2); else VS2 = sae.FirstVertex(ES2); - if(VS1.IsSame(V1)) + if (VS1.IsSame(V1)) break; - if(!FF.Contains(VS1)) { + if (!FF.Contains(VS1)) { FF.Add(VS1,VS2); } } @@ -211,7 +209,7 @@ static bool FillCorrespondingEdges(const TopoDS_Shape& FS1, BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); aBuilder.Add(aWire1, aLoc1); aBuilder.Add(aWire2, aLoc2); - if(!aBuilder.IsReady()) { + if (!aBuilder.IsReady()) { return false; } aBuilder.Build(); @@ -226,11 +224,11 @@ static bool FillCorrespondingEdges(const TopoDS_Shape& FS1, BRepTools::Write(C,"/dn02/users_Linux/skl/work/Bugs/14857/comp.brep"); */ ShapeAnalysis_Edge sae; - double tol = Max( BRep_Tool::Tolerance(TopoDS::Face(FS1)), - BRep_Tool::Tolerance(TopoDS::Face(FS2)) ); + double tol = Max(BRep_Tool::Tolerance(TopoDS::Face(FS1)), + BRep_Tool::Tolerance(TopoDS::Face(FS2))); TopTools_MapOfShape Vs1,Vs2; TopExp_Explorer exp; - exp.Init( FS1, TopAbs_EDGE ); + exp.Init(FS1, TopAbs_EDGE); TopoDS_Edge E1 = TopoDS::Edge(exp.Current()); TopoDS_Vertex V11 = sae.FirstVertex(E1); TopoDS_Vertex V21 = sae.LastVertex(E1); @@ -240,43 +238,43 @@ static bool FillCorrespondingEdges(const TopoDS_Shape& FS1, //cout<<"P21("<Length(); + Standard_Integer nbLocs = (theHSeqLocs.IsNull() ? 0 : theHSeqLocs->Length()); + + if (nbLocs && nbLocs != nbBases) { + Standard_ConstructionError::Raise("Number of sections is not equal to number of locations "); + } + + TopTools_SequenceOfShape aSeqBases; + TopTools_SequenceOfShape aSeqLocs; + TopTools_SequenceOfShape aSeqFaces; + + Standard_Integer i = 1; + for (i = 1; i <= nbBases; i++) { + if (theHSeqBases->Value(i).IsNull()) + continue; + + // Make copy to prevent modifying of base object 0020766 : EDF 1320 + TopoDS_Shape aShapeBase; + BRepBuilderAPI_Copy Copy (theHSeqBases->Value(i)); + if (Copy.IsDone()) + aShapeBase = Copy.Shape(); + + TopAbs_ShapeEnum aTypeBase = aShapeBase.ShapeType(); + + //if for section was specified face with a few wires then a few + // pipes were build and make solid + Standard_Boolean NeedCreateSolid = Standard_False; + if (aTypeBase == TopAbs_SHELL) { + // create wire as boundary contour if shell is no closed + // get free boundary shapes + ShapeAnalysis_FreeBounds anAnalizer(aShapeBase); + TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); + TopExp_Explorer anExp; + TopoDS_Shape aWire; + Standard_Integer NbWires = 0; + for (anExp.Init(aClosed, TopAbs_WIRE); anExp.More(); anExp.Next()) { + NbWires++; + aWire = anExp.Current(); + } + if (NbWires != 1) { + // bad case + Standard_ConstructionError::Raise("Bad shell is used as section "); + } + NeedCreateSolid = Standard_True; + aSeqFaces.Append(aShapeBase); + aSeqBases.Append(aWire); + } + else if (aTypeBase == TopAbs_FACE) { + NeedCreateSolid = Standard_True; + //for case one path should be used other type function + aSeqFaces.Append(aShapeBase); + TopExp_Explorer aExpW(aShapeBase,TopAbs_WIRE); + for (; aExpW.More(); aExpW.Next()) { + TopoDS_Shape aWireProf = aExpW.Current(); + aSeqBases.Append(aWireProf); + } + } + else if (aTypeBase == TopAbs_WIRE || aTypeBase == TopAbs_VERTEX) { + aSeqBases.Append(aShapeBase); + } + else if (aTypeBase == TopAbs_EDGE) { + TopoDS_Edge anEdge = TopoDS::Edge(aShapeBase); + TopoDS_Shape aWireProf = BRepBuilderAPI_MakeWire(anEdge); + aSeqBases.Append(aWireProf); + } + if (nbLocs) { + TopoDS_Shape aShapeLoc = theHSeqLocs->Value(i); + if (aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) + continue; + aSeqLocs.Append(aShapeLoc); + } + } + + nbLocs = aSeqLocs.Length(); + + // skl 02.05.2007 + TopTools_SequenceOfShape Edges; + if (nbLocs > 0) { + // we have to check that each location shape is a vertex from + // path and update aSeqLocs if it is needed (and possible) + TColgp_SequenceOfPnt PLocs; + for (i=1; i<=nbLocs; i++) { + TopoDS_Vertex V = TopoDS::Vertex(aSeqLocs.Value(i)); + PLocs.Append(BRep_Tool::Pnt(V)); + } + //TopTools_SequenceOfShape Edges; + TopExp_Explorer anExp; + for (anExp.Init(aWirePath, TopAbs_EDGE); anExp.More(); anExp.Next()) { + Edges.Append(anExp.Current()); + } + int nbEdges = Edges.Length(); + ShapeAnalysis_Edge sae; + TopoDS_Edge edge = TopoDS::Edge(Edges.First()); + double tol = BRep_Tool::Tolerance(edge); + TopoDS_Vertex VF = sae.FirstVertex(edge); + gp_Pnt PF = BRep_Tool::Pnt(VF); + //cout<<"PF("< tol) { + Standard_ConstructionError::Raise + ("First location shapes is not coincided with first vertex of aWirePath"); + } + aSeqLocs.ChangeValue(1) = VF; + edge = TopoDS::Edge(Edges.Last()); + tol = BRep_Tool::Tolerance(edge); + TopoDS_Vertex VL = sae.LastVertex(edge); + gp_Pnt PL = BRep_Tool::Pnt(VL); + if (PL.Distance(PLocs.Last()) > tol) { + Standard_ConstructionError::Raise + ("Last location shapes is not coincided with last vertex of aWirePath"); + } + aSeqLocs.ChangeValue(nbLocs) = VL; + int jcurr = 2; + for (i=1; i<=Edges.Length() && jcurr0 && + PLocs.Value(jcurr).Distance(PPCurve.Point(1)) < tol) { + double param = PPCurve.Parameter(1); + gp_Pnt PC1; + C->D0(param,PC1); + // split current edge + Handle(Geom_TrimmedCurve) tc1 = new Geom_TrimmedCurve(C,fp,param); + Handle(Geom_TrimmedCurve) tc2 = new Geom_TrimmedCurve(C,param,lp); + TopoDS_Edge E1,E2; + BRep_Builder B; + gp_Pnt Pfp; + C->D0(fp,Pfp); + if (Pfp.Distance(P1) we have to update WirePath + BRep_Builder B; + TopoDS_Wire W; + B.MakeWire(W); + for (i=1; i<=Edges.Length(); i++) { + B.Add(W,TopoDS::Edge(Edges.Value(i))); + } + aWirePath = W; + } + } + + // check curvature of wire for condition that + // max summary angle between directions along + // wire path must be < 4*PI. If not - split wire + // and seguences of shapes, perform pipe for each + // and make sewing after that + double fp,lp; + Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(Edges.Value(1)),fp,lp); + gp_Pnt P1,P2; + gp_Vec Vec1,Vec2; + C->D1(fp,P1,Vec1); + C->D1(lp,P2,Vec2); + double SumAng = fabs(Vec1.Angle(Vec2)); + Vec1 = Vec2; + P1 = P2; + TColStd_SequenceOfInteger SplitEdgeNums,SplitLocNums; + int LastLoc = 1; + //cout<<"Edges.Length()="<D1(lp,P2,Vec2); + double ang = fabs(Vec1.Angle(Vec2)); + SumAng += ang; + if (SumAng>4*PI) { + SumAng = ang; + SplitEdgeNums.Append(i-1); + int j; + for (j=LastLoc+1; j<=aSeqLocs.Length(); j++) { + TopoDS_Vertex aVert = TopoDS::Vertex(aSeqLocs.Value(j)); + gp_Pnt P = BRep_Tool::Pnt(aVert); + if (P1.Distance(P) < tol) { + SplitLocNums.Append(j); + LastLoc = j; + break; + } + } + } + Vec1 = Vec2; + P1 = P2; + } + + if (SplitLocNums.Length()==SplitEdgeNums.Length() && SplitEdgeNums.Length()>0) { + TopTools_SequenceOfShape aSeqRes; + int nn, num1 = 1, num2 = 1; + for (nn=1; nn<=SplitEdgeNums.Length(); nn++) { + // create wirepath and sequences of shapes + BRep_Builder B; + TopoDS_Wire tmpW; + B.MakeWire(tmpW); + for (i=num1; i<=SplitEdgeNums.Value(nn); i++) { + B.Add(tmpW,TopoDS::Edge(Edges.Value(i))); + } + num1 = SplitEdgeNums.Value(nn) + 1; + TopTools_SequenceOfShape aTmpSeqBases; + TopTools_SequenceOfShape aTmpSeqLocs; + for (i=num2; i<=SplitLocNums.Value(nn); i++) { + aTmpSeqBases.Append(aSeqBases.Value(i)); + aTmpSeqLocs.Append(aSeqLocs.Value(i)); + } + num2 = SplitLocNums.Value(nn); + // make pipe + BRepOffsetAPI_MakePipeShell aBuilder(tmpW); + Standard_Integer nbShapes = aTmpSeqBases.Length(); + for (i=1; i<=nbShapes; i++) { + TopoDS_Shape aShapeLoc = aTmpSeqLocs.Value(i); + TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc); + aBuilder.Add(aTmpSeqBases.Value(i), aVert, theWithContact, theWithCorrect); + } + if (!aBuilder.IsReady()) { + Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); + } + aBuilder.Build(); + TopoDS_Shape resShape = aBuilder.Shape(); + aSeqRes.Append(resShape); + } + // create wirepath and sequences of shapes for last part + BRep_Builder B; + TopoDS_Wire tmpW; + B.MakeWire(tmpW); + for (i=num1; i<=Edges.Length(); i++) { + B.Add(tmpW,TopoDS::Edge(Edges.Value(i))); + } + TopTools_SequenceOfShape aTmpSeqBases; + TopTools_SequenceOfShape aTmpSeqLocs; + for (i=num2; i<=aSeqLocs.Length(); i++) { + aTmpSeqBases.Append(aSeqBases.Value(i)); + aTmpSeqLocs.Append(aSeqLocs.Value(i)); + } + // make pipe for last part + BRepOffsetAPI_MakePipeShell aBuilder(tmpW); + Standard_Integer nbShapes = aTmpSeqBases.Length(); + for (i=1; i<=nbShapes; i++) { + TopoDS_Shape aShapeLoc = aTmpSeqLocs.Value(i); + TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc); + aBuilder.Add(aTmpSeqBases.Value(i), aVert, theWithContact, theWithCorrect); + } + if (!aBuilder.IsReady()) { + Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); + } + aBuilder.Build(); + TopoDS_Shape resShape = aBuilder.Shape(); + aSeqRes.Append(resShape); + // make sewing for result + Handle(BRepBuilderAPI_Sewing) aSewing = new BRepBuilderAPI_Sewing; + aSewing->SetTolerance(Precision::Confusion()); + aSewing->SetFaceMode(Standard_True); + aSewing->SetFloatingEdgesMode(Standard_False); + aSewing->SetNonManifoldMode(Standard_False); + for (i=1; i<=aSeqRes.Length(); i++) { + aSewing->Add(aSeqRes.Value(i)); + } + aSewing->Perform(); + aShape = aSewing->SewedShape(); + } + else { + // old implementation without splitting + BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); + + Standard_Integer nbShapes = aSeqBases.Length(); + Standard_Integer step = nbShapes/nbBases; + + if (nbShapes < nbBases || fmod((double)nbShapes, (double)nbBases)) { + Standard_ConstructionError::Raise("Invalid sections were specified for building pipe"); + } + Standard_Integer ind =0; + for (i = 1; i <= nbShapes && ind < nbShapes; i++) { //i+nbBases <= nbShapes + TopTools_SequenceOfShape usedBases; + Standard_Integer j = 1; + for (; j <= nbBases; j++) { + ind = i + (j-1)*step; + TopoDS_Shape aWireProf = aSeqBases.Value(ind); + usedBases.Append(aWireProf); + if (nbLocs) { + TopoDS_Shape aShapeLoc = aSeqLocs.Value(j); + TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc); + aBuilder.Add(aWireProf, aVert, theWithContact, theWithCorrect); + } + else + aBuilder.Add(aWireProf, theWithContact, theWithCorrect); + } + if (!aBuilder.IsReady()) { + Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); + } + aBuilder.Build(); + aShape = aBuilder.Shape(); + aSeqFaces.Append(aShape); + for (j = 1; j <=usedBases.Length(); j++) + aBuilder.Delete(usedBases.Value(j)); + } + + //for case if section is face + if (aSeqFaces.Length() >1) { + BRep_Builder aB; + TopoDS_Compound aComp; + aB.MakeCompound(aComp); + for (i = 1; i <= aSeqFaces.Length(); i++) + aB.Add(aComp,aSeqFaces.Value(i)); + aShape = aComp; + } + } + + return aShape; +} + //======================================================================= //function : CreatePipeForShellSections //purpose : auxilary for Execute() @@ -637,36 +996,36 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, nbSubBases = (aSubBasesObjs.IsNull() ? 0 :aSubBasesObjs->Length()), nbLocs = (aLocObjs.IsNull() ? 0 :aLocObjs->Length()); - if( nbLocs != nbBases) { - if(aCI) delete aCI; + if (nbLocs != nbBases) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Number of sections is not equal to number of locations "); } - if( nbSubBases && nbSubBases != nbBases) { - if(aCI) delete aCI; + if (nbSubBases && nbSubBases != nbBases) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Number of sections is not equal to number of subsections "); } //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); TopTools_SequenceOfShape VLocs; - for(i=1; i<=nbBases; i++) { + for (i=1; i<=nbBases; i++) { Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i); - if(anItemLoc.IsNull()) + if (anItemLoc.IsNull()) continue; Handle(GEOM_Function) aRefLoc = Handle(GEOM_Function)::DownCast(anItemLoc); TopoDS_Shape aShapeLoc = aRefLoc->GetValue(); - if(aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) + if (aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) continue; VLocs.Append(aShapeLoc); } nbLocs = VLocs.Length(); - if( nbLocs != nbBases) { - if(aCI) delete aCI; + if (nbLocs != nbBases) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("One of location shapes is not a vertex"); } // split wire path by location points TColgp_SequenceOfPnt PLocs; - for(i=1; i<=nbLocs; i++) { + for (i=1; i<=nbLocs; i++) { TopoDS_Vertex V = TopoDS::Vertex(VLocs.Value(i)); PLocs.Append(BRep_Tool::Pnt(V)); } @@ -675,31 +1034,31 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, TopTools_SequenceOfShape Wires; ShapeAnalysis_Edge sae; - if(nbLocs==2) { + if (nbLocs==2) { TopExp_Explorer anExp; - for ( anExp.Init( aWirePath, TopAbs_EDGE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aWirePath, TopAbs_EDGE); anExp.More(); anExp.Next()) { Edges.Append(anExp.Current()); } Standard_Integer Num1 = 0; Standard_Integer Num2 = 0; - for(i=1; i<=Edges.Length(); i++) { + for (i=1; i<=Edges.Length(); i++) { TopoDS_Edge E = TopoDS::Edge(Edges.Value(i)); double tol = BRep_Tool::Tolerance(E); TopoDS_Vertex V1 = sae.FirstVertex(E); TopoDS_Vertex V2 = sae.LastVertex(E); gp_Pnt P1 = BRep_Tool::Pnt(V1); gp_Pnt P2 = BRep_Tool::Pnt(V2); - if( P1.Distance(PLocs.First()) < tol ) { + if (P1.Distance(PLocs.First()) < tol) { Num1 = i; } - if( P2.Distance(PLocs.Last()) < tol ) { + if (P2.Distance(PLocs.Last()) < tol) { Num2 = i; } } - if( Num1>0 && Num2>0 ) { + if (Num1>0 && Num2>0) { TopoDS_Wire W; B.MakeWire(W); - for(i=Num1; i<=Num2; i++) { + for (i=Num1; i<=Num2; i++) { B.Add(W,Edges.Value(i)); } Wires.Append(W); @@ -710,7 +1069,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, } else { TopExp_Explorer anExp; - for ( anExp.Init( aWirePath, TopAbs_EDGE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aWirePath, TopAbs_EDGE); anExp.More(); anExp.Next()) { Edges.Append(anExp.Current()); } TopoDS_Edge edge = TopoDS::Edge(Edges.First()); @@ -718,8 +1077,8 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, TopoDS_Vertex VF = sae.FirstVertex(edge); gp_Pnt PF = BRep_Tool::Pnt(VF); //cout<<"PF("< tol ) { - if(aCI) delete aCI; + if (PF.Distance(PLocs.First()) > tol) { + if (aCI) delete aCI; Standard_ConstructionError::Raise ("First location shapes is not coincided with first vertex of aWirePath"); } @@ -728,27 +1087,27 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, tol = BRep_Tool::Tolerance(edge); TopoDS_Vertex VL = sae.LastVertex(edge); gp_Pnt PL = BRep_Tool::Pnt(VL); - if( PL.Distance(PLocs.Last()) > tol ) { - if(aCI) delete aCI; + if (PL.Distance(PLocs.Last()) > tol) { + if (aCI) delete aCI; Standard_ConstructionError::Raise ("Last location shapes is not coincided with last vertex of aWirePath"); } VLocs.ChangeValue(nbLocs) = VL; int jcurr = 2; TopTools_SequenceOfShape tmpEdges; - for(i=1; i<=Edges.Length() && jcurr0 && - PLocs.Value(jcurr).Distance(PPCurve.Point(1)) < tol ) { + if (PPCurve.NbPoints()>0 && + PLocs.Value(jcurr).Distance(PPCurve.Point(1)) < tol) { double param = PPCurve.Parameter(1); gp_Pnt PC1; C->D0(param,PC1); @@ -772,7 +1131,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, TopoDS_Edge E1,E2; gp_Pnt Pfp; C->D0(fp,Pfp); - if(Pfp.Distance(P1)Value(i); - if(anItem1.IsNull()) + if (anItem1.IsNull()) continue; Handle(GEOM_Function) aRefBase1 = Handle(GEOM_Function)::DownCast(anItem1); - if(aRefBase1.IsNull()) + if (aRefBase1.IsNull()) continue; TopoDS_Shape aShBase1 = aRefBase1->GetValue(); - if(aShBase1.IsNull()) + if (aShBase1.IsNull()) continue; TopAbs_ShapeEnum aType1 = aShBase1.ShapeType(); // 2 section Handle(Standard_Transient) anItem2 = aBasesObjs->Value(i+1); - if(anItem2.IsNull()) + if (anItem2.IsNull()) continue; Handle(GEOM_Function) aRefBase2 = Handle(GEOM_Function)::DownCast(anItem2); - if(aRefBase2.IsNull()) + if (aRefBase2.IsNull()) continue; TopoDS_Shape aShBase2 = aRefBase2->GetValue(); - if(aShBase2.IsNull()) + if (aShBase2.IsNull()) continue; TopAbs_ShapeEnum aType2 = aShBase2.ShapeType(); //BRepTools::Write(aShBase1,"/dn02/users_Linux/skl/work/Bugs/14857/base1.brep"); - bool OkSec = ( aType1==TopAbs_SHELL || aType1==TopAbs_FACE ) && - ( aType2==TopAbs_SHELL || aType2==TopAbs_FACE ); - if( !OkSec ) { - if(aCI) delete aCI; + bool OkSec = (aType1==TopAbs_SHELL || aType1==TopAbs_FACE) && + (aType2==TopAbs_SHELL || aType2==TopAbs_FACE); + if (!OkSec) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("One of section shapes has invalid type"); } @@ -871,14 +1230,14 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, // compare sections TopExp_Explorer anExp; Standard_Integer nbf1 = 0; - for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { nbf1++; } Standard_Integer nbf2 = 0; - for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { nbf2++; } - if(nbf1==nbf2) { + if (nbf1==nbf2) { CreateFewSolids = true; } @@ -887,22 +1246,22 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, bool NeedReverse = false; { // first section - anExp.Init( aShBase1, TopAbs_FACE ); + anExp.Init(aShBase1, TopAbs_FACE); TopoDS_Shape aFace = anExp.Current(); TColgp_SequenceOfPnt aPnts; double xc=0, yc=0, zc=0; - for ( anExp.Init( aFace, TopAbs_VERTEX ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aFace, TopAbs_VERTEX); anExp.More(); anExp.Next()) { TopoDS_Vertex V = TopoDS::Vertex(anExp.Current()); aPnts.Append(BRep_Tool::Pnt(V)); xc += aPnts.Last().X(); yc += aPnts.Last().Y(); zc += aPnts.Last().Z(); } - gp_Pnt PC( xc/aPnts.Length(), yc/aPnts.Length(), zc/aPnts.Length() ); + gp_Pnt PC(xc/aPnts.Length(), yc/aPnts.Length(), zc/aPnts.Length()); gp_Vec V1(PC,aPnts.Value(1)); gp_Vec V2(PC,aPnts.Value(2)); gp_Vec VN = V1.Crossed(V2); - for(int ip=2; ipD0(fp,P1); - if( P1.Distance(PLoc) < tol ) { + if (P1.Distance(PLoc) < tol) { C->D0(fp+(lp-fp)/100,P2); } else { @@ -933,12 +1292,12 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, else { TopoDS_Vertex VL = sae.LastVertex(edge); gp_Pnt PL = BRep_Tool::Pnt(VL); - if( PL.Distance(PLoc) < tol ) { + if (PL.Distance(PLoc) < tol) { double fp,lp; Handle(Geom_Curve) C = BRep_Tool::Curve(edge,fp,lp); gp_Pnt P1,P2; C->D0(fp,P1); - if( P1.Distance(PLoc) < tol ) { + if (P1.Distance(PLoc) < tol) { C->D0(fp+(lp-fp)/100,P2); } else { @@ -952,29 +1311,29 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, } cout<<"VN("<PI/2.) { + if (fabs(VN.Angle(PathNorm))>PI/2.) { NeedReverse = true; aShBase1.Reverse(); } } { // second section - anExp.Init( aShBase2, TopAbs_FACE ); + anExp.Init(aShBase2, TopAbs_FACE); TopoDS_Shape aFace = anExp.Current(); TColgp_SequenceOfPnt aPnts; double xc=0, yc=0, zc=0; - for ( anExp.Init( aFace, TopAbs_VERTEX ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aFace, TopAbs_VERTEX); anExp.More(); anExp.Next()) { TopoDS_Vertex V = TopoDS::Vertex(anExp.Current()); aPnts.Append(BRep_Tool::Pnt(V)); xc += aPnts.Last().X(); yc += aPnts.Last().Y(); zc += aPnts.Last().Z(); } - gp_Pnt PC( xc/aPnts.Length(), yc/aPnts.Length(), zc/aPnts.Length() ); + gp_Pnt PC(xc/aPnts.Length(), yc/aPnts.Length(), zc/aPnts.Length()); gp_Vec V1(PC,aPnts.Value(1)); gp_Vec V2(PC,aPnts.Value(2)); gp_Vec VN = V1.Crossed(V2); - for(int ip=2; ipD0(fp,P1); - if( P1.Distance(PLoc) < tol ) { + if (P1.Distance(PLoc) < tol) { C->D0(fp+(lp-fp)/100,P2); } else { @@ -1005,12 +1364,12 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, else { TopoDS_Vertex VL = sae.LastVertex(edge); gp_Pnt PL = BRep_Tool::Pnt(VL); - if( PL.Distance(PLoc) < tol ) { + if (PL.Distance(PLoc) < tol) { double fp,lp; Handle(Geom_Curve) C = BRep_Tool::Curve(edge,fp,lp); gp_Pnt P1,P2; C->D0(fp,P1); - if( P1.Distance(PLoc) < tol ) { + if (P1.Distance(PLoc) < tol) { C->D0(fp+(lp-fp)/100,P2); } else { @@ -1024,29 +1383,29 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, } //cout<<"VN("<PI/2.) + if (fabs(VN.Angle(PathNorm))>PI/2.) aShBase2.Reverse(); } */ - if(!CreateFewSolids) { + if (!CreateFewSolids) { // we can create only one solid TopoDS_Shape aWire1, aWire2; // prepare aWire1 - if(aType1==TopAbs_SHELL) { + if (aType1==TopAbs_SHELL) { // create wire as boundary contour if shell is no closed // get free boundary shapes - ShapeAnalysis_FreeBounds anAnalizer( aShBase1 ); + ShapeAnalysis_FreeBounds anAnalizer(aShBase1); TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); //TopExp_Explorer anExp; Standard_Integer NbWires = 0; - for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aClosed, TopAbs_WIRE); anExp.More(); anExp.Next()) { NbWires++; aWire1 = anExp.Current(); } - if(NbWires!=1) { + if (NbWires!=1) { // bad case - if(aCI) delete aCI; + if (aCI) delete aCI; Standard_ConstructionError::Raise("Bad shell is used as section "); } } @@ -1055,20 +1414,20 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, aWire1 = aExpW.Current(); } // prepare aWire2 - if(aType2==TopAbs_SHELL) { + if (aType2==TopAbs_SHELL) { // create wire as boundary contour if shell is no closed // get free boundary shapes - ShapeAnalysis_FreeBounds anAnalizer( aShBase2 ); + ShapeAnalysis_FreeBounds anAnalizer(aShBase2); TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); //TopExp_Explorer anExp; Standard_Integer NbWires = 0; - for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aClosed, TopAbs_WIRE); anExp.More(); anExp.Next()) { NbWires++; aWire2 = anExp.Current(); } - if(NbWires!=1) { + if (NbWires!=1) { // bad case - if(aCI) delete aCI; + if (aCI) delete aCI; Standard_ConstructionError::Raise("Bad shell is used as section "); } } @@ -1077,28 +1436,28 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, aWire2 = aExpW.Current(); } // make pipe using aWire1 and aWire2 - if( !aWire1.IsNull() && !aWire2.IsNull() ) { + if (!aWire1.IsNull() && !aWire2.IsNull()) { //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); BRepOffsetAPI_MakePipeShell aBuilder(WPath); aBuilder.Add(aWire1, TopoDS::Vertex(VLocs(i)), aWithContact, aWithCorrect); aBuilder.Add(aWire2, TopoDS::Vertex(VLocs(i+1)), aWithContact, aWithCorrect); - if(!aBuilder.IsReady()) { - if(aCI) delete aCI; + if (!aBuilder.IsReady()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); } aBuilder.Build(); TopoDS_Shape aShape = aBuilder.Shape(); TopoDS_Shell aShell; B.MakeShell(aShell); - for ( anExp.Init( aShape, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShape, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); } - for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); } - for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); } // make sewing for this shell @@ -1107,19 +1466,19 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, aSewing->SetFaceMode(Standard_True); aSewing->SetFloatingEdgesMode(Standard_False); aSewing->SetNonManifoldMode(Standard_False); - for ( anExp.Init( aShell, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShell, TopAbs_FACE); anExp.More(); anExp.Next()) { aSewing->Add(anExp.Current()); } aSewing->Perform(); const TopoDS_Shape aSewShape = aSewing->SewedShape(); - if( aSewShape.ShapeType() == TopAbs_SHELL ) { + if (aSewShape.ShapeType() == TopAbs_SHELL) { aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; BRepGProp::VolumeProperties(aShell, aSystem); - if(aSystem.Mass()<0) { + if (aSystem.Mass()<0) { aShell.Reverse(); } - if(BRep_Tool::IsClosed(aShell)) { + if (BRep_Tool::IsClosed(aShell)) { TopoDS_Solid aSolid; B.MakeSolid(aSolid); B.Add(aSolid,aShell); @@ -1137,10 +1496,10 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, else { // main block - creation few solids (for each pair of faces) TopTools_MapOfShape aFaces1,aFaces2; - for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { aFaces1.Add(anExp.Current()); } - for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { aFaces2.Add(anExp.Current()); } // creating map of edge faces @@ -1152,26 +1511,26 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, // constuct map face->face TopTools_IndexedDataMapOfShapeShape FF; TopoDS_Shape FS1,FS2; - if(nbSubBases==0) { + if (nbSubBases==0) { // find edge the most distant from location point // (this edge is not shared by two faces) double maxdist = 0.; TopoDS_Shape E1; TopoDS_Vertex V11,V21; - for(j=1; j<=aMapEdgeFaces1.Extent(); j++) { + for (j=1; j<=aMapEdgeFaces1.Extent(); j++) { TopoDS_Shape tmp = aMapEdgeFaces1.FindKey(j); const TopTools_ListOfShape& aList = aMapEdgeFaces1.FindFromKey(tmp); - if(aList.Extent()>1) + if (aList.Extent()>1) continue; TopExp_Explorer expv; - expv.Init( tmp, TopAbs_VERTEX ); + expv.Init(tmp, TopAbs_VERTEX); TopoDS_Vertex V1 = TopoDS::Vertex(expv.Current()); expv.Next(); TopoDS_Vertex V2 = TopoDS::Vertex(expv.Current()); gp_Pnt P1 = BRep_Tool::Pnt(V1); gp_Pnt P2 = BRep_Tool::Pnt(V2); double dist = PLocs.Value(i).Distance(P1) + PLocs.Value(i).Distance(P2); - if(dist>maxdist) { + if (dist>maxdist) { E1 = tmp; V11 = V1; V21 = V2; @@ -1188,13 +1547,13 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, gp_Pnt P21 = BRep_Tool::Pnt(V21); TopoDS_Shape E2; TopoDS_Vertex V12,V22; - for(j=1; j<=aMapEdgeFaces2.Extent(); j++) { + for (j=1; j<=aMapEdgeFaces2.Extent(); j++) { TopoDS_Shape tmp = aMapEdgeFaces2.FindKey(j); const TopTools_ListOfShape& aList = aMapEdgeFaces2.FindFromKey(tmp); - if(aList.Extent()>1) + if (aList.Extent()>1) continue; TopExp_Explorer expv; - expv.Init( tmp, TopAbs_VERTEX ); + expv.Init(tmp, TopAbs_VERTEX); TopoDS_Vertex V1tmp = TopoDS::Vertex(expv.Current()); expv.Next(); TopoDS_Vertex V2tmp = TopoDS::Vertex(expv.Current()); @@ -1204,7 +1563,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, double d2 = P1tmp.Distance(P21) + P2tmp.Distance(P11); TopoDS_Vertex V1,V2; gp_Pnt P1,P2; - if(d1>d2) { + if (d1>d2) { V1 = V2tmp; P1 = P2tmp; V2 = V1tmp; P2 = P1tmp; } @@ -1215,7 +1574,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, gp_Vec Vec1(P11,P1); gp_Vec Vec2(P21,P2); double ang = fabs(Vec1.Angle(VM)) + fabs(Vec2.Angle(VM)); - if(angValue(i); - if(anItem.IsNull()) { - if(aCI) delete aCI; + if (anItem.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem); - if(aRefBase.IsNull()) { - if(aCI) delete aCI; + if (aRefBase.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } TopoDS_Shape aSh = aRefBase->GetValue(); - if(aSh.IsNull()) { - if(aCI) delete aCI; + if (aSh.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } - if(aSh.ShapeType()!=TopAbs_FACE) { - if(aCI) delete aCI; + if (aSh.ShapeType()!=TopAbs_FACE) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } FS1 = aSh; } { // 2 section Handle(Standard_Transient) anItem = aSubBasesObjs->Value(i+1); - if(anItem.IsNull()) { - if(aCI) delete aCI; + if (anItem.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem); - if(aRefBase.IsNull()) { - if(aCI) delete aCI; + if (aRefBase.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } TopoDS_Shape aSh = aRefBase->GetValue(); - if(aSh.IsNull()) { - if(aCI) delete aCI; + if (aSh.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } - if(aSh.ShapeType()!=TopAbs_FACE) { - if(aCI) delete aCI; + if (aSh.ShapeType()!=TopAbs_FACE) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } FS2 = aSh; } - if( !aFaces1.Contains(FS1) || !aFaces2.Contains(FS2) ) { - if(aCI) delete aCI; + if (!aFaces1.Contains(FS1) || !aFaces2.Contains(FS2)) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid subbase shape"); } @@ -1294,8 +1653,8 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, // add pairs of edges to FF bool stat = FillCorrespondingEdges(FS1, FS2, TopoDS::Vertex(VLocs(i)), TopoDS::Vertex(VLocs(i+1)), WPath, FF); - if( !stat ) { - if(aCI) delete aCI; + if (!stat) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Can not create correct pipe"); } } @@ -1303,9 +1662,9 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, FindNextPairOfFaces(FS1, aMapEdgeFaces1, aMapEdgeFaces2, FF, aCI); // make pipe for each pair of faces - for(j=1; j<=FF.Extent(); j++) { + for (j=1; j<=FF.Extent(); j++) { TopoDS_Shape F1 = FF.FindKey(j); - if( F1.ShapeType() != TopAbs_FACE ) + if (F1.ShapeType() != TopAbs_FACE) continue; TopoDS_Shape F2 = FF.FindFromIndex(j); TopExp_Explorer aExpW1(F1,TopAbs_WIRE); @@ -1313,21 +1672,21 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, TopExp_Explorer aExpW2(F2,TopAbs_WIRE); TopoDS_Wire aWire2 = TopoDS::Wire(aExpW2.Current()); // make pipe using aWire1 and aWire2 - if( !aWire1.IsNull() && !aWire2.IsNull() ) { + if (!aWire1.IsNull() && !aWire2.IsNull()) { BRepOffsetAPI_MakePipeShell aBuilder(WPath); aBuilder.Add(aWire1, TopoDS::Vertex(VLocs(i)), aWithContact, aWithCorrect); aBuilder.Add(aWire2, TopoDS::Vertex(VLocs(i+1)), aWithContact, aWithCorrect); - if(!aBuilder.IsReady()) { - if(aCI) delete aCI; + if (!aBuilder.IsReady()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); } aBuilder.Build(); TopoDS_Shape aShape = aBuilder.Shape(); TopoDS_Shell aShell; B.MakeShell(aShell); - for ( anExp.Init( aShape, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShape, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); } @@ -1339,20 +1698,20 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, aSewing->SetFaceMode(Standard_True); aSewing->SetFloatingEdgesMode(Standard_False); aSewing->SetNonManifoldMode(Standard_False); - for ( anExp.Init( aShell, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShell, TopAbs_FACE); anExp.More(); anExp.Next()) { aSewing->Add(anExp.Current()); } aSewing->Perform(); const TopoDS_Shape aSewShape = aSewing->SewedShape(); - if( aSewShape.ShapeType() == TopAbs_SHELL ) { + if (aSewShape.ShapeType() == TopAbs_SHELL) { aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; BRepGProp::VolumeProperties(aShell, aSystem); - if(aSystem.Mass()<0) { + if (aSystem.Mass()<0) { //cout<<"aSewShape is reversed"<Length(), nbv = (VObjs.IsNull() ? 0 :VObjs->Length()); - if( nbv != nbBases ) { - if(aCI) delete aCI; + if (nbv != nbBases) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Number of shapes for recognition is invalid"); } TopTools_SequenceOfShape SecVs,Bases; - for(i=1; i<=nbBases; i++) { + for (i=1; i<=nbBases; i++) { // vertex Handle(Standard_Transient) anItem = VObjs->Value(i); - if(anItem.IsNull()) + if (anItem.IsNull()) continue; Handle(GEOM_Function) aRef = Handle(GEOM_Function)::DownCast(anItem); TopoDS_Shape V = aRef->GetValue(); - if(V.IsNull() || V.ShapeType() != TopAbs_VERTEX) + if (V.IsNull() || V.ShapeType() != TopAbs_VERTEX) continue; SecVs.Append(V); // section anItem = aBasesObjs->Value(i); - if(anItem.IsNull()) + if (anItem.IsNull()) continue; aRef = Handle(GEOM_Function)::DownCast(anItem); TopoDS_Shape aSh = aRef->GetValue(); - if(aSh.IsNull()) + if (aSh.IsNull()) continue; Bases.Append(aSh); } nbv = SecVs.Length(); nbBases = Bases.Length(); - if( nbv != nbBases ) { - if(aCI) delete aCI; + if (nbv != nbBases) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("One of shapes for recognition is not a vertex"); } @@ -1436,24 +1795,24 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) TopoDS_Shape aShBase2 = Bases.Value(i+1); TopExp_Explorer anExp; Standard_Integer nbf1 = 0; - for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { nbf1++; } Standard_Integer nbf2 = 0; - for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { nbf2++; } //cout<<"nbf1="<IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { + if (S1->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { Handle(Geom_RectangularTrimmedSurface) RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(S1); S1 = RTS->BasisSurface(); } Handle(Geom_Plane) Pln1 = Handle(Geom_Plane)::DownCast(S1); - if( Pln1.IsNull() ) { - if(aCI) delete aCI; + if (Pln1.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Surface from face is not plane"); } gp_Vec aDir1(Pln1->Axis().Direction()); Handle(Geom_Surface) S2 = BRep_Tool::Surface(TopoDS::Face(F2)); - if(S2->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { + if (S2->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { Handle(Geom_RectangularTrimmedSurface) RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(S2); S2 = RTS->BasisSurface(); } Handle(Geom_Plane) Pln2 = Handle(Geom_Plane)::DownCast(S2); - if( Pln2.IsNull() ) { - if(aCI) delete aCI; + if (Pln2.IsNull()) { + if (aCI) delete aCI; Standard_ConstructionError::Raise("Surface from face is not plane"); } gp_Vec aDir2(Pln2->Axis().Direction()); @@ -1532,21 +1891,21 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) gp_Pnt P1 = BRep_Tool::Pnt(TopoDS::Vertex(SecVs(i))); gp_Pnt P2 = BRep_Tool::Pnt(TopoDS::Vertex(SecVs(i+1))); gp_Vec aDir(P1,P2); - if(fabs(aDir.Angle(aDir1))>PI/2.) + if (fabs(aDir.Angle(aDir1))>PI/2.) aDir1.Reverse(); - if(fabs(aDir.Angle(aDir2))>PI/2.) + if (fabs(aDir.Angle(aDir2))>PI/2.) aDir2.Reverse(); TopExp_Explorer anExpE(F1,TopAbs_EDGE); TopTools_SequenceOfShape aNewFs; //int nbee=0; - for(; anExpE.More(); anExpE.Next()) { + for (; anExpE.More(); anExpE.Next()) { TopoDS_Edge E1 = TopoDS::Edge(anExpE.Current()); //nbee++; - if(!FF.Contains(E1)) + if (!FF.Contains(E1)) MESSAGE ("map FF not contains key E1"); - if(VPE.Contains(E1)) { + if (VPE.Contains(E1)) { aNewFs.Append(VPE.FindFromKey(E1)); #ifdef _DEBUG_ MESSAGE (" using existed face"); @@ -1557,14 +1916,14 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) TopoDS_Edge E3 = TopoDS::Edge(FF.FindFromKey(E1)); TopoDS_Vertex V1 = sae.FirstVertex(E1); TopoDS_Vertex V2 = sae.LastVertex(E1); - if(!FF.Contains(V1)) + if (!FF.Contains(V1)) MESSAGE ("map FF not contains key V1"); - if(!FF.Contains(V2)) + if (!FF.Contains(V2)) MESSAGE ("map FF not contains key V2"); TopoDS_Vertex V3 = TopoDS::Vertex(FF.FindFromKey(V2)); TopoDS_Vertex V4 = TopoDS::Vertex(FF.FindFromKey(V1)); TopoDS_Vertex Vtmp = sae.FirstVertex(E3); - if(Vtmp.IsSame(V4)) + if (Vtmp.IsSame(V4)) E3.Reverse(); gp_Pnt P1 = BRep_Tool::Pnt(V1); gp_Pnt P2 = BRep_Tool::Pnt(V2); @@ -1573,7 +1932,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) // make E2 TopoDS_Edge E2; Handle(Geom_BSplineCurve) C2; - if(VPE.Contains(V2)) { + if (VPE.Contains(V2)) { E2 = TopoDS::Edge(VPE.FindFromKey(V2)); double fp,lp; C2 = Handle(Geom_BSplineCurve)::DownCast(BRep_Tool::Curve(E2,fp,lp)); @@ -1594,7 +1953,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) // make E4 TopoDS_Edge E4; Handle(Geom_BSplineCurve) C4; - if(VPE.Contains(V1)) { + if (VPE.Contains(V1)) { E4 = TopoDS::Edge(VPE.FindFromKey(V1)); double fp,lp; C4 = Handle(Geom_BSplineCurve)::DownCast(BRep_Tool::Curve(E4,fp,lp)); @@ -1627,20 +1986,20 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) double fp,lp; Handle(Geom_Curve) C1 = BRep_Tool::Curve(E1,fp,lp); //bool IsConicC1 = false; - //if( C1->IsKind(STANDARD_TYPE(Geom_Conic)) ) { + //if (C1->IsKind(STANDARD_TYPE(Geom_Conic))) { // IsConicC1 = true; // cout<<"C1 - Geom_Conic"<IsKind(STANDARD_TYPE(Geom_Line)) || C1->IsKind(STANDARD_TYPE(Geom_Conic)) ) { + if (C1->IsKind(STANDARD_TYPE(Geom_Line)) || C1->IsKind(STANDARD_TYPE(Geom_Conic))) { C1 = new Geom_TrimmedCurve(C1,fp,lp); } - //if(IsConicC1) { + //if (IsConicC1) { // double tol = BRep_Tool::Tolerance(E1); // GeomConvert_ApproxCurve ApxC1(C1,tol,GeomAbs_C1,10,5); // C1 = ApxC1.Curve(); //} Handle(Geom_Curve) C3 = BRep_Tool::Curve(E3,fp,lp); - if( C3->IsKind(STANDARD_TYPE(Geom_Line)) || C3->IsKind(STANDARD_TYPE(Geom_Conic)) ) { + if (C3->IsKind(STANDARD_TYPE(Geom_Line)) || C3->IsKind(STANDARD_TYPE(Geom_Conic))) { C3 = new Geom_TrimmedCurve(C3,fp,lp); } //filebuf fic; @@ -1648,23 +2007,23 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) //os.precision(15); Handle(Geom_BSplineCurve) CE1 = GeomConvert::CurveToBSplineCurve(C1,Convert_RationalC1); - if(CE1->Degree()<3) + if (CE1->Degree()<3) CE1->IncreaseDegree(3); Handle(Geom_BSplineCurve) CE2 = GeomConvert::CurveToBSplineCurve(C2,Convert_RationalC1); - if(CE2->Degree()<3) + if (CE2->Degree()<3) CE2->IncreaseDegree(3); Handle(Geom_BSplineCurve) CE3 = GeomConvert::CurveToBSplineCurve(C3,Convert_RationalC1); - if(CE3->Degree()<3) + if (CE3->Degree()<3) CE3->IncreaseDegree(3); Handle(Geom_BSplineCurve) CE4 = GeomConvert::CurveToBSplineCurve(C4,Convert_RationalC1); - if(CE4->Degree()<3) + if (CE4->Degree()<3) CE4->IncreaseDegree(3); //cout<<"CE1->Degree()="<Degree()<<" CE2->Degree()="<Degree() // <<" CE3->Degree()="<Degree()<<" CE4->Degree()="<Degree()<D0(par,P); @@ -1711,7 +2070,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) } Points.SetValue(1,NbP,P2); // get points from C3 - if(P4.Distance(P1C3)<1.e-6) { + if (P4.Distance(P1C3)<1.e-6) { fp = fp2; lp = lp2; } @@ -1722,7 +2081,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) step = (lp-fp)/(NbP-1); Points.SetValue(NbP,1,P4); par = fp; - for(n1=2; n1D0(par,P); @@ -1730,7 +2089,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) } Points.SetValue(NbP,NbP,P3); // create isolines and get points from them - for(n1=1; n1<=NbP; n1++) { + for (n1=1; n1<=NbP; n1++) { gp_Pnt PI1 = Points.Value(1,n1); gp_Pnt PI2 = Points.Value(NbP,n1); Handle(TColgp_HArray1OfPnt) HAP = new TColgp_HArray1OfPnt(1,2); @@ -1746,7 +2105,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) par = fp; TopoDS_Compound VComp; B.MakeCompound(VComp); - for(n2=2; n2D0(par,P); @@ -1772,7 +2131,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) // make shell TopoDS_Shell aShell; B.MakeShell(aShell); - for(int nf=1; nf<=aNewFs.Length(); nf++) { + for (int nf=1; nf<=aNewFs.Length(); nf++) { B.Add(aShell,aNewFs(nf)); } B.Add(aShell,F1); @@ -1784,22 +2143,22 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) aSewing->SetFaceMode(Standard_True); aSewing->SetFloatingEdgesMode(Standard_False); aSewing->SetNonManifoldMode(Standard_False); - for ( anExp.Init( aShell, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + for (anExp.Init(aShell, TopAbs_FACE); anExp.More(); anExp.Next()) { aSewing->Add(anExp.Current()); } aSewing->Perform(); MESSAGE (" shell for face "<SewedShape(); //BRepTools::Write(aSewShape,"/dn02/users_Linux/skl/work/Bugs/14857/sew.brep"); - if( aSewShape.ShapeType() == TopAbs_SHELL ) { + if (aSewShape.ShapeType() == TopAbs_SHELL) { aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; BRepGProp::VolumeProperties(aShell, aSystem); - if(aSystem.Mass()<0) { + if (aSystem.Mass()<0) { //cout<<"aSewShape is reversed"<GetValue(); if (aShapeBase.IsNull()) { - if(aCIBN) delete aCIBN; + if (aCIBN) delete aCIBN; Standard_NullObject::Raise("MakePipe aborted : null base argument"); } TopoDS_Shape aProf; - if( aShapeBase.ShapeType() == TopAbs_VERTEX ) { + if (aShapeBase.ShapeType() == TopAbs_VERTEX) { aProf = aShapeBase; } - else if( aShapeBase.ShapeType() == TopAbs_EDGE) { + else if (aShapeBase.ShapeType() == TopAbs_EDGE) { aProf = BRepBuilderAPI_MakeWire(TopoDS::Edge(aShapeBase)).Shape(); } - else if( aShapeBase.ShapeType() == TopAbs_WIRE) { + else if (aShapeBase.ShapeType() == TopAbs_WIRE) { aProf = aShapeBase; } - else if( aShapeBase.ShapeType() == TopAbs_FACE) { + else if (aShapeBase.ShapeType() == TopAbs_FACE) { TopExp_Explorer wexp(aShapeBase,TopAbs_WIRE); aProf = wexp.Current(); } @@ -1885,7 +2244,7 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, PipeBuilder.Add(aProf); if (aShapeVec.IsNull()) { - if(aCIBN) delete aCIBN; + if (aCIBN) delete aCIBN; Standard_NullObject::Raise ("MakePipe aborted : null vector argument"); } @@ -1902,7 +2261,7 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, gp_Dir BiNormal(aVec); PipeBuilder.SetMode(BiNormal); PipeBuilder.Build(); - if( aShapeBase.ShapeType() == TopAbs_FACE) { + if (aShapeBase.ShapeType() == TopAbs_FACE) { PipeBuilder.MakeSolid(); } @@ -1920,44 +2279,44 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IPipe* aCI= 0; Standard_Integer aType = aFunction->GetType(); - if(aType == PIPE_BASE_PATH) + if (aType == PIPE_BASE_PATH) aCI = new GEOMImpl_IPipe(aFunction); - else if(aType == PIPE_DIFFERENT_SECTIONS) + else if (aType == PIPE_DIFFERENT_SECTIONS) aCI = new GEOMImpl_IPipeDiffSect(aFunction); - else if(aType == PIPE_SHELL_SECTIONS) + else if (aType == PIPE_SHELL_SECTIONS) aCI = new GEOMImpl_IPipeShellSect(aFunction); - else if(aType == PIPE_SHELLS_WITHOUT_PATH) + else if (aType == PIPE_SHELLS_WITHOUT_PATH) aCI = new GEOMImpl_IPipeShellSect(aFunction); - else if(aType == PIPE_BI_NORMAL_ALONG_VECTOR) + else if (aType == PIPE_BI_NORMAL_ALONG_VECTOR) aCI = new GEOMImpl_IPipeBiNormal(aFunction); else return 0; TopoDS_Wire aWirePath; - if(aType != PIPE_SHELLS_WITHOUT_PATH) { + if (aType != PIPE_SHELLS_WITHOUT_PATH) { // working with path Handle(GEOM_Function) aRefPath = aCI->GetPath(); TopoDS_Shape aShapePath = aRefPath->GetValue(); if (aShapePath.IsNull()) { MESSAGE ("Driver : path is null"); - if(aCI) delete aCI; + if (aCI) delete aCI; Standard_NullObject::Raise("MakePipe aborted : null path argument"); } // Get path contour bool isOk = false; - if ( aShapePath.ShapeType() == TopAbs_COMPOUND ) { + if (aShapePath.ShapeType() == TopAbs_COMPOUND) { TopTools_SequenceOfShape anEdges; TopExp_Explorer anExp; BRep_Builder B; TopoDS_Wire W; B.MakeWire(W); - for ( anExp.Init( aShapePath, TopAbs_EDGE ); anExp.More(); anExp.Next() ) { - B.Add( W, anExp.Current() ); + for (anExp.Init(aShapePath, TopAbs_EDGE); anExp.More(); anExp.Next()) { + B.Add(W, anExp.Current()); isOk = true; } - if ( isOk ) + if (isOk) aWirePath = W; } else if (aShapePath.ShapeType() == TopAbs_WIRE) { @@ -1971,26 +2330,25 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const isOk = true; } } - if ( !isOk ) { - if(aCI) delete aCI; + if (!isOk) { + if (aCI) delete aCI; Standard_TypeMismatch::Raise("MakePipe aborted : path shape is neither a wire nor an edge"); } } TopoDS_Shape aShape; - if (aType == PIPE_BASE_PATH) - { + if (aType == PIPE_BASE_PATH) { Handle(GEOM_Function) aRefBase = aCI->GetBase(); TopoDS_Shape aShapeBase; // Make copy to prevent modifying of base object 0020766 : EDF 1320 BRepBuilderAPI_Copy Copy(aRefBase->GetValue()); - if( Copy.IsDone() ) + if (Copy.IsDone()) aShapeBase = Copy.Shape(); if (aShapeBase.IsNull()) { - if(aCI) delete aCI; + if (aCI) delete aCI; Standard_NullObject::Raise("MakePipe aborted : null base argument"); } @@ -2001,374 +2359,47 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const //building pipe with different sections else if (aType == PIPE_DIFFERENT_SECTIONS) { GEOMImpl_IPipeDiffSect* aCIDS = (GEOMImpl_IPipeDiffSect*)aCI; - //GEOMImpl_IPipeDiffSect* aCIDS = static_cast(aCI); - //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); Handle(TColStd_HSequenceOfTransient) aBasesObjs = aCIDS->GetBases (); Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations (); Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode()); + if (aCI) { + delete aCI; + aCI = 0; + } - Standard_Integer i =1, nbBases = aBasesObjs->Length(), - nbLocs = (aLocObjs.IsNull() ? 0 :aLocObjs->Length()); + Standard_Integer nbBases = aBasesObjs->Length(); + Standard_Integer nbLocs = (aLocObjs.IsNull() ? 0 : aLocObjs->Length()); - if(nbLocs && nbLocs != nbBases) { - if(aCI) delete aCI; - Standard_ConstructionError::Raise("Number of sections is not equal to number of locations "); - } - TopTools_SequenceOfShape aSeqBases; - TopTools_SequenceOfShape aSeqLocs; - TopTools_SequenceOfShape aSeqFaces; - for (; i <= nbBases; i++) { + Handle(TopTools_HSequenceOfShape) aHSeqBases = new TopTools_HSequenceOfShape; + Handle(TopTools_HSequenceOfShape) aHSeqLocs = new TopTools_HSequenceOfShape; + Standard_Integer i; + + for (i = 1; i <= nbBases; i++) { Handle(Standard_Transient) anItem = aBasesObjs->Value(i); - if(anItem.IsNull()) + if (anItem.IsNull()) continue; Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem); - if(aRefBase.IsNull()) + if (aRefBase.IsNull()) continue; - - if(aRefBase->GetValue().IsNull()) + if (aRefBase->GetValue().IsNull()) continue; - // Make copy to prevent modifying of base object 0020766 : EDF 1320 - TopoDS_Shape aShapeBase; - BRepBuilderAPI_Copy Copy(aRefBase->GetValue()); - if( Copy.IsDone() ) - aShapeBase = Copy.Shape(); - - TopAbs_ShapeEnum aTypeBase = aShapeBase.ShapeType(); - - //if for section was specified face with a few wires then a few - // pipes were build and make solid - Standard_Boolean NeedCreateSolid = Standard_False; - if(aTypeBase == TopAbs_SHELL) { - // create wire as boundary contour if shell is no closed - // get free boundary shapes - ShapeAnalysis_FreeBounds anAnalizer( aShapeBase ); - TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); - TopExp_Explorer anExp; - TopoDS_Shape aWire; - Standard_Integer NbWires = 0; - for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { - NbWires++; - aWire = anExp.Current(); - } - if(NbWires!=1) { - // bad case - if(aCI) delete aCI; - Standard_ConstructionError::Raise("Bad shell is used as section "); - } - NeedCreateSolid = Standard_True; - aSeqFaces.Append(aShapeBase); - aSeqBases.Append(aWire); - } - else if(aTypeBase == TopAbs_FACE) { - NeedCreateSolid = Standard_True; - //for case one path should be used other type function - aSeqFaces.Append(aShapeBase); - TopExp_Explorer aExpW(aShapeBase,TopAbs_WIRE); - for (; aExpW.More(); aExpW.Next()) - { - TopoDS_Shape aWireProf = aExpW.Current(); - aSeqBases.Append(aWireProf); - } - } - else if(aTypeBase == TopAbs_WIRE || aTypeBase == TopAbs_VERTEX) { - aSeqBases.Append(aShapeBase); - } - else if(aTypeBase == TopAbs_EDGE) { - TopoDS_Edge anEdge = TopoDS::Edge(aShapeBase); - TopoDS_Shape aWireProf = BRepBuilderAPI_MakeWire(anEdge); - aSeqBases.Append(aWireProf); - } - if(nbLocs) { - Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i); - if(anItemLoc.IsNull()) - continue; - Handle(GEOM_Function) aRefLoc = Handle(GEOM_Function)::DownCast(anItemLoc); - TopoDS_Shape aShapeLoc = aRefLoc->GetValue(); - if(aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) - continue; - aSeqLocs.Append(aShapeLoc); - } - } - - nbLocs = aSeqLocs.Length(); - - // skl 02.05.2007 - TopTools_SequenceOfShape Edges; - if(nbLocs>0) { - // we have to check that each location shape is a vertex from - // path and update aSeqLocs if it is needed (and possible) - TColgp_SequenceOfPnt PLocs; - for(i=1; i<=nbLocs; i++) { - TopoDS_Vertex V = TopoDS::Vertex(aSeqLocs.Value(i)); - PLocs.Append(BRep_Tool::Pnt(V)); - } - //TopTools_SequenceOfShape Edges; - TopExp_Explorer anExp; - for ( anExp.Init( aWirePath, TopAbs_EDGE ); anExp.More(); anExp.Next() ) { - Edges.Append(anExp.Current()); - } - int nbEdges = Edges.Length(); - ShapeAnalysis_Edge sae; - TopoDS_Edge edge = TopoDS::Edge(Edges.First()); - double tol = BRep_Tool::Tolerance(edge); - TopoDS_Vertex VF = sae.FirstVertex(edge); - gp_Pnt PF = BRep_Tool::Pnt(VF); - //cout<<"PF("< tol ) { - if(aCI) delete aCI; - Standard_ConstructionError::Raise - ("First location shapes is not coincided with first vertex of aWirePath"); - } - aSeqLocs.ChangeValue(1) = VF; - edge = TopoDS::Edge(Edges.Last()); - tol = BRep_Tool::Tolerance(edge); - TopoDS_Vertex VL = sae.LastVertex(edge); - gp_Pnt PL = BRep_Tool::Pnt(VL); - if( PL.Distance(PLocs.Last()) > tol ) { - if(aCI) delete aCI; - Standard_ConstructionError::Raise - ("Last location shapes is not coincided with last vertex of aWirePath"); - } - aSeqLocs.ChangeValue(nbLocs) = VL; - int jcurr = 2; - for(i=1; i<=Edges.Length() && jcurr0 && - PLocs.Value(jcurr).Distance(PPCurve.Point(1)) < tol ) { - double param = PPCurve.Parameter(1); - gp_Pnt PC1; - C->D0(param,PC1); - // split current edge - Handle(Geom_TrimmedCurve) tc1 = new Geom_TrimmedCurve(C,fp,param); - Handle(Geom_TrimmedCurve) tc2 = new Geom_TrimmedCurve(C,param,lp); - TopoDS_Edge E1,E2; - BRep_Builder B; - gp_Pnt Pfp; - C->D0(fp,Pfp); - if(Pfp.Distance(P1) we have to update WirePath - BRep_Builder B; - TopoDS_Wire W; - B.MakeWire(W); - for(i=1; i<=Edges.Length(); i++) { - B.Add(W,TopoDS::Edge(Edges.Value(i))); - } - aWirePath = W; - } - } - - // check curvature of wire for condition that - // max summary angle between directions along - // wire path must be < 4*PI. If not - split wire - // and seguences of shapes, perform pipe for each - // and make sewing after that - double fp,lp; - Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(Edges.Value(1)),fp,lp); - gp_Pnt P1,P2; - gp_Vec Vec1,Vec2; - C->D1(fp,P1,Vec1); - C->D1(lp,P2,Vec2); - double SumAng = fabs(Vec1.Angle(Vec2)); - Vec1 = Vec2; - P1 = P2; - TColStd_SequenceOfInteger SplitEdgeNums,SplitLocNums; - int LastLoc = 1; - //cout<<"Edges.Length()="<D1(lp,P2,Vec2); - double ang = fabs(Vec1.Angle(Vec2)); - SumAng += ang; - if(SumAng>4*PI) { - SumAng = ang; - SplitEdgeNums.Append(i-1); - int j; - for(j=LastLoc+1; j<=aSeqLocs.Length(); j++) { - TopoDS_Vertex aVert = TopoDS::Vertex(aSeqLocs.Value(j)); - gp_Pnt P = BRep_Tool::Pnt(aVert); - if( P1.Distance(P) < tol ) { - SplitLocNums.Append(j); - LastLoc = j; - break; - } - } - } - Vec1 = Vec2; - P1 = P2; + aHSeqBases->Append(aRefBase->GetValue()); } + for (i = 1; i <= nbLocs; i++) { + Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i); + if (anItemLoc.IsNull()) + continue; + Handle(GEOM_Function) aRefLoc = Handle(GEOM_Function)::DownCast(anItemLoc); + TopoDS_Shape aShapeLoc = aRefLoc->GetValue(); + if (aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) + continue; - //cout<<"SplitEdgeNums.Length()="<SetTolerance(Precision::Confusion()); - aSewing->SetFaceMode(Standard_True); - aSewing->SetFloatingEdgesMode(Standard_False); - aSewing->SetNonManifoldMode(Standard_False); - for(i=1; i<=aSeqRes.Length(); i++) { - aSewing->Add(aSeqRes.Value(i)); - } - aSewing->Perform(); - aShape = aSewing->SewedShape(); + aHSeqLocs->Append(aShapeLoc); } - else { - // old implementation without splitting - BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); - Standard_Integer nbShapes = aSeqBases.Length(); - Standard_Integer step = nbShapes/nbBases; - - if (nbShapes < nbBases || fmod((double)nbShapes, (double)nbBases)) { - if(aCI) delete aCI; - Standard_ConstructionError::Raise("Invalid sections were specified for building pipe"); - } - Standard_Integer ind =0; - for (i = 1; i <= nbShapes && ind < nbShapes; i++) { //i+nbBases <= nbShapes - TopTools_SequenceOfShape usedBases; - Standard_Integer j = 1; - for (; j <= nbBases; j++) { - ind = i + (j-1)*step; - TopoDS_Shape aWireProf = aSeqBases.Value(ind); - usedBases.Append(aWireProf); - if(nbLocs) { - TopoDS_Shape aShapeLoc = aSeqLocs.Value(j); - TopoDS_Vertex aVert = TopoDS::Vertex(aShapeLoc); - aBuilder.Add(aWireProf,aVert,aWithContact,aWithCorrect); - } - else - aBuilder.Add(aWireProf,aWithContact,aWithCorrect); - } - if(!aBuilder.IsReady()) { - if(aCI) delete aCI; - Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); - } - aBuilder.Build(); - aShape = aBuilder.Shape(); - aSeqFaces.Append(aShape); - for( j = 1; j <=usedBases.Length(); j++) - aBuilder.Delete(usedBases.Value(j)); - } - - //for case if section is face - if(aSeqFaces.Length() >1) { - BRep_Builder aB; - TopoDS_Compound aComp; - aB.MakeCompound(aComp); - for( i = 1; i <= aSeqFaces.Length(); i++) - aB.Add(aComp,aSeqFaces.Value(i)); - aShape = aComp; - } - } + aShape = CreatePipeWithDifferentSections(aWirePath, aHSeqBases, aHSeqLocs, aWithContact, aWithCorrect); } //building pipe with shell sections @@ -2427,11 +2458,11 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_PipeDriver_Type_() { static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + if (aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + if (aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + if (aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PipeDriver", diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx index b47eccda0..3908fa954 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.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 -// // File : GEOMImpl_PipeDriver.ixx // Module : GEOMImpl -// + #ifndef _GEOMImpl_PipeDriver_HeaderFile #define _GEOMImpl_PipeDriver_HeaderFile @@ -120,6 +119,10 @@ class Handle(GEOMImpl_PipeDriver) : public Handle(TFunction_Driver) { #include #endif +#include +#include +#include + class TColStd_SequenceOfExtendedString; @@ -150,6 +153,13 @@ public: Standard_EXPORT static const Standard_GUID& GetID(); Standard_EXPORT ~GEOMImpl_PipeDriver() {}; + Standard_EXPORT static TopoDS_Shape CreatePipeWithDifferentSections + (const TopoDS_Wire& theWirePath, + const Handle(TopTools_HSequenceOfShape) theBases, + const Handle(TopTools_HSequenceOfShape) theLocs, + const Standard_Boolean theWithContact, + const Standard_Boolean theWithCorrect); + // Type management // diff --git a/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx b/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx index 2de6d2a94..f04e719a6 100644 --- a/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PolylineDriver.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 @@ -87,7 +86,7 @@ Standard_Integer GEOMImpl_PolylineDriver::Execute(TFunction_Logbook& log) const } if (aShapePnt.ShapeType() == TopAbs_VERTEX) { aMakePoly.Add(TopoDS::Vertex(aShapePnt)); -// if (!aMakePoly.Added()) return 0; + //if (!aMakePoly.Added()) return 0; } } // Compare first and last point coordinates and close polyline if it's the same. @@ -100,7 +99,8 @@ Standard_Integer GEOMImpl_PolylineDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aLastPnt = aLPoint->GetValue(); TopoDS_Vertex aV2 = TopoDS::Vertex(aLastPnt); - if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) ) + if ( (!aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2)) || + aCI.GetIsClosed()) aMakePoly.Close(); } diff --git a/src/GEOMImpl/GEOMImpl_PrismDriver.cxx b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx index 1757f9690..ad87f7ad7 100644 --- a/src/GEOMImpl/GEOMImpl_PrismDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx @@ -18,59 +18,68 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include #include -#include #include +#include +#include +#include #include #include #include +#include +#include +#include #include #include + +#include +#include #include #include #include #include -#include -#include +#include +#include #include +#include #include -#include #include +#include + +#include + #include //======================================================================= //function : GetID //purpose : -//======================================================================= +//======================================================================= const Standard_GUID& GEOMImpl_PrismDriver::GetID() { static Standard_GUID aPrismDriver("FF1BBB17-5D14-4df2-980B-3A668264EA16"); - return aPrismDriver; + return aPrismDriver; } //======================================================================= //function : GEOMImpl_PrismDriver -//purpose : +//purpose : //======================================================================= -GEOMImpl_PrismDriver::GEOMImpl_PrismDriver() +GEOMImpl_PrismDriver::GEOMImpl_PrismDriver() { } //======================================================================= //function : Execute //purpose : -//======================================================================= +//======================================================================= Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const { - if (Label().IsNull()) return 0; + if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IPrism aCI (aFunction); @@ -94,14 +103,19 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const } if (aV.Magnitude() > Precision::Confusion()) { aV.Normalize(); - if (aType == PRISM_BASE_VEC_H_2WAYS) { - gp_Trsf aTrsf; - aTrsf.SetTranslation( (-aV) * aCI.GetH() ); - BRepBuilderAPI_Transform aTransformation(aShapeBase, aTrsf, Standard_False); - aShapeBase = aTransformation.Shape(); - aCI.SetH( aCI.GetH()*2 ); + if (aType != PRISM_BASE_DXDYDZ_2WAYS && aCI.GetScale() > Precision::Confusion()) { + aShape = MakeScaledPrism(aShapeBase, aV * aCI.GetH(), aCI.GetScale()); + } + else { + if (aType == PRISM_BASE_VEC_H_2WAYS) { + gp_Trsf aTrsf; + aTrsf.SetTranslation((-aV) * aCI.GetH()); + BRepBuilderAPI_Transform aTransformation(aShapeBase, aTrsf, Standard_False); + aShapeBase = aTransformation.Shape(); + aCI.SetH(aCI.GetH()*2); + } + aShape = BRepPrimAPI_MakePrism(aShapeBase, aV * aCI.GetH(), Standard_False).Shape(); } - aShape = BRepPrimAPI_MakePrism(aShapeBase, aV * aCI.GetH(), Standard_False).Shape(); } } } @@ -119,15 +133,19 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const if (!V1.IsNull() && !V2.IsNull()) { gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); if (aV.Magnitude() > gp::Resolution()) { - if (aType == PRISM_BASE_TWO_PNT_2WAYS) - { + if (aType != PRISM_BASE_DXDYDZ_2WAYS && aCI.GetScale() > Precision::Confusion()) { + aShape = MakeScaledPrism(aShapeBase, aV, aCI.GetScale()); + } + else { + if (aType == PRISM_BASE_TWO_PNT_2WAYS) { gp_Trsf aTrsf; aTrsf.SetTranslation(-aV); BRepBuilderAPI_Transform aTransformation(aShapeBase, aTrsf, Standard_False); aShapeBase = aTransformation.Shape(); aV = aV * 2; } - aShape = BRepPrimAPI_MakePrism(aShapeBase, aV, Standard_False).Shape(); + aShape = BRepPrimAPI_MakePrism(aShapeBase, aV, Standard_False).Shape(); + } } } } @@ -136,15 +154,19 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShapeBase = aRefBase->GetValue(); gp_Vec aV (aCI.GetDX(), aCI.GetDY(), aCI.GetDZ()); if (aV.Magnitude() > gp::Resolution()) { - if (aType == PRISM_BASE_DXDYDZ_2WAYS) - { + if (aType != PRISM_BASE_DXDYDZ_2WAYS && aCI.GetScale() > Precision::Confusion()) { + aShape = MakeScaledPrism(aShapeBase, aV, aCI.GetScale()); + } + else { + if (aType == PRISM_BASE_DXDYDZ_2WAYS) { gp_Trsf aTrsf; aTrsf.SetTranslation(-aV); BRepBuilderAPI_Transform aTransformation(aShapeBase, aTrsf, Standard_False); aShapeBase = aTransformation.Shape(); aV = aV * 2; } - aShape = BRepPrimAPI_MakePrism(aShapeBase, aV, Standard_False).Shape(); + aShape = BRepPrimAPI_MakePrism(aShapeBase, aV, Standard_False).Shape(); + } } } @@ -153,26 +175,91 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aRes = GEOMImpl_IShapesOperations::CompsolidToCompound(aShape); aFunction->SetValue(aRes); - log.SetTouched(Label()); + log.SetTouched(Label()); - return 1; + return 1; } +//======================================================================= +//function : MakeScaledPrism +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_PrismDriver::MakeScaledPrism (const TopoDS_Shape& theShapeBase, + const gp_Vec& theVector, + const Standard_Real theScaleFactor) +{ + TopoDS_Shape aShape; + + // 1. aCDG = geompy.MakeCDG(theBase) + gp_Ax3 aPos = GEOMImpl_IMeasureOperations::GetPosition(theShapeBase); + gp_Pnt aCDG = aPos.Location(); + TopoDS_Shape aShapeCDG_1 = BRepBuilderAPI_MakeVertex(aCDG).Shape(); + + // 2. Scale = geompy.MakeScaleTransform(theBase, aCDG, theScaleFactor) + + // Bug 6839: Check for standalone (not included in faces) degenerated edges + TopTools_IndexedDataMapOfShapeListOfShape aEFMap; + TopExp::MapShapesAndAncestors(theShapeBase, TopAbs_EDGE, TopAbs_FACE, aEFMap); + Standard_Integer i, nbE = aEFMap.Extent(); + for (i = 1; i <= nbE; i++) { + TopoDS_Shape anEdgeSh = aEFMap.FindKey(i); + if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeSh))) { + const TopTools_ListOfShape& aFaces = aEFMap.FindFromIndex(i); + if (aFaces.IsEmpty()) + Standard_ConstructionError::Raise + ("Scaling aborted : cannot scale standalone degenerated edge"); + } + } + + // Perform Scaling + gp_Trsf aTrsf; + aTrsf.SetScale(aCDG, theScaleFactor); + BRepBuilderAPI_Transform aBRepTrsf (theShapeBase, aTrsf, Standard_False); + TopoDS_Shape aScale = aBRepTrsf.Shape(); + + // 3. aBase2 = geompy.MakeTranslationVectorDistance(Scale, theVec, theH) + gp_Trsf aTrsf3; + aTrsf3.SetTranslation(theVector); + TopLoc_Location aLocOrig = aScale.Location(); + gp_Trsf aTrsfOrig = aLocOrig.Transformation(); + TopLoc_Location aLocRes (aTrsf3 * aTrsfOrig); + TopoDS_Shape aBase2 = aScale.Located(aLocRes); + + // 4. aCDG_2 = geompy.MakeTranslationVectorDistance(aCDG, theVec, theH) + gp_Pnt aCDG_2 = aCDG.Translated(theVector); + TopoDS_Shape aShapeCDG_2 = BRepBuilderAPI_MakeVertex(aCDG_2).Shape(); + + // 5. Vector = geompy.MakeVector(aCDG, aCDG_2) + TopoDS_Shape aShapeVec = BRepBuilderAPI_MakeEdge(aCDG, aCDG_2).Shape(); + TopoDS_Edge anEdge = TopoDS::Edge(aShapeVec); + TopoDS_Wire aWirePath = BRepBuilderAPI_MakeWire(anEdge); + + // 6. aPrism = geompy.MakePipeWithDifferentSections([theBase, aBase2], [aCDG, aCDG_2], Vector, False, False) + Handle(TopTools_HSequenceOfShape) aBases = new TopTools_HSequenceOfShape; + aBases->Append(theShapeBase); + aBases->Append(aBase2); + + Handle(TopTools_HSequenceOfShape) aLocs = new TopTools_HSequenceOfShape; + aLocs->Append(aShapeCDG_1); + aLocs->Append(aShapeCDG_2); + + aShape = GEOMImpl_PipeDriver::CreatePipeWithDifferentSections(aWirePath, aBases, aLocs, false, false); + return aShape; +} //======================================================================= -//function : GEOMImpl_PrismDriver_Type_ +//function : GEOMImpl_PrismDriver_Type_ //purpose : -//======================================================================= +//======================================================================= Standard_EXPORT Handle_Standard_Type& GEOMImpl_PrismDriver_Type_() { static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + if (aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + if (aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - + if (aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PrismDriver", @@ -187,7 +274,7 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_PrismDriver_Type_() //======================================================================= //function : DownCast //purpose : -//======================================================================= +//======================================================================= const Handle(GEOMImpl_PrismDriver) Handle(GEOMImpl_PrismDriver)::DownCast(const Handle(Standard_Transient)& AnObject) { Handle(GEOMImpl_PrismDriver) _anOtherObject; @@ -198,5 +285,5 @@ const Handle(GEOMImpl_PrismDriver) Handle(GEOMImpl_PrismDriver)::DownCast(const } } - return _anOtherObject ; + return _anOtherObject; } diff --git a/src/GEOMImpl/GEOMImpl_PrismDriver.hxx b/src/GEOMImpl/GEOMImpl_PrismDriver.hxx index 4ca98f2bc..80028095c 100644 --- a/src/GEOMImpl/GEOMImpl_PrismDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PrismDriver.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 -// // File : GEOMImpl_PrismDriver.ixx // Module : GEOMImpl -// + #ifndef _GEOMImpl_PrismDriver_HeaderFile #define _GEOMImpl_PrismDriver_HeaderFile @@ -104,9 +103,9 @@ class Handle(GEOMImpl_PrismDriver) : public Handle(TFunction_Driver) { return (GEOMImpl_PrismDriver *)ControlAccess(); } - Standard_EXPORT ~Handle(GEOMImpl_PrismDriver)() {}; + Standard_EXPORT ~Handle(GEOMImpl_PrismDriver)() {}; - Standard_EXPORT static const Handle(GEOMImpl_PrismDriver) DownCast(const Handle(Standard_Transient)& AnObject); + Standard_EXPORT static const Handle(GEOMImpl_PrismDriver) DownCast(const Handle(Standard_Transient)& AnObject); }; #ifndef _TFunction_Driver_HeaderFile @@ -119,6 +118,10 @@ class Handle(GEOMImpl_PrismDriver) : public Handle(TFunction_Driver) { #include #endif +#include +#include +#include + class TColStd_SequenceOfExtendedString; @@ -126,35 +129,39 @@ class GEOMImpl_PrismDriver : public TFunction_Driver { public: - inline void* operator new(size_t,void* anAddress) - { - return anAddress; - } - inline void* operator new(size_t size) - { - return Standard::Allocate(size); - } - inline void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); - } + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + + Standard_EXPORT GEOMImpl_PrismDriver(); + Standard_EXPORT ~GEOMImpl_PrismDriver() {}; + + Standard_EXPORT virtual Standard_Integer Execute (TFunction_Logbook& log) const; + Standard_EXPORT virtual void Validate (TFunction_Logbook&) const {} + Standard_EXPORT Standard_Boolean MustExecute (const TFunction_Logbook&) const { return Standard_True; } + Standard_EXPORT static const Standard_GUID& GetID(); - // Methods PUBLIC - // -Standard_EXPORT GEOMImpl_PrismDriver(); -Standard_EXPORT virtual Standard_Integer Execute(TFunction_Logbook& log) const; -Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {} -Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { return Standard_True; } -Standard_EXPORT static const Standard_GUID& GetID(); -Standard_EXPORT ~GEOMImpl_PrismDriver() {}; + Standard_EXPORT static TopoDS_Shape MakeScaledPrism (const TopoDS_Shape& theShapeBase, + const gp_Vec& theVector, + const Standard_Real theScaleFactor); - // Type management - // -Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PrismDriver_Type_(); -Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PrismDriver) ; } -Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PrismDriver) == AType || TFunction_Driver::IsKind(AType)); } + // Type management + Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PrismDriver_Type_(); + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PrismDriver) ; } + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PrismDriver) == AType || TFunction_Driver::IsKind(AType)); } }; diff --git a/src/GEOMImpl/GEOMImpl_SplineDriver.cxx b/src/GEOMImpl/GEOMImpl_SplineDriver.cxx index c9d603cd5..8b051493c 100644 --- a/src/GEOMImpl/GEOMImpl_SplineDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_SplineDriver.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 @@ -86,7 +85,21 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const if (aLen < 2) return 0; Standard_Boolean isSeveral = Standard_False; gp_Pnt aPrevP; - TColgp_Array1OfPnt CurvePoints (1, aLen); + int aRealLen = aLen; + if (aType == SPLINE_BEZIER && aCI.GetIsClosed()) { + Handle(GEOM_Function) aFPoint = aCI.GetPoint(1); + TopoDS_Shape aFirstPnt = aFPoint->GetValue(); + TopoDS_Vertex aV1 = TopoDS::Vertex(aFirstPnt); + + Handle(GEOM_Function) aLPoint = aCI.GetPoint(aLen); + TopoDS_Shape aLastPnt = aLPoint->GetValue(); + TopoDS_Vertex aV2 = TopoDS::Vertex(aLastPnt); + + if (!aV1.IsNull() && !aV2.IsNull() && !aV1.IsSame(aV2)) { + aRealLen++; + } + } + TColgp_Array1OfPnt CurvePoints (1, aRealLen); for (ind = 1; ind <= aLen; ind++) { Handle(GEOM_Function) aRefPoint = aCI.GetPoint(ind); TopoDS_Shape aShapePnt = aRefPoint->GetValue(); @@ -105,16 +118,27 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const if (!isSeveral) { Standard_ConstructionError::Raise("Points for Bezier Curve are too close"); } + if (aRealLen > aLen) { // set last point equal to first for the closed curve + CurvePoints.SetValue(aRealLen, CurvePoints.Value(1)); + } Handle(Geom_BezierCurve) GBC = new Geom_BezierCurve(CurvePoints); aShape = BRepBuilderAPI_MakeEdge(GBC).Edge(); } else { //GeomAPI_PointsToBSpline GBC (CurvePoints); //aShape = BRepBuilderAPI_MakeEdge(GBC).Edge(); Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt(1, aLen); - for (ind = 1; ind <= aLen; ind++) { - aHCurvePoints->SetValue(ind, CurvePoints.Value(ind)); + if (aCI.GetDoReordering()) { + // TODO + for (ind = 1; ind <= aLen; ind++) { + aHCurvePoints->SetValue(ind, CurvePoints.Value(ind)); + } + } + else { + for (ind = 1; ind <= aLen; ind++) { + aHCurvePoints->SetValue(ind, CurvePoints.Value(ind)); + } } - int isClosed = aCI.GetIsClosed(); + bool isClosed = aCI.GetIsClosed(); GeomAPI_Interpolate GBC (aHCurvePoints, isClosed, gp::Resolution()); GBC.Perform(); if (GBC.IsDone()) diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 50adfd4ef..93e73b0e5 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_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 @@ -458,7 +457,7 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH //Create the Prism Handle(GEOM_Object) anObject = - GetOperations()->MakePrismVecH(aBase, aVec, theH); + GetOperations()->MakePrismVecH(aBase, aVec, theH); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -494,6 +493,35 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH2Ways return GetObject(anObject); } +//============================================================================= +/*! + * MakePrismVecH + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecHWithScaling + (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH, CORBA::Double theScaleFactor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetObjectImpl(theBase); + Handle(GEOM_Object) aVec = GetObjectImpl(theVec); + + if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + //Create the Prism + Handle(GEOM_Object) anObject = + GetOperations()->MakePrismVecH(aBase, aVec, theH, theScaleFactor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakePrismTwoPnt @@ -558,6 +586,39 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt2Ways return GetObject(anObject); } +//============================================================================= +/*! + * MakePrismTwoPnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPntWithScaling + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + CORBA::Double theScaleFactor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetObjectImpl(theBase); + Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1); + Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2); + + if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull()) + return aGEOMObject._retn(); + + //Create the Prism + Handle(GEOM_Object) anObject = + GetOperations()->MakePrismTwoPnt(aBase, aPoint1, aPoint2, theScaleFactor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakePrismDXDYDZ @@ -614,6 +675,35 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZ2Ways return GetObject(anObject); } +//============================================================================= +/*! + * MakePrismDXDYDZ + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZWithScaling + (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX, + CORBA::Double theDY, CORBA::Double theDZ, + CORBA::Double theScaleFactor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetObjectImpl(theBase); + + if (aBase.IsNull()) return aGEOMObject._retn(); + + //Create the Prism + Handle(GEOM_Object) anObject = + GetOperations()->MakePrismDXDYDZ(aBase, theDX, theDY, theDZ, theScaleFactor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakePipe diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index 5ca44b4c2..a7c183b1b 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_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_I3DPrimOperations_i_HeaderFile #define _GEOM_I3DPrimOperations_i_HeaderFile @@ -107,6 +106,11 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr theVec, CORBA::Double theH); + GEOM::GEOM_Object_ptr MakePrismVecHWithScaling (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH, + CORBA::Double theScaleFactor); + GEOM::GEOM_Object_ptr MakePrismTwoPnt (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr thePoint1, GEOM::GEOM_Object_ptr thePoint2); @@ -115,6 +119,11 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr thePoint1, GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr MakePrismTwoPntWithScaling (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + CORBA::Double theScaleFactor); + GEOM::GEOM_Object_ptr MakePrismDXDYDZ (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX, CORBA::Double theDY, @@ -123,6 +132,11 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ); + GEOM::GEOM_Object_ptr MakePrismDXDYDZWithScaling (GEOM::GEOM_Object_ptr theBase, + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ, + CORBA::Double theScaleFactor); GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr thePath); diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index b4d881a04..831ca9bde 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_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 @@ -334,7 +333,8 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcOfEllipse */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline - (const GEOM::ListOfGO& thePoints) + (const GEOM::ListOfGO& thePoints, + CORBA::Boolean theIsClosed) { GEOM::GEOM_Object_var aGEOMObject; @@ -353,7 +353,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline // Make Polyline Handle(GEOM_Object) anObject = - GetOperations()->MakePolyline(aPoints); + GetOperations()->MakePolyline(aPoints, theIsClosed); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -366,7 +366,8 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineBezier - (const GEOM::ListOfGO& thePoints) + (const GEOM::ListOfGO& thePoints, + CORBA::Boolean theIsClosed) { GEOM::GEOM_Object_var aGEOMObject; @@ -385,7 +386,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineBezier // Make Bezier curve Handle(GEOM_Object) anObject = - GetOperations()->MakeSplineBezier(aPoints); + GetOperations()->MakeSplineBezier(aPoints, theIsClosed); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -399,7 +400,8 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineBezier //============================================================================= GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation (const GEOM::ListOfGO& thePoints, - CORBA::Boolean theIsClosed) + CORBA::Boolean theIsClosed, + CORBA::Boolean theDoReordering) { GEOM::GEOM_Object_var aGEOMObject; @@ -418,7 +420,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation // Make Polyline Handle(GEOM_Object) anObject = - GetOperations()->MakeSplineInterpolation(aPoints, theIsClosed); + GetOperations()->MakeSplineInterpolation(aPoints, theIsClosed, theDoReordering); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index fbbde4c77..b629d46ca 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_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_ICurvesOperations_i_HeaderFile #define _GEOM_ICurvesOperations_i_HeaderFile @@ -76,12 +75,15 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3); - GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints); + GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints, + CORBA::Boolean theIsClosed); - GEOM::GEOM_Object_ptr MakeSplineBezier (const GEOM::ListOfGO& thePoints); + GEOM::GEOM_Object_ptr MakeSplineBezier (const GEOM::ListOfGO& thePoints, + CORBA::Boolean theIsClosed); GEOM::GEOM_Object_ptr MakeSplineInterpolation (const GEOM::ListOfGO& thePoints, - CORBA::Boolean theIsClosed); + CORBA::Boolean theIsClosed, + CORBA::Boolean theDoReordering); GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane); diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 220a867c3..6466983b1 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -2756,14 +2756,15 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArcOfEllipse (GEOM::GEOM_Object_ptr the //============================================================================= // MakePolyline: //============================================================================= -GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePolyline (GEOM::GEOM_List_ptr thePoints) +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePolyline (GEOM::GEOM_List_ptr thePoints, + CORBA::Boolean theIsClosed) { beginService( " GEOM_Superv_i::MakePolyline" ); MESSAGE("GEOM_Superv_i::MakePolyline"); if (GEOM_List_i* aListImplP = dynamic_cast*>(GetServant(thePoints, myPOA).in())) { getCurvesOp(); - GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakePolyline(aListImplP->GetList()); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakePolyline(aListImplP->GetList(), theIsClosed); endService( " GEOM_Superv_i::MakePolyline" ); return anObj; } @@ -2774,14 +2775,15 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePolyline (GEOM::GEOM_List_ptr thePoints //============================================================================= // MakeSplineBezier: //============================================================================= -GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineBezier (GEOM::GEOM_List_ptr thePoints) +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineBezier (GEOM::GEOM_List_ptr thePoints, + CORBA::Boolean theIsClosed) { beginService( " GEOM_Superv_i::MakeSplineBezier" ); MESSAGE("GEOM_Superv_i::MakeSplineBezier"); if (GEOM_List_i* aListImplP = dynamic_cast*>(GetServant(thePoints, myPOA).in())) { getCurvesOp(); - GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeSplineBezier(aListImplP->GetList()); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeSplineBezier(aListImplP->GetList(), theIsClosed); endService( " GEOM_Superv_i::MakeSplineBezier" ); return anObj; } @@ -2793,14 +2795,15 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineBezier (GEOM::GEOM_List_ptr thePo // MakeSplineInterpolation: //============================================================================= GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints, - CORBA::Boolean theIsClosed) + CORBA::Boolean theIsClosed, + CORBA::Boolean theDoReordering) { beginService( " GEOM_Superv_i::MakeSplineInterpolation" ); MESSAGE("GEOM_Superv_i::MakeSplineInterpolation"); if (GEOM_List_i* aListImplP = dynamic_cast*>(GetServant(thePoints, myPOA).in())) { getCurvesOp(); - GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeSplineInterpolation(aListImplP->GetList(), theIsClosed); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeSplineInterpolation(aListImplP->GetList(), theIsClosed, theDoReordering); endService( " GEOM_Superv_i::MakeSplineInterpolation" ); return anObj; } diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index dcef36414..1dd848ad5 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_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_SUPERV_I_H__ #define __GEOM_SUPERV_I_H__ @@ -31,14 +30,14 @@ #include "GEOM_List_i.hh" class GEOM_Superv_i : public virtual POA_GEOM::GEOM_Superv, - public Engines_Component_i + public Engines_Component_i { public: GEOM_Superv_i(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName); ~GEOM_Superv_i(); // generic method to be put in a super class @@ -58,101 +57,101 @@ public: void getAdvancedOp(); PortableServer::ServantBase_var GetServant(CORBA::Object_ptr theObject, - PortableServer::POA_ptr thePOA); + PortableServer::POA_ptr thePOA); //-----------------------------------------------------------------------// // Set current stydy ID // //-----------------------------------------------------------------------// - void SetStudyID( CORBA::Long theId ); + void SetStudyID( CORBA::Long theId ); //-----------------------------------------------------------// - // Create ListOfGO and add items to it // + // Create ListOfGO and add items to it // //-----------------------------------------------------------// GEOM::GEOM_List_ptr CreateListOfGO(); - void AddItemToListOfGO(GEOM::GEOM_List_ptr& theList, - GEOM::GEOM_Object_ptr theObject); + void AddItemToListOfGO(GEOM::GEOM_List_ptr& theList, + GEOM::GEOM_Object_ptr theObject); //-----------------------------------------------------------// - // Create ListOfLong and add items to it // + // Create ListOfLong and add items to it // //-----------------------------------------------------------// GEOM::GEOM_List_ptr CreateListOfLong(); - void AddItemToListOfLong(GEOM::GEOM_List_ptr& theList, - CORBA::Long theObject); - + void AddItemToListOfLong(GEOM::GEOM_List_ptr& theList, + CORBA::Long theObject); + //-----------------------------------------------------------// - // Create ListOfDouble and add items to it // + // Create ListOfDouble and add items to it // //-----------------------------------------------------------// GEOM::GEOM_List_ptr CreateListOfDouble(); - void AddItemToListOfDouble(GEOM::GEOM_List_ptr& theList, - CORBA::Double theObject); + void AddItemToListOfDouble(GEOM::GEOM_List_ptr& theList, + CORBA::Double theObject); //-----------------------------------------------------------------------// // Inherited methods from SALOMEDS::Driver // - //-----------------------------------------------------------------------// + //-----------------------------------------------------------------------// SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - CORBA::Boolean isMultiFile); + const char* theURL, + CORBA::Boolean isMultiFile); SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - CORBA::Boolean isMultiFile); - + const char* theURL, + CORBA::Boolean isMultiFile); + CORBA::Boolean Load(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - CORBA::Boolean isMultiFile); + const SALOMEDS::TMPFile& theStream, + const char* theURL, + CORBA::Boolean isMultiFile); CORBA::Boolean LoadASCII(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - CORBA::Boolean isMultiFile); + const SALOMEDS::TMPFile& theStream, + const char* theURL, + CORBA::Boolean isMultiFile); void Close(SALOMEDS::SComponent_ptr theComponent); char* ComponentDataType(); char* IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, - const char* IORString, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII); + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); char* LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, - const char* aLocalPersistentID, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII); + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); CORBA::Boolean CanPublishInStudy(CORBA::Object_ptr theIOR); SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theObject, - const char* theName) throw (SALOME::SALOME_Exception) ; + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) ; GEOM::ListOfGO* PublishNamedShapesInStudy(SALOMEDS::Study_ptr theStudy, - //SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theObject); + //SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject); CORBA::Boolean CanCopy(SALOMEDS::SObject_ptr theObject); SALOMEDS::TMPFile* CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID); CORBA::Boolean CanPaste(const char* theComponentName, CORBA::Long theObjectID); SALOMEDS::SObject_ptr PasteInto(const SALOMEDS::TMPFile& theStream, - CORBA::Long theObjectID, - SALOMEDS::SObject_ptr theObject); + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject); //-----------------------------------------------------------// - // Primitives Construction : BasicOperations // + // Primitives Construction : BasicOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakePointXYZ (CORBA::Double theX, - CORBA::Double theY, - CORBA::Double theZ); + CORBA::Double theY, + CORBA::Double theZ); GEOM::GEOM_Object_ptr MakePointWithReference (GEOM::GEOM_Object_ptr theReference, - CORBA::Double theX, - CORBA::Double theY, - CORBA::Double theZ); + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ); GEOM::GEOM_Object_ptr MakePointOnCurve (GEOM::GEOM_Object_ptr theRefCurve, - CORBA::Double theParameter); + CORBA::Double theParameter); GEOM::GEOM_Object_ptr MakePointOnCurveByLength (GEOM::GEOM_Object_ptr theRefCurve, - CORBA::Double theLength, - CORBA::Boolean theReverse); + CORBA::Double theLength, + CORBA::Boolean theReverse); GEOM::GEOM_Object_ptr MakePointOnCurveByCoord (GEOM::GEOM_Object_ptr theRefCurve, CORBA::Double theXParameter, CORBA::Double theYParameter, @@ -165,544 +164,547 @@ public: CORBA::Double theYParameter, CORBA::Double theZParameter); GEOM::GEOM_Object_ptr MakePointOnLinesIntersection (GEOM::GEOM_Object_ptr theRefLine1, - GEOM::GEOM_Object_ptr theRefLine2); + GEOM::GEOM_Object_ptr theRefLine2); GEOM::GEOM_Object_ptr MakeTangentOnCurve (GEOM::GEOM_Object_ptr theRefCurve, - CORBA::Double theParameter); + CORBA::Double theParameter); GEOM::GEOM_Object_ptr MakeVectorDXDYDZ (CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); + CORBA::Double theDY, + CORBA::Double theDZ); GEOM::GEOM_Object_ptr MakeVectorTwoPnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr thePnt2); GEOM::GEOM_Object_ptr MakeLineTwoPnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr thePnt2); GEOM::GEOM_Object_ptr MakeLineTwoFaces (GEOM::GEOM_Object_ptr theFace1, - GEOM::GEOM_Object_ptr theFace2); + GEOM::GEOM_Object_ptr theFace2); GEOM::GEOM_Object_ptr MakePlaneThreePnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3, - CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + CORBA::Double theTrimSize); GEOM::GEOM_Object_ptr MakePlanePntVec (GEOM::GEOM_Object_ptr thePnt, - GEOM::GEOM_Object_ptr theVec, - CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theTrimSize); GEOM::GEOM_Object_ptr MakePlaneFace (GEOM::GEOM_Object_ptr theFace, - CORBA::Double theTrimSize); + CORBA::Double theTrimSize); GEOM::GEOM_Object_ptr MakePlane2Vec (GEOM::GEOM_Object_ptr theVec1, - GEOM::GEOM_Object_ptr theVec2, - CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr theVec2, + CORBA::Double theTrimSize); GEOM::GEOM_Object_ptr MakePlaneLCS (GEOM::GEOM_Object_ptr theLCS, - CORBA::Double theTrimSize, - CORBA::Double theOrientation); + CORBA::Double theTrimSize, + CORBA::Double theOrientation); GEOM::GEOM_Object_ptr MakeMarker (CORBA::Double theOX , CORBA::Double theOY , CORBA::Double theOZ, - CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, - CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); + CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, + CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); GEOM::GEOM_Object_ptr MakeMarkerFromShape (GEOM::GEOM_Object_ptr theShape); GEOM::GEOM_Object_ptr MakeMarkerPntTwoVec (GEOM::GEOM_Object_ptr theOrigin, GEOM::GEOM_Object_ptr theXVec, GEOM::GEOM_Object_ptr theYVec); - - GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, - CORBA::Double theParameterU, - CORBA::Double theParameterV, - CORBA::Double theTrimSize); + + GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theParameterU, + CORBA::Double theParameterV, + CORBA::Double theTrimSize); //-----------------------------------------------------------// // Primitives Construction : 3DPrimOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeBox (CORBA::Double theX1, - CORBA::Double theY1, - CORBA::Double theZ1, - CORBA::Double theX2, - CORBA::Double theY2, - CORBA::Double theZ2); - GEOM::GEOM_Object_ptr MakeBoxDXDYDZ (CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); - GEOM::GEOM_Object_ptr MakeBoxTwoPnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2); + CORBA::Double theY1, + CORBA::Double theZ1, + CORBA::Double theX2, + CORBA::Double theY2, + CORBA::Double theZ2); + GEOM::GEOM_Object_ptr MakeBoxDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr MakeBoxTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); GEOM::GEOM_Object_ptr MakeFaceHW (CORBA::Double theH, - CORBA::Double theW, - CORBA::Short theOrientation); - GEOM::GEOM_Object_ptr MakeFaceObjHW (GEOM::GEOM_Object_ptr theObj, - CORBA::Double theH, - CORBA::Double theW); + CORBA::Double theW, + CORBA::Short theOrientation); + GEOM::GEOM_Object_ptr MakeFaceObjHW (GEOM::GEOM_Object_ptr theObj, + CORBA::Double theH, + CORBA::Double theW); GEOM::GEOM_Object_ptr MakeDiskPntVecR (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theR); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theR); GEOM::GEOM_Object_ptr MakeDiskThreePnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeDiskR (CORBA::Double theR, - CORBA::Short theOrientation); + CORBA::Short theOrientation); GEOM::GEOM_Object_ptr MakeCylinderPntVecRH (GEOM::GEOM_Object_ptr thePnt, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theRadius, - CORBA::Double theHeight); - GEOM::GEOM_Object_ptr MakeCylinderRH (CORBA::Double theR, - CORBA::Double theH); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + CORBA::Double theHeight); + GEOM::GEOM_Object_ptr MakeCylinderRH (CORBA::Double theR, + CORBA::Double theH); GEOM::GEOM_Object_ptr MakeSphere (CORBA::Double theX, - CORBA::Double theY, - CORBA::Double theZ, - CORBA::Double theRadius); + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theRadius); GEOM::GEOM_Object_ptr MakeSphereR (CORBA::Double theR); - GEOM::GEOM_Object_ptr MakeSpherePntR (GEOM::GEOM_Object_ptr thePnt, - CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeSpherePntR (GEOM::GEOM_Object_ptr thePnt, + CORBA::Double theR); GEOM::GEOM_Object_ptr MakeTorusPntVecRR (GEOM::GEOM_Object_ptr thePnt, - GEOM::GEOM_Object_ptr theVec, - CORBA::Double theRMajor, - CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, + CORBA::Double theRMinor); GEOM::GEOM_Object_ptr MakeTorusRR (CORBA::Double theRMajor, - CORBA::Double theRMinor); + CORBA::Double theRMinor); GEOM::GEOM_Object_ptr MakeConePntVecR1R2H (GEOM::GEOM_Object_ptr thePnt, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theR1, - CORBA::Double theR2, - CORBA::Double theHeight); - GEOM::GEOM_Object_ptr MakeConeR1R2H (CORBA::Double theR1, - CORBA::Double theR2, - CORBA::Double theHeight); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight); + GEOM::GEOM_Object_ptr MakeConeR1R2H (CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight); GEOM::GEOM_Object_ptr MakePrismVecH (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr theVec, - CORBA::Double theH); + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH); GEOM::GEOM_Object_ptr MakePrismVecH2Ways (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr theVec, - CORBA::Double theH); + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH); GEOM::GEOM_Object_ptr MakePrismTwoPnt (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr MakePrismTwoPnt2Ways (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr MakePrismDXDYDZ (GEOM::GEOM_Object_ptr theBase, - CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); GEOM::GEOM_Object_ptr MakePrismDXDYDZ2Ways (GEOM::GEOM_Object_ptr theBase, - CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); - GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePath); + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath); GEOM::GEOM_Object_ptr MakeRevolutionAxisAngle (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theAngle); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); GEOM::GEOM_Object_ptr MakeRevolutionAxisAngle2Ways (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theAngle); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); GEOM::GEOM_Object_ptr MakeFilling (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theMinDeg, CORBA::Long theMaxDeg, - CORBA::Double theTol2D, CORBA::Double theTol3D, - CORBA::Long theNbIter, + CORBA::Long theMinDeg, CORBA::Long theMaxDeg, + CORBA::Double theTol2D, CORBA::Double theTol3D, + CORBA::Long theNbIter, GEOM::filling_oper_method theMethod, CORBA::Boolean theApprox); GEOM::GEOM_Object_ptr MakeThruSections(const GEOM::ListOfGO& theSeqSections, - CORBA::Boolean theModeSolid, - CORBA::Double thePreci, - CORBA::Boolean theRuled); - + CORBA::Boolean theModeSolid, + CORBA::Double thePreci, + CORBA::Boolean theRuled); + GEOM::GEOM_Object_ptr MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections); - + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections); + GEOM::GEOM_Object_ptr MakePipeWithShellSections(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theSubBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections); + const GEOM::ListOfGO& theSubBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections); GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations); - + const GEOM::ListOfGO& theLocations); + GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePath, - GEOM::GEOM_Object_ptr theVec); + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec); //-----------------------------------------------------------// // BooleanOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeBoolean (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2, - CORBA::Long theOperation); + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOperation); GEOM::GEOM_Object_ptr MakeFuse (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2); + GEOM::GEOM_Object_ptr theShape2); GEOM::GEOM_Object_ptr MakePartition (GEOM::GEOM_List_ptr theShapes, - GEOM::GEOM_List_ptr theTools, - GEOM::GEOM_List_ptr theKeepInside, - GEOM::GEOM_List_ptr theRemoveInside, - CORBA::Short theLimit, - CORBA::Boolean theRemoveWebs, - GEOM::GEOM_List_ptr theMaterials, - CORBA::Short theKeepNonlimitShapes); + GEOM::GEOM_List_ptr theTools, + GEOM::GEOM_List_ptr theKeepInside, + GEOM::GEOM_List_ptr theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + GEOM::GEOM_List_ptr theMaterials, + CORBA::Short theKeepNonlimitShapes); GEOM::GEOM_Object_ptr MakeHalfPartition (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr thePlane); //-----------------------------------------------------------// // InsertOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeCopy (GEOM::GEOM_Object_ptr theOriginal); - void Export (GEOM::GEOM_Object_ptr theObject, - const char* theFileName, - const char* theFormatName); - GEOM::GEOM_Object_ptr Import (const char* theFileName, - const char* theFormatName); + void Export (GEOM::GEOM_Object_ptr theObject, + const char* theFileName, + const char* theFormatName); + GEOM::GEOM_Object_ptr Import (const char* theFileName, + const char* theFormatName); void ImportTranslators (GEOM::string_array_out theFormats, - GEOM::string_array_out thePatterns); + GEOM::string_array_out thePatterns); void ExportTranslators (GEOM::string_array_out theFormats, - GEOM::string_array_out thePatterns); + GEOM::string_array_out thePatterns); //-----------------------------------------------------------// // TransformOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); GEOM::GEOM_Object_ptr TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theDX, - CORBA::Double theDY, - CORBA::Double theDZ); + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr theVector); GEOM::GEOM_Object_ptr TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr theVector); GEOM::GEOM_Object_ptr TranslateVectorDistance (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theDistance, - CORBA::Boolean theCopy); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theDistance, + CORBA::Boolean theCopy); GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theStep, - CORBA::Long theNbTimes); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theStep, + CORBA::Long theNbTimes); GEOM::GEOM_Object_ptr MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theVector1, - CORBA::Double theStep1, - CORBA::Long theNbTimes1, - GEOM::GEOM_Object_ptr theVector2, - CORBA::Double theStep2, - CORBA::Long theNbTimes2); + GEOM::GEOM_Object_ptr theVector1, + CORBA::Double theStep1, + CORBA::Long theNbTimes1, + GEOM::GEOM_Object_ptr theVector2, + CORBA::Double theStep2, + CORBA::Long theNbTimes2); GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theAngle); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); GEOM::GEOM_Object_ptr RotateCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theAngle); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); GEOM::GEOM_Object_ptr RotateThreePoints (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theCentPoint, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr theCentPoint, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr RotateThreePointsCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theCentPoint, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr theCentPoint, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr MultiRotate1D (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Long theNbTimes); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Long theNbTimes); GEOM::GEOM_Object_ptr MultiRotate2D (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis, - CORBA::Double theAngle, - CORBA::Long theNbTimes1, - CORBA::Double theStep, - CORBA::Long theNbTimes2); - GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePlane); - GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePlane); - GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis); - GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theAxis); - GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint); - GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint); - GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset); - GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset); - GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint, - CORBA::Double theFactor); - GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint, - CORBA::Double theFactor); + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle, + CORBA::Long theNbTimes1, + CORBA::Double theStep, + CORBA::Long theNbTimes2); + GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); + GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); GEOM::GEOM_Object_ptr ScaleShapeAlongAxes (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint, - CORBA::Double theFactorX, - CORBA::Double theFactorY, - CORBA::Double theFactorZ); + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactorX, + CORBA::Double theFactorY, + CORBA::Double theFactorZ); GEOM::GEOM_Object_ptr ScaleShapeAlongAxesCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePoint, - CORBA::Double theFactorX, - CORBA::Double theFactorY, - CORBA::Double theFactorZ); + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactorX, + CORBA::Double theFactorY, + CORBA::Double theFactorZ); GEOM::GEOM_Object_ptr PositionShape (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theStartLCS, - GEOM::GEOM_Object_ptr theEndLCS); + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr theStartLCS, - GEOM::GEOM_Object_ptr theEndLCS); + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject, - GEOM::GEOM_Object_ptr thePath, - CORBA::Double theDistance, - CORBA::Boolean theCopy, - CORBA::Boolean theReverse); + GEOM::GEOM_Object_ptr thePath, + CORBA::Double theDistance, + CORBA::Boolean theCopy, + CORBA::Boolean theReverse); //-----------------------------------------------------------// // ShapesOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr thePnt2); GEOM::GEOM_Object_ptr MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires, CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, - CORBA::Boolean isPlanarWanted); + CORBA::Boolean isPlanarWanted); GEOM::GEOM_Object_ptr MakeFaceWires (GEOM::GEOM_List_ptr theWires, - CORBA::Boolean isPlanarWanted); + CORBA::Boolean isPlanarWanted); GEOM::GEOM_Object_ptr MakeShell (GEOM::GEOM_List_ptr theFacesAndShells); GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell); GEOM::GEOM_Object_ptr MakeSolidShells (GEOM::GEOM_List_ptr theShells); GEOM::GEOM_Object_ptr MakeCompound (GEOM::GEOM_List_ptr theShapes); GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - CORBA::Boolean doKeepNonSolids); + CORBA::Double theTolerance, + CORBA::Boolean doKeepNonSolids); GEOM::GEOM_List_ptr GetGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance); + CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeGlueFacesByList (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - const GEOM::ListOfGO& theFaces, - CORBA::Boolean doKeepNonSolids); + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces, + CORBA::Boolean doKeepNonSolids); GEOM::GEOM_List_ptr MakeExplode (GEOM::GEOM_Object_ptr theShape, - CORBA::Long theShapeType, - CORBA::Boolean isSorted); + CORBA::Long theShapeType, + CORBA::Boolean isSorted); CORBA::Long NumberOfFaces (GEOM::GEOM_Object_ptr theShape); CORBA::Long NumberOfEdges (GEOM::GEOM_Object_ptr theShape); GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theShape); GEOM::GEOM_List_ptr GetShapesOnShape (GEOM::GEOM_Object_ptr theCheckShape, - GEOM::GEOM_Object_ptr theShape, - CORBA::Short theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::shape_state theState); GEOM::GEOM_Object_ptr GetShapesOnShapeAsCompound (GEOM::GEOM_Object_ptr theCheckShape, - GEOM::GEOM_Object_ptr theShape, - CORBA::Short theShapeType, - GEOM::shape_state theState); + GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::shape_state theState); //-----------------------------------------------------------// // BlocksOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeQuad4Vertices (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3, - GEOM::GEOM_Object_ptr thePnt4); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + GEOM::GEOM_Object_ptr thePnt4); GEOM::GEOM_Object_ptr MakeQuad (GEOM::GEOM_Object_ptr theEdge1, - GEOM::GEOM_Object_ptr theEdge2, - GEOM::GEOM_Object_ptr theEdge3, - GEOM::GEOM_Object_ptr theEdge4); + GEOM::GEOM_Object_ptr theEdge2, + GEOM::GEOM_Object_ptr theEdge3, + GEOM::GEOM_Object_ptr theEdge4); GEOM::GEOM_Object_ptr MakeQuad2Edges (GEOM::GEOM_Object_ptr theEdge1, - GEOM::GEOM_Object_ptr theEdge2); + GEOM::GEOM_Object_ptr theEdge2); GEOM::GEOM_Object_ptr MakeHexa (GEOM::GEOM_Object_ptr theFace1, - GEOM::GEOM_Object_ptr theFace2, - GEOM::GEOM_Object_ptr theFace3, - GEOM::GEOM_Object_ptr theFace4, - GEOM::GEOM_Object_ptr theFace5, - GEOM::GEOM_Object_ptr theFace6); + GEOM::GEOM_Object_ptr theFace2, + GEOM::GEOM_Object_ptr theFace3, + GEOM::GEOM_Object_ptr theFace4, + GEOM::GEOM_Object_ptr theFace5, + GEOM::GEOM_Object_ptr theFace6); GEOM::GEOM_Object_ptr MakeHexa2Faces (GEOM::GEOM_Object_ptr theFace1, - GEOM::GEOM_Object_ptr theFace2); + GEOM::GEOM_Object_ptr theFace2); GEOM::GEOM_Object_ptr GetPoint (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theX, - CORBA::Double theY, - CORBA::Double theZ, - CORBA::Double theEpsilon); + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theEpsilon); GEOM::GEOM_Object_ptr GetEdge (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); GEOM::GEOM_Object_ptr GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr GetFaceByPoints (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePoint1, - GEOM::GEOM_Object_ptr thePoint2, - GEOM::GEOM_Object_ptr thePoint3, - GEOM::GEOM_Object_ptr thePoint4); + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + GEOM::GEOM_Object_ptr thePoint3, + GEOM::GEOM_Object_ptr thePoint4); GEOM::GEOM_Object_ptr GetFaceByEdges (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr theEdge1, - GEOM::GEOM_Object_ptr theEdge2); + GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2); GEOM::GEOM_Object_ptr GetOppositeFace (GEOM::GEOM_Object_ptr theBlock, - GEOM::GEOM_Object_ptr theFace); + GEOM::GEOM_Object_ptr theFace); GEOM::GEOM_Object_ptr GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr GetFaceByNormale (GEOM::GEOM_Object_ptr theBlock, - GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr theVector); CORBA::Boolean IsCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, - CORBA::Long theMinNbFaces, - CORBA::Long theMaxNbFaces, - CORBA::Long& theNbBlocks); + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces, + CORBA::Long& theNbBlocks); CORBA::Boolean CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, - GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors); + GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors); char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, - const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); + const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); GEOM::GEOM_List_ptr ExplodeCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, - CORBA::Long theMinNbFaces, - CORBA::Long theMaxNbFaces); + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces); GEOM::GEOM_Object_ptr GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound, - GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr GetBlockByParts (GEOM::GEOM_Object_ptr theCompound, - GEOM::GEOM_List_ptr theParts); + GEOM::GEOM_List_ptr theParts); GEOM::GEOM_List_ptr GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound, - GEOM::GEOM_List_ptr theParts); + GEOM::GEOM_List_ptr theParts); GEOM::GEOM_Object_ptr MakeMultiTransformation1D (GEOM::GEOM_Object_ptr theBlock, - CORBA::Long theDirFace1, - CORBA::Long theDirFace2, - CORBA::Long theNbTimes); + CORBA::Long theDirFace1, + CORBA::Long theDirFace2, + CORBA::Long theNbTimes); GEOM::GEOM_Object_ptr MakeMultiTransformation2D (GEOM::GEOM_Object_ptr theBlock, - CORBA::Long theDirFace1U, - CORBA::Long theDirFace2U, - CORBA::Long theNbTimesU, - CORBA::Long theDirFace1V, - CORBA::Long theDirFace2V, - CORBA::Long theNbTimesV); + CORBA::Long theDirFace1U, + CORBA::Long theDirFace2U, + CORBA::Long theNbTimesU, + CORBA::Long theDirFace1V, + CORBA::Long theDirFace2V, + CORBA::Long theNbTimesV); //-----------------------------------------------------------// // CurvesOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theR); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theR); GEOM::GEOM_Object_ptr MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeCircleCenter2Pnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theRMajor, CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, CORBA::Double theRMinor); GEOM::GEOM_Object_ptr MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - CORBA::Double theRMajor, CORBA::Double theRMinor, - GEOM::GEOM_Object_ptr theVectorMajor); + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, CORBA::Double theRMinor, + GEOM::GEOM_Object_ptr theVectorMajor); GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeArcCenter (GEOM::GEOM_Object_ptr theCenter, GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, CORBA::Boolean theSense); GEOM::GEOM_Object_ptr MakeArcOfEllipse (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); - GEOM::GEOM_Object_ptr MakePolyline (GEOM::GEOM_List_ptr thePoints); - GEOM::GEOM_Object_ptr MakeSplineBezier (GEOM::GEOM_List_ptr thePoints); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr MakePolyline (GEOM::GEOM_List_ptr thePoints, + CORBA::Boolean theIsClosed); + GEOM::GEOM_Object_ptr MakeSplineBezier (GEOM::GEOM_List_ptr thePoints, + CORBA::Boolean theIsClosed); GEOM::GEOM_Object_ptr MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints, - CORBA::Boolean theIsClosed); - GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, - GEOM::GEOM_List_ptr theWorkingPlane); + CORBA::Boolean theIsClosed, + CORBA::Boolean theDoReordering); + GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, + GEOM::GEOM_List_ptr theWorkingPlane); GEOM::GEOM_Object_ptr Make3DSketcher (GEOM::GEOM_List_ptr theCoordinates); //-----------------------------------------------------------// // LocalOperations // //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeFilletAll (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theR); + CORBA::Double theR); GEOM::GEOM_Object_ptr MakeFilletEdges (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, - GEOM::GEOM_List_ptr theEdges); + GEOM::GEOM_List_ptr theEdges); GEOM::GEOM_Object_ptr MakeFilletEdgesR1R2 (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR1, - CORBA::Double theR2, GEOM::GEOM_List_ptr theEdges); + CORBA::Double theR2, GEOM::GEOM_List_ptr theEdges); GEOM::GEOM_Object_ptr MakeFilletFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, - GEOM::GEOM_List_ptr theFaces); + GEOM::GEOM_List_ptr theFaces); GEOM::GEOM_Object_ptr MakeFilletFacesR1R2 (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR1, - CORBA::Double theR2, GEOM::GEOM_List_ptr theFaces); + CORBA::Double theR2, GEOM::GEOM_List_ptr theFaces); GEOM::GEOM_Object_ptr MakeFillet2D (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, - GEOM::GEOM_List_ptr theVertexes); + GEOM::GEOM_List_ptr theVertexes); GEOM::GEOM_Object_ptr MakeFillet1D (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, - GEOM::GEOM_List_ptr theVertexes); + GEOM::GEOM_List_ptr theVertexes); GEOM::GEOM_Object_ptr MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD); GEOM::GEOM_Object_ptr MakeChamferEdge (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD1, CORBA::Double theD2, - CORBA::Long theFace1, CORBA::Long theFace2); + CORBA::Double theD1, CORBA::Double theD2, + CORBA::Long theFace1, CORBA::Long theFace2); GEOM::GEOM_Object_ptr MakeChamferEdgeAD (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD, CORBA::Double theAngle, - CORBA::Long theFace1, CORBA::Long theFace2); + CORBA::Double theD, CORBA::Double theAngle, + CORBA::Long theFace1, CORBA::Long theFace2); GEOM::GEOM_Object_ptr MakeChamferFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD1, CORBA::Double theD2, - GEOM::GEOM_List_ptr theFaces); + CORBA::Double theD1, CORBA::Double theD2, + GEOM::GEOM_List_ptr theFaces); GEOM::GEOM_Object_ptr MakeChamferFacesAD (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD, CORBA::Double theAngle, - GEOM::GEOM_List_ptr theFaces); + CORBA::Double theD, CORBA::Double theAngle, + GEOM::GEOM_List_ptr theFaces); GEOM::GEOM_Object_ptr MakeChamferEdges (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD1, CORBA::Double theD2, - GEOM::GEOM_List_ptr theEdges); + CORBA::Double theD1, CORBA::Double theD2, + GEOM::GEOM_List_ptr theEdges); GEOM::GEOM_Object_ptr MakeChamferEdgesAD (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theD, CORBA::Double theAngle, - GEOM::GEOM_List_ptr theEdges); + CORBA::Double theD, CORBA::Double theAngle, + GEOM::GEOM_List_ptr theEdges); GEOM::GEOM_Object_ptr MakeArchimede (GEOM::GEOM_Object_ptr theShape, CORBA::Double theWeight, - CORBA::Double theWaterDensity, - CORBA::Double theMeshingDeflection); + CORBA::Double theWaterDensity, + CORBA::Double theMeshingDeflection); CORBA::Long GetSubShapeIndex (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr theSubShape); + GEOM::GEOM_Object_ptr theSubShape); //-----------------------------------------------------------// // GroupOperations // //-----------------------------------------------------------// - GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, - CORBA::Long theShapeType); - void AddObject (GEOM::GEOM_Object_ptr theGroup, - CORBA::Long theSubShapeId); - void RemoveObject (GEOM::GEOM_Object_ptr theGroup, - CORBA::Long theSubShapeId); + GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, + CORBA::Long theShapeType); + void AddObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId); + void RemoveObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId); CORBA::Long GetType (GEOM::GEOM_Object_ptr theGroup); GEOM::GEOM_Object_ptr GetMainShape (GEOM::GEOM_Object_ptr theGroup); GEOM::GEOM_List_ptr GetObjects (GEOM::GEOM_Object_ptr theGroup); - + //-----------------------------------------------------------// // Advanced Operations // //-----------------------------------------------------------// - GEOM::GEOM_List_ptr MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh); - GEOM::GEOM_List_ptr MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::GEOM_List_ptr MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); - GEOM::GEOM_List_ptr MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::GEOM_List_ptr MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh); - GEOM::GEOM_List_ptr MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::GEOM_List_ptr MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh); + GEOM::GEOM_List_ptr MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::GEOM_List_ptr MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); + GEOM::GEOM_List_ptr MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::GEOM_List_ptr MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh); + GEOM::GEOM_List_ptr MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); /*@@ insert new functions before this line @@ do not remove this line @@*/ - + private: - SALOME_NamingService * name_service; + SALOME_NamingService * name_service; GEOM::GEOM_Gen_var myGeomEngine; CORBA::Long myStudyID; CORBA::Long myLastStudyID; // mkr : PAL10770 PortableServer::POA_var myPOA; - + GEOM::GEOM_IBasicOperations_var myBasicOp; GEOM::GEOM_I3DPrimOperations_var my3DPrimOp; GEOM::GEOM_IBooleanOperations_var myBoolOp; @@ -716,4 +718,4 @@ private: GEOM::GEOM_IAdvancedOperations_var myAdvancedOp; }; -#endif +#endif diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 14a40fb5e..695b9db3e 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -901,35 +901,39 @@ class geompyDC(GEOM._objref_GEOM_Gen): ## Create a polyline on the set of points. # @param thePoints Sequence of points for the polyline. + # @param theIsClosed If True, build a closed wire. # @return New GEOM_Object, containing the created polyline. # # @ref tui_creation_curve "Example" - def MakePolyline(self,thePoints): + def MakePolyline(self, thePoints, theIsClosed=False): # Example: see GEOM_TestAll.py - anObj = self.CurvesOp.MakePolyline(thePoints) + anObj = self.CurvesOp.MakePolyline(thePoints, theIsClosed) RaiseIfFailed("MakePolyline", self.CurvesOp) return anObj ## Create bezier curve on the set of points. # @param thePoints Sequence of points for the bezier curve. + # @param theIsClosed If True, build a closed curve. # @return New GEOM_Object, containing the created bezier curve. # # @ref tui_creation_curve "Example" - def MakeBezier(self,thePoints): + def MakeBezier(self, thePoints, theIsClosed=False): # Example: see GEOM_TestAll.py - anObj = self.CurvesOp.MakeSplineBezier(thePoints) + anObj = self.CurvesOp.MakeSplineBezier(thePoints, theIsClosed) RaiseIfFailed("MakeSplineBezier", self.CurvesOp) return anObj ## Create B-Spline curve on the set of points. # @param thePoints Sequence of points for the B-Spline curve. # @param theIsClosed If True, build a closed curve. + # @param theDoReordering If TRUE, the algo does not follow the order of + # \a thePoints but searches for the closest vertex. # @return New GEOM_Object, containing the created B-Spline curve. # # @ref tui_creation_curve "Example" - def MakeInterpol(self, thePoints, theIsClosed=False): + def MakeInterpol(self, thePoints, theIsClosed=False, theDoReordering=False): # Example: see GEOM_TestAll.py - anObj = self.CurvesOp.MakeSplineInterpolation(thePoints, theIsClosed) + anObj = self.CurvesOp.MakeSplineInterpolation(thePoints, theIsClosed, theDoReordering) RaiseIfFailed("MakeSplineInterpolation", self.CurvesOp) return anObj @@ -1294,13 +1298,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theBase Base shape to be extruded. # @param thePoint1 First end of extrusion vector. # @param thePoint2 Second end of extrusion vector. + # @param theScaleFactor Use it to make prism with scaled second base. + # Nagative value means not scaled second base. # @return New GEOM_Object, containing the created prism. # # @ref tui_creation_prism "Example" - def MakePrism(self, theBase, thePoint1, thePoint2): + def MakePrism(self, theBase, thePoint1, thePoint2, theScaleFactor = -1.0): # Example: see GEOM_TestAll.py - anObj = self.PrimOp.MakePrismTwoPnt(theBase, thePoint1, thePoint2) + anObj = None + Parameters = "" + if theScaleFactor > 0: + theScaleFactor,Parameters = ParseParameters(theScaleFactor) + anObj = self.PrimOp.MakePrismTwoPntWithScaling(theBase, thePoint1, thePoint2, theScaleFactor) + else: + anObj = self.PrimOp.MakePrismTwoPnt(theBase, thePoint1, thePoint2) RaiseIfFailed("MakePrismTwoPnt", self.PrimOp) + anObj.SetParameters(Parameters) return anObj ## Create a shape by extrusion of the base shape along a @@ -1323,13 +1336,21 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theBase Base shape to be extruded. # @param theVec Direction of extrusion. # @param theH Prism dimension along theVec. + # @param theScaleFactor Use it to make prism with scaled second base. + # Nagative value means not scaled second base. # @return New GEOM_Object, containing the created prism. # # @ref tui_creation_prism "Example" - def MakePrismVecH(self, theBase, theVec, theH): + def MakePrismVecH(self, theBase, theVec, theH, theScaleFactor = -1.0): # Example: see GEOM_TestAll.py - theH,Parameters = ParseParameters(theH) - anObj = self.PrimOp.MakePrismVecH(theBase, theVec, theH) + anObj = None + Parameters = "" + if theScaleFactor > 0: + theH,theScaleFactor,Parameters = ParseParameters(theH,theScaleFactor) + anObj = self.PrimOp.MakePrismVecHWithScaling(theBase, theVec, theH, theScaleFactor) + else: + theH,Parameters = ParseParameters(theH) + anObj = self.PrimOp.MakePrismVecH(theBase, theVec, theH) RaiseIfFailed("MakePrismVecH", self.PrimOp) anObj.SetParameters(Parameters) return anObj @@ -1354,13 +1375,21 @@ class geompyDC(GEOM._objref_GEOM_Gen): ## Create a shape by extrusion of the base shape along the dx, dy, dz direction # @param theBase Base shape to be extruded. # @param theDX, theDY, theDZ Directions of extrusion. + # @param theScaleFactor Use it to make prism with scaled second base. + # Nagative value means not scaled second base. # @return New GEOM_Object, containing the created prism. # # @ref tui_creation_prism "Example" - def MakePrismDXDYDZ(self, theBase, theDX, theDY, theDZ): + def MakePrismDXDYDZ(self, theBase, theDX, theDY, theDZ, theScaleFactor = -1.0): # Example: see GEOM_TestAll.py - theDX,theDY,theDZ,Parameters = ParseParameters(theDX, theDY, theDZ) - anObj = self.PrimOp.MakePrismDXDYDZ(theBase, theDX, theDY, theDZ) + anObj = None + Parameters = "" + if theScaleFactor > 0: + theDX,theDY,theDZ,theScaleFactor,Parameters = ParseParameters(theDX, theDY, theDZ, theScaleFactor) + anObj = self.PrimOp.MakePrismDXDYDZWithScaling(theBase, theDX, theDY, theDZ, theScaleFactor) + else: + theDX,theDY,theDZ,Parameters = ParseParameters(theDX, theDY, theDZ) + anObj = self.PrimOp.MakePrismDXDYDZ(theBase, theDX, theDY, theDZ) RaiseIfFailed("MakePrismDXDYDZ", self.PrimOp) anObj.SetParameters(Parameters) return anObj diff --git a/src/GenerationGUI/GenerationGUI_PrismDlg.cxx b/src/GenerationGUI/GenerationGUI_PrismDlg.cxx index 1bdd4afc5..bc2b10168 100644 --- a/src/GenerationGUI/GenerationGUI_PrismDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PrismDlg.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 : GenerationGUI_PrismDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #include "GenerationGUI_PrismDlg.h" #include @@ -72,42 +71,48 @@ GenerationGUI_PrismDlg::GenerationGUI_PrismDlg (GeometryGUI* theGeometryGUI, QWi mainFrame()->RadioButton1->setChecked(true); - GroupPoints = new DlgRef_2Sel1Spin2Check(centralWidget()); - GroupPoints->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV")); - GroupPoints->TextLabel1->setText(tr("GEOM_BASE")); - GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); - GroupPoints->TextLabel3->setText(tr("GEOM_HEIGHT")); - GroupPoints->PushButton1->setIcon(image1); - GroupPoints->PushButton2->setIcon(image1); - GroupPoints->LineEdit1->setReadOnly(true); - GroupPoints->LineEdit2->setReadOnly(true); - GroupPoints->CheckButton1->setText(tr("GEOM_BOTHWAY")); - GroupPoints->CheckButton2->setText(tr("GEOM_REVERSE")); - - GroupPoints2 = new DlgRef_3Sel1Check(centralWidget()); - GroupPoints2->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV_2P")); - GroupPoints2->TextLabel1->setText(tr("GEOM_BASE")); - GroupPoints2->TextLabel2->setText(tr("GEOM_POINT_I").arg(1)); - GroupPoints2->TextLabel3->setText(tr("GEOM_POINT_I").arg(2)); - GroupPoints2->PushButton1->setIcon(image1); - GroupPoints2->PushButton2->setIcon(image1); - GroupPoints2->PushButton3->setIcon(image1); - GroupPoints2->CheckButton1->setText(tr("GEOM_BOTHWAY")); - - GroupPoints3 = new DlgRef_1Sel3Spin1Check(centralWidget()); - GroupPoints3->GroupBox1->setTitle(tr("GEOM_EXTRUSION_DXDYDZ")); - GroupPoints3->TextLabel1->setText(tr("GEOM_BASE")); - GroupPoints3->PushButton1->setIcon(image1); - GroupPoints3->TextLabel2->setText(tr("GEOM_DX")); - GroupPoints3->TextLabel3->setText(tr("GEOM_DY")); - GroupPoints3->TextLabel4->setText(tr("GEOM_DZ")); - GroupPoints3->CheckButton1->setText(tr("GEOM_BOTHWAY")); + GroupVecH = new DlgRef_2Sel2Spin3Check(centralWidget()); + GroupVecH->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV")); + GroupVecH->TextLabel1->setText(tr("GEOM_BASE")); + GroupVecH->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupVecH->TextLabel3->setText(tr("GEOM_HEIGHT")); + GroupVecH->TextLabel4->setText(tr("GEOM_SCALE_FACTOR")); + GroupVecH->PushButton1->setIcon(image1); + GroupVecH->PushButton2->setIcon(image1); + GroupVecH->LineEdit1->setReadOnly(true); + GroupVecH->LineEdit2->setReadOnly(true); + GroupVecH->CheckBox1->setText(tr("GEOM_BOTHWAY")); + GroupVecH->CheckBox2->setText(tr("GEOM_REVERSE")); + GroupVecH->CheckBox3->setText(tr("GEOM_SCALE_PRISM")); + + Group2Points = new DlgRef_3Sel3Spin2Check(centralWidget()); + Group2Points->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV_2P")); + Group2Points->TextLabel1->setText(tr("GEOM_BASE")); + Group2Points->TextLabel2->setText(tr("GEOM_POINT_I").arg(1)); + Group2Points->TextLabel3->setText(tr("GEOM_POINT_I").arg(2)); + Group2Points->TextLabel4->setText(tr("GEOM_SCALE_FACTOR")); + Group2Points->PushButton1->setIcon(image1); + Group2Points->PushButton2->setIcon(image1); + Group2Points->PushButton3->setIcon(image1); + Group2Points->CheckBox1->setText(tr("GEOM_BOTHWAY")); + Group2Points->CheckBox2->setText(tr("GEOM_SCALE_PRISM")); + + GroupDXDYDZ = new DlgRef_1Sel4Spin2Check(centralWidget()); + GroupDXDYDZ->GroupBox1->setTitle(tr("GEOM_EXTRUSION_DXDYDZ")); + GroupDXDYDZ->TextLabel1->setText(tr("GEOM_BASE")); + GroupDXDYDZ->PushButton1->setIcon(image1); + GroupDXDYDZ->TextLabel2->setText(tr("GEOM_DX")); + GroupDXDYDZ->TextLabel3->setText(tr("GEOM_DY")); + GroupDXDYDZ->TextLabel4->setText(tr("GEOM_DZ")); + GroupDXDYDZ->TextLabel5->setText(tr("GEOM_SCALE_FACTOR")); + GroupDXDYDZ->CheckBox1->setText(tr("GEOM_BOTHWAY")); + GroupDXDYDZ->CheckBox2->setText(tr("GEOM_SCALE_PRISM")); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); - layout->addWidget(GroupPoints); - layout->addWidget(GroupPoints2); - layout->addWidget(GroupPoints3); + layout->addWidget(GroupVecH); + layout->addWidget(Group2Points); + layout->addWidget(GroupDXDYDZ); /***************************************************************/ setHelpFileName("create_extrusion_page.html"); @@ -135,35 +140,53 @@ void GenerationGUI_PrismDlg::Init() double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); // min, max, step and decimals for spin boxes & initial values - initSpinBox(GroupPoints3->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox(GroupPoints3->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox(GroupPoints3->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); - GroupPoints3->SpinBox_DX->setValue(0.0); - GroupPoints3->SpinBox_DY->setValue(0.0); - GroupPoints3->SpinBox_DZ->setValue(0.0); + double aScaleFactor = 2.0; + double aScaleStep = 0.5; + + initSpinBox(GroupVecH->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); + GroupVecH->SpinBox_DX->setValue(100.0); + + initSpinBox(GroupDXDYDZ->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); + initSpinBox(GroupDXDYDZ->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); + initSpinBox(GroupDXDYDZ->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); + GroupDXDYDZ->SpinBox_DX->setValue(0.0); + GroupDXDYDZ->SpinBox_DY->setValue(0.0); + GroupDXDYDZ->SpinBox_DZ->setValue(0.0); - initSpinBox(GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); - GroupPoints->SpinBox_DX->setValue(100.0); + initSpinBox(GroupVecH->SpinBox_DY, 0.0, COORD_MAX, aScaleStep, "parametric_precision" ); + initSpinBox(Group2Points->SpinBox1, 0.0, COORD_MAX, aScaleStep, "parametric_precision" ); + initSpinBox(GroupDXDYDZ->SpinBox_SC, 0.0, COORD_MAX, aScaleStep, "parametric_precision" ); + + GroupVecH->SpinBox_DY->setValue(aScaleFactor); + Group2Points->SpinBox1->setValue(aScaleFactor); + GroupDXDYDZ->SpinBox_SC->setValue(aScaleFactor); + + // hide not used controls + Group2Points->TextLabel5->hide(); + Group2Points->TextLabel6->hide(); + + Group2Points->SpinBox2->hide(); + Group2Points->SpinBox3->hide(); // init variables - myEditCurrentArgument = GroupPoints->LineEdit1; - GroupPoints->LineEdit1->setReadOnly(true); - GroupPoints->LineEdit2->setReadOnly(true); + myEditCurrentArgument = GroupVecH->LineEdit1; + GroupVecH->LineEdit1->setReadOnly(true); + GroupVecH->LineEdit2->setReadOnly(true); - GroupPoints2->LineEdit1->setReadOnly(true); - GroupPoints2->LineEdit2->setReadOnly(true); - GroupPoints2->LineEdit3->setReadOnly(true); + Group2Points->LineEdit1->setReadOnly(true); + Group2Points->LineEdit2->setReadOnly(true); + Group2Points->LineEdit3->setReadOnly(true); - GroupPoints3->LineEdit1->setReadOnly(true); + GroupDXDYDZ->LineEdit1->setReadOnly(true); - GroupPoints->LineEdit1->setText(""); - GroupPoints->LineEdit2->setText(""); + GroupVecH->LineEdit1->setText(""); + GroupVecH->LineEdit2->setText(""); - GroupPoints2->LineEdit1->setText(""); - GroupPoints2->LineEdit2->setText(""); - GroupPoints2->LineEdit3->setText(""); + Group2Points->LineEdit1->setText(""); + Group2Points->LineEdit2->setText(""); + Group2Points->LineEdit3->setText(""); - GroupPoints3->LineEdit1->setText(""); + GroupDXDYDZ->LineEdit1->setText(""); myBaseObjects.clear(); myPoint1.nullify(); @@ -176,29 +199,36 @@ void GenerationGUI_PrismDlg::Init() connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); - connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupVecH->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupVecH->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupVecH->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); - connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); - connect(GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); - - connect(GroupPoints2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints2->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints2->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); - - connect(GroupPoints3->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints3->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); - connect(GroupPoints3->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); - connect(GroupPoints3->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); - connect(GroupPoints3->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); + connect(GroupVecH->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); + connect(GroupVecH->CheckBox2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); + connect(GroupVecH->CheckBox3, SIGNAL(toggled(bool)), this, SLOT(onScalePrism())); + connect(GroupVecH->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(Group2Points->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2Points->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2Points->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2Points->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); + connect(Group2Points->CheckBox2, SIGNAL(toggled(bool)), this, SLOT(onScalePrism())); + connect(Group2Points->SpinBox1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(GroupDXDYDZ->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDXDYDZ->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDXDYDZ->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDXDYDZ->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDXDYDZ->SpinBox_SC, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDXDYDZ->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(onBothway())); + connect(GroupDXDYDZ->CheckBox2, SIGNAL(toggled(bool)), this, SLOT(onScalePrism())); initName(tr("GEOM_EXTRUSION")); ConstructorsClicked(0); + onBothway(); } //================================================================================= @@ -207,10 +237,10 @@ void GenerationGUI_PrismDlg::Init() //================================================================================= void GenerationGUI_PrismDlg::SetDoubleSpinBoxStep (double step) { - GroupPoints->SpinBox_DX->setSingleStep(step); - GroupPoints3->SpinBox_DX->setSingleStep(step); - GroupPoints3->SpinBox_DY->setSingleStep(step); - GroupPoints3->SpinBox_DZ->setSingleStep(step); + GroupVecH->SpinBox_DX->setSingleStep(step); + GroupDXDYDZ->SpinBox_DX->setSingleStep(step); + GroupDXDYDZ->SpinBox_DY->setSingleStep(step); + GroupDXDYDZ->SpinBox_DZ->setSingleStep(step); } //================================================================================= @@ -221,33 +251,33 @@ void GenerationGUI_PrismDlg::ConstructorsClicked (int constructorId) { switch (constructorId) { case 0: - GroupPoints2->hide(); - GroupPoints3->hide(); - GroupPoints->show(); - - GroupPoints->LineEdit2->setText(""); + Group2Points->hide(); + GroupDXDYDZ->hide(); + GroupVecH->show(); + + GroupVecH->LineEdit2->setText(""); myVec.nullify(); - - GroupPoints->PushButton1->click(); + + GroupVecH->PushButton1->click(); break; case 1: - GroupPoints->hide(); - GroupPoints2->show(); - GroupPoints3->hide(); - - GroupPoints2->LineEdit2->setText(""); - GroupPoints2->LineEdit3->setText(""); + GroupVecH->hide(); + Group2Points->show(); + GroupDXDYDZ->hide(); + + Group2Points->LineEdit2->setText(""); + Group2Points->LineEdit3->setText(""); myPoint1.nullify(); myPoint2.nullify(); - - GroupPoints2->PushButton1->click(); + + Group2Points->PushButton1->click(); break; case 2: - GroupPoints->hide(); - GroupPoints2->hide(); - GroupPoints3->show(); - - GroupPoints3->PushButton1->click(); + GroupVecH->hide(); + Group2Points->hide(); + GroupDXDYDZ->show(); + + GroupDXDYDZ->PushButton1->click(); break; default: break; @@ -295,58 +325,58 @@ void GenerationGUI_PrismDlg::SelectionIntoArgument() erasePreview(); myEditCurrentArgument->setText(""); - if ( myEditCurrentArgument == GroupPoints->LineEdit1 || - myEditCurrentArgument == GroupPoints2->LineEdit1 || - myEditCurrentArgument == GroupPoints3->LineEdit1 ) { + if ( myEditCurrentArgument == GroupVecH->LineEdit1 || + myEditCurrentArgument == Group2Points->LineEdit1 || + myEditCurrentArgument == GroupDXDYDZ->LineEdit1 ) { myBaseObjects.clear(); QList objects = getSelected( TopAbs_SHAPE, -1 ); for ( int i = 0; i < objects.count(); i++ ) { GEOM::shape_type stype = objects[i]->GetMaxShapeType(); if ( stype < GEOM::SHELL || stype > GEOM::VERTEX ) - continue; + continue; myBaseObjects << objects[i]; } if ( !myBaseObjects.isEmpty() ) { QString aName = myBaseObjects.count() > 1 ? QString( "%1_objects").arg( myBaseObjects.count() ) : GEOMBase::GetName( myBaseObjects[0].get() ); - GroupPoints->LineEdit1->setText( aName ); - GroupPoints2->LineEdit1->setText( aName ); - GroupPoints3->LineEdit1->setText( aName ); + GroupVecH->LineEdit1->setText( aName ); + Group2Points->LineEdit1->setText( aName ); + GroupDXDYDZ->LineEdit1->setText( aName ); } else { - GroupPoints->LineEdit1->setText( "" ); - GroupPoints2->LineEdit1->setText( "" ); - GroupPoints3->LineEdit1->setText( "" ); + GroupVecH->LineEdit1->setText( "" ); + Group2Points->LineEdit1->setText( "" ); + GroupDXDYDZ->LineEdit1->setText( "" ); } } - else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { + else if ( myEditCurrentArgument == GroupVecH->LineEdit2 ) { myVec = getSelected( TopAbs_EDGE ); if ( myVec ) { QString aName = GEOMBase::GetName( myVec.get() ); myEditCurrentArgument->setText( aName ); if ( myBaseObjects.isEmpty() ) - GroupPoints->PushButton1->click(); + GroupVecH->PushButton1->click(); } } - if ( myEditCurrentArgument == GroupPoints2->LineEdit2 ) { + if ( myEditCurrentArgument == Group2Points->LineEdit2 ) { myPoint1 = getSelected( TopAbs_VERTEX ); if ( myPoint1 ) { QString aName = GEOMBase::GetName( myPoint1.get() ); myEditCurrentArgument->setText( aName ); if ( !myPoint2 ) - GroupPoints2->PushButton3->click(); + Group2Points->PushButton3->click(); else if ( myBaseObjects.isEmpty() ) - GroupPoints2->PushButton1->click(); + Group2Points->PushButton1->click(); } } - if ( myEditCurrentArgument == GroupPoints2->LineEdit3 ) { + if ( myEditCurrentArgument == Group2Points->LineEdit3 ) { myPoint2 = getSelected( TopAbs_VERTEX ); if ( myPoint2 ) { QString aName = GEOMBase::GetName( myPoint2.get() ); myEditCurrentArgument->setText( aName ); if ( myBaseObjects.isEmpty() ) - GroupPoints2->PushButton1->click(); + Group2Points->PushButton1->click(); else if ( !myPoint1 ) - GroupPoints2->PushButton2->click(); + Group2Points->PushButton2->click(); } } @@ -363,42 +393,42 @@ void GenerationGUI_PrismDlg::SetEditCurrentArgument() disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); globalSelection(GEOM_ALLSHAPES); - if (send == GroupPoints->PushButton1) { - myEditCurrentArgument = GroupPoints->LineEdit1; - GroupPoints->PushButton2->setDown(false); - GroupPoints->LineEdit2->setEnabled(false); + if (send == GroupVecH->PushButton1) { + myEditCurrentArgument = GroupVecH->LineEdit1; + GroupVecH->PushButton2->setDown(false); + GroupVecH->LineEdit2->setEnabled(false); } - else if (send == GroupPoints->PushButton2) { - myEditCurrentArgument = GroupPoints->LineEdit2; - GroupPoints->PushButton1->setDown(false); - GroupPoints->LineEdit1->setEnabled(false); + else if (send == GroupVecH->PushButton2) { + myEditCurrentArgument = GroupVecH->LineEdit2; + GroupVecH->PushButton1->setDown(false); + GroupVecH->LineEdit1->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); } - else if (send == GroupPoints2->PushButton1) { - myEditCurrentArgument = GroupPoints2->LineEdit1; - GroupPoints2->PushButton2->setDown(false); - GroupPoints2->PushButton3->setDown(false); - GroupPoints2->LineEdit2->setEnabled(false); - GroupPoints2->LineEdit3->setEnabled(false); + else if (send == Group2Points->PushButton1) { + myEditCurrentArgument = Group2Points->LineEdit1; + Group2Points->PushButton2->setDown(false); + Group2Points->PushButton3->setDown(false); + Group2Points->LineEdit2->setEnabled(false); + Group2Points->LineEdit3->setEnabled(false); } - else if (send == GroupPoints2->PushButton2) { - myEditCurrentArgument = GroupPoints2->LineEdit2; - GroupPoints2->PushButton1->setDown(false); - GroupPoints2->PushButton3->setDown(false); - GroupPoints2->LineEdit1->setEnabled(false); - GroupPoints2->LineEdit3->setEnabled(false); + else if (send == Group2Points->PushButton2) { + myEditCurrentArgument = Group2Points->LineEdit2; + Group2Points->PushButton1->setDown(false); + Group2Points->PushButton3->setDown(false); + Group2Points->LineEdit1->setEnabled(false); + Group2Points->LineEdit3->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); } - else if (send == GroupPoints2->PushButton3) { - myEditCurrentArgument = GroupPoints2->LineEdit3; - GroupPoints2->PushButton1->setDown(false); - GroupPoints2->PushButton2->setDown(false); - GroupPoints2->LineEdit1->setEnabled(false); - GroupPoints2->LineEdit2->setEnabled(false); + else if (send == Group2Points->PushButton3) { + myEditCurrentArgument = Group2Points->LineEdit3; + Group2Points->PushButton1->setDown(false); + Group2Points->PushButton2->setDown(false); + Group2Points->LineEdit1->setEnabled(false); + Group2Points->LineEdit2->setEnabled(false); localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); } - else if (send == GroupPoints3->PushButton1) { - myEditCurrentArgument = GroupPoints3->LineEdit1; + else if (send == GroupDXDYDZ->PushButton1) { + myEditCurrentArgument = GroupDXDYDZ->LineEdit1; } connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -446,15 +476,6 @@ void GenerationGUI_PrismDlg::ValueChangedInSpinBox() displayPreview(); } -//================================================================================= -// function : getHeight() -// purpose : -//================================================================================= -double GenerationGUI_PrismDlg::getHeight() const -{ - return GroupPoints->SpinBox_DX->value(); -} - //================================================================================= // function : createOperation // purpose : @@ -473,16 +494,16 @@ bool GenerationGUI_PrismDlg::isValid (QString& msg) bool ok = false; switch ( getConstructorId() ) { case 0: - ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) && + ok = GroupVecH->SpinBox_DX->isValid( msg, !IsPreview() ) && !myBaseObjects.isEmpty() && myVec; break; case 1: ok = !myBaseObjects.isEmpty() && myPoint1 && myPoint2; break; case 2: - ok = GroupPoints3->SpinBox_DX->isValid( msg, !IsPreview() ) && - GroupPoints3->SpinBox_DY->isValid( msg, !IsPreview() ) && - GroupPoints3->SpinBox_DZ->isValid( msg, !IsPreview() ) && + ok = GroupDXDYDZ->SpinBox_DX->isValid( msg, !IsPreview() ) && + GroupDXDYDZ->SpinBox_DY->isValid( msg, !IsPreview() ) && + GroupDXDYDZ->SpinBox_DZ->isValid( msg, !IsPreview() ) && !myBaseObjects.isEmpty(); break; default: @@ -492,6 +513,62 @@ bool GenerationGUI_PrismDlg::isValid (QString& msg) return ok; } +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::onReverse() +{ + double anOldValue = GroupVecH->SpinBox_DX->value(); + GroupVecH->SpinBox_DX->setValue(-anOldValue); +} + +//================================================================================= +// function : onBothway() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::onBothway() +{ + GroupVecH->CheckBox2->setEnabled(!GroupVecH->CheckBox1->isChecked()); // is reversed + GroupVecH->CheckBox3->setEnabled(!GroupVecH->CheckBox1->isChecked()); // is scaled + GroupVecH->TextLabel4->setEnabled(!GroupVecH->CheckBox1->isChecked() && + GroupVecH->CheckBox3->isChecked()); // scale factor + GroupVecH->SpinBox_DY->setEnabled(!GroupVecH->CheckBox1->isChecked() && + GroupVecH->CheckBox3->isChecked()); // scale factor + + Group2Points->CheckBox2->setEnabled(!Group2Points->CheckBox1->isChecked()); // is scaled + Group2Points->TextLabel4->setEnabled(!Group2Points->CheckBox1->isChecked() && + Group2Points->CheckBox2->isChecked()); // scale factor + Group2Points->SpinBox1->setEnabled(!Group2Points->CheckBox1->isChecked() && + Group2Points->CheckBox2->isChecked()); // scale factor + + GroupDXDYDZ->CheckBox2->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked()); // is scaled + GroupDXDYDZ->TextLabel5->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked() && + GroupDXDYDZ->CheckBox2->isChecked()); // scale factor + GroupDXDYDZ->SpinBox_SC->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked() && + GroupDXDYDZ->CheckBox2->isChecked()); // scale factor + + displayPreview(); +} + +//================================================================================= +// function : onScalePrism() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::onScalePrism() +{ + GroupVecH->TextLabel4->setEnabled(GroupVecH->CheckBox3->isChecked()); + GroupVecH->SpinBox_DY->setEnabled(GroupVecH->CheckBox3->isChecked()); + + Group2Points->TextLabel4->setEnabled(Group2Points->CheckBox2->isChecked()); + Group2Points->SpinBox1->setEnabled(Group2Points->CheckBox2->isChecked()); + + GroupDXDYDZ->TextLabel5->setEnabled(GroupDXDYDZ->CheckBox2->isChecked()); + GroupDXDYDZ->SpinBox_SC->setEnabled(GroupDXDYDZ->CheckBox2->isChecked()); + + displayPreview(); +} + //================================================================================= // function : execute // purpose : @@ -506,66 +583,64 @@ bool GenerationGUI_PrismDlg::execute (ObjectList& objects) for (int i = 0; i < myBaseObjects.count(); i++) { switch (getConstructorId()) { case 0: - if (!GroupPoints->CheckButton1->isChecked()) - anObj = anOper->MakePrismVecH(myBaseObjects[i].get(), myVec.get(), getHeight()); - else - anObj = anOper->MakePrismVecH2Ways(myBaseObjects[i].get(), myVec.get(), getHeight()); - + if (GroupVecH->CheckBox1->isChecked()) + anObj = anOper->MakePrismVecH2Ways(myBaseObjects[i].get(), myVec.get(), + GroupVecH->SpinBox_DX->value()); + else { + if (GroupVecH->CheckBox3->isChecked()) + anObj = anOper->MakePrismVecHWithScaling(myBaseObjects[i].get(), myVec.get(), + GroupVecH->SpinBox_DX->value(), + GroupVecH->SpinBox_DY->value()); + else + anObj = anOper->MakePrismVecH(myBaseObjects[i].get(), myVec.get(), + GroupVecH->SpinBox_DX->value()); + } + if (!anObj->_is_nil() && !IsPreview()) { - aParameters << GroupPoints->SpinBox_DX->text(); + aParameters << GroupVecH->SpinBox_DX->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } break; case 1: - if (!GroupPoints2->CheckButton1->isChecked()) - anObj = anOper->MakePrismTwoPnt(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get()); - else + if (Group2Points->CheckBox1->isChecked()) anObj = anOper->MakePrismTwoPnt2Ways(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get()); + else { + if (Group2Points->CheckBox2->isChecked()) + anObj = anOper->MakePrismTwoPntWithScaling(myBaseObjects[i].get(), myPoint1.get(), + myPoint2.get(), Group2Points->SpinBox1->value()); + else + anObj = anOper->MakePrismTwoPnt(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get()); + } break; case 2: - double dx = GroupPoints3->SpinBox_DX->value(); - double dy = GroupPoints3->SpinBox_DY->value(); - double dz = GroupPoints3->SpinBox_DZ->value(); - - if (!GroupPoints3->CheckButton1->isChecked()) - anObj = anOper->MakePrismDXDYDZ(myBaseObjects[i].get(), dx, dy, dz); - else + double dx = GroupDXDYDZ->SpinBox_DX->value(); + double dy = GroupDXDYDZ->SpinBox_DY->value(); + double dz = GroupDXDYDZ->SpinBox_DZ->value(); + + if (GroupDXDYDZ->CheckBox1->isChecked()) anObj = anOper->MakePrismDXDYDZ2Ways(myBaseObjects[i].get(), dx, dy, dz); - + else { + if (GroupDXDYDZ->CheckBox2->isChecked()) + anObj = anOper->MakePrismDXDYDZWithScaling(myBaseObjects[i].get(), dx, dy, dz, + GroupDXDYDZ->SpinBox_SC->value()); + else + anObj = anOper->MakePrismDXDYDZ(myBaseObjects[i].get(), dx, dy, dz); + } + if (!anObj->_is_nil() && !IsPreview()) { - aParameters << GroupPoints3->SpinBox_DX->text(); - aParameters << GroupPoints3->SpinBox_DY->text(); - aParameters << GroupPoints3->SpinBox_DZ->text(); + aParameters << GroupDXDYDZ->SpinBox_DX->text(); + aParameters << GroupDXDYDZ->SpinBox_DY->text(); + aParameters << GroupDXDYDZ->SpinBox_DZ->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } break; } - + if (!anObj->_is_nil()) objects.push_back(anObj._retn()); } - - return true; -} - -//================================================================================= -// function : onReverse() -// purpose : -//================================================================================= -void GenerationGUI_PrismDlg::onReverse() -{ - double anOldValue = GroupPoints->SpinBox_DX->value(); - GroupPoints->SpinBox_DX->setValue(-anOldValue); -} -//================================================================================= -// function : onBothway() -// purpose : -//================================================================================= -void GenerationGUI_PrismDlg::onBothway() -{ - GroupPoints->CheckButton2->setEnabled(!GroupPoints->CheckButton1->isChecked()); - displayPreview(); + return true; } //================================================================================= diff --git a/src/GenerationGUI/GenerationGUI_PrismDlg.h b/src/GenerationGUI/GenerationGUI_PrismDlg.h index bebfa3fec..7365b408a 100644 --- a/src/GenerationGUI/GenerationGUI_PrismDlg.h +++ b/src/GenerationGUI/GenerationGUI_PrismDlg.h @@ -18,21 +18,20 @@ // 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 : GenerationGUI_PrismDlg.h // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #ifndef GENERATIONGUI_PRISMDLG_H #define GENERATIONGUI_PRISMDLG_H #include "GEOMBase_Skeleton.h" #include "GEOM_GenericObjPtr.h" -class DlgRef_2Sel1Spin2Check; -class DlgRef_3Sel1Check; -class DlgRef_1Sel3Spin1Check; +class DlgRef_2Sel2Spin3Check; +class DlgRef_3Sel3Spin2Check; +class DlgRef_1Sel4Spin2Check; //================================================================================= // class : GenerationGUI_PrismDlg @@ -57,16 +56,15 @@ protected: private: void Init(); void enterEvent( QEvent* ); - double getHeight() const; private: QList myBaseObjects; /* Base shapes */ GEOM::GeomObjPtr myVec; /* Vector, defining the direction */ GEOM::GeomObjPtr myPoint1, myPoint2; /* Points for extrusion */ - DlgRef_2Sel1Spin2Check* GroupPoints; - DlgRef_3Sel1Check* GroupPoints2; // for second layout for extrusion using 2 points - DlgRef_1Sel3Spin1Check* GroupPoints3; + DlgRef_2Sel2Spin3Check* GroupVecH; + DlgRef_3Sel3Spin2Check* Group2Points; + DlgRef_1Sel4Spin2Check* GroupDXDYDZ; private slots: void ClickOnOk(); @@ -79,6 +77,7 @@ private slots: void SetDoubleSpinBoxStep( double ); void onReverse(); void onBothway(); + void onScalePrism(); }; #endif // GENERATIONGUI_PRISMDLG_H -- 2.39.2