From 89465ae3983751dffb23b628ee479ab956dcd14a Mon Sep 17 00:00:00 2001 From: dmv Date: Mon, 22 Dec 2008 12:23:19 +0000 Subject: [PATCH] 0020021: EDF 799 GEOM: Creation of 3D wired tubing --- doc/salome/gui/GEOM/images/3dsketch1.png | Bin 0 -> 4079 bytes doc/salome/gui/GEOM/images/3dsketch2.png | Bin 0 -> 23548 bytes doc/salome/gui/GEOM/images/3dsketch3.png | Bin 0 -> 23948 bytes .../gui/GEOM/input/creating_3dsketcher.doc | 32 + .../gui/GEOM/input/creating_geom_objects.doc | 1 + doc/salome/gui/GEOM/input/index.doc | 2 + doc/salome/gui/GEOM/input/tui_3dsketcher.doc | 20 + idl/GEOM_Gen.idl | 10 + resources/3dsketch.png | Bin 0 -> 685 bytes resources/GEOM_en.xml | 1 + resources/GEOM_fr.xml | 1 + resources/Makefile.am | 1 + src/EntityGUI/EntityGUI.cxx | 4 + src/EntityGUI/EntityGUI_3DSketcherDlg.cxx | 566 ++++++++++++++++++ src/EntityGUI/EntityGUI_3DSketcherDlg.h | 97 +++ src/EntityGUI/Makefile.am | 3 + src/GEOMGUI/GEOM_images.ts | 4 + src/GEOMGUI/GEOM_msg_en.ts | 24 + src/GEOMGUI/GeometryGUI.cxx | 3 + src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx | 137 +++++ src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx | 158 +++++ src/GEOMImpl/GEOMImpl_Gen.cxx | 2 + src/GEOMImpl/GEOMImpl_I3DSketcher.hxx | 43 ++ src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 71 +++ src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 1 + src/GEOMImpl/GEOMImpl_Types.hxx | 1 + src/GEOMImpl/Makefile.am | 3 + src/GEOM_I/GEOM_ICurvesOperations_i.cc | 25 + src/GEOM_I/GEOM_ICurvesOperations_i.hh | 2 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 18 + src/GEOM_I_Superv/GEOM_Superv_i.hh | 1 + src/GEOM_SWIG/GEOM_TestAll.py | 2 + src/GEOM_SWIG/geompyDC.py | 12 + 33 files changed, 1245 insertions(+) create mode 100755 doc/salome/gui/GEOM/images/3dsketch1.png create mode 100755 doc/salome/gui/GEOM/images/3dsketch2.png create mode 100755 doc/salome/gui/GEOM/images/3dsketch3.png create mode 100755 doc/salome/gui/GEOM/input/creating_3dsketcher.doc create mode 100755 doc/salome/gui/GEOM/input/tui_3dsketcher.doc create mode 100755 resources/3dsketch.png create mode 100755 src/EntityGUI/EntityGUI_3DSketcherDlg.cxx create mode 100755 src/EntityGUI/EntityGUI_3DSketcherDlg.h create mode 100755 src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx create mode 100755 src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx create mode 100755 src/GEOMImpl/GEOMImpl_I3DSketcher.hxx diff --git a/doc/salome/gui/GEOM/images/3dsketch1.png b/doc/salome/gui/GEOM/images/3dsketch1.png new file mode 100755 index 0000000000000000000000000000000000000000..087ea15dc6c23e5820ba2ca6180b5c72176d6541 GIT binary patch literal 4079 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 Xk@W*t<%&wEkcSZtk{qjW0jd81{iA`n literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/3dsketch2.png b/doc/salome/gui/GEOM/images/3dsketch2.png new file mode 100755 index 0000000000000000000000000000000000000000..51f171d9f16d5d32fba0322c9e4c496c4f28f7a7 GIT binary patch literal 23548 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
}rmJcl-MP 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/3dsketch3.png b/doc/salome/gui/GEOM/images/3dsketch3.png new file mode 100755 index 0000000000000000000000000000000000000000..feb56e7cb04e6871248f3fee5174f9839e7d3b16 GIT binary patch literal 23948 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 Entity -> 3D Sketch. + +\image html 3dsketch2.png + +The position of each coordinates can be defined by absolute coordinates X, Y, Z or +by relative coordinates DX, DY, DZ with respect to the previous Applied point. +Type of coordinates can be selected by the Coordinates Type radio buttons. +\n "Sketch Validation" button applies the whole wire. +\n "Sketch Closure" button connects the first and the last points closing +the contour and applies the closed wire. +To make a closed wire using the TUI command, the first and the last point shoul +have the same coordinates. + +The Result of the operation will be a \b GEOM_Object. + +TUI Command: geompy.Make3DSketcher( [ PointsList ] ) +This algorithm creates a wire, from the list of real values which define XYZ +coordinates of points. + +Example: + +\image html 3dsketch1.png + +Our TUI Scripts provide you with useful examples of the use of +\ref tui_3dsketcher_page "3D Sketcher". +*/ diff --git a/doc/salome/gui/GEOM/input/creating_geom_objects.doc b/doc/salome/gui/GEOM/input/creating_geom_objects.doc index 5d889f02a..02c30498a 100644 --- a/doc/salome/gui/GEOM/input/creating_geom_objects.doc +++ b/doc/salome/gui/GEOM/input/creating_geom_objects.doc @@ -36,6 +36,7 @@
  • \subpage work_with_groups_page
  • \subpage build_by_blocks_page
  • \subpage create_sketcher_page
  • +
  • \subpage create_3dsketcher_page
  • \subpage create_adv_obj_page
    • \ref create_explode_page
    • diff --git a/doc/salome/gui/GEOM/input/index.doc b/doc/salome/gui/GEOM/input/index.doc index cc7fda330..12941c823 100644 --- a/doc/salome/gui/GEOM/input/index.doc +++ b/doc/salome/gui/GEOM/input/index.doc @@ -40,6 +40,7 @@
    • \ref work_with_groups_page
    • \ref build_by_blocks_page
    • \ref create_sketcher_page
    • +
    • \ref create_3dsketcher_page
    • \ref create_adv_obj_page
      • \ref create_explode_page
      • @@ -122,6 +123,7 @@
      • \ref tui_working_with_groups_page
      • \ref tui_building_by_blocks_page
      • \ref tui_sketcher_page
      • +
      • \ref tui_3dsketcher_page
      • \ref tui_advanced_geom_objs_page
    • \ref tui_transformation_page
    • diff --git a/doc/salome/gui/GEOM/input/tui_3dsketcher.doc b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc new file mode 100755 index 000000000..c9760fbcf --- /dev/null +++ b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc @@ -0,0 +1,20 @@ +/*! + +\page tui_3dsketcher_page 3D Sketcher + +\code +import geompy +import salome +gg = salome.ImportComponentGUI("GEOM") + +# create a 3D sketcher (wire) of the given points coordinates +sketcher1 = geompy.Make3DSketcher([ 0,0,0, 50,50,50, 0,50,0, 50,0,50, 10,20,100, 0,0,0 ]) + +# add object in the study +id_sketcher1 = geompy.addToStudy(sketcher1,"Sketcher1") + +# display the sketcher +gg.createAndDisplayGO(id_sketcher1) +\endcode + +*/ \ No newline at end of file diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index afbc705a5..bffefb664 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2178,6 +2178,16 @@ module GEOM * \return New GEOM_Object, containing the created wire. */ GEOM_Object MakeSketcher (in string theCommand, in ListOfDouble theWorkingPlane); + + /*! + * Create a 3D sketcher, following the numerical description, + * passed through points created by \a theCoordinates argument. \n + * Format of the description string have to be the following: + * + * "Make3DSketcher[x1, y1, z1, x2, y2, z2, ..., xN, yN, zN]" + */ + + GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates); /*! * Create a sketcher (wire or face), following the textual description, diff --git a/resources/3dsketch.png b/resources/3dsketch.png new file mode 100755 index 0000000000000000000000000000000000000000..f34ec05166209a7188f7b8c3fc2ee9c842af99a3 GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l6(v z^mSxl*w|O|J8&|PuaN8!@0H0E#$$S>hnXyA}sap26EKOhn2 z35PdCh;VN8U;;_ZC}@?wuzHfiGL=ai6fQI*I}|#u=uS9zfRUR`fPq7SM_g&A19OVm zmDI+7!U;2&Ja{_abA~d1Gjd=!$m_zz&o@I&gZFck!X#EM54I?$SRONWg@%X?KOz{j zUa%|FF<$v0`@+{%<$d$f#Dfe+-Y-l_U=VQlVDRV9&&?_V)r`D5_@4Z8FzOLr^~74h zp1qSf_7k(_pE`w)k_=27mOQEp9y0RjKe^%Z$&S5zb1+fDVq?$kT1>A90I0am$I#Evp_om~ksKJkV=Vi(|`}p{a12 zPh>L_tK9{bCo&A5P8LsCJ#n)(Fj5Z1uxrnAXl1y-;G7{))3D2dL2B^{O-7bJ=CAe* zk{m`LGuWEC)FLvOzT7j~@am{%Pk`l&g-jQoC^w2c)1R=HN5J7mlBJMTwbX)w=BKGE zr1(}?u})!PJm~;*ZJ8o_(8nW;pOr3bNLG*vQEQ566}!xH!d3i)P6Goo!-oCRZIKUT R>wrm%!PC{xWt~$(69CN?_5lC@ literal 0 HcmV?d00001 diff --git a/resources/GEOM_en.xml b/resources/GEOM_en.xml index 175c2fb98..a7aac6c05 100644 --- a/resources/GEOM_en.xml +++ b/resources/GEOM_en.xml @@ -81,6 +81,7 @@ + diff --git a/resources/GEOM_fr.xml b/resources/GEOM_fr.xml index 1a551988e..feaac78e7 100644 --- a/resources/GEOM_fr.xml +++ b/resources/GEOM_fr.xml @@ -71,6 +71,7 @@ + diff --git a/resources/Makefile.am b/resources/Makefile.am index 3d4405ed0..f37e8e9e8 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -36,6 +36,7 @@ Plugin \ GEOMDS_Resources \ ImportExport \ ShHealing \ +3dsketch.png \ angle.png \ arc.png \ arccenter.png \ diff --git a/src/EntityGUI/EntityGUI.cxx b/src/EntityGUI/EntityGUI.cxx index 2bdb051f4..fa7ea74ba 100644 --- a/src/EntityGUI/EntityGUI.cxx +++ b/src/EntityGUI/EntityGUI.cxx @@ -37,6 +37,7 @@ #include #include "EntityGUI_SketcherDlg.h" // Sketcher +#include "EntityGUI_3DSketcherDlg.h" // Sketcher #include "EntityGUI_SubShapeDlg.h" // Method SUBSHAPE //======================================================================= @@ -75,6 +76,9 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) getGeometryGUI()->ActiveWorkingPlane(); aDlg = new EntityGUI_SketcherDlg( getGeometryGUI(), parent ); break; + case 405: // 3D SKETCHER + aDlg = new EntityGUI_3DSketcherDlg( getGeometryGUI(), parent ); + break; case 407: // EXPLODE : use ic aDlg = new EntityGUI_SubShapeDlg( getGeometryGUI(), parent ); break; diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx new file mode 100755 index 000000000..e10e6e692 --- /dev/null +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx @@ -0,0 +1,566 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : EntityGUI_3DSketcherDlg.cxx +// Author : DMV, OCN +// + +#include "EntityGUI_3DSketcherDlg.h" +#include "EntityGUI_Widgets.h" +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +class Locker +{ +public: + Locker( bool& l ) : myLock( l ) { myLock = true; } + ~Locker() { myLock = false; } +private: + bool& myLock; +}; + +//================================================================================= +// class : EntityGUI_3DSketcherDlg() +// purpose : Constructs a EntityGUI_3DSketcherDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl ) + : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ) +{ + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_UNDO" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_REDO" ) ) ); + QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICO_3DSKETCH" ) ) ); + + setWindowTitle( tr( "GEOM_3DSKETCHER_TITLE" ) ); + + /***************************************************************/ + + mainFrame()->GroupConstructors->setTitle( tr( "GEOM_3DSKETCHER" ) ); + mainFrame()->RadioButton1->setIcon( image3 );; + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->close(); + + GroupType = new DlgRef_3Radio(centralWidget()); + GroupType->GroupBox1->setTitle(tr("GEOM_COORDINATES_TYPE")); + GroupType->RadioButton1->setText(tr("GEOM_SKETCHER_ABS")); + GroupType->RadioButton2->setText(tr("GEOM_SKETCHER_REL")); + GroupType->RadioButton3->close(); + + Group3Spin = new EntityGUI_3Spin( centralWidget() ); + Group3Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) ); + Group3Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) ); + Group3Spin->buttonUndo->setIcon( image1 ); + Group3Spin->buttonRedo->setIcon( image2 ); + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) ); + + buttonOk()->setText( tr( "GEOM_BUT_END_SKETCH" ) ); + buttonApply()->setText( tr( "GEOM_BUT_CLOSE_SKETCH" ) ); + + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); + layout->setMargin( 0 ); layout->setSpacing( 6 ); + layout->addWidget( GroupType ); + layout->addWidget( Group3Spin ); + + setHelpFileName( "create_3dsketcher_page.html" ); + + resize(0,0); + Init(); +} + + + +//================================================================================= +// function : ~EntityGUI_3DSketcherDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +EntityGUI_3DSketcherDlg::~EntityGUI_3DSketcherDlg() +{ + myGeomGUI->SetActiveDialogBox( 0 ); +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::Init() +{ + myOK = false; + + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + + /* Get setting of step value from file configuration */ + double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 ); + + /* min, max, step and decimals for spin boxes */ + initSpinBox( Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + + /* signals and slots connections */ + connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( PointClicked( int ) ) ); + + connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + connect( Group3Spin->buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnAddPoint() ) ); + connect( Group3Spin->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) ); + connect( Group3Spin->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ; + + connect( GroupType->RadioButton1, SIGNAL( clicked() ), this, SLOT( TypeClicked() ) ); + connect( GroupType->RadioButton2, SIGNAL( clicked() ), this, SLOT( TypeClicked() ) ); + + connect( Group3Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + connect( Group3Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + connect( Group3Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + + connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) ); + + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); + connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + + initName( tr( "GEOM_3DSKETCHER" ) ); + + UpdateButtonsState(); +} + +//================================================================================= +// function : TypeClicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_3DSketcherDlg::TypeClicked() +{ + bool blocked = Group3Spin->SpinBox_DX->signalsBlocked(); + Group3Spin->SpinBox_DX->blockSignals(true); + Group3Spin->SpinBox_DY->blockSignals(true); + Group3Spin->SpinBox_DZ->blockSignals(true); + // Get setting of step value from file configuration + double x, y, z; + GetLastPoints(x, y, z); + if ( GroupType->RadioButton1->isChecked() ) { // XY + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) ); + Group3Spin->SpinBox_DX->setValue( x + Group3Spin->SpinBox_DX->value() ); + Group3Spin->SpinBox_DY->setValue( y + Group3Spin->SpinBox_DY->value() ); + Group3Spin->SpinBox_DZ->setValue( z + Group3Spin->SpinBox_DZ->value() ); + Group3Spin->buttonApply->setFocus(); + } else if ( GroupType->RadioButton2->isChecked() ) { // DXDY + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_DZ2" ) ); + Group3Spin->SpinBox_DX->setValue( Group3Spin->SpinBox_DX->value() - x ); + Group3Spin->SpinBox_DY->setValue( Group3Spin->SpinBox_DY->value() - y ); + Group3Spin->SpinBox_DZ->setValue( Group3Spin->SpinBox_DZ->value() - z ); + Group3Spin->buttonApply->setFocus(); + } + Group3Spin->SpinBox_DX->blockSignals(blocked); + Group3Spin->SpinBox_DY->blockSignals(blocked); + Group3Spin->SpinBox_DZ->blockSignals(blocked); +} + +//================================================================================= +// function : ClickOnAddPoint() +// purpose : called when the point coordinates is Applyed +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnAddPoint() +{ + double x, y, z; + GetCurrentPoints(x, y, z); + myPointsList.append(x); + myPointsList.append(y); + myPointsList.append(z); + + /*if (myRedoList.size() >= 2) { // Remove this positions from Redo List + for (int i = 0; i <= 2; i++) + myRedoList.removeFirst(); + }*/ + myRedoList.clear(); + + if ( GroupType->RadioButton2->isChecked() ) { + Group3Spin->SpinBox_DX->setValue( 0.0 ); + Group3Spin->SpinBox_DY->setValue( 0.0 ); + Group3Spin->SpinBox_DZ->setValue( 0.0 ); + } + UpdateButtonsState(); + displayPreview(); +} + +//================================================================================= +// function : UpdateButtonsState() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::UpdateButtonsState() +{ + if ( !myPointsList.count() ) + GroupType->RadioButton1->setChecked( true ); + GroupType->RadioButton2->setEnabled( myPointsList.count() > 2 ); + Group3Spin->buttonUndo->setEnabled( myPointsList.count() > 2 ); + Group3Spin->buttonRedo->setEnabled( myRedoList.count() > 2 ); +} + +//================================================================================= +// function : ClickOnUndo() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnUndo() +{ + if (myPointsList.count() > 2) { + double x, y, z; + GetLastPoints(x, y, z); + myRedoList.append(x); + myRedoList.append(y); + myRedoList.append(z); + myPointsList.removeLast(); + myPointsList.removeLast(); + myPointsList.removeLast(); + + UpdateButtonsState(); + displayPreview(); + } +} + +//================================================================================= +// function : ClickOnRedo() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnRedo() +{ + int count = myRedoList.count(); + if ( count > 2 ) { + myPointsList.append( myRedoList[count-3] ); + myPointsList.append( myRedoList[count-2] ); + myPointsList.append( myRedoList[count-1] ); + myRedoList.removeLast(); + myRedoList.removeLast(); + myRedoList.removeLast(); + + UpdateButtonsState(); + displayPreview(); + } +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed +//================================================================================= +void EntityGUI_3DSketcherDlg::SelectionIntoArgument() +{ + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + int nbSel = aSelList.Extent(); + if ( nbSel == 1 ) { + Standard_Boolean aRes = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes); + if (!CORBA::is_nil(aSelectedObject) && aRes) { + TopoDS_Shape aShape; + if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE)) { // Explore the shape if its a local selection + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(aSelList.First(), aMap); + if (aMap.Extent() == 1) + { + int anIndex = aMap(1); + GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId()); + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + } + } + bool isOk = true; + if ( aShape.ShapeType() != TopAbs_VERTEX ) + isOk = GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_VERTEX); + if (isOk) { + gp_Pnt aPnt; + if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) { + // set coordinates to the Spin Boxes + double aX, aY, aZ; + aX = aPnt.X(); + aY = aPnt.Y(); + aZ = aPnt.Z(); + bool blocked = Group3Spin->SpinBox_DX->signalsBlocked(); + Group3Spin->SpinBox_DX->blockSignals(true); + Group3Spin->SpinBox_DY->blockSignals(true); + Group3Spin->SpinBox_DZ->blockSignals(true); + if ( GroupType->RadioButton1->isChecked() ) { + Group3Spin->SpinBox_DX->setValue( aX ); + Group3Spin->SpinBox_DY->setValue( aY ); + Group3Spin->SpinBox_DZ->setValue( aZ ); + } else if ( GroupType->RadioButton2->isChecked() ) { + double x, y, z; + GetLastPoints(x, y, z); + Group3Spin->SpinBox_DX->setValue( aX - x ); + Group3Spin->SpinBox_DY->setValue( aY - y ); + Group3Spin->SpinBox_DZ->setValue( aZ - z ); + } + Group3Spin->SpinBox_DX->blockSignals(blocked); + Group3Spin->SpinBox_DY->blockSignals(blocked); + Group3Spin->SpinBox_DZ->blockSignals(blocked); + } + } + } + } + displayPreview(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::DeactivateActiveDialog() +{ + setEnabled( false ); + globalSelection(); + disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ActivateThisDialog() +{ + myGeomGUI->EmitSignalDeactivateDialog(); + setEnabled( true ); + myGeomGUI->SetActiveDialogBox( this ); + + connect( myGeomGUI->getApp()->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + displayPreview(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox( double newValue ) +{ + displayPreview(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::enterEvent( QEvent* ) +{ + if ( !mainFrame()->GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr EntityGUI_3DSketcherDlg::createOperation() +{ + return getGeomEngine()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::isValid( QString& msg ) +{ + int nbPoints = myPointsList.count()/3; + if ( myOK ) + return nbPoints >= 2; + else + return nbPoints >= 1; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::execute( ObjectList& objects ) +{ + GEOM::ListOfDouble_var aCoordsArray = new GEOM::ListOfDouble; + if (myOK) + aCoordsArray->length(myPointsList.size()); + else + aCoordsArray->length(myPointsList.size()+3); + + int i = 0; + QList::const_iterator it; + for(it = myPointsList.begin(); it != myPointsList.end(); ++it ) { + aCoordsArray[i] = *it; + i++; + } + + if (!myOK) { + double x, y, z; + GetCurrentPoints(x, y, z); + aCoordsArray[i] = x; + aCoordsArray[i+1] = y; + aCoordsArray[i+2] = z; + } + + GEOM::GEOM_Object_var anObj = + GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->Make3DSketcher( aCoordsArray ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================================= +// function : initSpinBox() +// purpose : +//================================================================================= + +void EntityGUI_3DSketcherDlg::initSpinBox( QDoubleSpinBox* spinBox, + double min, double max, + double step, int decimals ) +{ + spinBox->setDecimals( decimals ); + spinBox->setRange( min, max ); + spinBox->setSingleStep( step ); +} + +//================================================================================= +// function : SetDoubleSpinBoxStep() +// purpose : Double spin box management +//================================================================================= +void EntityGUI_3DSketcherDlg::SetDoubleSpinBoxStep( double step ) +{ + Group3Spin->SpinBox_DX->setSingleStep(step); + Group3Spin->SpinBox_DY->setSingleStep(step); + Group3Spin->SpinBox_DZ->setSingleStep(step); +} + +//================================================================================= +// function : isSameAsPrevious() +// purpose : Compare Last point in the list with current selected point +//================================================================================= +/*bool EntityGUI_3DSketcherDlg::isSameAsPrevious() // Not used this time +{ + double curX, curY, curZ; + double lastX, lastY, lastZ; + GetCurrentPoints(curX, curY, curZ); + GetLastPoints(lastX, lastY, lastZ); + if ( abs(lastX - curX) < Precision::Confusion() && + abs(lastY - curY) < Precision::Confusion() && + abs(lastZ - curZ) < Precision::Confusion() ) + return true; + + return false; +}*/ + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnOk() +{ + Locker lock( myOK ); + + if ( !onAccept() ) + return; + + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::ClickOnApply() +{ + if (myPointsList.count() > 3) { + myPointsList.append(myPointsList[0]); + myPointsList.append(myPointsList[1]); + myPointsList.append(myPointsList[2]); + } + + Locker lock( myOK ); + + if ( !onAccept() ) + return false; + + ClickOnCancel(); + return true; +} + +//================================================================================= +// function : GetLastPoints() +// purpose : return last points from list +//================================================================================= +void EntityGUI_3DSketcherDlg::GetLastPoints(double& x, double& y, double& z) +{ + int count = myPointsList.count(); + x = count > 2 ? myPointsList[count-3] : 0.0; + y = count > 2 ? myPointsList[count-2] : 0.0; + z = count > 2 ? myPointsList[count-1] : 0.0; +} + +//================================================================================= +// function : GetCurrentPoints() +// purpose : returns current points +//================================================================================= +void EntityGUI_3DSketcherDlg::GetCurrentPoints(double& x, double& y, double& z) +{ + if ( GroupType->RadioButton1->isChecked() ) { + x = Group3Spin->SpinBox_DX->value(); + y = Group3Spin->SpinBox_DY->value(); + z = Group3Spin->SpinBox_DZ->value(); + } else { // if (GroupType->RadioButton2->isChecked()) + GetLastPoints(x, y, z); + x += Group3Spin->SpinBox_DX->value(); + y += Group3Spin->SpinBox_DY->value(); + z += Group3Spin->SpinBox_DZ->value(); + } +} diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.h b/src/EntityGUI/EntityGUI_3DSketcherDlg.h new file mode 100755 index 000000000..8c2544f45 --- /dev/null +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.h @@ -0,0 +1,97 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : EntityGUI_3DSketcherDlg.h +// Author : DMV, OCN +// + +#ifndef ENTITYGUI_3DSKETCHERDLG_H +#define ENTITYGUI_3DSKETCHERDLG_H + +#include + +class QDoubleSpinBox; +class EntityGUI_3Spin; +class DlgRef_3Radio; + +#ifndef COORD_MIN +# define COORD_MIN -1e+15 +# define COORD_MAX +1e+15 +# define MAX_NUMBER 100000 +# define DBL_DIGITS_DISPLAY 16 +#endif // COORD_MIN + +//================================================================================= +// class : EntityGUI_Dlg +// purpose : +//================================================================================= +class EntityGUI_3DSketcherDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + EntityGUI_3DSketcherDlg( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0 ); + ~EntityGUI_3DSketcherDlg(); + +protected: + void initSpinBox( QDoubleSpinBox*, + double, double, double = 0.1, + int = 3 ); + + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& ); + +private: + void Init(); + void enterEvent( QEvent* ); + +private: + QList myPointsList; + QList myRedoList; + + EntityGUI_3Spin* Group3Spin; + DlgRef_3Radio* GroupType; + + bool myOK; + +private slots: + void ClickOnOk(); + void ClickOnAddPoint(); + bool ClickOnApply(); + // bool isSameAsPrevious(); + void UpdateButtonsState(); + void GetLastPoints(double&, double&, double&); + void GetCurrentPoints(double&, double&, double&); + + void ClickOnUndo(); + void ClickOnRedo(); + + void SelectionIntoArgument(); + void DeactivateActiveDialog(); + void ActivateThisDialog(); + void TypeClicked(); + void ValueChangedInSpinBox( double ); + void SetDoubleSpinBoxStep( double ); +}; + +#endif // ENTITYGUI_SKETCHERDLG_H diff --git a/src/EntityGUI/Makefile.am b/src/EntityGUI/Makefile.am index 89c9671ce..ce74db216 100644 --- a/src/EntityGUI/Makefile.am +++ b/src/EntityGUI/Makefile.am @@ -34,17 +34,20 @@ salomeinclude_HEADERS = \ EntityGUI.h \ EntityGUI_Widgets.h \ EntityGUI_SketcherDlg.h \ + EntityGUI_3DSketcherDlg.h \ EntityGUI_SubShapeDlg.h dist_libEntityGUI_la_SOURCES = \ EntityGUI.cxx \ EntityGUI_Widgets.cxx \ EntityGUI_SketcherDlg.cxx \ + EntityGUI_3DSketcherDlg.cxx \ EntityGUI_SubShapeDlg.cxx MOC_FILES = \ EntityGUI_Widgets_moc.cxx \ EntityGUI_SketcherDlg_moc.cxx \ + EntityGUI_3DSketcherDlg_moc.cxx \ EntityGUI_SubShapeDlg_moc.cxx nodist_libEntityGUI_la_SOURCES = \ diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 5fcf863eb..8d0a032d8 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -894,6 +894,10 @@ ICO_SKETCH sketch.png + + ICO_3DSKETCH + 3dsketch.png + ICO_SOLID build_solid.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index fc4d51282..9d466b0aa 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1432,6 +1432,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_DY2 DY : + + GEOM_SKETCHER_DZ2 + DZ : + GEOM_SKETCHER_EL Element Type @@ -1480,6 +1484,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_TITLE Sketch Construction + + GEOM_3DSKETCHER_TITLE + 3D Sketch Construction + GEOM_SKETCHER_TYPE Type @@ -1528,6 +1536,18 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_Y3 Abs. Y : + + GEOM_SKETCHER_Z2 + Z : + + + GEOM_3DSKETCHER + 3D Sketcher + + + GEOM_COORDINATES_TYPE + Coordinates Type + GEOM_SOLID Solid @@ -2324,6 +2344,10 @@ Please, select face, shell or solid and try again MEN_SKETCH Sketch + + MEN_3DSKETCH + 3D Sketch + MEN_SOLID Solid diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 0efa80e7e..3b514664a 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -441,6 +441,7 @@ void GeometryGUI::OnGUIEvent( int id ) #endif } else if( id == 404 || // MENU ENTITY - SKETCHER + id == 405 || // MENU ENTITY - 3D SKETCHER id == 407 ) { // MENU ENTITY - EXPLODE #ifndef WNT library = getLibrary( "libEntityGUI.so" ); @@ -797,6 +798,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( 9999, "HEX_SOLID" ); createGeomAction( 404, "SKETCH" ); + createGeomAction( 405, "3DSKETCH" ); createGeomAction( 407, "EXPLODE" ); createGeomAction( 4081, "EDGE" ); @@ -945,6 +947,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), newEntId, -1 ); createMenu( 404, newEntId, -1 ); + createMenu( 405, newEntId, -1 ); createMenu( separator(), newEntId, -1 ); createMenu( 407, newEntId, -1 ); diff --git a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx new file mode 100755 index 000000000..27603fe0f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx @@ -0,0 +1,137 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include +#include +#include +#include + +#include + +// OCCT Includes +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_3DSketcherDriver::GetID() +{ + static Standard_GUID a3DSketcherDriver("FF2BBB54-5D24-4df3-210B-3A678263EA26"); + return a3DSketcherDriver; +} + + +//======================================================================= +//function : GEOMImpl_3DSketcherDriver +//purpose : +//======================================================================= +GEOMImpl_3DSketcherDriver::GEOMImpl_3DSketcherDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_3DSketcherDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_I3DSketcher aCI (aFunction); + + TopoDS_Shape aShape; + + Handle(TColStd_HArray1OfReal) aCoordsArray = aCI.GetCoordinates(); + + BRepBuilderAPI_MakePolygon aMakePoly; + int anArrayLength = aCoordsArray->Length(); + double x, y, z; + for (int i = 0; i <=(anArrayLength - 3); i+=3) { + x = aCoordsArray->Value(i+1); + y = aCoordsArray->Value(i+2); + z = aCoordsArray->Value(i+3); + gp_Pnt aPnt = gp_Pnt(x, y, z); + aMakePoly.Add(aPnt); + } + if (aCoordsArray->Value(1) == x && aCoordsArray->Value(2) == y && aCoordsArray->Value(3) == z) + aMakePoly.Close(); + + if (aMakePoly.IsDone()) + aShape = aMakePoly.Wire(); + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + log.SetTouched(Label()); + return 1; +} + + +//======================================================================= +//function : GEOMImpl_3DSketcherDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_3DSketcherDriver_Type_() +{ + + static Handle_Standard_Type 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); + static Handle_Standard_Type 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_3DSketcherDriver", + sizeof(GEOMImpl_3DSketcherDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_3DSketcherDriver) Handle(GEOMImpl_3DSketcherDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_3DSketcherDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_3DSketcherDriver))) { + _anOtherObject = Handle(GEOMImpl_3DSketcherDriver)((Handle(GEOMImpl_3DSketcherDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx new file mode 100755 index 000000000..f0f2476f8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx @@ -0,0 +1,158 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : GEOMImpl_3DSketcherDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_3DSketcherDriver_HeaderFile +#define _GEOMImpl_3DSketcherDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_3DSketcherDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_3DSketcherDriver); + +class Handle(GEOMImpl_3DSketcherDriver) : public Handle(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); + } + + Handle(GEOMImpl_3DSketcherDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_3DSketcherDriver)(const Handle(GEOMImpl_3DSketcherDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_3DSketcherDriver)(const GEOMImpl_3DSketcherDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_3DSketcherDriver)& operator=(const Handle(GEOMImpl_3DSketcherDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_3DSketcherDriver)& operator=(const GEOMImpl_3DSketcherDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_3DSketcherDriver* operator->() + { + return (GEOMImpl_3DSketcherDriver *)ControlAccess(); + } + + GEOMImpl_3DSketcherDriver* operator->() const + { + return (GEOMImpl_3DSketcherDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_3DSketcherDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_3DSketcherDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_3DSketcherDriver : 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); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_3DSketcherDriver(); +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_3DSketcherDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_3DSketcherDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_3DSketcherDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_3DSketcherDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Gen.cxx b/src/GEOMImpl/GEOMImpl_Gen.cxx index 16e512673..ad458c33c 100644 --- a/src/GEOMImpl/GEOMImpl_Gen.cxx +++ b/src/GEOMImpl/GEOMImpl_Gen.cxx @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,7 @@ GEOMImpl_Gen::GEOMImpl_Gen() TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PolylineDriver::GetID(), new GEOMImpl_PolylineDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SplineDriver::GetID(), new GEOMImpl_SplineDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SketcherDriver::GetID(), new GEOMImpl_SketcherDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_3DSketcherDriver::GetID(), new GEOMImpl_3DSketcherDriver()); // 3D Primitives TFunction_DriverTable::Get()->AddDriver(GEOMImpl_BoxDriver::GetID(), new GEOMImpl_BoxDriver()); diff --git a/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx new file mode 100755 index 000000000..dc4ea30f6 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx @@ -0,0 +1,43 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +//NOTE: This is an interface to a function for the Sketcher creation. + + +#include "GEOM_Function.hxx" + +#include + +#define SKETCH_ARG_COORDS 1 + +class GEOMImpl_I3DSketcher +{ + public: + + GEOMImpl_I3DSketcher(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetCoordinates(const Handle(TColStd_HArray1OfReal)& theValue) + { _func->SetRealArray(SKETCH_ARG_COORDS, theValue); } + + Handle(TColStd_HArray1OfReal) GetCoordinates() { return _func->GetRealArray(SKETCH_ARG_COORDS); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index c9507c5fa..c7adc5915 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -21,6 +21,8 @@ #include +#include + #include #include @@ -32,6 +34,7 @@ #include #include #include +#include #include #include @@ -39,6 +42,7 @@ #include #include #include +#include #include "utilities.h" @@ -768,6 +772,73 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher (const char* theCom return aSketcher; } +//============================================================================= +/*! + * Make3DSketcher + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (list theCoordinates) +{ + SetErrorCode(KO); + + //Add a new Sketcher object + Handle(GEOM_Object) a3DSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER); + + //Add a new Sketcher function + Handle(GEOM_Function) aFunction = + a3DSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), GEOM_3DSKETCHER); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL; + + GEOMImpl_I3DSketcher aCI (aFunction); + + int nbOfCoords = 0; + list::iterator it = theCoordinates.begin(); + for (; it != theCoordinates.end(); it++) + nbOfCoords++; + + Handle(TColStd_HArray1OfReal) aCoordsArray = new TColStd_HArray1OfReal (1, nbOfCoords); + + it = theCoordinates.begin(); + int ind = 1; + for (; it != theCoordinates.end(); it++, ind++) + aCoordsArray->SetValue(ind, *it); + + aCI.SetCoordinates(aCoordsArray); + + //Compute the Sketcher value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("3D Sketcher 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 << a3DSketcher << " = geompy.Make3DSketcher(["; + + it = theCoordinates.begin(); + pd << (*it++); + while (it != theCoordinates.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return a3DSketcher; +} + //============================================================================= /*! * MakeSketcherOnPlane diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index 60a1e56b8..f5865ed80 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -69,6 +69,7 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const char* theCommand, list theWorkingPlane); + Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (list theCoordinates); Standard_EXPORT Handle(GEOM_Object) MakeSketcherOnPlane (const char* theCommand, Handle(GEOM_Object) theWorkingPlane); }; diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 7b70e9b8b..ec7b469d0 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -87,6 +87,7 @@ #define GEOM_ELLIPSE_ARC 43 +#define GEOM_3DSKETCHER 44 //GEOM_Function types diff --git a/src/GEOMImpl/Makefile.am b/src/GEOMImpl/Makefile.am index b0113b6ca..c68c850a2 100644 --- a/src/GEOMImpl/Makefile.am +++ b/src/GEOMImpl/Makefile.am @@ -60,6 +60,7 @@ salomeinclude_HEADERS = \ GEOMImpl_IArchimede.hxx \ GEOMImpl_IArc.hxx \ GEOMImpl_ISketcher.hxx \ + GEOMImpl_I3DSketcher.hxx \ GEOMImpl_IVector.hxx \ GEOMImpl_IDisk.hxx \ GEOMImpl_IFace.hxx \ @@ -123,6 +124,7 @@ salomeinclude_HEADERS = \ GEOMImpl_ArcDriver.hxx \ GEOMImpl_SplineDriver.hxx \ GEOMImpl_SketcherDriver.hxx \ + GEOMImpl_3DSketcherDriver.hxx \ GEOMImpl_FilletDriver.hxx \ GEOMImpl_ChamferDriver.hxx \ GEOMImpl_BooleanDriver.hxx \ @@ -184,6 +186,7 @@ dist_libGEOMimpl_la_SOURCES = \ GEOMImpl_ArcDriver.cxx \ GEOMImpl_SplineDriver.cxx \ GEOMImpl_SketcherDriver.cxx \ + GEOMImpl_3DSketcherDriver.cxx \ GEOMImpl_FilletDriver.cxx \ GEOMImpl_ChamferDriver.cxx \ GEOMImpl_BooleanDriver.cxx \ diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index 740385c37..0400f241d 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -444,6 +444,31 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher return GetObject(anObject); } +//============================================================================= +/*! + * Make3DSketcher + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher + (const GEOM::ListOfDouble& theCoordinates) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind = 0; + int aLen = theCoordinates.length(); + list aCoords; + for (; ind < aLen; ind++) + aCoords.push_back(theCoordinates[ind]); + + // Make Sketcher + Handle(GEOM_Object) anObject = + GetOperations()->Make3DSketcher(aCoords); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return GEOM::GEOM_Object::_nil(); + + return GetObject(anObject); +} //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index e719bf74d..dd1c70525 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -76,6 +76,8 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr MakeSplineInterpolation (const GEOM::ListOfGO& thePoints); GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane); + + GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates); GEOM::GEOM_Object_ptr MakeSketcherOnPlane (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane); diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 90ee3a838..2ee744c7f 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -2649,6 +2649,24 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSketcher (const char* theCommand, return NULL; } +//============================================================================= +// Make3DSketcher: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::Make3DSketcher ( GEOM::GEOM_List_ptr theCoordinates) +{ + beginService( " GEOM_Superv_i::Make3DSketcher" ); + MESSAGE("GEOM_Superv_i::Make3DSketcher"); + if (GEOM_List_i* aListImpl = + dynamic_cast*>(GetServant(theCoordinates, myPOA).in())) { + getCurvesOp(); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->Make3DSketcher(aListImpl->GetList()); + endService( " GEOM_Superv_i::Make3DSketcher" ); + return anObj; + } + endService( " GEOM_Superv_i::Make3DSketcher" ); + return NULL; +} + //=============================== LocalOperations ============================= //============================================================================= // MakeFilletAll: diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 3d8425253..d667c1222 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -569,6 +569,7 @@ public: GEOM::GEOM_Object_ptr MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, GEOM::GEOM_List_ptr theWorkingPlane); + GEOM::GEOM_Object_ptr Make3DSketcher (GEOM::GEOM_List_ptr theCoordinates); //-----------------------------------------------------------// // LocalOperations // diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index a44d8bcfb..f8d842be9 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -102,6 +102,7 @@ def TestAll (geompy, math): Interpol = geompy.MakeInterpol([px, py, p200, pxyz]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr Sketcher = geompy.MakeSketcher("Sketcher:F -100 -100:TT 250 -100:R 0:C 100 150:R 0:L 300:WW", [100,0,0, 1,1,1, -1,1,0]) #(String, List of Doubles)->GEOM_Object_ptr + Sketcher3d = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) #Test point on curve creation p_on_arc = geompy.MakeVertexOnCurve(Arc, 0.25) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr @@ -304,6 +305,7 @@ def TestAll (geompy, math): id_Bezier = geompy.addToStudy(Bezier, "Bezier") id_Interpol = geompy.addToStudy(Interpol, "Interpol") id_Sketcher = geompy.addToStudy(Sketcher, "Sketcher") + id_Sketcher3d = geompy.addToStudy(Sketcher3d, "Sketcher 3D") id_p_on_arc = geompy.addToStudy(p_on_arc, "Vertex on Arc (0.25)") id_p_on_l1l2 = geompy.addToStudy(p_on_l1l2, "Vertex on Lines Intersection") diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 18b06e9e1..072fd41f7 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -670,6 +670,18 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj = self.CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane) RaiseIfFailed("MakeSketcherOnPlane", self.CurvesOp) return anObj + + ## Create a sketcher wire, following the numerical description, + # passed through theCoordinates argument. \n + # @param theCoordinates double values, defining points to create a wire, + # passing from it. + # @return New GEOM_Object, containing the created wire. + # + # @ref tui_sketcher_page "Example" + def Make3DSketcher(self, theCoordinates): + anObj = self.CurvesOp.Make3DSketcher(theCoordinates) + RaiseIfFailed("Make3DSketcher", self.CurvesOp) + return anObj # end of l3_sketcher ## @} -- 2.39.2