1 // Copyright (C) 2007-2012 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 //vtkFloatingPointType 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->SetInput(myGrid);
145 myPreviewActor = SALOME_Actor::New();
146 myPreviewActor->PickableOff();
147 myPreviewActor->VisibilityOff();
148 myPreviewActor->SetMapper(myMapper);
150 vtkProperty* myProp = vtkProperty::New();
151 vtkFloatingPointType 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->SetInput(myGrid);
169 myFaceOrientationDataMapper = vtkPolyDataMapper::New();
170 myFaceOrientationDataMapper->SetInput(myFaceOrientationFilter->GetOutput());
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.
285 //! Constructor. Sets passed boolean flag to \c true.
286 BusyLocker( bool& busy ) : myBusy( busy ) { myBusy = true; }
287 //! Destructor. Clear external boolean flag passed as parameter to the constructor to \c false.
288 ~BusyLocker() { myBusy = false; }
290 bool& myBusy; //! External 'busy state' boolean flag
295 \brief Simple editable table item.
299 class IdEditItem: public QTableWidgetItem
302 IdEditItem(const QString& text );
305 QWidget* createEditor() const;
308 IdEditItem::IdEditItem(const QString& text )
309 : QTableWidgetItem(text, QTableWidgetItem::UserType+100)
313 IdEditItem::~IdEditItem()
317 QWidget* IdEditItem::createEditor() const
319 QLineEdit *aLineEdit = new QLineEdit(text(), tableWidget());
320 aLineEdit->setValidator( new SMESHGUI_IdValidator(tableWidget(), 1) );
324 //=================================================================================
325 // function : SMESHGUI_AddQuadraticElementDlg()
326 // purpose : constructor
327 //=================================================================================
328 SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theModule,
329 const SMDSAbs_EntityType theType )
330 : QDialog( SMESH::GetDesktop( theModule ) ),
331 mySMESHGUI( theModule ),
332 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
333 myGeomType( theType ),
338 setAttribute( Qt::WA_DeleteOnClose, true );
340 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>
341 (SUIT_Session::session()->activeApplication());
343 mySimulation = new SMESH::TElementSimulation (anApp);
344 mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
346 QString anElementName;
348 switch ( myGeomType ) {
349 case SMDSEntity_Quad_Edge:
350 anElementName = QString("QUADRATIC_EDGE");
352 case SMDSEntity_Quad_Triangle:
353 anElementName = QString("QUADRATIC_TRIANGLE");
355 case SMDSEntity_Quad_Quadrangle:
356 anElementName = QString("QUADRATIC_QUADRANGLE");
358 case SMDSEntity_BiQuad_Quadrangle:
359 anElementName = QString("BIQUADRATIC_QUADRANGLE");
361 case SMDSEntity_Quad_Tetra:
362 anElementName = QString("QUADRATIC_TETRAHEDRON");
364 case SMDSEntity_Quad_Pyramid:
365 anElementName = QString("QUADRATIC_PYRAMID");
367 case SMDSEntity_Quad_Penta:
368 anElementName = QString("QUADRATIC_PENTAHEDRON");
370 case SMDSEntity_Quad_Hexa:
371 anElementName = QString("QUADRATIC_HEXAHEDRON");
373 case SMDSEntity_TriQuad_Hexa:
374 anElementName = QString("TRIQUADRATIC_HEXAHEDRON");
377 myGeomType = SMDSEntity_Quad_Edge;
378 anElementName = QString("QUADRATIC_EDGE");
381 QString iconName = tr(QString("ICON_DLG_%1").arg(anElementName).toLatin1().data());
382 QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(anElementName).toLatin1().data());
383 QString argumentsGrTitle = tr(QString("SMESH_ADD_%1").arg(anElementName).toLatin1().data());
384 QString constructorGrTitle = tr(QString("SMESH_%1").arg(anElementName).toLatin1().data());
386 QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", iconName));
387 QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
389 setWindowTitle(caption);
391 setSizeGripEnabled(true);
393 QVBoxLayout* aDialogLayout = new QVBoxLayout(this);
394 aDialogLayout->setSpacing(SPACING);
395 aDialogLayout->setMargin(MARGIN);
397 /***************************************************************/
398 GroupConstructors = new QGroupBox(constructorGrTitle, this);
399 QButtonGroup* ButtonGroup = new QButtonGroup(this);
400 QHBoxLayout* aGroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
401 aGroupConstructorsLayout->setSpacing(SPACING);
402 aGroupConstructorsLayout->setMargin(MARGIN);
404 myRadioButton1 = new QRadioButton(GroupConstructors);
405 myRadioButton1->setIcon(image0);
406 aGroupConstructorsLayout->addWidget(myRadioButton1);
407 ButtonGroup->addButton(myRadioButton1, 0);
409 /***************************************************************/
410 GroupArguments = new QGroupBox(argumentsGrTitle, this);
411 QGridLayout* aGroupArgumentsLayout = new QGridLayout(GroupArguments);
412 aGroupArgumentsLayout->setSpacing(SPACING);
413 aGroupArgumentsLayout->setMargin(MARGIN);
416 QLabel* aCornerNodesLabel = new QLabel(tr("SMESH_CORNER_NODES"), GroupArguments);
417 myCornerSelectButton = new QPushButton(GroupArguments);
418 myCornerSelectButton->setIcon(image1);
419 myCornerNodes = new QLineEdit(GroupArguments);
422 myTable = new QTableWidget(GroupArguments);
425 myMidFaceLabel = new QLabel(tr("SMESH_MIDFACE_NODES"), GroupArguments);
426 myMidFaceSelectButton = new QPushButton(GroupArguments);
427 myMidFaceSelectButton->setIcon(image1);
428 myMidFaceNodes = new QLineEdit(GroupArguments);
429 myMidFaceNodes->setValidator(new SMESHGUI_IdValidator(this, 6));
432 myCenterLabel = new QLabel(tr("SMESH_CENTER_NODE"), GroupArguments);
433 myCenterSelectButton = new QPushButton(GroupArguments);
434 myCenterSelectButton->setIcon(image1);
435 myCenterNode = new QLineEdit(GroupArguments);
436 myCenterNode->setValidator(new SMESHGUI_IdValidator(this, 1));
438 myReverseCB = new QCheckBox(tr("SMESH_REVERSE"), GroupArguments);
440 aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0);
441 aGroupArgumentsLayout->addWidget(myCornerSelectButton, 0, 1);
442 aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2);
443 aGroupArgumentsLayout->addWidget(myTable, 1, 0, 1, 3);
444 aGroupArgumentsLayout->addWidget(myMidFaceLabel, 2, 0);
445 aGroupArgumentsLayout->addWidget(myMidFaceSelectButton, 2, 1);
446 aGroupArgumentsLayout->addWidget(myMidFaceNodes, 2, 2);
447 aGroupArgumentsLayout->addWidget(myCenterLabel, 3, 0);
448 aGroupArgumentsLayout->addWidget(myCenterSelectButton, 3, 1);
449 aGroupArgumentsLayout->addWidget(myCenterNode, 3, 2);
450 aGroupArgumentsLayout->addWidget(myReverseCB, 4, 0, 1, 3);
452 /***************************************************************/
453 GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this );
454 GroupGroups->setCheckable( true );
455 QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups);
456 GroupGroupsLayout->setSpacing(SPACING);
457 GroupGroupsLayout->setMargin(MARGIN);
459 TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
460 ComboBox_GroupName = new QComboBox( GroupGroups );
461 ComboBox_GroupName->setEditable( true );
462 ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
464 GroupGroupsLayout->addWidget( TextLabel_GroupName );
465 GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
467 /***************************************************************/
468 GroupButtons = new QGroupBox(this);
469 QHBoxLayout* aGroupButtonsLayout = new QHBoxLayout(GroupButtons);
470 aGroupButtonsLayout->setSpacing(SPACING);
471 aGroupButtonsLayout->setMargin(MARGIN);
473 buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
474 buttonOk->setAutoDefault(true);
475 buttonOk->setDefault(true);
476 buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
477 buttonApply->setAutoDefault(true);
478 buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
479 buttonCancel->setAutoDefault(true);
480 buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
481 buttonHelp->setAutoDefault(true);
483 aGroupButtonsLayout->addWidget(buttonOk);
484 aGroupButtonsLayout->addSpacing(10);
485 aGroupButtonsLayout->addWidget(buttonApply);
486 aGroupButtonsLayout->addSpacing(10);
487 aGroupButtonsLayout->addStretch();
488 aGroupButtonsLayout->addWidget(buttonCancel);
489 aGroupButtonsLayout->addWidget(buttonHelp);
491 /***************************************************************/
492 aDialogLayout->addWidget(GroupConstructors);
493 aDialogLayout->addWidget(GroupArguments);
494 aDialogLayout->addWidget(GroupGroups);
495 aDialogLayout->addWidget(GroupButtons);
497 Init(); /* Initialisations */
500 //=================================================================================
501 // function : ~SMESHGUI_AddQuadraticElementDlg()
502 // purpose : Destroys the object and frees any allocated resources
503 //=================================================================================
504 SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg()
509 //=================================================================================
512 //=================================================================================
513 void SMESHGUI_AddQuadraticElementDlg::Init()
515 myRadioButton1->setChecked(true);
516 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
518 /* reset "Add to group" control */
519 GroupGroups->setChecked( false );
522 myNbMidFaceNodes = 0;
527 switch (myGeomType) {
528 case SMDSEntity_Quad_Edge:
531 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_edges
533 case SMDSEntity_Quad_Triangle:
536 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles
538 case SMDSEntity_Quad_Quadrangle:
541 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles
543 case SMDSEntity_BiQuad_Quadrangle:
547 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles
549 case SMDSEntity_Quad_Tetra:
552 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_tetrahedrons
554 case SMDSEntity_Quad_Pyramid:
557 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pyramids
559 case SMDSEntity_Quad_Penta:
562 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pentahedrons
564 case SMDSEntity_Quad_Hexa:
567 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons
569 case SMDSEntity_TriQuad_Hexa:
572 myNbMidFaceNodes = 6;
574 myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons
578 myMidFaceLabel ->setVisible( myNbMidFaceNodes );
579 myMidFaceSelectButton->setVisible( myNbMidFaceNodes );
580 myMidFaceNodes ->setVisible( myNbMidFaceNodes );
581 myCenterLabel ->setVisible( myNbCenterNodes );
582 myCenterSelectButton ->setVisible( myNbCenterNodes );
583 myCenterNode ->setVisible( myNbCenterNodes );
585 myCornerNodes->setValidator(new SMESHGUI_IdValidator(this, myNbCorners));
587 /* initialize table */
588 myTable->setColumnCount(3);
589 myTable->setRowCount(aNumRows);
591 QStringList aColLabels;
592 aColLabels.append(tr("SMESH_FIRST"));
593 aColLabels.append(tr("SMESH_MIDDLE"));
594 aColLabels.append(tr("SMESH_LAST"));
595 myTable->setHorizontalHeaderLabels(aColLabels);
597 for ( int col = 0; col < myTable->columnCount(); col++ )
598 myTable->setColumnWidth(col, 80);
600 //myTable->setColumnReadOnly(0, true); // VSR: TODO
601 //myTable->setColumnReadOnly(2, true); // VSR: TODO
603 myTable->setEnabled( false );
605 for ( int row = 0; row < myTable->rowCount(); row++ )
607 myTable->setItem( row, 0, new QTableWidgetItem( "" ) );
608 myTable->item( row, 0 )->setFlags(0);
610 IdEditItem* anEditItem = new IdEditItem( "" );
611 anEditItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
612 myTable->setItem(row, 1, anEditItem);
614 myTable->setItem( row, 2, new QTableWidgetItem( "" ) );
615 myTable->item( row, 2 )->setFlags(0);
618 /* signals and slots connections */
619 connect(myCornerSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
620 connect(myMidFaceSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
621 connect(myCenterSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection()));
622 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument()));
623 connect(myTable, SIGNAL(cellDoubleClicked(int, int)), SLOT(onCellDoubleClicked(int, int)));
624 connect(myTable, SIGNAL(cellChanged (int, int)), SLOT(onCellTextChange(int, int)));
625 connect(myCornerNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
626 connect(myMidFaceNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
627 connect(myCenterNode, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
628 connect(myReverseCB, SIGNAL(stateChanged(int)), SLOT(onReverse(int)));
630 connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk()));
631 connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel()));
632 connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply()));
633 connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp()));
635 connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
636 connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(ClickOnCancel()));
637 connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(ClickOnCancel()));
639 myCurrentLineEdit = myCornerNodes;
641 // set selection mode
642 SMESH::SetPointRepresentation(true);
644 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
645 aViewWindow->SetSelectionMode( NodeSelection );
647 SelectionIntoArgument();
650 //=================================================================================
651 // function : ClickOnApply()
653 //=================================================================================
654 void SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
659 if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() )
662 BusyLocker lock( myBusy );
664 std::vector<vtkIdType> anIds;
666 switch (myGeomType) {
667 case SMDSEntity_Quad_Edge:
668 anIds.push_back(myTable->item(0, 0)->text().toInt());
669 anIds.push_back(myTable->item(0, 2)->text().toInt());
670 anIds.push_back(myTable->item(0, 1)->text().toInt());
672 case SMDSEntity_Quad_Triangle:
673 case SMDSEntity_Quad_Quadrangle:
674 case SMDSEntity_BiQuad_Quadrangle:
675 case SMDSEntity_Quad_Tetra:
676 case SMDSEntity_Quad_Pyramid:
677 case SMDSEntity_Quad_Penta:
678 case SMDSEntity_Quad_Hexa:
679 case SMDSEntity_TriQuad_Hexa:
680 for ( int row = 0; row < myNbCorners; row++ )
681 anIds.push_back(myTable->item(row, 0)->text().toInt());
682 for ( int row = 0; row < myTable->rowCount(); row++ )
683 anIds.push_back(myTable->item(row, 1)->text().toInt());
684 if ( myNbMidFaceNodes )
686 QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
687 for (int i = 0; i < aListId.count(); i++)
688 anIds.push_back( aListId[ i ].toInt() );
690 if ( myNbCenterNodes )
692 QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts);
693 anIds.push_back( aListId[ 0 ].toInt() );
697 if ( myReverseCB->isChecked())
698 ReverseConnectivity( anIds, myGeomType, /*toReverse=*/true, /*toVtkOrder=*/false );
700 int aNumberOfIds = anIds.size();
701 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
702 anArrayOfIdeces->length( aNumberOfIds );
704 for (int i = 0; i < aNumberOfIds; i++)
705 anArrayOfIdeces[i] = anIds[ i ];
707 bool addToGroup = GroupGroups->isChecked();
710 SMESH::SMESH_GroupBase_var aGroup;
713 aGroupName = ComboBox_GroupName->currentText();
714 for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
715 QString aName = ComboBox_GroupName->itemText( i );
716 if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
719 if ( idx > 0 && idx < myGroups.count() ) {
720 SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
721 if ( !aGeomGroup->_is_nil() ) {
722 int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
723 tr( "MESH_STANDALONE_GRP_CHOSEN" ).arg( aGroupName ),
724 tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 );
725 if ( res == 1 ) return;
727 aGroup = myGroups[idx-1];
731 SMESH::ElementType anElementType;
733 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
734 switch (myGeomType) {
735 case SMDSEntity_Quad_Edge:
736 anElementType = SMESH::EDGE;
737 anElemId = aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break;
738 case SMDSEntity_Quad_Triangle:
739 case SMDSEntity_Quad_Quadrangle:
740 case SMDSEntity_BiQuad_Quadrangle:
741 anElementType = SMESH::FACE;
742 anElemId = aMeshEditor->AddFace(anArrayOfIdeces.inout()); break;
743 case SMDSEntity_Quad_Tetra:
744 case SMDSEntity_Quad_Pyramid:
745 case SMDSEntity_Quad_Penta:
746 case SMDSEntity_Quad_Hexa:
747 case SMDSEntity_TriQuad_Hexa:
748 anElementType = SMESH::VOLUME;
749 anElemId = aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break;
753 if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) {
754 SMESH::SMESH_Group_var aGroupUsed;
755 if ( aGroup->_is_nil() ) {
757 aGroupUsed = SMESH::AddGroup( myMesh, anElementType, aGroupName );
758 if ( !aGroupUsed->_is_nil() ) {
759 myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroupUsed));
760 ComboBox_GroupName->addItem( aGroupName );
764 SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup );
765 if ( !aGeomGroup->_is_nil() ) {
766 aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup );
767 if ( !aGroupUsed->_is_nil() && idx > 0 ) {
768 myGroups[idx-1] = SMESH::SMESH_GroupBase::_duplicate(aGroupUsed);
769 SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser();
773 aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup );
776 if ( !aGroupUsed->_is_nil() ) {
777 SMESH::long_array_var anIdList = new SMESH::long_array;
778 anIdList->length( 1 );
779 anIdList[0] = anElemId;
780 aGroupUsed->Add( anIdList.inout() );
784 SALOME_ListIO aList; aList.Append( myActor->getIO() );
785 mySelector->ClearIndex();
786 mySelectionMgr->setSelectedObjects( aList, false );
788 mySimulation->SetVisibility(false);
792 SetCurrentSelection();
796 SMESHGUI::Modified();
799 //=================================================================================
800 // function : ClickOnOk()
802 //=================================================================================
803 void SMESHGUI_AddQuadraticElementDlg::ClickOnOk()
809 //=================================================================================
810 // function : ClickOnCancel()
812 //=================================================================================
813 void SMESHGUI_AddQuadraticElementDlg::ClickOnCancel()
815 mySelectionMgr->clearSelected();
816 mySimulation->SetVisibility(false);
817 SMESH::SetPointRepresentation(false);
818 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
819 aViewWindow->SetSelectionMode( ActorSelection );
820 disconnect(mySelectionMgr, 0, this, 0);
821 mySMESHGUI->ResetState();
825 //=================================================================================
826 // function : ClickOnHelp()
828 //=================================================================================
829 void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp()
831 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
833 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
837 platform = "winapplication";
839 platform = "application";
841 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
842 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
843 arg(app->resourceMgr()->stringValue("ExternalBrowser",
845 arg(myHelpFileName));
849 //=================================================================================
850 // function : onTextChange()
852 //=================================================================================
853 void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText)
856 BusyLocker lock( myBusy );
858 mySimulation->SetVisibility(false);
860 // hilight entered nodes
861 SMDS_Mesh* aMesh = 0;
863 aMesh = myActor->GetObject()->GetMesh();
865 QLineEdit* send = (QLineEdit*)sender();
866 if (send == myCornerNodes ||
867 send == myMidFaceNodes ||
868 send == myCenterNode)
869 myCurrentLineEdit = send;
872 TColStd_MapOfInteger newIndices;
874 QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
876 for (int i = 0; i < aListId.count(); i++) {
877 if ( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) )
879 newIndices.Add( n->GetID() );
888 mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
889 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
890 aViewWindow->highlight( myActor->getIO(), true, true );
892 if ( myCurrentLineEdit == myCornerNodes )
893 UpdateTable( allOk );
900 //=================================================================================
901 // function : SelectionIntoArgument()
902 // purpose : Called when selection has changed
903 //=================================================================================
904 void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument()
907 BusyLocker lock( myBusy );
909 QString aCurrentEntry = myEntry;
911 if ( myCurrentLineEdit )
916 myCurrentLineEdit->setText("");
918 if (!GroupButtons->isEnabled()) // inactive
921 mySimulation->SetVisibility(false);
925 mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
927 if (aList.Extent() != 1)
934 Handle(SALOME_InteractiveObject) anIO = aList.First();
935 myEntry = anIO->getEntry();
936 myMesh = SMESH::GetMeshByIO(anIO);
937 if (myMesh->_is_nil()) {
942 myActor = SMESH::FindActorByEntry(anIO->getEntry());
947 if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) {
948 SMESH::ElementType anElementType;
949 switch ( myGeomType ) {
950 case SMDSEntity_Quad_Edge:
951 anElementType = SMESH::EDGE; break;
952 case SMDSEntity_Quad_Triangle:
953 case SMDSEntity_Quad_Quadrangle:
954 case SMDSEntity_BiQuad_Quadrangle:
955 anElementType = SMESH::FACE; break;
956 case SMDSEntity_Quad_Tetra:
957 case SMDSEntity_Quad_Pyramid:
958 case SMDSEntity_Quad_Penta:
959 case SMDSEntity_Quad_Hexa:
960 case SMDSEntity_TriQuad_Hexa:
961 anElementType = SMESH::VOLUME; break;
964 ComboBox_GroupName->clear();
965 ComboBox_GroupName->addItem( QString() );
966 SMESH::ListOfGroups aListOfGroups = *myMesh->GetGroups();
967 for ( int i = 0, n = aListOfGroups.length(); i < n; i++ ) {
968 SMESH::SMESH_GroupBase_var aGroup = aListOfGroups[i];
969 if ( !aGroup->_is_nil() && aGroup->GetType() == anElementType ) {
970 QString aGroupName( aGroup->GetName() );
971 if ( !aGroupName.isEmpty() ) {
972 myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroup));
973 ComboBox_GroupName->addItem( aGroupName );
984 // get selected nodes
985 QString aString = "";
986 int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,myActor->getIO(),aString);
988 if ( myCurrentLineEdit )
990 if ( myCurrentLineEdit != myCenterNode || nbNodes == 1 )
991 myCurrentLineEdit->setText(aString);
993 if ( myCurrentLineEdit == myCornerNodes )
996 else if ( myTable->isEnabled() && nbNodes == 1 )
998 int theRow = myTable->currentRow(), theCol = myTable->currentColumn();
1000 myTable->item(theRow, 1)->setText(aString);
1004 displaySimulation();
1007 //=================================================================================
1008 // function : displaySimulation()
1010 //=================================================================================
1011 void SMESHGUI_AddQuadraticElementDlg::displaySimulation()
1015 SMESH::TElementSimulation::TVTKIds anIds;
1017 // Collect ids from the dialog
1020 int aDisplayMode = VTK_SURFACE;
1022 if ( myGeomType == SMDSEntity_Quad_Edge )
1024 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 0)->text().toInt() ) );
1025 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 2)->text().toInt() ) );
1026 anID = myTable->item(0, 1)->text().toInt(&ok);
1027 if (!ok) anID = myTable->item(0, 0)->text().toInt();
1028 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
1029 aDisplayMode = VTK_WIREFRAME;
1033 for ( int row = 0; row < myNbCorners; row++ )
1034 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) );
1036 for ( int row = 0; row < myTable->rowCount(); row++ )
1038 anID = myTable->item(row, 1)->text().toInt(&ok);
1040 anID = myTable->item(row, 0)->text().toInt();
1041 aDisplayMode = VTK_WIREFRAME;
1043 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
1045 if ( myNbMidFaceNodes )
1047 QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
1048 for (int i = 0; i < aListId.count(); i++)
1049 anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ i ].toInt() ));
1051 if ( myNbCenterNodes )
1053 QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts);
1054 anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ 0 ].toInt() ));
1058 mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked());
1062 mySimulation->SetVisibility(false);
1064 SMESH::UpdateView();
1067 //=================================================================================
1068 // function : SetCurrentSelection()
1070 //=================================================================================
1071 void SMESHGUI_AddQuadraticElementDlg::SetCurrentSelection()
1073 QPushButton* send = (QPushButton*)sender();
1074 myCurrentLineEdit = 0;
1076 if (send == myCornerSelectButton)
1077 myCurrentLineEdit = myCornerNodes;
1078 else if ( send == myMidFaceSelectButton )
1079 myCurrentLineEdit = myMidFaceNodes;
1080 else if ( send == myCenterSelectButton )
1081 myCurrentLineEdit = myCenterNode;
1083 if ( myCurrentLineEdit )
1085 myCurrentLineEdit->setFocus();
1086 SelectionIntoArgument();
1090 //=================================================================================
1091 // function : DeactivateActiveDialog()
1093 //=================================================================================
1094 void SMESHGUI_AddQuadraticElementDlg::DeactivateActiveDialog()
1096 if (GroupConstructors->isEnabled()) {
1097 GroupConstructors->setEnabled(false);
1098 GroupArguments->setEnabled(false);
1099 GroupButtons->setEnabled(false);
1100 mySimulation->SetVisibility(false);
1101 mySMESHGUI->ResetState();
1102 mySMESHGUI->SetActiveDialogBox(0);
1106 //=================================================================================
1107 // function : ActivateThisDialog()
1109 //=================================================================================
1110 void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog()
1112 /* Emit a signal to deactivate the active dialog */
1113 mySMESHGUI->EmitSignalDeactivateDialog();
1115 GroupConstructors->setEnabled(true);
1116 GroupArguments->setEnabled(true);
1117 GroupButtons->setEnabled(true);
1119 SMESH::SetPointRepresentation(true);
1121 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1122 aViewWindow->SetSelectionMode( NodeSelection );
1123 SelectionIntoArgument();
1126 //=================================================================================
1127 // function : enterEvent()
1129 //=================================================================================
1130 void SMESHGUI_AddQuadraticElementDlg::enterEvent (QEvent*)
1132 if (GroupConstructors->isEnabled())
1134 ActivateThisDialog();
1137 //=================================================================================
1138 // function : closeEvent()
1140 //=================================================================================
1141 void SMESHGUI_AddQuadraticElementDlg::closeEvent (QCloseEvent*)
1143 /* same than click on cancel button */
1147 //=================================================================================
1148 // function : hideEvent()
1149 // purpose : caused by ESC key
1150 //=================================================================================
1151 void SMESHGUI_AddQuadraticElementDlg::hideEvent (QHideEvent*)
1157 //=================================================================================
1158 // function : onReverse()
1160 //=================================================================================
1161 void SMESHGUI_AddQuadraticElementDlg::onReverse (int state)
1163 mySimulation->SetVisibility(false);
1164 displaySimulation();
1169 //=================================================================================
1170 // function : IsValid()
1172 //=================================================================================
1173 bool SMESHGUI_AddQuadraticElementDlg::IsValid()
1175 SMDS_Mesh* aMesh = 0;
1177 aMesh = myActor->GetObject()->GetMesh();
1182 std::set< int > okIDs;
1183 for ( int row = 0; row < myTable->rowCount(); row++ )
1185 int anID = myTable->item(row, 1)->text().toInt(&ok);
1189 const SMDS_MeshNode * aNode = aMesh->FindNode(anID);
1192 okIDs.insert( anID );
1195 QStringList aListId;
1196 if ( myNbMidFaceNodes )
1197 aListId += myMidFaceNodes->text().split(" ", QString::SkipEmptyParts);
1198 if ( myNbCenterNodes )
1199 aListId += myCenterNode->text().split(" ", QString::SkipEmptyParts);
1201 for (int i = 0; i < aListId.count(); i++)
1203 int anID = aListId[ i ].toInt(&ok);
1207 if ( !aMesh->FindNode(anID) )
1209 okIDs.insert( anID );
1212 return okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes;
1215 //=================================================================================
1216 // function : UpdateTable()
1218 //=================================================================================
1219 void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity )
1221 QStringList aListCorners = myCornerNodes->text().split(" ", QString::SkipEmptyParts);
1223 if ( aListCorners.count() == myNbCorners && theConersValidity )
1225 myTable->setEnabled( true );
1227 // clear the Middle column
1228 for ( int row = 0; row < myTable->rowCount(); row++ )
1229 myTable->item( row, 1 )->setText("");
1234 switch (myGeomType) {
1235 case SMDSEntity_Quad_Edge:
1236 aFirstColIds = FirstEdgeIds;
1237 aLastColIds = LastEdgeIds;
1239 case SMDSEntity_Quad_Triangle:
1240 aFirstColIds = FirstTriangleIds;
1241 aLastColIds = LastTriangleIds;
1243 case SMDSEntity_Quad_Quadrangle:
1244 case SMDSEntity_BiQuad_Quadrangle:
1245 aFirstColIds = FirstQuadrangleIds;
1246 aLastColIds = LastQuadrangleIds;
1248 case SMDSEntity_Quad_Tetra:
1249 aFirstColIds = FirstTetrahedronIds;
1250 aLastColIds = LastTetrahedronIds;
1252 case SMDSEntity_Quad_Pyramid:
1253 aFirstColIds = FirstPyramidIds;
1254 aLastColIds = LastPyramidIds;
1256 case SMDSEntity_Quad_Penta:
1257 aFirstColIds = FirstPentahedronIds;
1258 aLastColIds = LastPentahedronIds;
1260 case SMDSEntity_Quad_Hexa:
1261 case SMDSEntity_TriQuad_Hexa:
1262 aFirstColIds = FirstHexahedronIds;
1263 aLastColIds = LastHexahedronIds;
1267 // fill the First and the Last columns
1268 for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++)
1269 myTable->item( i, 0 )->setText( aListCorners[ aFirstColIds[i] ] );
1271 for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++)
1272 myTable->item( i, 2 )->setText( aListCorners[ aLastColIds[i] ] );
1277 for ( int row = 0; row < myTable->rowCount(); row++ )
1278 for ( int col = 0; col < myTable->columnCount(); col++ )
1279 if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText("");
1281 myTable->setEnabled( false );
1286 //=================================================================================
1287 // function : onTableActivate()
1289 //=================================================================================
1290 void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol )
1292 myCurrentLineEdit = 0;
1293 displaySimulation();
1298 //=================================================================================
1299 // function : onCellTextChange()
1301 //=================================================================================
1302 void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol)
1304 myCurrentLineEdit = 0;
1305 displaySimulation();
1309 //=================================================================================
1310 // function : keyPressEvent()
1312 //=================================================================================
1313 void SMESHGUI_AddQuadraticElementDlg::keyPressEvent( QKeyEvent* e )
1315 QDialog::keyPressEvent( e );
1316 if ( e->isAccepted() )
1319 if ( e->key() == Qt::Key_F1 ) {
1325 void SMESHGUI_AddQuadraticElementDlg::updateButtons()
1327 bool valid = IsValid();
1328 buttonOk->setEnabled( valid );
1329 buttonApply->setEnabled( valid );
1332 //=================================================================================
1333 // function : isValid
1335 //=================================================================================
1336 bool SMESHGUI_AddQuadraticElementDlg::isValid()
1338 if( GroupGroups->isChecked() && ComboBox_GroupName->currentText().isEmpty() ) {
1339 SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) );