1 // Copyright (C) 2007-2013 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.
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_AddMeshElementDlg.cxx
25 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
28 #include "SMESHGUI_AddQuadraticElementDlg.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_VTKUtils.h"
33 #include "SMESHGUI_MeshUtils.h"
34 #include "SMESHGUI_GroupUtils.h"
35 #include "SMESHGUI_IdValidator.h"
37 #include <SMESH_Actor.h>
38 #include <SMESH_ActorUtils.h>
39 #include <SMESH_FaceOrientationFilter.h>
40 #include <SMDS_Mesh.hxx>
42 // SALOME GUI includes
43 #include <SUIT_Desktop.h>
44 #include <SUIT_Session.h>
45 #include <SUIT_MessageBox.h>
46 #include <SUIT_ResourceMgr.h>
47 #include <SUIT_ViewManager.h>
49 #include <LightApp_SelectionMgr.h>
51 #include <SVTK_ViewModel.h>
52 #include <SVTK_ViewWindow.h>
54 #include <SALOME_ListIO.hxx>
56 #include <SalomeApp_Application.h>
59 #include <SALOMEconfig.h>
60 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
63 #include <TColStd_MapOfInteger.hxx>
66 #include <vtkIdList.h>
67 #include <vtkUnstructuredGrid.h>
68 #include <vtkDataSetMapper.h>
69 #include <vtkPolyDataMapper.h>
70 #include <vtkProperty.h>
71 #include <vtkCellType.h>
78 #include <QPushButton>
79 #include <QRadioButton>
80 #include <QVBoxLayout>
81 #include <QHBoxLayout>
82 #include <QGridLayout>
84 #include <QTableWidget>
86 #include <QButtonGroup>
96 void ReverseConnectivity( std::vector<vtkIdType> & ids, SMDSAbs_EntityType type,
97 bool toReverse, // inverse element
98 bool toVtkOrder ) // smds connectivity to vtk one
100 if ( toReverse ) // first reverse smds order
102 const std::vector<int>& index = SMDS_MeshCell::reverseSmdsOrder(type);
103 SMDS_MeshCell::applyInterlace( index, ids );
105 if ( toVtkOrder ) // from smds to vtk connectivity
107 const std::vector<int>& index = SMDS_MeshCell::toVtkOrder(type);
108 SMDS_MeshCell::applyInterlace( index, ids );
114 class TElementSimulation {
115 SalomeApp_Application* myApplication;
116 SUIT_ViewWindow* myViewWindow;
117 SVTK_ViewWindow* myVTKViewWindow;
119 SALOME_Actor* myPreviewActor;
120 vtkDataSetMapper* myMapper;
121 vtkUnstructuredGrid* myGrid;
122 //vtkProperty* myBackProp, *myProp;
124 //double myRGB[3], myBackRGB[3];
126 SALOME_Actor* myFaceOrientation;
127 vtkPolyDataMapper* myFaceOrientationDataMapper;
128 SMESH_FaceOrientationFilter* myFaceOrientationFilter;
131 TElementSimulation (SalomeApp_Application* theApplication)
133 myApplication = theApplication;
134 SUIT_ViewManager* mgr = theApplication->activeViewManager();
136 myViewWindow = mgr->getActiveView();
137 myVTKViewWindow = GetVtkViewWindow(myViewWindow);
139 myGrid = vtkUnstructuredGrid::New();
141 // Create and display actor
142 myMapper = vtkDataSetMapper::New();
143 myMapper->SetInputData(myGrid);
145 myPreviewActor = SALOME_Actor::New();
146 myPreviewActor->PickableOff();
147 myPreviewActor->VisibilityOff();
148 myPreviewActor->SetMapper(myMapper);
150 vtkProperty* myProp = vtkProperty::New();
151 double aRGB[3], aBackRGB[3];
152 GetColor( "SMESH", "fill_color", aRGB[0], aRGB[1], aRGB[2], QColor( 0, 170, 255 ) );
153 myProp->SetColor( aRGB[0], aRGB[1], aRGB[2] );
154 myPreviewActor->SetProperty( myProp );
157 vtkProperty* myBackProp = vtkProperty::New();
158 GetColor( "SMESH", "backface_color", aBackRGB[0], aBackRGB[1], aBackRGB[2], QColor( 0, 0, 255 ) );
159 myBackProp->SetColor( aBackRGB[0], aBackRGB[1], aBackRGB[2] );
160 myPreviewActor->SetBackfaceProperty( myBackProp );
161 myBackProp->Delete();
163 myVTKViewWindow->AddActor(myPreviewActor);
165 // Orientation of faces
166 myFaceOrientationFilter = SMESH_FaceOrientationFilter::New();
167 myFaceOrientationFilter->SetInputData(myGrid);
169 myFaceOrientationDataMapper = vtkPolyDataMapper::New();
170 myFaceOrientationDataMapper->SetInputConnection(myFaceOrientationFilter->GetOutputPort());
172 myFaceOrientation = SALOME_Actor::New();
173 myFaceOrientation->PickableOff();
174 myFaceOrientation->VisibilityOff();
175 myFaceOrientation->SetMapper(myFaceOrientationDataMapper);
177 vtkProperty* anOrientationProp = vtkProperty::New();
178 GetColor( "SMESH", "orientation_color", aRGB[0], aRGB[1], aRGB[2], QColor( 255, 255, 255 ) );
179 anOrientationProp->SetColor( aRGB[0], aRGB[1], aRGB[2] );
180 myFaceOrientation->SetProperty( anOrientationProp );
181 anOrientationProp->Delete();
183 myVTKViewWindow->AddActor(myFaceOrientation);
186 typedef std::vector<vtkIdType> TVTKIds;
187 void SetPosition (SMESH_Actor* theActor,
188 SMDSAbs_EntityType theType,
191 const bool theReverse)
193 vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid();
194 myGrid->SetPoints(aGrid->GetPoints());
198 ReverseConnectivity( theIds, theType, theReverse, /*toVtkOrder=*/true);
201 vtkIdList *anIds = vtkIdList::New();
203 for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) {
204 anIds->InsertId(i,theIds[i]);
205 //std::cout << i<< ": " << theIds[i] << std::endl;
208 vtkIdType aType = SMDS_MeshCell::toVtkType(theType);
209 myGrid->InsertNextCell(aType,anIds);
214 myPreviewActor->GetMapper()->Update();
215 myPreviewActor->SetRepresentation( theMode );
216 SetVisibility(true, theActor->GetFacesOriented());
220 void SetVisibility (bool theVisibility, bool theShowOrientation = false)
222 myPreviewActor->SetVisibility(theVisibility);
223 myFaceOrientation->SetVisibility(theShowOrientation);
224 RepaintCurrentView();
228 ~TElementSimulation()
230 if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) {
231 myVTKViewWindow->RemoveActor(myPreviewActor);
232 myVTKViewWindow->RemoveActor(myFaceOrientation);
234 myPreviewActor->Delete();
235 myFaceOrientation->Delete();
237 myMapper->RemoveAllInputs();
240 myFaceOrientationFilter->Delete();
242 myFaceOrientationDataMapper->RemoveAllInputs();
243 myFaceOrientationDataMapper->Delete();
248 // myBackProp->Delete();
254 // Define the sequences of ids
255 static int FirstEdgeIds[] = {0};
256 static int LastEdgeIds[] = {1};
258 static int FirstTriangleIds[] = {0,1,2};
259 static int LastTriangleIds[] = {1,2,0};
261 static int FirstQuadrangleIds[] = {0,1,2,3};
262 static int LastQuadrangleIds[] = {1,2,3,0};
264 static int FirstTetrahedronIds[] = {0,1,2,3,3,3};
265 static int LastTetrahedronIds[] = {1,2,0,0,1,2};
267 static int FirstPyramidIds[] = {0,1,2,3,4,4,4,4};
268 static int LastPyramidIds[] = {1,2,3,0,0,1,2,3};
270 static int FirstPentahedronIds[] = {0,1,2,3,4,5,0,1,2};
271 static int LastPentahedronIds[] = {1,2,0,4,5,3,3,4,5};
273 static int FirstHexahedronIds[] = {0,1,2,3,4,5,6,7,0,1,2,3};
274 static int LastHexahedronIds[] = {1,2,3,0,5,6,7,4,4,5,6,7};
278 \brief Simple 'busy state' flag locker.
284 //! Constructor. Sets passed boolean flag to \c true.
285 BusyLocker( bool& busy ) : myBusy( busy ) { myBusy = true; }
286 //! Destructor. Clear external boolean flag passed as parameter to the constructor to \c false.
287 ~BusyLocker() { myBusy = false; }
289 bool& myBusy; //! External 'busy state' boolean flag
294 \brief Simple editable table item.
297 class IdEditItem: public QTableWidgetItem
300 IdEditItem(const QString& text );
303 QWidget* createEditor() const;
306 IdEditItem::IdEditItem(const QString& text )
307 : QTableWidgetItem(text, QTableWidgetItem::UserType+100)
311 IdEditItem::~IdEditItem()
315 QWidget* IdEditItem::createEditor() const
317 QLineEdit *aLineEdit = new QLineEdit(text(), tableWidget());
318 aLineEdit->setValidator( new SMESHGUI_IdValidator(tableWidget(), 1) );
322 //=================================================================================
323 // function : SMESHGUI_AddQuadraticElementDlg()
324 // purpose : constructor
325 //=================================================================================
327 SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theModule,
328 const SMDSAbs_EntityType theType )
329 : QDialog( SMESH::GetDesktop( theModule ) ),
330 mySMESHGUI( theModule ),
331 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
332 myGeomType( theType ),
337 setAttribute( Qt::WA_DeleteOnClose, true );
339 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>
340 (SUIT_Session::session()->activeApplication());
342 mySimulation = new SMESH::TElementSimulation (anApp);
343 mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
345 QString anElementName;
347 switch ( myGeomType ) {
348 case SMDSEntity_Quad_Edge:
349 anElementName = QString("QUADRATIC_EDGE");
351 case SMDSEntity_Quad_Triangle:
352 anElementName = QString("QUADRATIC_TRIANGLE");
354 case SMDSEntity_Quad_Quadrangle:
355 anElementName = QString("QUADRATIC_QUADRANGLE");
357 case SMDSEntity_BiQuad_Quadrangle:
358 anElementName = QString("BIQUADRATIC_QUADRANGLE");
360 case SMDSEntity_BiQuad_Triangle:
361 anElementName = QString("BIQUADRATIC_TRIANGLE");
363 case SMDSEntity_Quad_Tetra:
364 anElementName = QString("QUADRATIC_TETRAHEDRON");
366 case SMDSEntity_Quad_Pyramid:
367 anElementName = QString("QUADRATIC_PYRAMID");
369 case SMDSEntity_Quad_Penta:
370 anElementName = QString("QUADRATIC_PENTAHEDRON");
372 case SMDSEntity_Quad_Hexa:
373 anElementName = QString("QUADRATIC_HEXAHEDRON");
375 case SMDSEntity_TriQuad_Hexa:
376 anElementName = QString("TRIQUADRATIC_HEXAHEDRON");
379 myGeomType = SMDSEntity_Quad_Edge;
380 anElementName = QString("QUADRATIC_EDGE");
383 QString iconName = tr(QString("ICON_DLG_%1").arg(anElementName).toLatin1().data());
384 QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(anElementName).toLatin1().data());
385 QString argumentsGrTitle = tr(QString("SMESH_ADD_%1").arg(anElementName).toLatin1().data());
386 QString constructorGrTitle = tr(QString("SMESH_%1").arg(anElementName).toLatin1().data());
388 QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", iconName));
389 QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
391 setWindowTitle(caption);
393 setSizeGripEnabled(true);
395 QVBoxLayout* aDialogLayout = new QVBoxLayout(this);
396 aDialogLayout->setSpacing(SPACING);
397 aDialogLayout->setMargin(MARGIN);
399 /***************************************************************/
400 GroupConstructors = new QGroupBox(constructorGrTitle, this);
401 QButtonGroup* ButtonGroup = new QButtonGroup(this);
402 QHBoxLayout* aGroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
403 aGroupConstructorsLayout->setSpacing(SPACING);
404 aGroupConstructorsLayout->setMargin(MARGIN);
406 myRadioButton1 = new QRadioButton(GroupConstructors);
407 myRadioButton1->setIcon(image0);
408 aGroupConstructorsLayout->addWidget(myRadioButton1);
409 ButtonGroup->addButton(myRadioButton1, 0);
411 /***************************************************************/
412 GroupArguments = new QGroupBox(argumentsGrTitle, this);
413 QGridLayout* aGroupArgumentsLayout = new QGridLayout(GroupArguments);
414 aGroupArgumentsLayout->setSpacing(SPACING);
415 aGroupArgumentsLayout->setMargin(MARGIN);
418 QLabel* aCornerNodesLabel = new QLabel(tr("SMESH_CORNER_NODES"), GroupArguments);
419 myCornerSelectButton = new QPushButton(GroupArguments);
420 myCornerSelectButton->setIcon(image1);
421 myCornerNodes = new QLineEdit(GroupArguments);
424 myTable = new QTableWidget(GroupArguments);
427 myMidFaceLabel = new QLabel(tr("SMESH_MIDFACE_NODES"), GroupArguments);
428 myMidFaceSelectButton = new QPushButton(GroupArguments);
429 myMidFaceSelectButton->setIcon(image1);
430 myMidFaceNodes = new QLineEdit(GroupArguments);
431 myMidFaceNodes->setValidator(new SMESHGUI_IdValidator(this, 6));
434 myCenterLabel = new QLabel(tr("SMESH_CENTER_NODE"), GroupArguments);
435 myCenterSelectButton = new QPushButton(GroupArguments);
436 myCenterSelectButton->setIcon(image1);
437 myCenterNode = new QLineEdit(GroupArguments);
438 myCenterNode->setValidator(new SMESHGUI_IdValidator(this, 1));
440 myReverseCB = new QCheckBox(tr("SMESH_REVERSE"), GroupArguments);
442 aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0);
443 aGroupArgumentsLayout->addWidget(myCornerSelectButton, 0, 1);
444 aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2);
445 aGroupArgumentsLayout->addWidget(myTable, 1, 0, 1, 3);
446 aGroupArgumentsLayout->addWidget(myMidFaceLabel, 2, 0);
447 aGroupArgumentsLayout->addWidget(myMidFaceSelectButton, 2, 1);
448 aGroupArgumentsLayout->addWidget(myMidFaceNodes, 2, 2);
449 aGroupArgumentsLayout->addWidget(myCenterLabel, 3, 0);
450 aGroupArgumentsLayout->addWidget(myCenterSelectButton, 3, 1);
451 aGroupArgumentsLayout->addWidget(myCenterNode, 3, 2);
452 aGroupArgumentsLayout->addWidget(myReverseCB, 4, 0, 1, 3);
454 /***************************************************************/
455 GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this );
456 GroupGroups->setCheckable( true );
457 QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups);
458 GroupGroupsLayout->setSpacing(SPACING);
459 GroupGroupsLayout->setMargin(MARGIN);
461 TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
462 ComboBox_GroupName = new QComboBox( GroupGroups );
463 ComboBox_GroupName->setEditable( true );
464 ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
466 GroupGroupsLayout->addWidget( TextLabel_GroupName );
467 GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
469 /***************************************************************/
470 GroupButtons = new QGroupBox(this);
471 QHBoxLayout* aGroupButtonsLayout = new QHBoxLayout(GroupButtons);
472 aGroupButtonsLayout->setSpacing(SPACING);
473 aGroupButtonsLayout->setMargin(MARGIN);
475 buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
476 buttonOk->setAutoDefault(true);
477 buttonOk->setDefault(true);
478 buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
479 buttonApply->setAutoDefault(true);
480 buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
481 buttonCancel->setAutoDefault(true);
482 buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
483 buttonHelp->setAutoDefault(true);
485 aGroupButtonsLayout->addWidget(buttonOk);
486 aGroupButtonsLayout->addSpacing(10);
487 aGroupButtonsLayout->addWidget(buttonApply);
488 aGroupButtonsLayout->addSpacing(10);
489 aGroupButtonsLayout->addStretch();
490 aGroupButtonsLayout->addWidget(buttonCancel);
491 aGroupButtonsLayout->addWidget(buttonHelp);
493 /***************************************************************/
494 aDialogLayout->addWidget(GroupConstructors);
495 aDialogLayout->addWidget(GroupArguments);
496 aDialogLayout->addWidget(GroupGroups);
497 aDialogLayout->addWidget(GroupButtons);
499 Init(); /* Initialisations */
502 //=================================================================================
503 // function : ~SMESHGUI_AddQuadraticElementDlg()
504 // purpose : Destroys the object and frees any allocated resources
505 //=================================================================================
507 SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg()
512 //=================================================================================
515 //=================================================================================
517 void SMESHGUI_AddQuadraticElementDlg::Init()
519 myRadioButton1->setChecked(true);
520 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
522 /* reset "Add to group" control */
523 GroupGroups->setChecked( false );
526 myNbMidFaceNodes = 0;
531 switch (myGeomType) {
532 case SMDSEntity_Quad_Edge:
535 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_edges
537 case SMDSEntity_Quad_Triangle:
540 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles
542 case SMDSEntity_BiQuad_Triangle:
546 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles
548 case SMDSEntity_Quad_Quadrangle:
551 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles
553 case SMDSEntity_BiQuad_Quadrangle:
557 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles
559 case SMDSEntity_Quad_Tetra:
562 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_tetrahedrons
564 case SMDSEntity_Quad_Pyramid:
567 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pyramids
569 case SMDSEntity_Quad_Penta:
572 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pentahedrons
574 case SMDSEntity_Quad_Hexa:
577 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons
579 case SMDSEntity_TriQuad_Hexa:
582 myNbMidFaceNodes = 6;
584 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons
588 myMidFaceLabel ->setVisible( myNbMidFaceNodes );
589 myMidFaceSelectButton->setVisible( myNbMidFaceNodes );
590 myMidFaceNodes ->setVisible( myNbMidFaceNodes );
591 myCenterLabel ->setVisible( myNbCenterNodes );
592 myCenterSelectButton ->setVisible( myNbCenterNodes );
593 myCenterNode ->setVisible( myNbCenterNodes );
595 myCornerNodes->setValidator(new SMESHGUI_IdValidator(this, myNbCorners));
597 /* initialize table */
598 myTable->setColumnCount(3);
599 myTable->setRowCount(aNumRows);
601 QStringList aColLabels;
602 aColLabels.append(tr("SMESH_FIRST"));
603 aColLabels.append(tr("SMESH_MIDDLE"));
604 aColLabels.append(tr("SMESH_LAST"));
605 myTable->setHorizontalHeaderLabels(aColLabels);
607 for ( int col = 0; col < myTable->columnCount(); col++ )
608 myTable->setColumnWidth(col, 80);
610 //myTable->setColumnReadOnly(0, true); // VSR: TODO
611 //myTable->setColumnReadOnly(2, true); // VSR: TODO
613 myTable->setEnabled( false );
615 for ( int row = 0; row < myTable->rowCount(); row++ )
617 myTable->setItem( row, 0, new QTableWidgetItem( "" ) );
618 myTable->item( row, 0 )->setFlags(0);
620 IdEditItem* anEditItem = new IdEditItem( "" );
621 anEditItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
622 myTable->setItem(row, 1, anEditItem);
624 myTable->setItem( row, 2, new QTableWidgetItem( "" ) );
625 myTable->item( row, 2 )->setFlags(0);
628 /* signals and slots connections */
629 connect(myCornerSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
630 connect(myMidFaceSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
631 connect(myCenterSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
632 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument()));
633 connect(myTable, SIGNAL(cellDoubleClicked(int, int)), SLOT(onCellDoubleClicked(int, int)));
634 connect(myTable, SIGNAL(cellChanged (int, int)), SLOT(onCellTextChange(int, int)));
635 connect(myCornerNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
636 connect(myMidFaceNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
637 connect(myCenterNode, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
638 connect(myReverseCB, SIGNAL(stateChanged(int)), SLOT(onReverse(int)));
640 connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk()));
641 connect(buttonCancel, SIGNAL(clicked()), SLOT(reject()));
642 connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply()));
643 connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp()));
645 connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
646 connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(reject()));
647 connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(reject()));
649 myCurrentLineEdit = myCornerNodes;
651 // set selection mode
652 SMESH::SetPointRepresentation(true);
654 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
655 aViewWindow->SetSelectionMode( NodeSelection );
657 SelectionIntoArgument();
660 //=================================================================================
661 // function : ClickOnApply()
663 //=================================================================================
665 bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
670 if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() )
673 BusyLocker lock( myBusy );
675 std::vector<vtkIdType> anIds;
677 switch (myGeomType) {
678 case SMDSEntity_Quad_Edge:
679 anIds.push_back(myTable->item(0, 0)->text().toInt());
680 anIds.push_back(myTable->item(0, 2)->text().toInt());
681 anIds.push_back(myTable->item(0, 1)->text().toInt());
683 case SMDSEntity_Quad_Triangle:
684 case SMDSEntity_Quad_Quadrangle:
685 case SMDSEntity_BiQuad_Triangle:
686 case SMDSEntity_BiQuad_Quadrangle:
687 case SMDSEntity_Quad_Tetra:
688 case SMDSEntity_Quad_Pyramid:
689 case SMDSEntity_Quad_Penta:
690 case SMDSEntity_Quad_Hexa:
691 case SMDSEntity_TriQuad_Hexa:
692 for ( int row = 0; row < myNbCorners; row++ )
693 anIds.push_back(myTable->item(row, 0)->text().toInt());
694 for ( int row = 0; row < myTable->rowCount(); row++ )
695 anIds.push_back(myTable->item(row, 1)->text().toInt());
696 if ( myNbMidFaceNodes )
698 QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
699 for (int i = 0; i < aListId.count(); i++)
700 anIds.push_back( aListId[ i ].toInt() );
702 if ( myNbCenterNodes )
704 QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts);
705 anIds.push_back( aListId[ 0 ].toInt() );
709 if ( myReverseCB->isChecked())
710 ReverseConnectivity( anIds, myGeomType, /*toReverse=*/true, /*toVtkOrder=*/false );
712 int aNumberOfIds = anIds.size();
713 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
714 anArrayOfIdeces->length( aNumberOfIds );
716 for (int i = 0; i < aNumberOfIds; i++)
717 anArrayOfIdeces[i] = anIds[ i ];
719 bool addToGroup = GroupGroups->isChecked();
722 SMESH::SMESH_GroupBase_var aGroup;
725 aGroupName = ComboBox_GroupName->currentText();
726 for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
727 QString aName = ComboBox_GroupName->itemText( i );
728 if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
731 if ( idx > 0 && idx <= myGroups.count() ) {
732 SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
733 if ( !aGeomGroup->_is_nil() ) {
734 int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
735 tr( "MESH_STANDALONE_GRP_CHOSEN" ).arg( aGroupName ),
736 tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 );
737 if ( res == 1 ) return false;
739 aGroup = myGroups[idx-1];
743 SMESH::ElementType anElementType;
745 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
746 switch (myGeomType) {
747 case SMDSEntity_Quad_Edge:
748 anElementType = SMESH::EDGE;
749 anElemId = aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break;
750 case SMDSEntity_Quad_Triangle:
751 case SMDSEntity_Quad_Quadrangle:
752 case SMDSEntity_BiQuad_Triangle:
753 case SMDSEntity_BiQuad_Quadrangle:
754 anElementType = SMESH::FACE;
755 anElemId = aMeshEditor->AddFace(anArrayOfIdeces.inout()); break;
756 case SMDSEntity_Quad_Tetra:
757 case SMDSEntity_Quad_Pyramid:
758 case SMDSEntity_Quad_Penta:
759 case SMDSEntity_Quad_Hexa:
760 case SMDSEntity_TriQuad_Hexa:
761 anElementType = SMESH::VOLUME;
762 anElemId = aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break;
766 if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) {
767 SMESH::SMESH_Group_var aGroupUsed;
768 if ( aGroup->_is_nil() ) {
770 aGroupUsed = SMESH::AddGroup( myMesh, anElementType, aGroupName );
771 if ( !aGroupUsed->_is_nil() ) {
772 myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroupUsed));
773 ComboBox_GroupName->addItem( aGroupName );
777 SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup );
778 if ( !aGeomGroup->_is_nil() ) {
779 aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup );
780 if ( !aGroupUsed->_is_nil() && idx > 0 ) {
781 myGroups[idx-1] = SMESH::SMESH_GroupBase::_duplicate(aGroupUsed);
782 SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser();
786 aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup );
789 if ( !aGroupUsed->_is_nil() ) {
790 SMESH::long_array_var anIdList = new SMESH::long_array;
791 anIdList->length( 1 );
792 anIdList[0] = anElemId;
793 aGroupUsed->Add( anIdList.inout() );
797 SALOME_ListIO aList; aList.Append( myActor->getIO() );
798 mySelector->ClearIndex();
799 mySelectionMgr->setSelectedObjects( aList, false );
801 mySimulation->SetVisibility(false);
805 SetCurrentSelection();
809 SMESHGUI::Modified();
814 //=================================================================================
815 // function : ClickOnOk()
817 //=================================================================================
819 void SMESHGUI_AddQuadraticElementDlg::ClickOnOk()
821 if ( ClickOnApply() )
825 //=================================================================================
826 // function : reject()
828 //=================================================================================
830 void SMESHGUI_AddQuadraticElementDlg::reject()
832 mySelectionMgr->clearSelected();
833 mySimulation->SetVisibility(false);
834 SMESH::SetPointRepresentation(false);
835 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
836 aViewWindow->SetSelectionMode( ActorSelection );
837 disconnect(mySelectionMgr, 0, this, 0);
838 mySMESHGUI->ResetState();
842 //=================================================================================
843 // function : ClickOnHelp()
845 //=================================================================================
847 void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp()
849 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
851 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
855 platform = "winapplication";
857 platform = "application";
859 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
860 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
861 arg(app->resourceMgr()->stringValue("ExternalBrowser",
863 arg(myHelpFileName));
867 //=================================================================================
868 // function : onTextChange()
870 //=================================================================================
872 void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText)
875 BusyLocker lock( myBusy );
877 mySimulation->SetVisibility(false);
879 // hilight entered nodes
880 SMDS_Mesh* aMesh = 0;
882 aMesh = myActor->GetObject()->GetMesh();
884 QLineEdit* send = (QLineEdit*)sender();
885 if (send == myCornerNodes ||
886 send == myMidFaceNodes ||
887 send == myCenterNode)
888 myCurrentLineEdit = send;
891 TColStd_MapOfInteger newIndices;
893 QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
895 for (int i = 0; i < aListId.count(); i++) {
896 if ( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) )
898 newIndices.Add( n->GetID() );
907 mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
908 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
909 aViewWindow->highlight( myActor->getIO(), true, true );
911 if ( myCurrentLineEdit == myCornerNodes )
912 UpdateTable( allOk );
919 //=================================================================================
920 // function : SelectionIntoArgument()
921 // purpose : Called when selection has changed
922 //=================================================================================
924 void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument()
927 BusyLocker lock( myBusy );
929 QString aCurrentEntry = myEntry;
931 if ( myCurrentLineEdit )
936 myCurrentLineEdit->setText("");
938 if (!GroupButtons->isEnabled()) // inactive
941 mySimulation->SetVisibility(false);
945 mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
947 if (aList.Extent() != 1)
954 Handle(SALOME_InteractiveObject) anIO = aList.First();
955 myEntry = anIO->getEntry();
956 myMesh = SMESH::GetMeshByIO(anIO);
957 if (myMesh->_is_nil()) {
962 myActor = SMESH::FindActorByEntry(anIO->getEntry());
967 if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) {
968 SMESH::ElementType anElementType;
969 switch ( myGeomType ) {
970 case SMDSEntity_Quad_Edge:
971 anElementType = SMESH::EDGE; break;
972 case SMDSEntity_Quad_Triangle:
973 case SMDSEntity_Quad_Quadrangle:
974 case SMDSEntity_BiQuad_Triangle:
975 case SMDSEntity_BiQuad_Quadrangle:
976 anElementType = SMESH::FACE; break;
977 case SMDSEntity_Quad_Tetra:
978 case SMDSEntity_Quad_Pyramid:
979 case SMDSEntity_Quad_Penta:
980 case SMDSEntity_Quad_Hexa:
981 case SMDSEntity_TriQuad_Hexa:
982 anElementType = SMESH::VOLUME; break;
985 ComboBox_GroupName->clear();
986 ComboBox_GroupName->addItem( QString() );
987 SMESH::ListOfGroups aListOfGroups = *myMesh->GetGroups();
988 for ( int i = 0, n = aListOfGroups.length(); i < n; i++ ) {
989 SMESH::SMESH_GroupBase_var aGroup = aListOfGroups[i];
990 if ( !aGroup->_is_nil() && aGroup->GetType() == anElementType ) {
991 QString aGroupName( aGroup->GetName() );
992 if ( !aGroupName.isEmpty() ) {
993 myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroup));
994 ComboBox_GroupName->addItem( aGroupName );
1005 // get selected nodes
1006 QString aString = "";
1007 int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,myActor->getIO(),aString);
1009 if ( myCurrentLineEdit )
1011 if ( myCurrentLineEdit != myCenterNode || nbNodes == 1 )
1012 myCurrentLineEdit->setText(aString);
1014 if ( myCurrentLineEdit == myCornerNodes )
1017 else if ( myTable->isEnabled() && nbNodes == 1 )
1019 int theRow = myTable->currentRow(), theCol = myTable->currentColumn();
1021 myTable->item(theRow, 1)->setText(aString);
1025 displaySimulation();
1028 //=================================================================================
1029 // function : displaySimulation()
1031 //=================================================================================
1033 void SMESHGUI_AddQuadraticElementDlg::displaySimulation()
1037 SMESH::TElementSimulation::TVTKIds anIds;
1039 // Collect ids from the dialog
1042 int aDisplayMode = VTK_SURFACE;
1044 if ( myGeomType == SMDSEntity_Quad_Edge )
1046 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 0)->text().toInt() ) );
1047 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 2)->text().toInt() ) );
1048 anID = myTable->item(0, 1)->text().toInt(&ok);
1049 if (!ok) anID = myTable->item(0, 0)->text().toInt();
1050 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
1051 aDisplayMode = VTK_WIREFRAME;
1055 for ( int row = 0; row < myNbCorners; row++ )
1056 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) );
1058 for ( int row = 0; row < myTable->rowCount(); row++ )
1060 anID = myTable->item(row, 1)->text().toInt(&ok);
1062 anID = myTable->item(row, 0)->text().toInt();
1063 aDisplayMode = VTK_WIREFRAME;
1065 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
1067 if ( myNbMidFaceNodes )
1069 QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
1070 for (int i = 0; i < aListId.count(); i++)
1071 anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ i ].toInt() ));
1073 if ( myNbCenterNodes )
1075 QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts);
1076 anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ 0 ].toInt() ));
1080 mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked());
1084 mySimulation->SetVisibility(false);
1086 SMESH::UpdateView();
1089 //=================================================================================
1090 // function : SetCurrentSelection()
1092 //=================================================================================
1094 void SMESHGUI_AddQuadraticElementDlg::SetCurrentSelection()
1096 QPushButton* send = (QPushButton*)sender();
1097 myCurrentLineEdit = 0;
1099 if (send == myCornerSelectButton)
1100 myCurrentLineEdit = myCornerNodes;
1101 else if ( send == myMidFaceSelectButton )
1102 myCurrentLineEdit = myMidFaceNodes;
1103 else if ( send == myCenterSelectButton )
1104 myCurrentLineEdit = myCenterNode;
1106 if ( myCurrentLineEdit )
1108 myCurrentLineEdit->setFocus();
1109 SelectionIntoArgument();
1113 //=================================================================================
1114 // function : DeactivateActiveDialog()
1116 //=================================================================================
1118 void SMESHGUI_AddQuadraticElementDlg::DeactivateActiveDialog()
1120 if (GroupConstructors->isEnabled()) {
1121 GroupConstructors->setEnabled(false);
1122 GroupArguments->setEnabled(false);
1123 GroupButtons->setEnabled(false);
1124 mySimulation->SetVisibility(false);
1125 mySMESHGUI->ResetState();
1126 mySMESHGUI->SetActiveDialogBox(0);
1130 //=================================================================================
1131 // function : ActivateThisDialog()
1133 //=================================================================================
1135 void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog()
1137 /* Emit a signal to deactivate the active dialog */
1138 mySMESHGUI->EmitSignalDeactivateDialog();
1140 GroupConstructors->setEnabled(true);
1141 GroupArguments->setEnabled(true);
1142 GroupButtons->setEnabled(true);
1144 SMESH::SetPointRepresentation(true);
1146 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1147 aViewWindow->SetSelectionMode( NodeSelection );
1148 SelectionIntoArgument();
1151 //=================================================================================
1152 // function : enterEvent()
1154 //=================================================================================
1156 void SMESHGUI_AddQuadraticElementDlg::enterEvent (QEvent*)
1158 if (GroupConstructors->isEnabled())
1160 ActivateThisDialog();
1163 //=================================================================================
1164 // function : onReverse()
1166 //=================================================================================
1168 void SMESHGUI_AddQuadraticElementDlg::onReverse (int state)
1170 mySimulation->SetVisibility(false);
1171 displaySimulation();
1175 //=================================================================================
1176 // function : IsValid()
1178 //=================================================================================
1180 bool SMESHGUI_AddQuadraticElementDlg::IsValid()
1182 SMDS_Mesh* aMesh = 0;
1184 aMesh = myActor->GetObject()->GetMesh();
1189 std::set< int > okIDs;
1190 for ( int row = 0; row < myTable->rowCount(); row++ )
1192 int anID = myTable->item(row, 1)->text().toInt(&ok);
1196 const SMDS_MeshNode * aNode = aMesh->FindNode(anID);
1199 okIDs.insert( anID );
1202 QStringList aListId;
1203 if ( myNbMidFaceNodes )
1204 aListId += myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
1205 if ( myNbCenterNodes )
1206 aListId += myCenterNode->text().split(" ", QString::SkipEmptyParts);
1208 for (int i = 0; i < aListId.count(); i++)
1210 int anID = aListId[ i ].toInt(&ok);
1214 if ( !aMesh->FindNode(anID) )
1216 okIDs.insert( anID );
1219 return okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes;
1222 //=================================================================================
1223 // function : UpdateTable()
1225 //=================================================================================
1227 void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity )
1229 QStringList aListCorners = myCornerNodes->text().split(" ", QString::SkipEmptyParts);
1231 if ( aListCorners.count() == myNbCorners && theConersValidity )
1233 myTable->setEnabled( true );
1235 // clear the Middle column
1236 for ( int row = 0; row < myTable->rowCount(); row++ )
1237 myTable->item( row, 1 )->setText("");
1242 switch (myGeomType) {
1243 case SMDSEntity_Quad_Edge:
1244 aFirstColIds = FirstEdgeIds;
1245 aLastColIds = LastEdgeIds;
1247 case SMDSEntity_Quad_Triangle:
1248 case SMDSEntity_BiQuad_Triangle:
1249 aFirstColIds = FirstTriangleIds;
1250 aLastColIds = LastTriangleIds;
1252 case SMDSEntity_Quad_Quadrangle:
1253 case SMDSEntity_BiQuad_Quadrangle:
1254 aFirstColIds = FirstQuadrangleIds;
1255 aLastColIds = LastQuadrangleIds;
1257 case SMDSEntity_Quad_Tetra:
1258 aFirstColIds = FirstTetrahedronIds;
1259 aLastColIds = LastTetrahedronIds;
1261 case SMDSEntity_Quad_Pyramid:
1262 aFirstColIds = FirstPyramidIds;
1263 aLastColIds = LastPyramidIds;
1265 case SMDSEntity_Quad_Penta:
1266 aFirstColIds = FirstPentahedronIds;
1267 aLastColIds = LastPentahedronIds;
1269 case SMDSEntity_Quad_Hexa:
1270 case SMDSEntity_TriQuad_Hexa:
1271 aFirstColIds = FirstHexahedronIds;
1272 aLastColIds = LastHexahedronIds;
1276 // fill the First and the Last columns
1277 for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++)
1278 myTable->item( i, 0 )->setText( aListCorners[ aFirstColIds[i] ] );
1280 for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++)
1281 myTable->item( i, 2 )->setText( aListCorners[ aLastColIds[i] ] );
1286 for ( int row = 0; row < myTable->rowCount(); row++ )
1287 for ( int col = 0; col < myTable->columnCount(); col++ )
1288 if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText("");
1290 myTable->setEnabled( false );
1294 //=================================================================================
1295 // function : onTableActivate()
1297 //=================================================================================
1299 void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol )
1301 myCurrentLineEdit = 0;
1302 displaySimulation();
1306 //=================================================================================
1307 // function : onCellTextChange()
1309 //=================================================================================
1311 void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol)
1313 myCurrentLineEdit = 0;
1314 displaySimulation();
1318 //=================================================================================
1319 // function : keyPressEvent()
1321 //=================================================================================
1323 void SMESHGUI_AddQuadraticElementDlg::keyPressEvent( QKeyEvent* e )
1325 QDialog::keyPressEvent( e );
1326 if ( e->isAccepted() )
1329 if ( e->key() == Qt::Key_F1 ) {
1335 //=======================================================================
1336 //function : updateButtons
1338 //=======================================================================
1340 void SMESHGUI_AddQuadraticElementDlg::updateButtons()
1342 bool valid = IsValid();
1343 buttonOk->setEnabled( valid );
1344 buttonApply->setEnabled( valid );
1347 //=================================================================================
1348 // function : isValid
1350 //=================================================================================
1352 bool SMESHGUI_AddQuadraticElementDlg::isValid()
1354 if( GroupGroups->isChecked() && ComboBox_GroupName->currentText().isEmpty() ) {
1355 SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) );