1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESHGUI_ExtrusionAlongPathDlg.cxx
25 // Author : Vadim SANDLER
29 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
32 #include "SMESHGUI_Utils.h"
33 #include "SMESHGUI_VTKUtils.h"
34 #include "SMESHGUI_MeshUtils.h"
35 #include "SMESHGUI_SpinBox.h"
36 #include "SMESHGUI_IdValidator.h"
38 #include "SMESH_Actor.h"
39 #include "SMESH_TypeFilter.hxx"
40 #include "SMESH_NumberFilter.hxx"
41 #include "SMESH_LogicalFilter.hxx"
43 #include "SMDS_Mesh.hxx"
47 #include "SUIT_ResourceMgr.h"
48 #include "SUIT_OverrideCursor.h"
49 #include "SUIT_Desktop.h"
50 #include "SUIT_MessageBox.h"
52 #include "SVTK_ViewModel.h"
53 #include "SVTK_ViewWindow.h"
54 #include "SVTK_Selector.h"
55 #include "SVTK_Selection.h"
56 #include "SALOME_ListIO.hxx"
58 #include "utilities.h"
61 #include <BRep_Tool.hxx>
62 #include <TopoDS_Shape.hxx>
64 #include <TopoDS_Vertex.hxx>
66 #include <TColStd_MapOfInteger.hxx>
67 #include <TColStd_IndexedMapOfInteger.hxx>
70 #include <qapplication.h>
71 #include <qbuttongroup.h>
72 #include <qgroupbox.h>
74 #include <qlineedit.h>
75 #include <qpushbutton.h>
76 #include <qtoolbutton.h>
77 #include <qradiobutton.h>
78 #include <qcheckbox.h>
81 #include <qvalidator.h>
86 #include "SALOMEconfig.h"
87 #include CORBA_SERVER_HEADER(SMESH_Group)
91 //=================================================================================
92 // function : SMESHGUI_ExtrusionAlongPathDlg()
93 // purpose : constructor
94 //=================================================================================
95 SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theModule,
97 : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_ExtrusionAlongPathDlg", modal,
98 WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
99 mySMESHGUI( theModule ),
100 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
102 SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
103 QPixmap edgeImage ( mgr->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
104 QPixmap faceImage ( mgr->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
105 QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT")));
106 QPixmap addImage ( mgr->loadPixmap("SMESH", tr("ICON_APPEND")));
107 QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
111 setCaption(tr("EXTRUSION_ALONG_PATH"));
112 setSizeGripEnabled(TRUE);
114 QGridLayout* topLayout = new QGridLayout(this);
115 topLayout->setSpacing(6);
116 topLayout->setMargin(11);
118 /***************************************************************/
119 // Elements type group box (1d / 2d elements)
120 GroupConstructors = new QButtonGroup(tr("SMESH_EXTRUSION"), this);
121 GroupConstructors->setColumnLayout(0, Qt::Vertical);
122 GroupConstructors->layout()->setSpacing(0);
123 GroupConstructors->layout()->setMargin(0);
124 QGridLayout* GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
125 GroupConstructorsLayout->setAlignment(Qt::AlignTop);
126 GroupConstructorsLayout->setSpacing(6); GroupConstructorsLayout->setMargin(11);
128 Elements1dRB = new QRadioButton(GroupConstructors);
129 Elements1dRB->setPixmap(edgeImage);
130 Elements2dRB = new QRadioButton(GroupConstructors);
131 Elements2dRB->setPixmap(faceImage);
132 Elements1dRB->setChecked(true);
135 GroupConstructorsLayout->addWidget(Elements1dRB, 0, 0);
136 GroupConstructorsLayout->addWidget(Elements2dRB, 0, 2);
138 /***************************************************************/
139 // Arguments group box
140 GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this);
141 GroupArguments->setColumnLayout(0, Qt::Vertical);
142 GroupArguments->layout()->setSpacing(0); GroupArguments->layout()->setMargin(0);
143 QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments->layout());
144 GroupArgumentsLayout->setAlignment(Qt::AlignTop);
145 GroupArgumentsLayout->setSpacing(6); GroupArgumentsLayout->setMargin(11);
147 // Controls for elements selection
148 ElementsLab = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
150 SelectElementsButton = new QToolButton(GroupArguments);
151 SelectElementsButton->setPixmap(selectImage);
153 ElementsLineEdit = new QLineEdit(GroupArguments);
154 ElementsLineEdit->setValidator(new SMESHGUI_IdValidator(this));
156 // Controls for the whole mesh selection
157 MeshCheck = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
159 // Controls for path selection
160 PathGrp = new QGroupBox(tr("SMESH_PATH"), GroupArguments);
161 PathGrp->setColumnLayout(0, Qt::Vertical);
162 PathGrp->layout()->setSpacing(0); PathGrp->layout()->setMargin(0);
163 QGridLayout* PathGrpLayout = new QGridLayout(PathGrp->layout());
164 PathGrpLayout->setAlignment(Qt::AlignTop);
165 PathGrpLayout->setSpacing(6); PathGrpLayout->setMargin(11);
167 // Controls for path mesh selection
168 PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp);
170 SelectPathMeshButton = new QToolButton(PathGrp);
171 SelectPathMeshButton->setPixmap(selectImage);
173 PathMeshLineEdit = new QLineEdit(PathGrp);
174 PathMeshLineEdit->setReadOnly(true);
176 // Controls for path shape selection
177 PathShapeLab = new QLabel(tr("SMESH_PATH_SHAPE"), PathGrp);
179 SelectPathShapeButton = new QToolButton(PathGrp);
180 SelectPathShapeButton->setPixmap(selectImage);
182 PathShapeLineEdit = new QLineEdit(PathGrp);
183 PathShapeLineEdit->setReadOnly(true);
185 // Controls for path starting point selection
186 StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp);
188 SelectStartPointButton = new QToolButton(PathGrp);
189 SelectStartPointButton->setPixmap(selectImage);
191 StartPointLineEdit = new QLineEdit(PathGrp);
192 StartPointLineEdit->setValidator(new QIntValidator(this));
195 PathGrpLayout->addWidget(PathMeshLab, 0, 0);
196 PathGrpLayout->addWidget(SelectPathMeshButton, 0, 1);
197 PathGrpLayout->addWidget(PathMeshLineEdit, 0, 2);
198 PathGrpLayout->addWidget(PathShapeLab, 1, 0);
199 PathGrpLayout->addWidget(SelectPathShapeButton, 1, 1);
200 PathGrpLayout->addWidget(PathShapeLineEdit, 1, 2);
201 PathGrpLayout->addWidget(StartPointLab, 2, 0);
202 PathGrpLayout->addWidget(SelectStartPointButton, 2, 1);
203 PathGrpLayout->addWidget(StartPointLineEdit, 2, 2);
205 // Controls for base point defining
206 BasePointCheck = new QCheckBox(tr("SMESH_USE_BASE_POINT"), GroupArguments);
208 BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments);
209 BasePointGrp->setColumnLayout(0, Qt::Vertical);
210 BasePointGrp->layout()->setSpacing(0); BasePointGrp->layout()->setMargin(0);
211 QGridLayout* BasePointGrpLayout = new QGridLayout(BasePointGrp->layout());
212 BasePointGrpLayout->setAlignment(Qt::AlignTop);
213 BasePointGrpLayout->setSpacing(6); BasePointGrpLayout->setMargin(11);
215 SelectBasePointButton = new QToolButton(BasePointGrp);
216 SelectBasePointButton->setPixmap(selectImage);
218 XLab = new QLabel(tr("SMESH_X"), BasePointGrp);
219 XSpin = new SMESHGUI_SpinBox(BasePointGrp);
220 YLab = new QLabel(tr("SMESH_Y"), BasePointGrp);
221 YSpin = new SMESHGUI_SpinBox(BasePointGrp);
222 ZLab = new QLabel(tr("SMESH_Z"), BasePointGrp);
223 ZSpin = new SMESHGUI_SpinBox(BasePointGrp);
226 BasePointGrpLayout->addWidget(SelectBasePointButton, 0, 0);
227 BasePointGrpLayout->addWidget(XLab, 0, 1);
228 BasePointGrpLayout->addWidget(XSpin, 0, 2);
229 BasePointGrpLayout->addWidget(YLab, 0, 3);
230 BasePointGrpLayout->addWidget(YSpin, 0, 4);
231 BasePointGrpLayout->addWidget(ZLab, 0, 5);
232 BasePointGrpLayout->addWidget(ZSpin, 0, 6);
234 // Controls for angles defining
235 AnglesCheck = new QCheckBox(tr("SMESH_USE_ANGLES"), GroupArguments);
237 AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments);
238 AnglesGrp->setColumnLayout(0, Qt::Vertical);
239 AnglesGrp->layout()->setSpacing(0); AnglesGrp->layout()->setMargin(0);
240 QGridLayout* AnglesGrpLayout = new QGridLayout(AnglesGrp->layout());
241 AnglesGrpLayout->setAlignment(Qt::AlignTop);
242 AnglesGrpLayout->setSpacing(6); AnglesGrpLayout->setMargin(11);
244 AnglesList = new QListBox(AnglesGrp);
245 AnglesList->setSelectionMode(QListBox::Extended);
247 AddAngleButton = new QToolButton(AnglesGrp);
248 AddAngleButton->setPixmap(addImage);
250 RemoveAngleButton = new QToolButton(AnglesGrp);
251 RemoveAngleButton->setPixmap(removeImage);
253 AngleSpin = new SMESHGUI_SpinBox(AnglesGrp);
256 QVBoxLayout* bLayout = new QVBoxLayout();
257 bLayout->addWidget(AddAngleButton);
258 bLayout->addSpacing(6);
259 bLayout->addWidget(RemoveAngleButton);
260 bLayout->addStretch();
261 AnglesGrpLayout->addMultiCellWidget(AnglesList, 0, 1, 0, 0);
262 AnglesGrpLayout->addMultiCellLayout(bLayout, 0, 1, 1, 1);
263 AnglesGrpLayout->addWidget( AngleSpin, 0, 2 );
264 AnglesGrpLayout->setRowStretch(1, 10);
267 GroupArgumentsLayout->addWidget( ElementsLab, 0, 0 );
268 GroupArgumentsLayout->addWidget( SelectElementsButton, 0, 1 );
269 GroupArgumentsLayout->addWidget( ElementsLineEdit, 0, 2 );
270 GroupArgumentsLayout->addMultiCellWidget(MeshCheck, 1, 1, 0, 2);
271 GroupArgumentsLayout->addMultiCellWidget(PathGrp, 2, 2, 0, 2);
272 GroupArgumentsLayout->addWidget( BasePointCheck, 3, 0 );
273 GroupArgumentsLayout->addMultiCellWidget(BasePointGrp, 3, 4, 1, 2);
274 GroupArgumentsLayout->addWidget( AnglesCheck, 5, 0 );
275 GroupArgumentsLayout->addMultiCellWidget(AnglesGrp, 5, 6, 1, 2);
276 GroupArgumentsLayout->setRowStretch(6, 10);
278 /***************************************************************/
279 // common buttons group box
280 GroupButtons = new QGroupBox(this);
281 GroupButtons->setColumnLayout(0, Qt::Vertical);
282 GroupButtons->layout()->setSpacing(0);
283 GroupButtons->layout()->setMargin(0);
284 QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
285 GroupButtonsLayout->setAlignment(Qt::AlignTop);
286 GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11);
288 OkButton = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons);
289 OkButton->setAutoDefault(true);
290 OkButton->setDefault(true);
292 ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
293 ApplyButton->setAutoDefault(true);
295 CloseButton = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
296 CloseButton->setAutoDefault(true);
299 GroupButtonsLayout->addWidget(OkButton, 0, 0);
300 GroupButtonsLayout->addWidget(ApplyButton, 0, 1);
301 GroupButtonsLayout->addWidget(CloseButton, 0, 3);
302 GroupButtonsLayout->addColSpacing(2, 10);
303 GroupButtonsLayout->setColStretch(2, 10);
305 /***************************************************************/
307 topLayout->addWidget(GroupConstructors, 0, 0);
308 topLayout->addWidget(GroupArguments, 1, 0);
309 topLayout->addWidget(GroupButtons, 2, 0);
311 /***************************************************************/
313 XSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
314 YSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
315 ZSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
316 AngleSpin->RangeStepAndValidator(-999999.999, +999999.999, 5.0, 3);
318 mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
320 mySMESHGUI->SetActiveDialogBox(this);
322 // Costruction of the logical filter for the elements: mesh/sub-mesh/group
323 SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
324 SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP);
326 QPtrList<SUIT_SelectionFilter> aListOfFilters;
327 if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
328 if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
330 myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
331 myPathMeshFilter = new SMESH_TypeFilter (MESH);
335 /***************************************************************/
336 // signals-slots connections
337 connect(OkButton, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
338 connect(CloseButton, SIGNAL(clicked()), this, SLOT(reject()));
339 connect(ApplyButton, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
341 connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleAdded()));
342 connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved()));
344 connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
346 connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
347 connect(SelectPathMeshButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
348 connect(SelectPathShapeButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
349 connect(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
350 connect(SelectBasePointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
352 connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
353 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
354 connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject()));
356 connect(ElementsLineEdit, SIGNAL(textChanged(const QString&)),
357 SLOT(onTextChange(const QString&)));
358 connect(StartPointLineEdit, SIGNAL(textChanged(const QString&)),
359 SLOT(onTextChange(const QString&)));
361 connect(MeshCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh()));
362 connect(AnglesCheck, SIGNAL(toggled(bool)), SLOT(onAnglesCheck()));
363 connect(BasePointCheck, SIGNAL(toggled(bool)), SLOT(onBasePointCheck()));
365 AnglesList->installEventFilter(this);
366 ElementsLineEdit->installEventFilter(this);
367 StartPointLineEdit->installEventFilter(this);
368 XSpin->editor()->installEventFilter(this);
369 YSpin->editor()->installEventFilter(this);
370 ZSpin->editor()->installEventFilter(this);
372 /***************************************************************/
373 // set position and show dialog box
375 mySMESHGUI->DefineDlgPosition(this, x, y);
377 this->show(); // displays Dialog
380 //=================================================================================
381 // function : ~SMESHGUI_ExtrusionAlongPathDlg()
382 // purpose : destructor
383 //=================================================================================
384 SMESHGUI_ExtrusionAlongPathDlg::~SMESHGUI_ExtrusionAlongPathDlg()
386 // no need to delete child widgets, Qt does it all for us
389 //=================================================================================
391 // purpose : initialization
392 //=================================================================================
393 void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls)
396 myEditCurrentArgument = 0;
398 myMesh = SMESH::SMESH_Mesh::_nil();
399 myIDSource = SMESH::SMESH_IDSource::_nil();
401 myPathMesh = SMESH::SMESH_Mesh::_nil();
402 myPathShape = GEOM::GEOM_Object::_nil();
404 ElementsLineEdit->clear();
405 PathMeshLineEdit->clear();
406 PathShapeLineEdit->clear();
407 StartPointLineEdit->clear();
410 XSpin->SetValue(0.0);
411 YSpin->SetValue(0.0);
412 ZSpin->SetValue(0.0);
414 AngleSpin->SetValue(45);
415 MeshCheck->setChecked(false);
416 ConstructorsClicked(0);
421 SetEditCurrentArgument(0);
424 //=================================================================================
425 // function : ConstructorsClicked()
426 // purpose : Called when user changes type of elements (1d / 2d)
427 //=================================================================================
428 void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type)
430 if (myType == type) return;
432 disconnect(mySelectionMgr, 0, this, 0);
435 GroupArguments->setTitle(tr("EXTRUSION_1D"));
437 GroupArguments->setTitle(tr("EXTRUSION_2D"));
439 // clear elements ID list
440 if (!MeshCheck->isChecked()) {
441 ElementsLineEdit->clear();
443 // set selection mode if necessary
444 if (myEditCurrentArgument == ElementsLineEdit) {
445 mySelectionMgr->clearSelected();
446 mySelectionMgr->clearFilters();
447 SMESH::SetPickable();
449 SMESH::SetPointRepresentation(false);
450 if (MeshCheck->isChecked()) {
451 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
452 aViewWindow->SetSelectionMode(ActorSelection);
453 mySelectionMgr->installFilter(myElementsFilter);
457 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
458 aViewWindow->SetSelectionMode(EdgeSelection);
462 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
463 aViewWindow->SetSelectionMode(FaceSelection);
467 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
472 //=================================================================================
473 // function : ClickOnApply()
474 // purpose : Called when user presses <Apply> button
475 //=================================================================================
476 bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
478 if (mySMESHGUI->isActiveStudyLocked())
481 if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
482 !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil())
485 SMESH::long_array_var anElementsId = new SMESH::long_array;
487 if (MeshCheck->isChecked()) {
488 // If "Select whole mesh, submesh or group" check box is on ->
489 // get all elements of the required type from the object selected
491 // if MESH object is selected
492 if (!CORBA::is_nil(SMESH::SMESH_Mesh::_narrow(myIDSource))) {
494 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(myIDSource);
495 // get IDs from mesh...
496 if (Elements1dRB->isChecked())
498 anElementsId = aMesh->GetElementsByType(SMESH::EDGE);
499 else if (Elements2dRB->isChecked()) {
500 anElementsId = aMesh->GetElementsByType(SMESH::FACE);
503 // SUBMESH is selected
504 if (!CORBA::is_nil(SMESH::SMESH_subMesh::_narrow(myIDSource))) {
506 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(myIDSource);
507 // get IDs from submesh
508 if (Elements1dRB->isChecked())
510 anElementsId = aSubMesh->GetElementsByType(SMESH::EDGE);
511 else if (Elements2dRB->isChecked())
513 anElementsId = aSubMesh->GetElementsByType(SMESH::FACE);
516 if (!CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(myIDSource))) {
518 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(myIDSource);
519 // get IDs from group
520 // 1d elements or 2d elements
521 if (Elements1dRB->isChecked() && aGroup->GetType() == SMESH::EDGE ||
522 Elements2dRB->isChecked() && aGroup->GetType() == SMESH::FACE)
523 anElementsId = aGroup->GetListOfID();
526 // If "Select whole mesh, submesh or group" check box is off ->
527 // use only elements of given type selected by user
529 SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh();
531 QStringList aListElementsId = QStringList::split(" ", ElementsLineEdit->text(), false);
532 anElementsId = new SMESH::long_array;
533 anElementsId->length(aListElementsId.count());
536 for (int i = 0; i < aListElementsId.count(); i++) {
537 long ind = aListElementsId[ i ].toLong(&bOk);
539 const SMDS_MeshElement* e = aMesh->FindElement(ind);
541 bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
542 Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
544 anElementsId[ j++ ] = ind;
548 anElementsId->length(j);
552 if (anElementsId->length() <= 0) {
556 if (StartPointLineEdit->text().stripWhiteSpace().isEmpty()) {
561 long aNodeStart = StartPointLineEdit->text().toLong(&bOk);
567 SMESH::double_array_var anAngles = new SMESH::double_array;
568 if (AnglesCheck->isChecked()) {
569 anAngles->length(AnglesList->count());
572 for (int i = 0; i < AnglesList->count(); i++) {
573 double angle = AnglesList->text(i).toDouble(&bOk);
575 anAngles[ j++ ] = angle*PI/180;
581 SMESH::PointStruct aBasePoint;
582 if (BasePointCheck->isChecked()) {
583 aBasePoint.x = XSpin->GetValue();
584 aBasePoint.y = YSpin->GetValue();
585 aBasePoint.z = ZSpin->GetValue();
589 SUIT_OverrideCursor wc;
590 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
591 SMESH::SMESH_MeshEditor::Extrusion_Error retVal =
592 aMeshEditor->ExtrusionAlongPath(anElementsId.inout(), myPathMesh, myPathShape, aNodeStart,
593 AnglesCheck->isChecked(), anAngles.inout(),
594 BasePointCheck->isChecked(), aBasePoint);
599 case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS:
600 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
602 tr("NO_ELEMENTS_SELECTED"),
605 case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE:
606 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
608 tr("SELECTED_PATH_IS_NOT_EDGE"),
611 case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE:
612 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
614 tr("BAD_SHAPE_TYPE"),
617 case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE:
618 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
620 tr("EXTR_BAD_STARTING_NODE"),
623 case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER:
624 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
626 tr("WRONG_ANGLES_NUMBER"),
629 case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT:
630 SUIT_MessageBox::warn1(SMESHGUI::desktop(),
632 tr("CANT_GET_TANGENT"),
635 case SMESH::SMESH_MeshEditor::EXTR_OK:
642 mySelectionMgr->clearSelected();
645 ConstructorsClicked(GetConstructorId());
649 //=================================================================================
650 // function : ClickOnOk()
651 // purpose : Called when user presses <OK> button
652 //=================================================================================
653 void SMESHGUI_ExtrusionAlongPathDlg::ClickOnOk()
659 //=================================================================================
660 // function : reject()
661 // purpose : Called when dialog box is closed
662 //=================================================================================
663 void SMESHGUI_ExtrusionAlongPathDlg::reject()
665 disconnect(mySelectionMgr, 0, this, 0);
666 mySelectionMgr->clearFilters();
667 mySelectionMgr->clearSelected();
668 SMESH::SetPickable(); // ???
669 SMESH::SetPointRepresentation(false);
670 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
671 aViewWindow->SetSelectionMode(ActorSelection);
672 mySMESHGUI->ResetState();
676 //=======================================================================
677 // function : onTextChange()
679 //=======================================================================
680 void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText)
682 QLineEdit* send = (QLineEdit*)sender();
690 if (send != StartPointLineEdit && send != ElementsLineEdit)
691 send = ElementsLineEdit;
693 if (send == ElementsLineEdit && myEditCurrentArgument == ElementsLineEdit) {
694 // hilight entered elements
695 SMDS_Mesh* aMesh = 0;
697 aMesh = myMeshActor->GetObject()->GetMesh();
700 //mySelectionMgr->clearSelected();
701 //mySelectionMgr->AddIObject(myMeshActor->getIO());
703 aList.Append(myMeshActor->getIO());
704 mySelectionMgr->setSelectedObjects(aList, false);
706 QStringList aListId = QStringList::split(" ", theNewText, false);
708 const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO();
709 TColStd_MapOfInteger newIndices;
710 for (int i = 0; i < aListId.count(); i++) {
711 long ind = aListId[ i ].toLong(&bOk);
713 const SMDS_MeshElement* e = aMesh->FindElement(ind);
715 // check also type of element
716 bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
717 Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
719 newIndices.Add(e->GetID());
723 mySelector->AddOrRemoveIndex(anIO, newIndices, false);
724 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
725 aViewWindow->highlight( anIO, true, true );
727 } else if (send == StartPointLineEdit &&
728 myEditCurrentArgument == StartPointLineEdit) {
729 if (!myPathMesh->_is_nil()) {
730 SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
731 SMDS_Mesh* aMesh = 0;
733 aMesh = aPathActor->GetObject()->GetMesh();
735 //mySelectionMgr->clearSelected();
736 //mySelectionMgr->AddIObject(aPathActor->getIO());
738 aList.Append(aPathActor->getIO());
739 mySelectionMgr->setSelectedObjects(aList, false);
742 long ind = theNewText.toLong(&bOk);
744 const SMDS_MeshNode* n = aMesh->FindNode(ind);
746 //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) {
747 TColStd_MapOfInteger newIndices;
748 newIndices.Add(n->GetID());
749 mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false );
750 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
751 aViewWindow->highlight( aPathActor->getIO(), true, true );
759 //=================================================================================
760 // function : SelectionIntoArgument()
761 // purpose : Called when selection as changed or other case
762 //=================================================================================
763 void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument()
767 // return if dialog box is inactive
768 if (!GroupButtons->isEnabled())
771 // selected objects count
772 const SALOME_ListIO& aList = mySelector->StoredIObjects();
773 int nbSel = aList.Extent();
780 if (myEditCurrentArgument == ElementsLineEdit) {
781 // we are now selecting mesh elements (or whole mesh/submesh/group)
783 ElementsLineEdit->clear();
784 myMesh = SMESH::SMESH_Mesh::_nil();
785 myIDSource = SMESH::SMESH_IDSource::_nil();
788 // try to get mesh from selection
789 Handle(SALOME_InteractiveObject) IO = aList.First();
790 myMesh = SMESH::GetMeshByIO(IO);
791 if (myMesh->_is_nil())
794 myMeshActor = SMESH::FindActorByObject(myMesh);
798 if (MeshCheck->isChecked()) {
799 // If "Select whole mesh, submesh or group" check box is on ->
800 // get ID source and put it's name to the edit box
802 SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
804 myIDSource = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
805 ElementsLineEdit->setText(aString);
807 // If "Select whole mesh, submesh or group" check box is off ->
808 // try to get selected elements IDs
810 //int aNbUnits = SMESH::GetNameOfSelectedElements(mySelectionMgr, aString);
811 SMESH::GetNameOfSelectedElements(mySelector, myMeshActor->getIO(), aString);
812 ElementsLineEdit->setText(aString);
814 } else if (myEditCurrentArgument == PathMeshLineEdit) {
815 // we are now selecting path mesh
817 PathMeshLineEdit->clear();
818 myPathMesh = SMESH::SMESH_Mesh::_nil();
819 PathShapeLineEdit->clear();
820 myPathShape = GEOM::GEOM_Object::_nil();
821 StartPointLineEdit->clear();
823 // try to get mesh from selection
824 Handle(SALOME_InteractiveObject) IO = aList.First();
825 myPathMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
826 if(myPathMesh->_is_nil())
830 SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
831 PathMeshLineEdit->setText(aString);
832 } else if (myEditCurrentArgument == PathShapeLineEdit) {
833 // we are now selecting path mesh
835 PathShapeLineEdit->clear();
836 myPathShape = GEOM::GEOM_Object::_nil();
837 StartPointLineEdit->clear();
839 // return if path mesh is not yet selected
840 if (myPathMesh->_is_nil())
843 // try to get shape from selection
844 Handle(SALOME_InteractiveObject) IO = aList.First();
845 myPathShape = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
846 if (myPathShape->_is_nil())
850 SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
851 PathShapeLineEdit->setText(aString);
852 } else if (myEditCurrentArgument == StartPointLineEdit) {
853 // we are now selecting start point of path
855 StartPointLineEdit->clear();
857 // return if path mesh or path shape is not yet selected
858 if (myPathMesh->_is_nil() || myPathShape->_is_nil())
861 // try to get shape from selection
862 Handle(SALOME_InteractiveObject) IO = aList.First();
865 int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, myMeshActor->getIO(), aString);
867 StartPointLineEdit->setText(aString.stripWhiteSpace());
869 } else if (myEditCurrentArgument == XSpin) {
870 // we are now selecting base point
871 // reset is not performed here!
873 // return if is not enabled
874 if (!BasePointGrp->isEnabled())
877 // try to get shape from selection
878 Handle(SALOME_InteractiveObject) IO = aList.First();
880 // check if geom vertex is selected
881 GEOM::GEOM_Object_var aGeomObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
882 TopoDS_Vertex aVertex;
883 if (!aGeomObj->_is_nil()) {
884 if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) {
885 gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
886 XSpin->SetValue(aPnt.X());
887 YSpin->SetValue(aPnt.Y());
888 ZSpin->SetValue(aPnt.Z());
893 // check if smesh node is selected
894 SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(IO);
895 if (aMesh->_is_nil())
899 int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, myMeshActor->getIO(), aString);
900 // return if more than one node is selected
904 SMESH_Actor* aMeshActor = SMESH::FindActorByObject(aMesh);
908 SMDS_Mesh* mesh = aMeshActor->GetObject()->GetMesh();
912 const SMDS_MeshNode* n = mesh->FindNode(aString.toLong());
916 XSpin->SetValue(n->X());
917 YSpin->SetValue(n->Y());
918 ZSpin->SetValue(n->Z());
922 //=================================================================================
923 // function : SetEditCurrentArgument()
925 //=================================================================================
926 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument()
928 QToolButton* send = (QToolButton*)sender();
929 if (send != SelectElementsButton &&
930 send != SelectPathMeshButton &&
931 send != SelectPathShapeButton &&
932 send != SelectStartPointButton &&
933 send != SelectBasePointButton)
935 SetEditCurrentArgument(send);
938 //=================================================================================
939 // function : SetEditCurrentArgument()
941 //=================================================================================
942 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button)
944 disconnect(mySelectionMgr, 0, this, 0);
945 mySelectionMgr->clearSelected();
946 mySelectionMgr->clearFilters();
947 SMESH::SetPickable();
949 if (button == SelectElementsButton) {
950 myEditCurrentArgument = ElementsLineEdit;
951 SMESH::SetPointRepresentation(false);
952 if (MeshCheck->isChecked()) {
953 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
954 aViewWindow->SetSelectionMode(ActorSelection);
955 mySelectionMgr->installFilter(myElementsFilter);
957 if (Elements1dRB->isChecked())
959 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
960 aViewWindow->SetSelectionMode(EdgeSelection);
962 else if (Elements2dRB->isChecked())
964 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
965 aViewWindow->SetSelectionMode(FaceSelection);
968 } else if (button == SelectPathMeshButton) {
969 myEditCurrentArgument = PathMeshLineEdit;
970 SMESH::SetPointRepresentation(false);
971 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
972 aViewWindow->SetSelectionMode(ActorSelection);
973 mySelectionMgr->installFilter(myPathMeshFilter);
975 else if (button == SelectPathShapeButton) {
976 myEditCurrentArgument = PathShapeLineEdit;
977 SMESH::SetPointRepresentation(false);
978 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
979 aViewWindow->SetSelectionMode(ActorSelection);
981 if (!myPathMesh->_is_nil()) {
982 GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh();
983 SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
985 if (!aMainShape->_is_nil() && aPathActor)
986 mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1,
987 TopAbs_EDGE, aMainShape));
988 //SMESH::SetPickable(aPathActor);
991 else if (button == SelectStartPointButton) {
992 myEditCurrentArgument = StartPointLineEdit;
993 if (!myPathMesh->_is_nil()) {
994 SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
996 SMESH::SetPointRepresentation(true);
997 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
998 aViewWindow->SetSelectionMode(NodeSelection);
999 SMESH::SetPickable(aPathActor);
1003 else if (button == SelectBasePointButton) {
1004 myEditCurrentArgument = XSpin;
1005 SMESH::SetPointRepresentation(true);
1006 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1007 aViewWindow->SetSelectionMode(NodeSelection);
1009 SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH);
1010 SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter(GROUP);
1011 SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE,
1013 QPtrList<SUIT_SelectionFilter> aListOfFilters;
1014 if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
1015 if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
1016 if (aVertexFilter) aListOfFilters.append(aVertexFilter);
1018 mySelectionMgr->installFilter(new SMESH_LogicalFilter
1019 (aListOfFilters, SMESH_LogicalFilter::LO_OR));
1022 if (myEditCurrentArgument && !myEditCurrentArgument->hasFocus())
1023 myEditCurrentArgument->setFocus();
1025 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1026 SelectionIntoArgument();
1029 //=================================================================================
1030 // function : DeactivateActiveDialog()
1031 // purpose : Deactivates this dialog
1032 //=================================================================================
1033 void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog()
1035 if (GroupConstructors->isEnabled()) {
1036 GroupConstructors->setEnabled(false);
1037 GroupArguments->setEnabled(false);
1038 GroupButtons->setEnabled(false);
1039 mySMESHGUI->ResetState();
1040 mySMESHGUI->SetActiveDialogBox(0);
1044 //=================================================================================
1045 // function : ActivateThisDialog()
1046 // purpose : Activates this dialog
1047 //=================================================================================
1048 void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog()
1050 // Emit a signal to deactivate the active dialog
1051 mySMESHGUI->EmitSignalDeactivateDialog();
1052 GroupConstructors->setEnabled(true);
1053 GroupArguments->setEnabled(true);
1054 GroupButtons->setEnabled(true);
1056 mySMESHGUI->SetActiveDialogBox(this);
1058 ConstructorsClicked(GetConstructorId());
1059 SelectionIntoArgument();
1062 //=================================================================================
1063 // function : enterEvent()
1064 // purpose : Mouse enter event
1065 //=================================================================================
1066 void SMESHGUI_ExtrusionAlongPathDlg::enterEvent (QEvent*)
1068 if (!GroupConstructors->isEnabled())
1069 ActivateThisDialog();
1072 //=======================================================================
1073 // function : onSelectMesh()
1075 //=======================================================================
1076 void SMESHGUI_ExtrusionAlongPathDlg::onSelectMesh()
1078 bool toSelectMesh = MeshCheck->isChecked();
1080 ElementsLineEdit->setReadOnly(toSelectMesh);
1081 ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS"));
1082 ElementsLineEdit->clear();
1084 SetEditCurrentArgument(SelectElementsButton);
1087 //=================================================================================
1088 // function : GetConstructorId()
1090 //=================================================================================
1091 int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId()
1093 if (GroupConstructors != NULL && GroupConstructors->selected() != NULL)
1094 return GroupConstructors->id(GroupConstructors->selected());
1098 //=======================================================================
1099 // function : onAnglesCheck()
1100 // purpose : called when "Use Angles" check box is switched
1101 //=======================================================================
1102 void SMESHGUI_ExtrusionAlongPathDlg::onAnglesCheck()
1104 AnglesGrp->setEnabled(AnglesCheck->isChecked());
1107 //=======================================================================
1108 // function : onBasePointCheck()
1109 // purpose : called when "Use Base Point" check box is switched
1110 //=======================================================================
1111 void SMESHGUI_ExtrusionAlongPathDlg::onBasePointCheck()
1113 BasePointGrp->setEnabled(BasePointCheck->isChecked());
1116 //=======================================================================
1117 // function : OnAngleAdded()
1118 // purpose : Called when user adds angle to the list
1119 //=======================================================================
1120 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded()
1122 AnglesList->insertItem(QString::number(AngleSpin->GetValue()));
1125 //=======================================================================
1126 // function : OnAngleRemoved()
1127 // purpose : Called when user removes angle(s) from the list
1128 //=======================================================================
1129 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved()
1131 QList<QListBoxItem> aList;
1132 aList.setAutoDelete(false);
1133 for (int i = 0; i < AnglesList->count(); i++)
1134 if (AnglesList->isSelected(i))
1135 aList.append(AnglesList->item(i));
1137 for (int i = 0; i < aList.count(); i++)
1141 //=================================================================================
1142 // function : eventFilter()
1143 // purpose : event filter ???
1144 //=================================================================================
1145 bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event)
1147 if (event->type() == QEvent::KeyPress) {
1148 QKeyEvent* ke = (QKeyEvent*)event;
1149 if (object == AnglesList) {
1150 if (ke->key() == Key_Delete)
1154 else if (event->type() == QEvent::FocusIn) {
1155 if (object == ElementsLineEdit) {
1156 if (myEditCurrentArgument != ElementsLineEdit)
1157 SetEditCurrentArgument(SelectElementsButton);
1159 else if (object == StartPointLineEdit) {
1160 if (myEditCurrentArgument != StartPointLineEdit)
1161 SetEditCurrentArgument(SelectStartPointButton);
1163 else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) {
1164 if (myEditCurrentArgument != XSpin)
1165 SetEditCurrentArgument(SelectBasePointButton);
1168 return QDialog::eventFilter(object, event);