From 0c6f0114a9bcef28bb175f71a012779be4247c28 Mon Sep 17 00:00:00 2001 From: akl Date: Mon, 29 Sep 2008 07:32:29 +0000 Subject: [PATCH] To implement issue 0019962: MakePipeBiNormalAlongAxis implementation. --- doc/salome/gui/GEOM/images/pipe2.png | Bin 0 -> 9375 bytes doc/salome/gui/GEOM/images/pipebinormalsn.png | Bin 0 -> 204740 bytes .../input/creating_extrusion_alongpath.doc | 20 ++- .../gui/GEOM/input/tui_complex_objs.doc | 80 ++++++++++ src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 37 +++++ src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 4 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 18 +++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 4 + src/GEOM_SWIG/geompyDC.py | 17 +++ src/GenerationGUI/GenerationGUI_PipeDlg.cxx | 138 +++++++++++++++--- src/GenerationGUI/GenerationGUI_PipeDlg.h | 9 +- 11 files changed, 299 insertions(+), 28 deletions(-) create mode 100755 doc/salome/gui/GEOM/images/pipe2.png create mode 100644 doc/salome/gui/GEOM/images/pipebinormalsn.png diff --git a/doc/salome/gui/GEOM/images/pipe2.png b/doc/salome/gui/GEOM/images/pipe2.png new file mode 100755 index 0000000000000000000000000000000000000000..0a69cd834cd4cbb5da06a7d7d3f767d942a4e08f GIT binary patch literal 9375 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 Menu select New Entity - > Generation - > Extrusion along a path -\n To create an extruded \b Pipe shape, you need to define the Base +\n Firstly, to create an extruded \b Pipe shape, you can define the Base Object (vertex, edge, planar wire, face or shell), which will be extruded and the Path Object (edge or wire) along which the Base Object will be extruded. @@ -18,12 +18,30 @@ definition of the path. \image html pipe.png +\n Secondly, you can define the Base +Object (edge, planar wire or face), which will be extruded, +the Path Object (edge or wire) along which the Base +Object will be extruded and the Vector (edge or wire) +to keep constant angular relations between the sections and this one. +\n The \b Result of the operation will be a GEOM_Object (edge, face, shell, +solid or compsolid). + +\n TUI Command: geompy.MakePipeBiNormalAlongVector(baseShape, pathShape, binormalShape) +\n Arguments: Name + 1 shape (edge, planar wire or face) +serving as base object + 1 shape (edge or wire) for +definition of the path + 1 shape (edge or wire) to set a fixed +BiNormal direction to perform the extrusion. + +\image html pipe2.png + Example: \image html pipe_wire_edgesn.png \image html pipesn.png +\image html pipebinormalsn.png + Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_pipe "Complex Geometric Objects". diff --git a/doc/salome/gui/GEOM/input/tui_complex_objs.doc b/doc/salome/gui/GEOM/input/tui_complex_objs.doc index 2f4fa5076..254846e07 100644 --- a/doc/salome/gui/GEOM/input/tui_complex_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_complex_objs.doc @@ -543,4 +543,84 @@ gg.createAndDisplayGO(id_pipe) gg.setDisplayMode(id_pipe,1) \endcode +\anchor tui_creation_pipe_binormal_along_vector +

Creation of a PipeBiNormalAlongVector

+ +\code +def MakeHelix(radius, height, rotation, direction): + # - create a helix - + radius = 1.0 * radius + height = 1.0 * height + rotation = 1.0 * rotation + if direction > 0: + direction = +1 + else: + direction = -1 + pass + from math import sqrt + length_z = height + length_xy = radius*rotation + length = sqrt(length_z*length_z + length_xy*length_xy) + import geompy + nb_steps = 1 + epsilon = 1.0e-6 + while 1: + z_step = height / nb_steps + angle_step = rotation / nb_steps + z = 0.0 + angle = 0.0 + helix_points = [] + for n in range(nb_steps+1): + from math import cos, sin + x = radius * cos(angle) + y = radius * sin(angle) + p = geompy.MakeVertex(x, y, z) + helix_points.append( p ) + z += z_step + angle += direction * angle_step + pass + helix = geompy.MakeInterpol(helix_points) + length_test = geompy.BasicProperties(helix)[0] + prec = abs(length-length_test)/length + # print nb_steps, length_test, prec + if prec < epsilon: + break + nb_steps *= 2 + pass + return helix + +def MakeSpring(radius, height, rotation, direction, thread_radius, base_rotation=0.0): + # - create a pipe - + thread_radius = 1.0 * thread_radius + # create a helix + helix = MakeHelix(radius, height, rotation, direction) + # base in the (Ox, Oz) plane + import geompy + p0 = geompy.MakeVertex(radius-3*thread_radius, 0.0, -thread_radius) + p1 = geompy.MakeVertex(radius+3*thread_radius, 0.0, -thread_radius) + p2 = geompy.MakeVertex(radius+3*thread_radius, 0.0, +thread_radius) + p3 = geompy.MakeVertex(radius-3*thread_radius, 0.0, +thread_radius) + e0 = geompy.MakeEdge(p0, p1) + e1 = geompy.MakeEdge(p1, p2) + e2 = geompy.MakeEdge(p2, p3) + e3 = geompy.MakeEdge(p3, p0) + w = geompy.MakeWire([e0, e1, e2, e3]) + # create a base face + base = geompy.MakeFace(w, True) + # create a binormal vector + binormal = geompy.MakeVectorDXDYDZ(0.0, 0.0, 10.0) + # create a pipe + spring = geompy.MakePipeBiNormalAlongVector(base, helix, binormal) + # Publish in the study + geompy.addToStudy(base, "base") + geompy.addToStudy(helix, "helix") + geompy.addToStudy(binormal, "binormal") + geompy.addToStudy(spring, "spring") + return spring + +from math import pi + +spring = MakeSpring(50, 100, 2*pi, 1, 5, pi/2) +\endcode + */ diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 6e6a4b8be..ae0ba98c6 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -1031,3 +1031,40 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath return GetObject(anObject); } + + +//============================================================================= +/*! + * MakePipeBiNormalAlongVector + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBase == NULL || thePath == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject + (theBase->GetStudyID(), theBase->GetEntry()); + Handle(GEOM_Object) aPath = GetOperations()->GetEngine()->GetObject + (thePath->GetStudyID(), thePath->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + //Create the Pipe + Handle(GEOM_Object) anObject = + GetOperations()->MakePipeBiNormalAlongVector(aBase, aPath, aVec); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index 0f5641eae..b8464650c 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -156,6 +156,10 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases, const GEOM::ListOfGO& theLocations); + GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec); + ::GEOMImpl_I3DPrimOperations* GetOperations() { return (::GEOMImpl_I3DPrimOperations*)GetImpl(); } }; diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 97d7f17af..910c380bd 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1222,6 +1222,24 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeShellsWithoutPath } +//============================================================================= +// MakePipe: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeBiNormalAlongVector + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec) +{ + beginService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" ); + MESSAGE("GEOM_Superv_i::MakePipeBiNormalAlongVector"); + get3DPrimOp(); + GEOM::GEOM_Object_ptr anObj = + my3DPrimOp->MakePipeBiNormalAlongVector(theBase, thePath, theVec); + endService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" ); + return anObj; +} + + //============================================================================= // MakeFuse: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 75a66523e..e35bf641b 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -282,6 +282,10 @@ public: GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases, const GEOM::ListOfGO& theLocations); + GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec); + //-----------------------------------------------------------// // BooleanOperations // //-----------------------------------------------------------// diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 2b2f27dc3..d3477a9a3 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -1139,6 +1139,23 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("MakePipeShellsWithoutPath", self.PrimOp) return anObj + ## Create a shape by extrusion of the base shape along + # the path shape with constant bi-normal direction along the given vector. + # The path shape can be a wire or an edge. + # @param theBase Base shape to be extruded. + # @param thePath Path shape to extrude the base shape along it. + # @param theVec Vector defines a constant binormal direction to keep the + # same angle beetween the direction and the sections + # along the sweep surface. + # @return New GEOM_Object, containing the created pipe. + # + # @ref tui_creation_pipe "Example" + def MakePipeBiNormalAlongVector(self,theBase, thePath, theVec): + # Example: see GEOM_TestAll.py + anObj = self.PrimOp.MakePipeBiNormalAlongVector(theBase, thePath, theVec) + RaiseIfFailed("MakePipeBiNormalAlongVector", self.PrimOp) + return anObj + # end of l3_complex ## @} diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx index 4e15dd2ba..0bc5e05f1 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx @@ -55,26 +55,26 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE_BINORMAL"))); setWindowTitle(tr("GEOM_PIPE_TITLE")); /***************************************************************/ mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE")); mainFrame()->RadioButton1->setIcon(image0); - mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton2->setIcon(image2); mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); - GroupPoints = new DlgRef_2Sel(centralWidget()); + GroupPoints = new DlgRef_3Sel(centralWidget()); GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); GroupPoints->TextLabel1->setText(tr("GEOM_BASE_OBJECT")); GroupPoints->TextLabel2->setText(tr("GEOM_PATH_OBJECT")); + GroupPoints->TextLabel3->setText(tr("GEOM_VECTOR")); GroupPoints->PushButton1->setIcon(image1); GroupPoints->PushButton2->setIcon(image1); - GroupPoints->LineEdit1->setReadOnly(true); - GroupPoints->LineEdit2->setReadOnly(true); + GroupPoints->PushButton3->setIcon(image1); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -105,28 +105,68 @@ void GenerationGUI_PipeDlg::Init() // init variables GroupPoints->LineEdit1->setReadOnly(true); GroupPoints->LineEdit2->setReadOnly(true); + GroupPoints->LineEdit3->setReadOnly(true); GroupPoints->LineEdit1->setText(""); GroupPoints->LineEdit2->setText(""); - myBase = myPath = GEOM::GEOM_Object::_nil(); - myOkBase = myOkPath = false; + GroupPoints->LineEdit3->setText(""); + myBase = myPath = myVec = GEOM::GEOM_Object::_nil(); + myOkBase = myOkPath = myOkVec = false; // signals and slots connections connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + 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(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); initName(tr("GEOM_PIPE")); + GroupPoints->TextLabel3->hide(); + GroupPoints->PushButton3->hide(); + GroupPoints->LineEdit3->hide(); + ConstructorsClicked(0); + GroupPoints->PushButton1->click(); SelectionIntoArgument(); } +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) +{ + erasePreview(); + + switch (constructorId) + { + case 0: + { + GroupPoints->TextLabel3->hide(); + GroupPoints->PushButton3->hide(); + GroupPoints->LineEdit3->hide(); + break; + } + case 1: + { + GroupPoints->TextLabel3->show(); + GroupPoints->PushButton3->show(); + GroupPoints->LineEdit3->show(); + break; + } + } + + displayPreview(); +} + //================================================================================= // function : ClickOnOk() // purpose : @@ -147,6 +187,8 @@ bool GenerationGUI_PipeDlg::ClickOnApply() return false; initName(); + if ( getConstructorId() != 1 ) + ConstructorsClicked( getConstructorId() ); // activate selection and connect selection manager GroupPoints->PushButton1->click(); return true; @@ -162,6 +204,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument() myEditCurrentArgument->setText(""); if (myEditCurrentArgument == GroupPoints->LineEdit1) myOkBase = false; else if (myEditCurrentArgument == GroupPoints->LineEdit2) myOkPath = false; + else if (myEditCurrentArgument == GroupPoints->LineEdit3) myOkVec = false; LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); SALOME_ListIO aSelList; @@ -187,14 +230,23 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument() S.ShapeType() == TopAbs_SOLID || S.ShapeType() == TopAbs_SHAPE) return; + if ( getConstructorId() == 1 && + (S.ShapeType() == TopAbs_SHELL || + S.ShapeType() == TopAbs_VERTEX)) + return; myBase = aSelectedObject; myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject)); myOkBase = true; if (!myOkPath) GroupPoints->PushButton2->click(); + else if (!myOkVec) + GroupPoints->PushButton3->click(); } - else if (myEditCurrentArgument == GroupPoints->LineEdit2) { + else if (myEditCurrentArgument == GroupPoints->LineEdit2 || + myEditCurrentArgument == GroupPoints->LineEdit3) { + myEditCurrentArgument == GroupPoints->LineEdit2 ? myOkPath = false : myOkVec = false; + bool myOk = false; QString aName = GEOMBase::GetName(aSelectedObject); if (aSelectedObject != myBase) { @@ -210,27 +262,44 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument() if (aFindedObject == GEOM::GEOM_Object::_nil()) { // Object not found in study GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId()); - myPath = aShapesOp->GetSubShape(aSelectedObject, anIndex); - myOkPath = true; + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + myOk = true; } else { // get Object from study - myPath = aFindedObject; - myOkPath = true; + aSelectedObject = aFindedObject; + myOk = true; } } else { - myOkPath = true; + myOk = true; if (S.ShapeType() != TopAbs_EDGE) { aSelectedObject = GEOM::GEOM_Object::_nil(); aName = ""; - myOkPath = false; + myOk = false; } - myPath = aSelectedObject; + } + if (myEditCurrentArgument == GroupPoints->LineEdit2) { + myPath = aSelectedObject; + myOkPath = myOk; + } + else if (myEditCurrentArgument == GroupPoints->LineEdit3) { + myVec = aSelectedObject; + myOkVec = myOk; } } myEditCurrentArgument->setText(aName); - if (myOkPath && !myOkBase) - GroupPoints->PushButton1->click(); + if (myOkPath) { + if (!myOkBase) + GroupPoints->PushButton1->click(); + else if (!myOkVec) + GroupPoints->PushButton3->click(); + } + else if (myOkVec) { + if (!myOkBase) + GroupPoints->PushButton1->click(); + else if (!myOkPath) + GroupPoints->PushButton2->click(); + } } // clear selection @@ -252,15 +321,22 @@ void GenerationGUI_PipeDlg::SetEditCurrentArgument() disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); globalSelection(GEOM_ALLSHAPES); + GroupPoints->PushButton1->setDown(false); + GroupPoints->PushButton2->setDown(false); + GroupPoints->PushButton3->setDown(false); + GroupPoints->LineEdit1->setEnabled(false); + GroupPoints->LineEdit2->setEnabled(false); + GroupPoints->LineEdit3->setEnabled(false); if (send == GroupPoints->PushButton1) { myEditCurrentArgument = GroupPoints->LineEdit1; - GroupPoints->PushButton2->setDown(false); - GroupPoints->LineEdit2->setEnabled(false); } else if (send == GroupPoints->PushButton2) { myEditCurrentArgument = GroupPoints->LineEdit2; - GroupPoints->PushButton1->setDown(false); - GroupPoints->LineEdit1->setEnabled(false); + + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); + } + else if(send == GroupPoints->PushButton3) { + myEditCurrentArgument = GroupPoints->LineEdit3; localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE); } @@ -285,7 +361,8 @@ void GenerationGUI_PipeDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); if (send == GroupPoints->LineEdit1 || - send == GroupPoints->LineEdit2) { + send == GroupPoints->LineEdit2 || + send == GroupPoints->LineEdit3) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); } @@ -328,7 +405,12 @@ GEOM::GEOM_IOperations_ptr GenerationGUI_PipeDlg::createOperation() //================================================================================= bool GenerationGUI_PipeDlg::isValid (QString&) { - return myOkBase && myOkPath; + switch ( getConstructorId() ) { + case 0 : + return myOkBase && myOkPath; + case 1 : + return myOkBase && myOkPath && myOkVec; + } } //================================================================================= @@ -339,7 +421,15 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects) { GEOM::GEOM_Object_var anObj; - anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())->MakePipe(myBase, myPath); + switch ( getConstructorId() ) { + case 0 : + anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())->MakePipe(myBase, myPath); + break; + case 1 : + anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())-> + MakePipeBiNormalAlongVector(myBase, myPath, myVec); + break; + } if (!anObj->_is_nil()) objects.push_back(anObj._retn()); diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.h b/src/GenerationGUI/GenerationGUI_PipeDlg.h index 4200cf1f9..51ebe8362 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.h +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.h @@ -28,7 +28,7 @@ #include -class DlgRef_2Sel; +class DlgRef_3Sel; //================================================================================= // class : GenerationGUI_PipeDlg @@ -56,10 +56,12 @@ private: private: GEOM::GEOM_Object_var myBase; /* Base shape */ GEOM::GEOM_Object_var myPath; /* Shape, defining the path */ + GEOM::GEOM_Object_var myVec; /* Vector, defining the constant binormal direction */ bool myOkBase; - bool myOkPath; /* to check when arguments are defined */ + bool myOkPath; + bool myOkVec; /* to check when arguments are defined */ - DlgRef_2Sel* GroupPoints; + DlgRef_3Sel* GroupPoints; private slots: void ClickOnOk(); @@ -68,6 +70,7 @@ private slots: void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void ConstructorsClicked( int ); }; #endif // GENERATIONGUI_PIPEDLG_H