1 // Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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, or (at your option) any later version.
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.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File : SMESHGUI_ExtrusionDlg.cxx
25 // Author : Michael ZORIN, Open CASCADE S.A.S.
28 #include "SMESHGUI_ExtrusionDlg.h"
31 #include "SMESHGUI_FilterDlg.h"
32 #include "SMESHGUI_IdValidator.h"
33 #include "SMESHGUI_MeshEditPreview.h"
34 #include "SMESHGUI_MeshUtils.h"
35 #include "SMESHGUI_SpinBox.h"
36 #include "SMESHGUI_Utils.h"
37 #include "SMESHGUI_VTKUtils.h"
39 #include <SMDS_Mesh.hxx>
40 #include <SMESH_Actor.h>
41 #include <SMESH_LogicalFilter.hxx>
42 #include <SMESH_TypeFilter.hxx>
44 // SALOME GUI includes
45 #include <LightApp_Application.h>
46 #include <LightApp_SelectionMgr.h>
47 #include <SUIT_Desktop.h>
48 #include <SUIT_MessageBox.h>
49 #include <SUIT_OverrideCursor.h>
50 #include <SUIT_ResourceMgr.h>
51 #include <SUIT_Session.h>
52 #include <SVTK_ViewModel.h>
53 #include <SVTK_ViewWindow.h>
54 #include <SalomeApp_IntSpinBox.h>
57 #include <BRep_Tool.hxx>
58 #include <TColStd_IndexedMapOfInteger.hxx>
59 #include <TColStd_MapOfInteger.hxx>
60 #include <TopoDS_Vertex.hxx>
64 #include <QApplication>
65 #include <QButtonGroup>
67 #include <QGridLayout>
69 #include <QHBoxLayout>
73 #include <QListWidget>
74 #include <QPushButton>
75 #include <QRadioButton>
76 #include <QToolButton>
77 #include <QVBoxLayout>
80 #include <SALOMEconfig.h>
81 #include CORBA_SERVER_HEADER(SMESH_Group)
82 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
83 #include <SMESH_NumberFilter.hxx>
90 const char* getLabelText( int typeIndex, bool objSelection )
92 const char* typeLbl[3] = { "SMESH_ID_NODES", "SMESH_ID_EDGES", "SMESH_ID_FACES" };
93 const char* obj = "SMESH_OBJECTS";
94 return objSelection ? obj : typeLbl[ typeIndex ];
98 //================================================================================
102 //================================================================================
104 SMESHGUI_3TypesSelector::SMESHGUI_3TypesSelector( QWidget * parent ):
107 SMESHGUI* gui = SMESHGUI::GetSMESHGUI();
108 mySelectionMgr = SMESH::GetSelectionMgr( gui );
109 mySelector = SMESH::GetViewWindow( gui )->GetSelector();
111 myIdValidator = new SMESHGUI_IdValidator(this);
113 QPixmap image( SMESH::GetResourceMgr( gui )->loadPixmap("SMESH", tr("ICON_SELECT")));
115 mySelectBtnGrp = new QButtonGroup( this );
116 mySelectBtnGrp->setExclusive( true );
118 QVBoxLayout* mainLayout = new QVBoxLayout( this );
119 mainLayout->setSpacing( SPACING );
120 mainLayout->setMargin( 0 );
122 const char* groupLbl[3] = { "SMESH_NODES", "SMESH_EDGES", "SMESH_FACES" };
124 for ( int i = 0; i < 3; ++i )
126 myGroups[i] = new QGroupBox( tr( groupLbl[i] ), this );
127 mainLayout->addWidget( myGroups[i] );
128 QGridLayout* layout = new QGridLayout( myGroups[i] );
129 layout->setSpacing( SPACING );
130 layout->setMargin( MARGIN );
132 QPushButton* selBtn = new QPushButton( myGroups[i] );
133 selBtn->setIcon( image );
134 selBtn->setCheckable( true );
135 mySelectBtnGrp->addButton( selBtn, i );
136 myLabel [i] = new QLabel( myGroups[i] );
137 myLineEdit [i] = new QLineEdit( myGroups[i] );
138 myMeshChk [i] = new QCheckBox( tr("SMESH_SELECT_WHOLE_MESH"), myGroups[i] );
139 myFilterBtn[i] = new QPushButton( tr( "SMESH_BUT_FILTER" ), myGroups[i] );
141 myLineEdit[i]->setMaxLength(-1);
142 myLabel [i]->setText( tr( getLabelText( i, true )));
144 layout->addWidget(myLabel [i], 0, 0);
145 layout->addWidget(selBtn, 0, 1);
146 layout->addWidget(myLineEdit [i], 0, 2, 1, 2);
147 layout->addWidget(myFilterBtn[i], 0, 4);
148 layout->addWidget(myMeshChk [i], 1, 0, 1, 5);
149 layout->setColumnStretch( 2, 10 );
151 connect( myMeshChk [i], SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool)));
152 connect( myFilterBtn[i], SIGNAL(clicked()), SLOT(setFilters()));
153 connect( myLineEdit [i], SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
154 myIDSource[i] = new SMESH::ListOfIDSources;
156 connect( mySelectBtnGrp, SIGNAL(buttonClicked (int)), SLOT(onSelectType(int)));
157 connect(mySelectionMgr, SIGNAL( currentSelectionChanged()), SLOT(selectionIntoArgument()));
159 // Costruction of the logical filter for the elements: mesh/sub-mesh/group
160 QList<SUIT_SelectionFilter*> aListOfFilters;
161 aListOfFilters.append(new SMESH_TypeFilter (SMESH::MESH));
162 aListOfFilters.append(new SMESH_TypeFilter (SMESH::SUBMESH_VERTEX));
163 aListOfFilters.append(new SMESH_TypeFilter (SMESH::GROUP_NODE));
165 new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
166 aListOfFilters.append(0);
167 aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
168 aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_EDGE);
169 aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_EDGE);
170 aListOfFilters[3] = new SMESH_TypeFilter (SMESH::IDSOURCE_EDGE); // for sub-mesh on group of EDGEs
172 new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
173 aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
174 aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_FACE);
175 aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_FACE);
176 aListOfFilters[3] = new SMESH_TypeFilter (SMESH::IDSOURCE_FACE); // for sub-mesh on group of FACEs
178 new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
182 myMeshChk[0]->setChecked( true );
183 myMeshChk[1]->setChecked( true );
184 myMeshChk[2]->setChecked( true );
185 mySelectBtnGrp->button(0)->click();
188 //================================================================================
192 //================================================================================
194 SMESHGUI_3TypesSelector::~SMESHGUI_3TypesSelector()
206 myFilterDlg->setParent( 0 );
210 disconnect(mySelectionMgr, 0, this, 0);
213 //================================================================================
215 * \brief Slot called when selection changes
217 //================================================================================
219 void SMESHGUI_3TypesSelector::selectionIntoArgument()
223 // return if dialog box is inactive
227 // get a current element type
228 int iType = mySelectBtnGrp->checkedId();
229 if ( iType < 0 || iType > 2 )
232 QString aString = "";
237 myLineEdit[ iType ]->setText(aString);
238 myIDSource[ iType ]->length (nbObjects);
240 if ( !myGroups[ iType ]->isEnabled() )
243 SMESH::SetPointRepresentation(false);
245 SALOME_ListIO selected;
246 mySelectionMgr->selectedObjects( selected );
248 if ( myMeshChk[ iType ]->isChecked() ) // objects selection
249 myIDSource[ iType ]->length( selected.Extent() ); // reserve
250 myIDSource[ iType ]->length(0);
252 SALOME_ListIteratorOfListIO It( selected );
253 for ( ; It.More(); It.Next() )
255 Handle(SALOME_InteractiveObject) IO = It.Value();
258 SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(IO);
259 if ( mesh->_is_nil() )
261 if ( !myMesh->_is_nil() &&
262 IsAnythingSelected() &&
263 myMesh->GetId() != mesh->GetId() )
264 continue; // other mesh
267 myActor = SMESH::FindActorByEntry( IO->getEntry() );
269 if ( myMeshChk[ iType ]->isChecked() ) // objects selection
271 SMESH::SMESH_IDSource_var idSrc = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
272 if ( idSrc->_is_nil() )
274 mesh = SMESH::SMESH_Mesh::_narrow( idSrc );
275 if ( !mesh->_is_nil() ) // if a mesh is selected, stop iteration
278 myIDSource[ iType ]->length( nbObjects );
279 myIDSource[ iType ][ 0 ] = idSrc;
280 aString = IO->getName();
283 else // several groups can be selected
285 myIDSource[ iType ]->length( nbObjects + 1 );
286 myIDSource[ iType ][ nbObjects++ ] = idSrc;
287 aString += " " + QString( IO->getName() ) + " ";
290 else // get indices of selected elements
292 TColStd_IndexedMapOfInteger aMapIndex;
293 mySelector->GetIndex(IO,aMapIndex);
294 int nbElements = aMapIndex.Extent();
295 if ( nbElements > 0 )
297 SMESH::smIdType_array_var ids = new SMESH::smIdType_array;
298 ids->length( nbElements );
299 for ( int i = 0; i < nbElements; ++i )
300 aString += QString(" %1").arg( ids[ i ] = aMapIndex( i+1 ));
301 addTmpIdSource( ids, iType, nbObjects++ );
307 myIDSource[ iType ]->length( nbObjects );
310 myLineEdit[ iType ]->setText(aString);
313 emit selectionChanged();
316 //================================================================================
318 * \brief Slot called when text changes in myLineEdit
320 //================================================================================
322 void SMESHGUI_3TypesSelector::onTextChange( const QString& theNewText )
327 // get a current element type
329 QLineEdit* le = (QLineEdit*) sender();
330 for ( ; iType < 3; ++iType )
331 if ( myLineEdit[ iType ] == le )
333 if ( iType < 0 || iType > 2 )
335 if ( !myGroups[ iType ]->isEnabled() )
340 // highlight entered elements/nodes
342 myIDSource[ iType ]->length( 0 );
344 if ( !myMesh->_is_nil() )
346 QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
347 if ( aListId.count() > 0 )
349 SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
351 SMESH::ElementType SMESHType = SMESH::ElementType ( iType+1 );
352 SMDSAbs_ElementType SMDSType = SMDSAbs_ElementType( iType+1 );
353 const bool isNode = ( SMDSType == SMDSAbs_Node );
355 SMESH::smIdType_array_var ids = new SMESH::smIdType_array;
356 ids->length( aListId.count() );
357 TColStd_MapOfInteger newIndices;
358 for (int i = 0; i < aListId.count(); i++) {
359 int id = aListId[ i ].toInt();
360 bool validId = false;
363 const SMDS_MeshElement * e;
364 if ( isNode ) e = aMesh->FindNode( id );
365 else e = aMesh->FindElement( id );
366 validId = ( e && e->GetType() == SMDSType );
368 validId = ( myMesh->GetElementType( id, !isNode ) == SMESHType );
371 if ( validId && newIndices.Add( id ))
372 ids[ newIndices.Extent()-1 ] = id;
374 if ( !newIndices.IsEmpty() ) {
375 ids->length( newIndices.Extent() );
376 addTmpIdSource( ids, iType, 0 );
378 mySelector->AddOrRemoveIndex(myIO, newIndices, false);
379 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView() )
380 aViewWindow->highlight( myIO, true, true );
384 emit selectionChanged();
389 //================================================================================
391 * \brief Creates from ids and stores a temporary IDSource
393 //================================================================================
395 void SMESHGUI_3TypesSelector::addTmpIdSource( SMESH::smIdType_array_var& ids, int iType, int index )
397 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
398 SMESH::SMESH_IDSource_var idSrc =
399 aMeshEditor->MakeIDSource( ids, SMESH::ElementType( iType+1 ));
401 if ( (int) myIDSource[ iType ]->length() <= index )
402 myIDSource[ iType ]->length( index + 1 );
403 myIDSource[ iType ][ index ] = idSrc;
405 myTmpIDSourceList.push_back( idSrc );
408 //================================================================================
410 * \brief Slot called when myMeshChk is checked
412 //================================================================================
414 void SMESHGUI_3TypesSelector::onSelectMesh( bool on )
416 QCheckBox* send = (QCheckBox*)sender();
417 for ( int iType = 0; iType < 3; ++iType )
418 if ( send == myMeshChk[ iType ])
420 myLabel[ iType ]->setText( tr( getLabelText( iType, on )));
421 myFilterBtn[ iType ]->setEnabled( !on );
422 myIDSource [ iType ]->length(0);
424 myLineEdit [ iType ]->setText("");
426 myLineEdit [ iType ]->setReadOnly( on );
427 myLineEdit [ iType ]->setValidator( on ? 0 : myIdValidator );
428 mySelectBtnGrp->button(iType)->click();
437 //================================================================================
439 * \brief Slot called when a selection button is clicked
441 //================================================================================
443 void SMESHGUI_3TypesSelector::onSelectType(int iType)
445 if ( iType < 0 || iType > 2 )
448 myIDSource[ iType ]->length(0);
449 myLineEdit[ iType ]->setText("");
451 disconnect(mySelectionMgr, 0, this, 0);
452 mySelectionMgr->clearFilters();
454 SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView();
455 if ( myMeshChk[ iType ]->isChecked() )
457 if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
458 mySelectionMgr->installFilter( myFilter[ iType ]);
460 else if ( aViewWindow )
463 case SMESH::NODE: aViewWindow->SetSelectionMode(NodeSelection); break;
464 case SMESH::EDGE: aViewWindow->SetSelectionMode(EdgeSelection); break;
465 case SMESH::FACE: aViewWindow->SetSelectionMode(FaceSelection); break;
469 myLineEdit[ iType ]->setFocus();
471 connect(mySelectionMgr, SIGNAL( currentSelectionChanged()), SLOT( selectionIntoArgument()));
472 selectionIntoArgument();
475 //================================================================================
477 * \brief Slot called when "Set filter" is clicked
479 //================================================================================
481 void SMESHGUI_3TypesSelector::setFilters()
483 if ( myMesh->_is_nil() ) {
484 SUIT_MessageBox::critical(this,
486 tr("NO_MESH_SELECTED"));
492 types.append( SMESH::NODE );
493 types.append( SMESH::EDGE );
494 types.append( SMESH::FACE );
495 myFilterDlg = new SMESHGUI_FilterDlg( SMESHGUI::GetSMESHGUI(), types );
498 QPushButton* send = (QPushButton*)sender();
499 for ( int iType = 0; iType < 3; ++iType )
500 if ( send == myFilterBtn[ iType ])
502 mySelectBtnGrp->button(iType)->click();
504 myFilterDlg->Init( SMESH::ElementType( iType+1 ) );
505 myFilterDlg->SetSelection();
506 myFilterDlg->SetMesh( myMesh );
507 myFilterDlg->SetSourceWg( myLineEdit[ iType ]);
513 //================================================================================
515 * \brief Clear selection
517 //================================================================================
519 void SMESHGUI_3TypesSelector::Clear()
522 for ( int iType = 0; iType < 3; ++iType )
524 myIDSource[ iType ]->length(0);
525 myLineEdit[ iType ]->setText("");
528 selectionIntoArgument();
531 //================================================================================
533 * \brief Enable/disable controls of a type
535 //================================================================================
537 void SMESHGUI_3TypesSelector::SetEnabled( bool enable, SMESH::ElementType type )
540 for ( int iType = 0; iType < 3; ++iType )
541 if ( iType+1 == type || type == SMESH::ALL )
543 myGroups[ iType ]->setEnabled( enable );
545 myIDSource[ iType ]->length(0);
546 myLineEdit[ iType ]->setText("");
550 selectionIntoArgument();
553 //================================================================================
555 * \brief Checks if anything is selected
557 //================================================================================
559 bool SMESHGUI_3TypesSelector::IsAnythingSelected( SMESH::ElementType type )
563 for ( int iType = 0; iType < 3; ++iType )
564 if ( iType+1 == type || type == SMESH::ALL )
565 nbSel += myIDSource[ iType ]->length();
570 //================================================================================
572 * \brief Returns selected elements and most complex type of selected elements
574 //================================================================================
576 SMESH::ElementType SMESHGUI_3TypesSelector::GetSelected( SMESH::ListOfIDSources & nodes,
577 SMESH::ListOfIDSources & edges,
578 SMESH::ListOfIDSources & faces )
580 nodes = myIDSource[0];
581 edges = myIDSource[1];
582 faces = myIDSource[2];
584 if ( myIDSource[2]->length() > 0 ) return SMESH::FACE;
585 if ( myIDSource[1]->length() > 0 ) return SMESH::EDGE;
586 if ( myIDSource[0]->length() > 0 ) return SMESH::NODE;
590 //=================================================================================
591 // function : SMESHGUI_ExtrusionDlg()
592 // purpose : constructor
593 //=================================================================================
595 SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
596 : SMESHGUI_PreviewDlg( theModule ),
597 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
599 SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
600 QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT")));
601 QPixmap addImage ( mgr->loadPixmap("SMESH", tr("ICON_APPEND")));
602 QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
605 setAttribute( Qt::WA_DeleteOnClose, true );
606 setWindowTitle(tr("EXTRUSION_ALONG_LINE"));
607 setSizeGripEnabled(true);
609 QVBoxLayout* SMESHGUI_ExtrusionDlgLayout = new QVBoxLayout(this);
610 SMESHGUI_ExtrusionDlgLayout->setSpacing(SPACING);
611 SMESHGUI_ExtrusionDlgLayout->setMargin(MARGIN);
613 /***************************************************************/
614 GroupArguments = new QGroupBox(tr("SMESH_EXTRUSION"), this);
615 QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
616 GroupArgumentsLayout->setSpacing(SPACING);
617 GroupArgumentsLayout->setMargin(MARGIN);
619 // Controls for elements selection
620 SelectorWdg = new SMESHGUI_3TypesSelector( GroupArguments );
622 ExtrMethod_RBut0 = new QRadioButton(GroupArguments);
623 ExtrMethod_RBut0->setText( tr("SMESH_EXTRUSION_TO_DISTANCE") );
624 ExtrMethod_RBut1 = new QRadioButton(GroupArguments);
625 ExtrMethod_RBut1->setText( tr("SMESH_EXTRUSION_ALONG_VECTOR") );
626 ExtrMethod_RBut2 = new QRadioButton(GroupArguments);
627 ExtrMethod_RBut2->setText( tr("SMESH_EXTRUSION_BY_NORMAL") );
629 //Control for the Distance selection
630 TextLabelDistance = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
632 TextLabelDx = new QLabel(tr("SMESH_X"), GroupArguments);
633 SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments);
635 TextLabelDy = new QLabel(tr("SMESH_Y"), GroupArguments);
636 SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments);
638 TextLabelDz = new QLabel(tr("SMESH_Z"), GroupArguments);
639 SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments);
641 // Controls for vector selection
643 TextLabelVector = new QLabel(tr("SMESH_VECTOR"), GroupArguments);
645 SelectVectorButton = new QPushButton( GroupArguments );
646 SelectVectorButton->setIcon( selectImage );
647 SelectVectorButton->setCheckable( true );
648 SelectorWdg->GetButtonGroup()->addButton( SelectVectorButton );
650 TextLabelVx = new QLabel(tr("SMESH_DX"), GroupArguments);
651 SpinBox_Vx = new SMESHGUI_SpinBox(GroupArguments);
653 TextLabelVy = new QLabel(tr("SMESH_DY"), GroupArguments);
654 SpinBox_Vy = new SMESHGUI_SpinBox(GroupArguments);
656 TextLabelVz = new QLabel(tr("SMESH_DZ"), GroupArguments);
657 SpinBox_Vz = new SMESHGUI_SpinBox(GroupArguments);
659 TextLabelDist = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
660 SpinBox_VDist = new SMESHGUI_SpinBox(GroupArguments);
662 // Controls for nb. steps defining
663 TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments);
664 SpinBox_NbSteps = new SalomeApp_IntSpinBox(GroupArguments);
666 // CheckBox for groups generation
667 MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
669 // CheckBox for ByAverageNormal arg of ExtrusionByNormal()
670 ByAverageNormalCheck = new QCheckBox(tr("BY_AVERAGE_NORMAL"), GroupArguments);
672 // CheckBox for UseInputElemsOnly arg of ExtrusionByNormal()
673 UseInputElemsOnlyCheck = new QCheckBox(tr("USE_INPUT_ELEMS_ONLY"), GroupArguments);
676 myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments);
680 BasePointGrp = new QGroupBox(tr("BASE_POINT"), GroupArguments);
681 BasePointGrp->setCheckable(true);
682 BasePointGrp->setChecked(false);
683 QHBoxLayout* BasePointGrpLayout = new QHBoxLayout(BasePointGrp);
684 BasePointGrpLayout->setSpacing(SPACING); BasePointGrpLayout->setMargin(MARGIN);
686 SelectBasePointButton = new QPushButton(BasePointGrp);
687 SelectBasePointButton->setIcon(selectImage);
688 SelectBasePointButton->setCheckable(true);
689 SelectorWdg->GetButtonGroup()->addButton( SelectBasePointButton );
691 QLabel* XLab = new QLabel(tr("SMESH_X"), BasePointGrp);
692 BasePoint_XSpin = new SMESHGUI_SpinBox(BasePointGrp);
693 BasePoint_XSpin->SetValue(0.);
694 QLabel* YLab = new QLabel(tr("SMESH_Y"), BasePointGrp);
695 BasePoint_YSpin = new SMESHGUI_SpinBox(BasePointGrp);
696 BasePoint_YSpin->SetValue(0.);
697 QLabel* ZLab = new QLabel(tr("SMESH_Z"), BasePointGrp);
698 BasePoint_ZSpin = new SMESHGUI_SpinBox(BasePointGrp);
699 BasePoint_ZSpin->SetValue(0.);
701 BasePointGrpLayout->addWidget(SelectBasePointButton);
702 BasePointGrpLayout->addWidget(XLab);
703 BasePointGrpLayout->addWidget(BasePoint_XSpin, 1);
704 BasePointGrpLayout->addWidget(YLab);
705 BasePointGrpLayout->addWidget(BasePoint_YSpin, 1);
706 BasePointGrpLayout->addWidget(ZLab);
707 BasePointGrpLayout->addWidget(BasePoint_ZSpin, 1);
711 ScalesGrp = new QGroupBox(tr("SMESH_SCALES"), GroupArguments);
712 ScalesGrp->setCheckable(true);
713 ScalesGrp->setChecked(false);
714 QGridLayout* ScalesGrpLayout = new QGridLayout( ScalesGrp );
715 ScalesGrpLayout->setSpacing(SPACING); ScalesGrpLayout->setMargin(MARGIN);
717 ScalesList = new QListWidget( ScalesGrp );
718 ScalesList->setSelectionMode(QListWidget::ExtendedSelection);
720 AddScaleButton = new QToolButton( ScalesGrp );
721 AddScaleButton->setIcon( addImage );
723 RemoveScaleButton = new QToolButton( ScalesGrp );
724 RemoveScaleButton->setIcon( removeImage );
726 ScaleSpin = new SMESHGUI_SpinBox( ScalesGrp );
727 ScaleSpin->SetValue(2);
729 LinearScalesCheck = new QCheckBox(tr("LINEAR_SCALES"), ScalesGrp );
731 ScalesGrpLayout->addWidget(ScalesList, 0, 0, 4, 1);
732 ScalesGrpLayout->addWidget(AddScaleButton, 0, 1);
733 ScalesGrpLayout->addWidget(RemoveScaleButton, 2, 1);
734 ScalesGrpLayout->addWidget(ScaleSpin, 0, 2);
735 ScalesGrpLayout->addWidget(LinearScalesCheck, 4, 0, 1, 3);
736 ScalesGrpLayout->setRowMinimumHeight(1, 10);
737 ScalesGrpLayout->setRowStretch(3, 10);
741 AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments);
742 AnglesGrp->setCheckable(true);
743 AnglesGrp->setChecked(false);
744 QGridLayout* AnglesGrpLayout = new QGridLayout( AnglesGrp );
745 AnglesGrpLayout->setSpacing(SPACING); AnglesGrpLayout->setMargin(MARGIN);
747 AnglesList = new QListWidget( AnglesGrp );
748 AnglesList->setSelectionMode(QListWidget::ExtendedSelection);
750 AddAngleButton = new QToolButton( AnglesGrp );
751 AddAngleButton->setIcon( addImage );
753 RemoveAngleButton = new QToolButton( AnglesGrp );
754 RemoveAngleButton->setIcon( removeImage );
756 AngleSpin = new SMESHGUI_SpinBox( AnglesGrp );
757 AngleSpin->SetValue(10);
759 LinearAnglesCheck = new QCheckBox(tr("LINEAR_ANGLES"), AnglesGrp );
761 AnglesGrpLayout->addWidget(AnglesList, 0, 0, 4, 1);
762 AnglesGrpLayout->addWidget(AddAngleButton, 0, 1);
763 AnglesGrpLayout->addWidget(RemoveAngleButton, 2, 1);
764 AnglesGrpLayout->addWidget(AngleSpin, 0, 2);
765 AnglesGrpLayout->addWidget(LinearAnglesCheck, 4, 0, 1, 3);
766 AnglesGrpLayout->setRowMinimumHeight(1, 10);
767 AnglesGrpLayout->setRowStretch(3, 10);
770 GroupArgumentsLayout->addWidget(SelectorWdg, 0, 0, 1, 9);
771 GroupArgumentsLayout->addWidget(ExtrMethod_RBut0, 1, 0, 1, 3);
772 GroupArgumentsLayout->addWidget(ExtrMethod_RBut1, 1, 3, 1, 3);
773 GroupArgumentsLayout->addWidget(ExtrMethod_RBut2, 1, 6, 1, 3);
774 GroupArgumentsLayout->addWidget(TextLabelDistance, 2, 0);
775 GroupArgumentsLayout->addWidget(TextLabelDx, 2, 2);
776 GroupArgumentsLayout->addWidget(SpinBox_Dx, 2, 3);
777 GroupArgumentsLayout->addWidget(TextLabelDy, 2, 4);
778 GroupArgumentsLayout->addWidget(SpinBox_Dy, 2, 5);
779 GroupArgumentsLayout->addWidget(TextLabelDz, 2, 6);
780 GroupArgumentsLayout->addWidget(SpinBox_Dz, 2, 7);
781 GroupArgumentsLayout->addWidget(TextLabelVector, 3, 0);
782 GroupArgumentsLayout->addWidget(SelectVectorButton, 3, 1);
783 GroupArgumentsLayout->addWidget(TextLabelVx, 3, 2);
784 GroupArgumentsLayout->addWidget(SpinBox_Vx, 3, 3);
785 GroupArgumentsLayout->addWidget(TextLabelVy, 3, 4);
786 GroupArgumentsLayout->addWidget(SpinBox_Vy, 3, 5);
787 GroupArgumentsLayout->addWidget(TextLabelVz, 3, 6);
788 GroupArgumentsLayout->addWidget(SpinBox_Vz, 3, 7);
789 GroupArgumentsLayout->addWidget(TextLabelDist, 4, 0);
790 GroupArgumentsLayout->addWidget(SpinBox_VDist, 4, 3);
791 GroupArgumentsLayout->addWidget(TextLabelNbSteps, 5, 0, 1, 3);
792 GroupArgumentsLayout->addWidget(SpinBox_NbSteps, 5, 3);
793 GroupArgumentsLayout->addWidget(ByAverageNormalCheck, 6, 0, 1, 4);
794 GroupArgumentsLayout->addWidget(UseInputElemsOnlyCheck, 6, 4, 1, 4);
795 GroupArgumentsLayout->addWidget(BasePointGrp, 7, 0, 1, 9);
796 GroupArgumentsLayout->addWidget(ScalesGrp, 8, 0, 1, 4);
797 GroupArgumentsLayout->addWidget(AnglesGrp, 8, 5, 1, 4);
798 GroupArgumentsLayout->addWidget(myPreviewCheckBox, 9, 0, 1, 8);
799 GroupArgumentsLayout->addWidget(MakeGroupsCheck, 10,0, 1, 8);
800 GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 10, 0);
802 /***************************************************************/
803 GroupButtons = new QGroupBox(this);
804 QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
805 GroupButtonsLayout->setSpacing(SPACING);
806 GroupButtonsLayout->setMargin(MARGIN);
808 buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
809 buttonOk->setAutoDefault(true);
810 buttonOk->setDefault(true);
811 buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
812 buttonApply->setAutoDefault(true);
813 buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
814 buttonCancel->setAutoDefault(true);
815 buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
816 buttonHelp->setAutoDefault(true);
818 GroupButtonsLayout->addWidget(buttonOk);
819 GroupButtonsLayout->addSpacing(10);
820 GroupButtonsLayout->addWidget(buttonApply);
821 GroupButtonsLayout->addSpacing(10);
822 GroupButtonsLayout->addStretch();
823 GroupButtonsLayout->addWidget(buttonCancel);
824 GroupButtonsLayout->addWidget(buttonHelp);
826 /***************************************************************/
827 SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments);
828 SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons);
830 /* Initialisations */
831 SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
832 SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
833 SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
835 SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
836 SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
837 SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
839 SpinBox_NbSteps->setRange(1, 999999);
840 SpinBox_VDist->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
842 BasePoint_XSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
843 BasePoint_YSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
844 BasePoint_ZSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
845 ScaleSpin->RangeStepAndValidator (COORD_MIN, COORD_MAX, 1.0, "length_precision");
846 AngleSpin->RangeStepAndValidator (-180.0, 180.0, 5.0, "angle_precision");
848 ExtrMethod_RBut0->setChecked(true);
849 UseInputElemsOnlyCheck->setChecked(true);
850 MakeGroupsCheck->setChecked(true);
852 mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector();
854 mySMESHGUI->SetActiveDialogBox(this);
856 myHelpFileName = "extrusion.html";
860 /***************************************************************/
861 // signals and slots connections
862 connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
863 connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
864 connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
865 connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
867 connect(ExtrMethod_RBut0, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
868 connect(ExtrMethod_RBut1, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
869 connect(ExtrMethod_RBut2, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
871 // to update state of the Ok & Apply buttons
872 connect(SpinBox_Vx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
873 connect(SpinBox_Vy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
874 connect(SpinBox_Vz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
875 connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
876 connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
877 connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
879 connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleAdded()));
880 connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleRemoved()));
881 connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(OnScaleAdded()));
882 connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnScaleRemoved()));
884 connect(SelectVectorButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
885 connect(SelectBasePointButton,SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
886 connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(SetEditCurrentArgument()));
887 connect(BasePointGrp, SIGNAL(toggled(bool)), SelectBasePointButton, SLOT(click()));
888 connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
889 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(toDisplaySimulation()));
890 connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(toDisplaySimulation()));
891 connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(CheckIsEnable()));
892 /* to close dialog if study change */
893 connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject()));
894 connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), this, SLOT(onOpenView()));
895 connect(mySMESHGUI, SIGNAL(SignalCloseView()), this, SLOT(onCloseView()));
897 connect(SpinBox_Dx, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
898 connect(SpinBox_Dy, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
899 connect(SpinBox_Dz, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
900 connect(SpinBox_Vx, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
901 connect(SpinBox_Vy, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
902 connect(SpinBox_Vz, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
903 connect(SpinBox_VDist, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
904 connect(SpinBox_NbSteps, SIGNAL(valueChanged(int)), this, SLOT(toDisplaySimulation()));
905 connect(ByAverageNormalCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
906 connect(UseInputElemsOnlyCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
907 connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
908 connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
909 connect(LinearScalesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
910 connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
911 connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
912 connect(LinearAnglesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
913 connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
914 connect(BasePoint_XSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
915 connect(BasePoint_YSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
916 connect(BasePoint_ZSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
917 connect(ScalesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
918 connect(AnglesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
920 //To Connect preview check box
921 connectPreviewControl();
923 /***************************************************************/
928 //=================================================================================
929 // function : ~SMESHGUI_ExtrusionDlg()
930 // purpose : destructor
931 //=================================================================================
932 SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
936 //=================================================================================
938 // purpose : initialization
939 //=================================================================================
940 void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
944 SpinBox_NbSteps->setValue(1);
945 SpinBox_VDist->setValue(10);
946 SpinBox_Dx->SetValue(0);
947 SpinBox_Dy->SetValue(0);
948 SpinBox_Dz->SetValue(0);
949 SpinBox_Vx->SetValue(0);
950 SpinBox_Vy->SetValue(0);
951 SpinBox_Vz->SetValue(0);
953 myPreviewCheckBox->setChecked(false);
954 onDisplaySimulation(false);
956 SelectorWdg->Clear();
960 //=================================================================================
961 // function : CheckIsEnable()
962 // purpose : Check whether the Ok and Apply buttons should be enabled or not
963 //=================================================================================
964 void SMESHGUI_ExtrusionDlg::CheckIsEnable()
966 bool anIsEnable = SelectorWdg->IsAnythingSelected() && isValuesValid();
968 buttonOk->setEnabled(anIsEnable);
969 buttonApply->setEnabled(anIsEnable);
972 //=================================================================================
973 // function : isValuesValid()
974 // purpose : Return true in case if values entered into dialog are valid
975 //=================================================================================
976 bool SMESHGUI_ExtrusionDlg::isValuesValid()
978 double aX, aY, aZ, aModule = 0;
979 if ( ExtrMethod_RBut0->isChecked() )
981 aX = SpinBox_Dx->GetValue();
982 aY = SpinBox_Dy->GetValue();
983 aZ = SpinBox_Dz->GetValue();
984 aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
986 else if ( ExtrMethod_RBut1->isChecked() )
988 aX = SpinBox_Vx->GetValue();
989 aY = SpinBox_Vy->GetValue();
990 aZ = SpinBox_Vz->GetValue();
991 aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
992 double aVDist = (double)SpinBox_VDist->value();
995 else if ( ExtrMethod_RBut2->isChecked() )
997 aModule = Abs((double)SpinBox_VDist->value());
1000 return aModule > 1.0E-38;
1003 //=======================================================================
1004 //function : getScaleParams
1005 //purpose : return 3 scaling parameters
1006 //=======================================================================
1008 void SMESHGUI_ExtrusionDlg::getScaleParams( SMESH::double_array*& scales,
1009 SMESH::double_array*& basePoint,
1010 bool & scalesVariation,
1011 SMESH::double_array*& angles,
1012 bool & anglesVariation )
1014 scales = new SMESH::double_array;
1015 if ( ScalesGrp->isChecked() )
1017 scales->length( myScalesList.count() );
1018 for ( int i = 0; i < myScalesList.count(); ++i )
1019 (*scales)[i] = myScalesList[i];
1021 angles = new SMESH::double_array;
1022 if ( AnglesGrp->isChecked() )
1024 angles->length( myAnglesList.count() );
1025 for ( int i = 0; i < myAnglesList.count(); ++i )
1026 (*angles)[i] = myAnglesList[i]*M_PI/180.;
1028 basePoint = new SMESH::double_array;
1029 if ( BasePointGrp->isChecked() )
1031 basePoint->length( 3 );
1032 (*basePoint)[0] = BasePoint_XSpin->GetValue();
1033 (*basePoint)[1] = BasePoint_YSpin->GetValue();
1034 (*basePoint)[2] = BasePoint_ZSpin->GetValue();
1037 scalesVariation = ( scales->length() > 0 && LinearScalesCheck->isChecked() );
1038 anglesVariation = ( angles->length() > 0 && LinearAnglesCheck->isChecked() );
1041 //=================================================================================
1042 // function : ClickOnRadio()
1043 // purpose : Radio button management
1044 //=================================================================================
1046 void SMESHGUI_ExtrusionDlg::ClickOnRadio()
1048 if ( ExtrMethod_RBut0->isChecked() )
1050 TextLabelDistance->show();
1051 TextLabelDx->show();
1053 TextLabelDy->show();
1055 TextLabelDz->show();
1058 TextLabelVector->hide();
1059 TextLabelVx->hide();
1061 TextLabelVy->hide();
1063 TextLabelVz->hide();
1065 TextLabelDist->hide();
1066 SpinBox_VDist->hide();
1067 SelectVectorButton->hide();
1069 ByAverageNormalCheck->hide();
1070 UseInputElemsOnlyCheck->hide();
1072 SelectorWdg->SetEnabled( true, SMESH::ALL );
1074 else if ( ExtrMethod_RBut1->isChecked() )
1076 TextLabelDistance->hide();
1077 TextLabelDx->hide();
1079 TextLabelDy->hide();
1081 TextLabelDz->hide();
1084 TextLabelVector->show();
1085 TextLabelVx->show();
1087 TextLabelVy->show();
1089 TextLabelVz->show();
1091 TextLabelDist->show();
1092 SpinBox_VDist->show();
1093 SelectVectorButton->show();
1095 ByAverageNormalCheck->hide();
1096 UseInputElemsOnlyCheck->hide();
1098 SelectorWdg->SetEnabled( true, SMESH::ALL );
1100 else if ( ExtrMethod_RBut2->isChecked() )
1102 TextLabelDistance->hide();
1103 TextLabelDx->hide();
1105 TextLabelDy->hide();
1107 TextLabelDz->hide();
1110 TextLabelVector->hide();
1111 TextLabelVx->hide();
1113 TextLabelVy->hide();
1115 TextLabelVz->hide();
1118 TextLabelDist->show();
1119 SpinBox_VDist->show();
1120 SelectVectorButton->hide();
1122 ByAverageNormalCheck->show();
1123 UseInputElemsOnlyCheck->show();
1125 SelectorWdg->SetEnabled( false, SMESH::NODE );
1126 SelectorWdg->SetEnabled( false, SMESH::EDGE );
1129 BasePointGrp->setEnabled( !ExtrMethod_RBut2->isChecked() );
1130 ScalesGrp ->setEnabled( !ExtrMethod_RBut2->isChecked() );
1131 AnglesGrp ->setEnabled( !ExtrMethod_RBut2->isChecked() );
1136 onDisplaySimulation(true);
1138 qApp->processEvents();
1140 resize( minimumSizeHint() );
1143 //=================================================================================
1144 // function : ClickOnApply()
1145 // purpose : Called when user presses <Apply> button
1146 //=================================================================================
1148 bool SMESHGUI_ExtrusionDlg::ClickOnApply()
1150 if (SMESHGUI::isStudyLocked())
1156 if ( SelectorWdg->IsAnythingSelected() )
1158 SMESH::DirStruct aVector;
1159 getExtrusionVector(aVector);
1161 QStringList aParameters;
1162 if ( ExtrMethod_RBut0->isChecked() )
1164 aParameters << SpinBox_Dx->text();
1165 aParameters << SpinBox_Dy->text();
1166 aParameters << SpinBox_Dz->text();
1168 else if ( ExtrMethod_RBut1->isChecked() )
1170 // only 3 coords in a python dump command :(
1171 // aParameters << SpinBox_Vx->text();
1172 // aParameters << SpinBox_Vy->text();
1173 // aParameters << SpinBox_Vz->text();
1174 // aParameters << SpinBox_VDist->text();
1176 else if ( ExtrMethod_RBut2->isChecked() )
1178 aParameters << SpinBox_VDist->text();
1181 long aNbSteps = (long)SpinBox_NbSteps->value();
1182 aParameters << SpinBox_NbSteps->text();
1184 for (int i = 0; i < myScalesList.count(); i++)
1185 aParameters << ScalesList->item(i)->text();
1187 for (int i = 0; i < myAnglesList.count(); i++)
1188 aParameters << AnglesList->item(i)->text();
1190 bool meshHadNewTypeBefore = true;
1192 const bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() );
1196 SUIT_OverrideCursor aWaitCursor;
1198 SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh();
1200 SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources();
1201 SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources();
1202 SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources();
1203 maxSelType = SelectorWdg->GetSelected( nodes, edges, faces );
1205 // is it necessary to switch on the next Display Mode?
1206 SMESH::ElementType newType = (SMESH::ElementType)( maxSelType + 1 );
1207 SMESH::array_of_ElementType_var oldTypes = mesh->GetTypes();
1208 meshHadNewTypeBefore = false;
1209 for ( size_t i = 0; i < oldTypes->length() && !meshHadNewTypeBefore; ++i )
1210 meshHadNewTypeBefore = ( oldTypes[i] >= newType );
1212 SMESH::SMESH_MeshEditor_var meshEditor = mesh->GetMeshEditor();
1213 SMESH::ListOfGroups_var groups;
1215 mesh->SetParameters( aParameters.join(":").toUtf8().constData() );
1217 if ( ExtrMethod_RBut2->isVisible() &&
1218 ExtrMethod_RBut2->isChecked() ) // Extrusion by normal
1220 double stepSize = (double) SpinBox_VDist->value();
1221 long nbSteps = (long) SpinBox_NbSteps->value();
1222 bool useInputElemsOnly = UseInputElemsOnlyCheck->isChecked();
1223 bool byAverageNormal = ByAverageNormalCheck->isChecked();
1224 int dim = (maxSelType == SMESH::FACE) ? 2 : 1;
1226 groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, byAverageNormal,
1227 useInputElemsOnly, makeGroups, dim );
1231 SMESH::double_array_var scales, basePoint, angles;
1232 bool scalesVariation, anglesVariation;
1233 getScaleParams( scales.out(), basePoint.out(), scalesVariation,
1234 angles.out(), anglesVariation );
1235 groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces,
1236 aVector, aNbSteps, makeGroups,
1237 scales, scalesVariation, basePoint,
1238 angles, anglesVariation );
1244 SMESH_Actor* actor = SelectorWdg->GetActor();
1245 if ( actor && !meshHadNewTypeBefore )
1247 unsigned int aMode = actor->GetEntityMode();
1248 switch ( maxSelType ) {
1249 case SMESH::NODE: // extrude node -> edges
1250 actor->SetRepresentation(SMESH_Actor::eEdge);
1251 actor->SetEntityMode( aMode |= SMESH_Actor::eEdges ); break;
1252 case SMESH::EDGE: // edge -> faces
1253 actor->SetRepresentation(SMESH_Actor::eSurface);
1254 actor->SetEntityMode( aMode |= SMESH_Actor::eFaces ); break;
1255 case SMESH::FACE: // faces -> volumes
1256 actor->SetRepresentation(SMESH_Actor::eSurface);
1257 actor->SetEntityMode( aMode |= SMESH_Actor::eVolumes ); break;
1261 SMESH::Update( actor->getIO(), actor->GetVisibility() );
1263 mySMESHGUI->updateObjBrowser(true); // new groups may appear
1265 mySelectionMgr->clearSelected();
1268 SMESHGUI::Modified();
1273 //=================================================================================
1274 // function : ClickOnOk()
1275 // purpose : Called when user presses <OK> button
1276 //=================================================================================
1277 void SMESHGUI_ExtrusionDlg::ClickOnOk()
1283 //=================================================================================
1284 // function : reject()
1285 // purpose : Called when dialog box is closed
1286 //=================================================================================
1287 void SMESHGUI_ExtrusionDlg::reject()
1289 disconnect(mySelectionMgr, 0, this, 0);
1290 mySelectionMgr->clearFilters();
1291 //mySelectionMgr->clearSelected();
1292 if (SMESH::GetCurrentVtkView()) {
1293 SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
1294 SMESH::SetPointRepresentation(false);
1295 SMESH::SetPickable();
1297 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1298 aViewWindow->SetSelectionMode(ActorSelection);
1299 mySMESHGUI->ResetState();
1304 //=================================================================================
1305 // function : onOpenView()
1307 //=================================================================================
1308 void SMESHGUI_ExtrusionDlg::onOpenView()
1311 SMESH::SetPointRepresentation(false);
1314 mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector();
1315 ActivateThisDialog();
1319 //=================================================================================
1320 // function : onCloseView()
1322 //=================================================================================
1323 void SMESHGUI_ExtrusionDlg::onCloseView()
1325 DeactivateActiveDialog();
1329 //=================================================================================
1330 // function : ClickOnHelp()
1332 //=================================================================================
1333 void SMESHGUI_ExtrusionDlg::ClickOnHelp()
1335 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
1337 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
1341 platform = "winapplication";
1343 platform = "application";
1345 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
1346 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
1347 arg(app->resourceMgr()->stringValue("ExternalBrowser",
1349 arg(myHelpFileName));
1353 //=================================================================================
1354 // function : SelectionIntoArgument()
1355 // purpose : Called when selection has changed or other case
1356 //=================================================================================
1357 void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
1359 // return if dialog box is inactive
1360 if (!GroupButtons->isEnabled())
1363 SALOME_ListIO aList;
1364 mySelectionMgr->selectedObjects(aList);
1365 if ( aList.IsEmpty() || aList.Extent() > 1 )
1368 if ( SelectVectorButton->isChecked() )
1370 Handle(SALOME_InteractiveObject) IO = aList.First();
1371 TColStd_IndexedMapOfInteger aMapIndex;
1372 mySelector->GetIndex(IO,aMapIndex);
1373 if ( aMapIndex.Extent() != 1 )
1375 SMESH_Actor* anActor = SMESH::FindActorByEntry( IO->getEntry() );
1376 SMDS_Mesh* aMesh = anActor ? anActor->GetObject()->GetMesh() : 0;
1380 const SMDS_MeshFace* face =
1381 aMesh->DownCast< SMDS_MeshFace >(aMesh->FindElement(aMapIndex(1)));
1385 gp_XYZ aNormale = SMESH::getNormale(face);
1386 SpinBox_Vx->SetValue(aNormale.X());
1387 SpinBox_Vy->SetValue(aNormale.Y());
1388 SpinBox_Vz->SetValue(aNormale.Z());
1390 else if ( SelectBasePointButton->isChecked() )
1392 if (!BasePointGrp->isChecked())
1395 // try to get shape from selection
1396 Handle(SALOME_InteractiveObject) IO = aList.First();
1398 // check if geom vertex is selected
1399 GEOM::GEOM_Object_var aGeomObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
1400 TopoDS_Vertex aVertex;
1401 if (!aGeomObj->_is_nil()) {
1402 if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) {
1403 gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
1404 BasePoint_XSpin->SetValue(aPnt.X());
1405 BasePoint_YSpin->SetValue(aPnt.Y());
1406 BasePoint_ZSpin->SetValue(aPnt.Z());
1410 if ( aVertex.IsNull() )
1412 // check if smesh node is selected
1413 SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(IO);
1414 if (aMesh->_is_nil())
1418 int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
1419 // return if more than one node is selected
1423 SMESH_Actor* aMeshActor = SMESH::FindActorByObject(aMesh);
1427 SMDS_Mesh* mesh = aMeshActor->GetObject()->GetMesh();
1431 const SMDS_MeshNode* n = mesh->FindNode(aString.toLong());
1435 BasePoint_XSpin->SetValue(n->X());
1436 BasePoint_YSpin->SetValue(n->Y());
1437 BasePoint_ZSpin->SetValue(n->Z());
1441 onDisplaySimulation(true);
1445 //=================================================================================
1446 // function : SetEditCurrentArgument()
1448 //=================================================================================
1449 void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
1451 QPushButton* send = (QPushButton*)sender();
1453 disconnect(mySelectionMgr, 0, this, 0);
1454 mySelectionMgr->clearSelected();
1455 mySelectionMgr->clearFilters();
1457 if (send == SelectVectorButton)
1459 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1460 aViewWindow->SetSelectionMode(FaceSelection);
1462 else if ( send == SelectBasePointButton )
1464 SMESH::SetPointRepresentation(true);
1465 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1466 aViewWindow->SetSelectionMode(NodeSelection);
1468 SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(SMESH::IDSOURCE);
1469 SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_VERTEX,
1471 QList<SUIT_SelectionFilter*> aListOfFilters;
1472 aListOfFilters << aMeshOrSubMeshFilter << aVertexFilter;
1474 mySelectionMgr->installFilter(new SMESH_LogicalFilter
1475 (aListOfFilters, SMESH_LogicalFilter::LO_OR, true));
1478 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1479 SelectionIntoArgument();
1482 //=================================================================================
1483 // function : DeactivateActiveDialog()
1484 // purpose : Deactivates this dialog
1485 //=================================================================================
1486 void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog()
1488 if (GroupButtons->isEnabled())
1490 GroupArguments->setEnabled(false);
1491 GroupButtons->setEnabled(false);
1492 SelectorWdg->setEnabled(false);
1493 mySMESHGUI->ResetState();
1494 mySMESHGUI->SetActiveDialogBox(0);
1498 //=================================================================================
1499 // function : ActivateThisDialog()
1500 // purpose : Activates this dialog
1501 //=================================================================================
1502 void SMESHGUI_ExtrusionDlg::ActivateThisDialog()
1504 // Emit a signal to deactivate the active dialog
1505 mySMESHGUI->EmitSignalDeactivateDialog();
1506 GroupArguments->setEnabled(true);
1507 GroupButtons->setEnabled(true);
1508 SelectorWdg->setEnabled(true);
1510 mySMESHGUI->SetActiveDialogBox(this);
1513 //=================================================================================
1514 // function : enterEvent()
1516 //=================================================================================
1517 void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*)
1519 if ( !GroupButtons->isEnabled() ) {
1520 SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
1521 if ( aViewWindow && !mySelector) {
1522 mySelector = aViewWindow->GetSelector();
1524 ActivateThisDialog();
1528 //=================================================================================
1529 // function : keyPressEvent()
1531 //=================================================================================
1532 void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e )
1534 QDialog::keyPressEvent( e );
1535 if ( e->isAccepted() )
1538 if ( e->key() == Qt::Key_F1 ) {
1544 //=================================================================================
1545 // function : isValid
1547 //=================================================================================
1548 bool SMESHGUI_ExtrusionDlg::isValid()
1552 if ( ExtrMethod_RBut0->isChecked() ) {
1553 ok = SpinBox_Dx->isValid( msg, true ) && ok;
1554 ok = SpinBox_Dy->isValid( msg, true ) && ok;
1555 ok = SpinBox_Dz->isValid( msg, true ) && ok;
1556 } else if ( ExtrMethod_RBut1->isChecked() ) {
1557 ok = SpinBox_Vx->isValid( msg, true ) && ok;
1558 ok = SpinBox_Vy->isValid( msg, true ) && ok;
1559 ok = SpinBox_Vz->isValid( msg, true ) && ok;
1560 ok = SpinBox_VDist->isValid( msg, true ) && ok;
1562 ok = SpinBox_NbSteps->isValid( msg, true ) && ok;
1564 if ( BasePointGrp->isChecked()) {
1565 ok = BasePoint_XSpin->isValid( msg, true ) && ok;
1566 ok = BasePoint_YSpin->isValid( msg, true ) && ok;
1567 ok = BasePoint_ZSpin->isValid( msg, true ) && ok;
1571 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1572 if ( !msg.isEmpty() )
1574 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1580 //=================================================================================
1581 // function : onDisplaySimulation
1582 // purpose : Show/Hide preview
1583 //=================================================================================
1584 void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview )
1586 if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
1587 if ( SelectorWdg->IsAnythingSelected() && isValid() && isValuesValid())
1590 SMESH::DirStruct aVector;
1591 getExtrusionVector(aVector);
1593 //Get Number of the steps
1594 long aNbSteps = (long)SpinBox_NbSteps->value();
1597 SUIT_OverrideCursor aWaitCursor;
1599 SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh();
1600 SMESH::SMESH_MeshEditor_var meshEditor = mesh->GetMeshEditPreviewer();
1601 SMESH::ListOfGroups_var groups;
1603 SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources();
1604 SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources();
1605 SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources();
1606 const int maxSelType = SelectorWdg->GetSelected( nodes, edges, faces );
1607 const bool makeGroups = false;
1609 if ( ExtrMethod_RBut2->isVisible() &&
1610 ExtrMethod_RBut2->isChecked() ) // Extrusion by normal
1612 double stepSize = (double) SpinBox_VDist->value();
1613 long nbSteps = (long) SpinBox_NbSteps->value();
1614 bool useInputElemsOnly = UseInputElemsOnlyCheck->isChecked();
1615 bool byAverageNormal = ByAverageNormalCheck->isChecked();
1616 int dim = (maxSelType == SMESH::FACE) ? 2 : 1;
1618 groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, byAverageNormal,
1619 useInputElemsOnly, makeGroups, dim );
1623 SMESH::double_array_var scales, basePoint, angles;
1624 bool scalesVariation, anglesVariation;
1625 getScaleParams( scales.out(), basePoint.out(), scalesVariation,
1626 angles.out(), anglesVariation );
1627 groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces,
1628 aVector, aNbSteps, makeGroups,
1629 scales, scalesVariation, basePoint,
1630 angles, anglesVariation );
1632 SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData();
1633 mySimulation->SetData(aMeshPreviewStruct);
1646 //=================================================================================
1647 // function : getExtrusionVector()
1648 // purpose : get direction of the extrusion
1649 //=================================================================================
1650 void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector)
1652 if ( ExtrMethod_RBut0->isChecked() )
1654 aVector.PS.x = SpinBox_Dx->GetValue();
1655 aVector.PS.y = SpinBox_Dy->GetValue();
1656 aVector.PS.z = SpinBox_Dz->GetValue();
1658 else if ( ExtrMethod_RBut1->isChecked() )
1660 gp_XYZ aNormale(SpinBox_Vx->GetValue(),
1661 SpinBox_Vy->GetValue(),
1662 SpinBox_Vz->GetValue());
1663 aNormale /= aNormale.Modulus();
1664 double aVDist = (double)SpinBox_VDist->value();
1666 aVector.PS.x = aNormale.X()*aVDist;
1667 aVector.PS.y = aNormale.Y()*aVDist;
1668 aVector.PS.z = aNormale.Z()*aVDist;
1672 //=======================================================================
1673 // function : OnScaleAdded()
1674 // purpose : Called when user adds Scale or Angle to the list
1675 //=======================================================================
1676 void SMESHGUI_ExtrusionDlg::OnScaleAdded()
1678 if ( sender() == AddScaleButton )
1681 if( !ScaleSpin->isValid( msg, true ) ) {
1682 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1683 if ( !msg.isEmpty() )
1685 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1688 ScalesList->addItem(ScaleSpin->text());
1689 myScalesList.append(ScaleSpin->GetValue());
1692 if ( sender() == AddAngleButton )
1695 if( !AngleSpin->isValid( msg, true ) ) {
1696 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1697 if ( !msg.isEmpty() )
1699 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1702 AnglesList->addItem(AngleSpin->text());
1703 myAnglesList.append(AngleSpin->GetValue());
1707 //=======================================================================
1708 // function : OnScaleRemoved()
1709 // purpose : Called when user removes Scales or Angles from the list
1710 //=======================================================================
1711 void SMESHGUI_ExtrusionDlg::OnScaleRemoved()
1713 QListWidget* widget;
1714 QList<double>* list;
1715 if ( sender() == RemoveScaleButton )
1717 widget = ScalesList;
1718 list = & myScalesList;
1722 widget = AnglesList;
1723 list = & myAnglesList;
1726 QList<QListWidgetItem*> aList = widget->selectedItems();
1727 QListWidgetItem* anItem;
1729 foreach(anItem, aList) {
1730 row = widget->row(anItem);
1731 list->removeAt(row);
1734 widget->setCurrentRow( row, QItemSelectionModel::Select );