1 #include "SMESHGUI_AddQuadraticElementDlg.h"
4 #include "SMESHGUI_Utils.h"
5 #include "SMESHGUI_VTKUtils.h"
6 #include "SMESHGUI_MeshUtils.h"
7 #include "SMESHGUI_IdValidator.h"
8 #include "SMESH_ActorUtils.h"
10 #include "SMDS_Mesh.hxx"
11 #include "SMESH_Actor.h"
13 #include "SUIT_Session.h"
14 #include "SUIT_MessageBox.h"
15 #include "LightApp_Application.h"
17 #include "SVTK_Selection.h"
18 #include "SVTK_Selector.h"
19 #include "SALOME_ListIO.hxx"
20 #include "SALOME_ListIteratorOfListIO.hxx"
22 #include "SalomeApp_Study.h"
23 #include "SalomeApp_Application.h"
25 #include "SVTK_ViewModel.h"
26 #include "SVTK_ViewWindow.h"
28 #include "utilities.h"
31 #include <TColStd_MapOfInteger.hxx>
32 #include <TColStd_IndexedMapOfInteger.hxx>
36 #include <vtkIdList.h>
37 #include <vtkIntArray.h>
38 #include <vtkCellArray.h>
39 #include <vtkUnsignedCharArray.h>
40 #include <vtkUnstructuredGrid.h>
41 #include <vtkDataSetMapper.h>
42 #include <vtkProperty.h>
44 #include <vtkQuadraticEdge.h>
45 #include <vtkQuadraticTriangle.h>
46 #include <vtkQuadraticQuad.h>
47 #include <vtkQuadraticHexahedron.h>
48 #include <vtkQuadraticTetra.h>
51 #include <qbuttongroup.h>
52 #include <qgroupbox.h>
54 #include <qlineedit.h>
55 #include <qpushbutton.h>
56 #include <qradiobutton.h>
59 #include <qcheckbox.h>
68 void ReverseConnectivity( vector<int> & ids, int type )
70 // for reverse connectivity of other types keeping the first id, see
71 // void SMESH_VisualObjDef::buildElemPrs() in SMESH_Object.cxx:900
75 case QUAD_TETRAHEDRON: {
76 static int aConn[] = {0,2,1,3,6,5,4,7,9,8};
81 static int aConn[] = {0,3,2,1,4,8,7,6,5,9,12,11,10};
85 case QUAD_PENTAHEDRON: {
86 static int aConn[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13};
90 case QUAD_HEXAHEDRON: {
91 static int aConn[] = {0,3,2,1,4,7,6,5,11,10,9,8,15,14,13,12,16,19,18,17};
96 static int aConn[] = {1,0,2};
100 case QUAD_TRIANGLE: {
101 static int aConn[] = {0,2,1,5,4,3};
105 case QUAD_QUADRANGLE: {
106 static int aConn[] = {0,3,2,1,7,6,5,4};
113 reverse( ids.begin(), ids.end() );
116 vector<int> aRevIds( ids.size() );
117 for ( int i = 0; i < ids.size(); i++)
118 aRevIds[ i ] = ids[ conn[ i ]];
123 class TElementSimulation {
124 SalomeApp_Application* myApplication;
125 SUIT_ViewWindow* myViewWindow;
126 SVTK_ViewWindow* myVTKViewWindow;
128 SALOME_Actor* myPreviewActor;
129 vtkDataSetMapper* myMapper;
130 vtkUnstructuredGrid* myGrid;
131 //vtkProperty* myBackProp, *myProp;
133 vtkFloatingPointType myRGB[3], myBackRGB[3];
136 TElementSimulation (SalomeApp_Application* theApplication)
138 myApplication = theApplication;
139 SUIT_ViewManager* mgr = theApplication->activeViewManager();
141 myViewWindow = mgr->getActiveView();
142 myVTKViewWindow = GetVtkViewWindow(myViewWindow);
144 myGrid = vtkUnstructuredGrid::New();
146 // Create and display actor
147 myMapper = vtkDataSetMapper::New();
148 myMapper->SetInput(myGrid);
150 myPreviewActor = SALOME_Actor::New();
151 myPreviewActor->PickableOff();
152 myPreviewActor->VisibilityOff();
153 myPreviewActor->SetMapper(myMapper);
155 vtkProperty* myProp = vtkProperty::New();
156 GetColor( "SMESH", "fill_color", myRGB[0], myRGB[1], myRGB[2], QColor( 0, 170, 255 ) );
157 myProp->SetColor( myRGB[0], myRGB[1], myRGB[2] );
158 myPreviewActor->SetProperty( myProp );
161 vtkProperty* myBackProp = vtkProperty::New();
162 GetColor( "SMESH", "backface_color", myBackRGB[0], myBackRGB[1], myBackRGB[2], QColor( 0, 0, 255 ) );
163 myBackProp->SetColor( myBackRGB[0], myBackRGB[1], myBackRGB[2] );
164 myPreviewActor->SetBackfaceProperty( myBackProp );
165 myBackProp->Delete();
167 myVTKViewWindow->AddActor(myPreviewActor);
170 typedef std::vector<vtkIdType> TVTKIds;
171 void SetPosition (SMESH_Actor* theActor,
175 const bool theReverse)
177 vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid();
178 myGrid->SetPoints(aGrid->GetPoints());
186 aType = VTK_QUADRATIC_EDGE;
189 aType = VTK_QUADRATIC_TRIANGLE;
191 case QUAD_QUADRANGLE:
192 aType = VTK_QUADRATIC_QUAD;
194 case QUAD_TETRAHEDRON:
195 aType = VTK_QUADRATIC_TETRA;
198 //aType = VTK_QUADRATIC_PYRAMID; // NOT SUPPORTED IN VTK4.2
199 aType = VTK_CONVEX_POINT_SET;
201 case QUAD_PENTAHEDRON:
202 //aType = VTK_QUADRATIC_WEDGE; // NOT SUPPORTED IN VTK4.2
203 aType = VTK_CONVEX_POINT_SET;
205 case QUAD_HEXAHEDRON:
206 aType = VTK_QUADRATIC_HEXAHEDRON;
210 // take care of orientation
211 if ( aType == VTK_CONVEX_POINT_SET ) {
212 if ( theReverse && theMode == VTK_SURFACE ) {
213 //myPreviewActor->GetProperty()->SetColor( myBackRGB[0], myBackRGB[1], myBackRGB[2] );
217 // VTK cell connectivity opposites the MED one for volumic elements
218 if ( theIds.size() > 8 ? !theReverse : theReverse ) {
219 ReverseConnectivity( theIds, theType );
224 vtkIdList *anIds = vtkIdList::New();
226 for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) {
227 anIds->InsertId(i,theIds[i]);
228 //std::cout << i<< ": " << theIds[i] << std::endl;
231 myGrid->InsertNextCell(aType,anIds);
236 myPreviewActor->GetMapper()->Update();
237 myPreviewActor->SetRepresentation( theMode );
240 // restore normal orientation
241 if ( aType == VTK_CONVEX_POINT_SET ) {
242 if ( theReverse && theMode == VTK_SURFACE ) {
243 //myPreviewActor->GetProperty()->SetColor( myRGB[0], myRGB[1], myRGB[2] );
249 void SetVisibility (bool theVisibility)
251 myPreviewActor->SetVisibility(theVisibility);
252 RepaintCurrentView();
256 ~TElementSimulation()
258 if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) {
259 myVTKViewWindow->RemoveActor(myPreviewActor);
261 myPreviewActor->Delete();
263 myMapper->RemoveAllInputs();
269 // myBackProp->Delete();
275 // Define the sequences of ids
276 static int FirstEdgeIds[] = {0};
277 static int LastEdgeIds[] = {1};
279 static int FirstTriangleIds[] = {0,1,2};
280 static int LastTriangleIds[] = {1,2,0};
282 static int FirstQuadrangleIds[] = {0,1,2,3};
283 static int LastQuadrangleIds[] = {1,2,3,0};
285 static int FirstTetrahedronIds[] = {0,1,2,3,3,3};
286 static int LastTetrahedronIds[] = {1,2,0,0,1,2};
288 static int FirstPyramidIds[] = {0,1,2,3,4,4,4,4};
289 static int LastPyramidIds[] = {1,2,3,0,0,1,2,3};
291 static int FirstPentahedronIds[] = {0,1,2,3,4,5,0,1,2};
292 static int LastPentahedronIds[] = {1,2,0,4,5,3,3,4,5};
294 static int FirstHexahedronIds[] = {0,1,2,3,4,5,6,7,0,1,2,3};
295 static int LastHexahedronIds[] = {1,2,3,0,5,6,7,4,4,5,6,7};
299 //=================================================================================
300 // function : SMESHGUI_AddQuadraticElementDlg()
301 // purpose : constructor
302 //=================================================================================
303 SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theModule,
306 bool modal, WFlags fl)
307 : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
308 WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
309 mySMESHGUI( theModule ),
310 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
313 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>
314 (SUIT_Session::session()->activeApplication());
316 mySimulation = new SMESH::TElementSimulation (anApp);
317 mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
319 QString anElementName;
323 anElementName = QString("QUADRATIC_EDGE");
326 anElementName = QString("QUADRATIC_TRIANGLE");
328 case QUAD_QUADRANGLE:
329 anElementName = QString("QUADRATIC_QUADRANGLE");
331 case QUAD_TETRAHEDRON:
332 anElementName = QString("QUADRATIC_TETRAHEDRON");
335 anElementName = QString("QUADRATIC_PYRAMID");
337 case QUAD_PENTAHEDRON:
338 anElementName = QString("QUADRATIC_PENTAHEDRON");
340 case QUAD_HEXAHEDRON:
341 anElementName = QString("QUADRATIC_HEXAHEDRON");
345 anElementName = QString("QUADRATIC_EDGE");
348 QString iconName = tr(QString("ICON_DLG_%1").arg(anElementName));
349 QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(anElementName));
350 QString argumentsGrTitle = tr(QString("SMESH_ADD_%1").arg(anElementName));
351 QString constructorGrTitle = tr(QString("SMESH_%1").arg(anElementName));
353 QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", iconName));
354 QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
357 setName("SMESHGUI_AddQuadraticElementDlg");
360 setSizeGripEnabled(TRUE);
361 QGridLayout* aDialogLayout = new QGridLayout(this);
362 aDialogLayout->setSpacing(6);
363 aDialogLayout->setMargin(11);
365 /***************************************************************/
366 GroupConstructors = new QButtonGroup(this, "GroupConstructors");
367 GroupConstructors->setTitle(constructorGrTitle);
369 GroupConstructors->setExclusive(TRUE);
370 GroupConstructors->setColumnLayout(0, Qt::Vertical);
371 GroupConstructors->layout()->setSpacing(0);
372 GroupConstructors->layout()->setMargin(0);
373 GroupConstructors->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
374 QGridLayout* aGroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
375 aGroupConstructorsLayout->setAlignment(Qt::AlignTop);
376 aGroupConstructorsLayout->setSpacing(6);
377 aGroupConstructorsLayout->setMargin(11);
378 myRadioButton1 = new QRadioButton(GroupConstructors, "myRadioButton1");
379 myRadioButton1->setText(tr("" ));
380 myRadioButton1->setPixmap(image0);
381 myRadioButton1->setChecked(TRUE);
382 myRadioButton1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, myRadioButton1->sizePolicy().hasHeightForWidth()));
383 aGroupConstructorsLayout->addWidget(myRadioButton1, 0, 0);
384 aGroupConstructorsLayout->addItem( new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1);
385 aDialogLayout->addWidget(GroupConstructors, 0, 0);
387 /***************************************************************/
388 GroupArguments = new QGroupBox(this, "GroupArguments");
389 GroupArguments->setTitle(argumentsGrTitle);
390 GroupArguments->setColumnLayout(0, Qt::Vertical);
391 GroupArguments->layout()->setSpacing(0);
392 GroupArguments->layout()->setMargin(0);
393 GroupArguments->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding));
394 QGridLayout* aGroupArgumentsLayout = new QGridLayout(GroupArguments->layout());
395 aGroupArgumentsLayout->setAlignment(Qt::AlignTop);
396 aGroupArgumentsLayout->setSpacing(6);
397 aGroupArgumentsLayout->setMargin(11);
398 QLabel* aCornerNodesLabel = new QLabel(GroupArguments, "aCornerNodesLabel");
399 aCornerNodesLabel->setText(tr("SMESH_CORNER_NODES" ));
400 aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0);
401 mySelectButton = new QPushButton(GroupArguments, "mySelectButton");
402 mySelectButton->setPixmap(image1);
403 aGroupArgumentsLayout->addWidget(mySelectButton, 0, 1);
404 myCornerNodes = new QLineEdit(GroupArguments, "myCornerNodes");
405 aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2);
407 myTable = new QTable(GroupArguments);
408 aGroupArgumentsLayout->addMultiCellWidget(myTable, 1, 1, 0, 2);
410 myReverseCB = new QCheckBox(GroupArguments, "myReverseCB");
411 myReverseCB->setText(tr("SMESH_REVERSE" ));
412 aGroupArgumentsLayout->addWidget(myReverseCB, 2, 0);
414 aDialogLayout->addWidget(GroupArguments, 1, 0);
417 /***************************************************************/
418 GroupButtons = new QGroupBox(this, "GroupButtons");
419 GroupButtons->setColumnLayout(0, Qt::Vertical);
420 GroupButtons->layout()->setSpacing(0);
421 GroupButtons->layout()->setMargin(0);
422 GroupButtons->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
423 QGridLayout* aGroupButtonsLayout = new QGridLayout(GroupButtons->layout());
424 aGroupButtonsLayout->setAlignment(Qt::AlignTop);
425 aGroupButtonsLayout->setSpacing(6);
426 aGroupButtonsLayout->setMargin(11);
427 buttonCancel = new QPushButton(GroupButtons, "buttonCancel");
428 buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
429 buttonCancel->setAutoDefault(TRUE);
430 aGroupButtonsLayout->addWidget(buttonCancel, 0, 3);
431 buttonApply = new QPushButton(GroupButtons, "buttonApply");
432 buttonApply->setText(tr("SMESH_BUT_APPLY" ));
433 buttonApply->setAutoDefault(TRUE);
434 aGroupButtonsLayout->addWidget(buttonApply, 0, 1);
435 aGroupButtonsLayout->addItem( new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2);
436 buttonOk = new QPushButton(GroupButtons, "buttonOk");
437 buttonOk->setText(tr("SMESH_BUT_OK" ));
438 buttonOk->setAutoDefault(TRUE);
439 buttonOk->setDefault(TRUE);
440 aGroupButtonsLayout->addWidget(buttonOk, 0, 0);
441 buttonHelp = new QPushButton(GroupButtons, "buttonHelp");
442 buttonHelp->setText(tr("SMESH_BUT_HELP" ));
443 buttonHelp->setAutoDefault(TRUE);
444 aGroupButtonsLayout->addWidget(buttonHelp, 0, 4);
446 aDialogLayout->addWidget(GroupButtons, 2, 0);
448 Init(); /* Initialisations */
451 //=================================================================================
452 // function : ~SMESHGUI_AddQuadraticElementDlg()
453 // purpose : Destroys the object and frees any allocated resources
454 //=================================================================================
455 SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg()
457 // no need to delete child widgets, Qt does it all for us
461 //=================================================================================
464 //=================================================================================
465 void SMESHGUI_AddQuadraticElementDlg::Init()
467 GroupArguments->show();
468 myRadioButton1->setChecked(TRUE);
469 myIsEditCorners = true;
470 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
480 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_edges
485 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_triangles
487 case QUAD_QUADRANGLE:
490 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_quadrangles
492 case QUAD_TETRAHEDRON:
495 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_tetrahedrons
500 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_pyramids
502 case QUAD_PENTAHEDRON:
505 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_pentahedrons
507 case QUAD_HEXAHEDRON:
510 myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_hexahedrons
514 myCornerNodes->setValidator(new SMESHGUI_IdValidator(this, "validator", myNbCorners));
516 /* initialize table */
517 myTable->setNumCols(3);
518 myTable->setNumRows(aNumRows);
520 QStringList aColLabels;
521 aColLabels.append(tr("SMESH_FIRST"));
522 aColLabels.append(tr("SMESH_MIDDLE"));
523 aColLabels.append(tr("SMESH_LAST"));
524 myTable->setColumnLabels(aColLabels);
526 for ( int col = 0; col < myTable->numCols(); col++ )
527 myTable->setColumnWidth(col, 80);
529 myTable->setColumnReadOnly(0, true);
530 myTable->setColumnReadOnly(2, true);
532 myTable->setEnabled( false );
534 for ( int row = 0; row < myTable->numRows(); row++ )
536 SMESHGUI_IdEditItem* anEditItem = new SMESHGUI_IdEditItem( myTable, QTableItem::OnTyping, "" );
537 anEditItem->setReplaceable(false);
538 myTable->setItem(row, 1, anEditItem);
541 /* signals and slots connections */
542 connect(mySelectButton, SIGNAL(clicked()), SLOT(SetEditCorners()));
543 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument()));
544 connect(myTable, SIGNAL(doubleClicked(int, int, int, const QPoint&)), SLOT(onCellDoubleClicked(int, int, int, const QPoint&)));
545 connect(myTable, SIGNAL(valueChanged (int, int)), SLOT(onCellTextChange(int, int)));
546 connect(myCornerNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
547 connect(myReverseCB, SIGNAL(stateChanged(int)), SLOT(onReverse(int)));
549 connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk()));
550 connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel()));
551 connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply()));
552 connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp()));
554 connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
555 connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(ClickOnCancel()));
557 this->show(); // displays Dialog
559 // set selection mode
560 SMESH::SetPointRepresentation(true);
562 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
563 aViewWindow->SetSelectionMode( NodeSelection );
570 //=================================================================================
571 // function : ClickOnApply()
573 //=================================================================================
574 void SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
576 if (IsValid() && !mySMESHGUI->isActiveStudyLocked()) {
583 anIds.push_back(myTable->text(0, 0).toInt());
584 anIds.push_back(myTable->text(0, 2).toInt());
585 anIds.push_back(myTable->text(0, 1).toInt());
588 case QUAD_QUADRANGLE:
589 case QUAD_TETRAHEDRON:
591 case QUAD_PENTAHEDRON:
592 case QUAD_HEXAHEDRON:
593 for ( int row = 0; row < myNbCorners; row++ )
594 anIds.push_back(myTable->text(row, 0).toInt());
595 for ( int row = 0; row < myTable->numRows(); row++ )
596 anIds.push_back(myTable->text(row, 1).toInt());
599 if ( myReverseCB->isChecked())
600 SMESH::ReverseConnectivity( anIds, myType );
602 int aNumberOfIds = anIds.size();
603 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
604 anArrayOfIdeces->length( aNumberOfIds );
606 for (int i = 0; i < aNumberOfIds; i++)
607 anArrayOfIdeces[i] = anIds[ i ];
609 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
612 aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break;
614 case QUAD_QUADRANGLE:
615 aMeshEditor->AddFace(anArrayOfIdeces.inout()); break;
616 case QUAD_TETRAHEDRON:
618 case QUAD_PENTAHEDRON:
619 case QUAD_HEXAHEDRON:
620 aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break;
623 SALOME_ListIO aList; aList.Append( myActor->getIO() );
624 mySelector->ClearIndex();
625 mySelectionMgr->setSelectedObjects( aList, false );
628 mySimulation->SetVisibility(false);
630 buttonOk->setEnabled(false);
631 buttonApply->setEnabled(false);
640 //=================================================================================
641 // function : ClickOnOk()
643 //=================================================================================
644 void SMESHGUI_AddQuadraticElementDlg::ClickOnOk()
651 //=================================================================================
652 // function : ClickOnCancel()
654 //=================================================================================
655 void SMESHGUI_AddQuadraticElementDlg::ClickOnCancel()
657 mySelectionMgr->clearSelected();
658 mySimulation->SetVisibility(false);
659 SMESH::SetPointRepresentation(false);
660 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
661 aViewWindow->SetSelectionMode( ActorSelection );
662 disconnect(mySelectionMgr, 0, this, 0);
663 mySMESHGUI->ResetState();
668 //=================================================================================
669 // function : ClickOnHelp()
671 //=================================================================================
672 void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp()
674 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
676 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
678 SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
679 QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
680 arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName),
681 QObject::tr("BUT_OK"));
685 //=================================================================================
686 // function : onTextChange()
688 //=================================================================================
689 void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText)
694 buttonOk->setEnabled(false);
695 buttonApply->setEnabled(false);
697 mySimulation->SetVisibility(false);
699 // hilight entered nodes
700 SMDS_Mesh* aMesh = 0;
702 aMesh = myActor->GetObject()->GetMesh();
705 TColStd_MapOfInteger newIndices;
707 QStringList aListId = QStringList::split(" ", theNewText, false);
709 for (int i = 0; i < aListId.count(); i++) {
710 if( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) )
711 newIndices.Add( n->GetID() );
719 mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
720 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
721 aViewWindow->highlight( myActor->getIO(), true, true );
723 if ( sender() == myCornerNodes )
724 UpdateTable( allOk );
728 buttonOk->setEnabled(true);
729 buttonApply->setEnabled(true);
732 if ( sender() == myTable )
738 //=================================================================================
739 // function : SelectionIntoArgument()
740 // purpose : Called when selection has changed
741 //=================================================================================
742 void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument()
746 if ( myIsEditCorners )
752 myCornerNodes->setText("");
755 if (!GroupButtons->isEnabled()) // inactive
758 buttonOk->setEnabled(false);
759 buttonApply->setEnabled(false);
761 mySimulation->SetVisibility(false);
765 mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
767 if (aList.Extent() != 1)
773 Handle(SALOME_InteractiveObject) anIO = aList.First();
774 myMesh = SMESH::GetMeshByIO(anIO);
775 if (myMesh->_is_nil())
778 myActor = SMESH::FindActorByEntry(anIO->getEntry());
785 // get selected nodes
786 QString aString = "";
787 int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,myActor->getIO(),aString);
789 if ( myIsEditCorners )
792 myCornerNodes->setText(aString);
797 else if ( myTable->isEnabled() && nbNodes == 1 )
800 int theRow = myTable->currentRow(), theCol = myTable->currentColumn();
802 myTable->setText(theRow, 1, aString);
808 buttonOk->setEnabled( true );
809 buttonApply->setEnabled( true );
815 //=================================================================================
816 // function : displaySimulation()
818 //=================================================================================
819 void SMESHGUI_AddQuadraticElementDlg::displaySimulation()
821 if (!myIsEditCorners) {
822 SMESH::TElementSimulation::TVTKIds anIds;
824 // Collect ids from the dialog
827 int aDisplayMode = VTK_SURFACE;
829 if ( myType == QUAD_EDGE )
831 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(0, 0).toInt() ) );
832 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(0, 2).toInt() ) );
833 anID = (myTable->text(0, 1)).toInt(&ok);
834 if (!ok) anID = (myTable->text(0, 0)).toInt();
835 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
836 aDisplayMode = VTK_WIREFRAME;
840 for ( int row = 0; row < myNbCorners; row++ )
841 anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(row, 0).toInt() ) );
843 for ( int row = 0; row < myTable->numRows(); row++ )
845 anID = (myTable->text(row, 1)).toInt(&ok);
847 anID = (myTable->text(row, 0)).toInt();
848 aDisplayMode = VTK_WIREFRAME;
850 anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) );
854 mySimulation->SetPosition(myActor,myType,anIds,aDisplayMode,myReverseCB->isChecked());
859 //=================================================================================
860 // function : SetEditCorners()
862 //=================================================================================
863 void SMESHGUI_AddQuadraticElementDlg::SetEditCorners()
865 myCornerNodes->setFocus();
866 myIsEditCorners = true;
868 SelectionIntoArgument();
871 //=================================================================================
872 // function : DeactivateActiveDialog()
874 //=================================================================================
875 void SMESHGUI_AddQuadraticElementDlg::DeactivateActiveDialog()
877 if (GroupConstructors->isEnabled()) {
878 GroupConstructors->setEnabled(false);
879 GroupArguments->setEnabled(false);
880 GroupButtons->setEnabled(false);
881 mySimulation->SetVisibility(false);
882 mySMESHGUI->ResetState();
883 mySMESHGUI->SetActiveDialogBox(0);
887 //=================================================================================
888 // function : ActivateThisDialog()
890 //=================================================================================
891 void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog()
893 /* Emit a signal to deactivate the active dialog */
894 mySMESHGUI->EmitSignalDeactivateDialog();
896 GroupConstructors->setEnabled(true);
897 GroupArguments->setEnabled(true);
898 GroupButtons->setEnabled(true);
900 SMESH::SetPointRepresentation(true);
902 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
903 aViewWindow->SetSelectionMode( NodeSelection );
904 SelectionIntoArgument();
907 //=================================================================================
908 // function : enterEvent()
910 //=================================================================================
911 void SMESHGUI_AddQuadraticElementDlg::enterEvent (QEvent*)
913 if (GroupConstructors->isEnabled())
915 ActivateThisDialog();
919 //=================================================================================
920 // function : closeEvent()
922 //=================================================================================
923 void SMESHGUI_AddQuadraticElementDlg::closeEvent (QCloseEvent*)
925 /* same than click on cancel button */
930 //=================================================================================
931 // function : hideEvent()
932 // purpose : caused by ESC key
933 //=================================================================================
934 void SMESHGUI_AddQuadraticElementDlg::hideEvent (QHideEvent*)
940 //=================================================================================
941 // function : onReverse()
943 //=================================================================================
944 void SMESHGUI_AddQuadraticElementDlg::onReverse (int state)
950 mySimulation->SetVisibility(false);
956 //=================================================================================
957 // function : IsValid()
959 //=================================================================================
960 bool SMESHGUI_AddQuadraticElementDlg::IsValid()
962 SMDS_Mesh* aMesh = 0;
964 aMesh = myActor->GetObject()->GetMesh();
970 for ( int row = 0; row < myTable->numRows(); row++ )
972 int anID = (myTable->text(row, 1)).toInt(&ok);
976 const SMDS_MeshNode * aNode = aMesh->FindNode(anID);
984 //=================================================================================
985 // function : UpdateTable()
987 //=================================================================================
988 void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity )
990 QStringList aListCorners = QStringList::split(" ", myCornerNodes->text(), false);
992 if ( aListCorners.count() == myNbCorners && theConersValidity )
994 myTable->setEnabled( true );
996 // clear the Middle column
997 for ( int row = 0; row < myTable->numRows(); row++ )
998 myTable->setText( row, 1, "");
1005 aFirstColIds = FirstEdgeIds;
1006 aLastColIds = LastEdgeIds;
1009 aFirstColIds = FirstTriangleIds;
1010 aLastColIds = LastTriangleIds;
1012 case QUAD_QUADRANGLE:
1013 aFirstColIds = FirstQuadrangleIds;
1014 aLastColIds = LastQuadrangleIds;
1016 case QUAD_TETRAHEDRON:
1017 aFirstColIds = FirstTetrahedronIds;
1018 aLastColIds = LastTetrahedronIds;
1021 aFirstColIds = FirstPyramidIds;
1022 aLastColIds = LastPyramidIds;
1024 case QUAD_PENTAHEDRON:
1025 aFirstColIds = FirstPentahedronIds;
1026 aLastColIds = LastPentahedronIds;
1028 case QUAD_HEXAHEDRON:
1029 aFirstColIds = FirstHexahedronIds;
1030 aLastColIds = LastHexahedronIds;
1034 // fill the First and the Last columns
1035 for (int i = 0, iEnd = myTable->numRows(); i < iEnd; i++)
1036 myTable->setText( i, 0, aListCorners[ aFirstColIds[i] ] );
1038 for (int i = 0, iEnd = myTable->numRows(); i < iEnd; i++)
1039 myTable->setText( i, 2, aListCorners[ aLastColIds[i] ] );
1044 for ( int row = 0; row < myTable->numRows(); row++ )
1045 for ( int col = 0; col < myTable->numCols(); col++ )
1046 myTable->setText(row, col, "");
1048 myTable->setEnabled( false );
1053 //=================================================================================
1054 // function : onTableActivate()
1056 //=================================================================================
1057 void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol, int theButton, const QPoint& theMousePos )
1059 if ( theButton == 1 && theCol == 1 )
1060 myIsEditCorners = false;
1062 displaySimulation();
1067 //=================================================================================
1068 // function : onCellTextChange()
1070 //=================================================================================
1071 void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol)
1073 onTextChange( myTable->text(theRow, theCol) );
1077 QWidget* SMESHGUI_IdEditItem::createEditor() const
1079 QLineEdit *aLineEdit = new QLineEdit(text(), table()->viewport());
1080 aLineEdit->setValidator( new SMESHGUI_IdValidator(table()->viewport(), "validator", 1) );