X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_AddQuadraticElementDlg.cxx;h=e3175273c6b11c7f63216ba46d22ad15e3a74294;hb=ccde869e079e5502930d8b04f2b229ee500779cb;hp=52458d5354b9ca86ef7f534bae12593d9d7c772c;hpb=24702e4b6a0bdf24dfaaa44d3defe0cade6d6f7e;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index 52458d535..e3175273c 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -34,6 +34,7 @@ #include #include +#include #include // SALOME GUI includes @@ -63,6 +64,7 @@ #include #include #include +#include #include #include @@ -153,7 +155,11 @@ namespace SMESH vtkUnstructuredGrid* myGrid; //vtkProperty* myBackProp, *myProp; - vtkFloatingPointType myRGB[3], myBackRGB[3]; + //vtkFloatingPointType myRGB[3], myBackRGB[3]; + + SALOME_Actor* myFaceOrientation; + vtkPolyDataMapper* myFaceOrientationDataMapper; + SMESH_FaceOrientationFilter* myFaceOrientationFilter; public: TElementSimulation (SalomeApp_Application* theApplication) @@ -176,18 +182,39 @@ namespace SMESH myPreviewActor->SetMapper(myMapper); vtkProperty* myProp = vtkProperty::New(); - GetColor( "SMESH", "fill_color", myRGB[0], myRGB[1], myRGB[2], QColor( 0, 170, 255 ) ); - myProp->SetColor( myRGB[0], myRGB[1], myRGB[2] ); + vtkFloatingPointType aRGB[3], aBackRGB[3]; + GetColor( "SMESH", "fill_color", aRGB[0], aRGB[1], aRGB[2], QColor( 0, 170, 255 ) ); + myProp->SetColor( aRGB[0], aRGB[1], aRGB[2] ); myPreviewActor->SetProperty( myProp ); myProp->Delete(); vtkProperty* myBackProp = vtkProperty::New(); - GetColor( "SMESH", "backface_color", myBackRGB[0], myBackRGB[1], myBackRGB[2], QColor( 0, 0, 255 ) ); - myBackProp->SetColor( myBackRGB[0], myBackRGB[1], myBackRGB[2] ); + GetColor( "SMESH", "backface_color", aBackRGB[0], aBackRGB[1], aBackRGB[2], QColor( 0, 0, 255 ) ); + myBackProp->SetColor( aBackRGB[0], aBackRGB[1], aBackRGB[2] ); myPreviewActor->SetBackfaceProperty( myBackProp ); myBackProp->Delete(); myVTKViewWindow->AddActor(myPreviewActor); + + // Orientation of faces + myFaceOrientationFilter = SMESH_FaceOrientationFilter::New(); + myFaceOrientationFilter->SetInput(myGrid); + + myFaceOrientationDataMapper = vtkPolyDataMapper::New(); + myFaceOrientationDataMapper->SetInput(myFaceOrientationFilter->GetOutput()); + + myFaceOrientation = SALOME_Actor::New(); + myFaceOrientation->PickableOff(); + myFaceOrientation->VisibilityOff(); + myFaceOrientation->SetMapper(myFaceOrientationDataMapper); + + vtkProperty* anOrientationProp = vtkProperty::New(); + GetColor( "SMESH", "orientation_color", aRGB[0], aRGB[1], aRGB[2], QColor( 255, 255, 255 ) ); + anOrientationProp->SetColor( aRGB[0], aRGB[1], aRGB[2] ); + myFaceOrientation->SetProperty( anOrientationProp ); + anOrientationProp->Delete(); + + myVTKViewWindow->AddActor(myFaceOrientation); } typedef std::vector TVTKIds; @@ -222,8 +249,8 @@ namespace SMESH aType = VTK_CONVEX_POINT_SET; break; case QUAD_PENTAHEDRON: - //aType = VTK_QUADRATIC_WEDGE; // NOT SUPPORTED IN VTK4.2 - aType = VTK_CONVEX_POINT_SET; + aType = VTK_QUADRATIC_WEDGE; + //aType = VTK_CONVEX_POINT_SET; break; case QUAD_HEXAHEDRON: aType = VTK_QUADRATIC_HEXAHEDRON; @@ -238,9 +265,13 @@ namespace SMESH } else { // VTK cell connectivity opposites the MED one for volumic elements - if ( theIds.size() > 8 ? !theReverse : theReverse ) { - ReverseConnectivity( theIds, theType ); + if( aType != VTK_QUADRATIC_WEDGE) { + if ( theIds.size() > 8 ? !theReverse : theReverse ) { + ReverseConnectivity( theIds, theType ); + } } + else if(theReverse) + ReverseConnectivity( theIds, theType ); } myGrid->Reset(); @@ -258,7 +289,7 @@ namespace SMESH myPreviewActor->GetMapper()->Update(); myPreviewActor->SetRepresentation( theMode ); - SetVisibility(true); + SetVisibility(true, theActor->GetFacesOriented()); // restore normal orientation if ( aType == VTK_CONVEX_POINT_SET ) { @@ -269,9 +300,10 @@ namespace SMESH } - void SetVisibility (bool theVisibility) + void SetVisibility (bool theVisibility, bool theShowOrientation = false) { myPreviewActor->SetVisibility(theVisibility); + myFaceOrientation->SetVisibility(theShowOrientation); RepaintCurrentView(); } @@ -280,12 +312,19 @@ namespace SMESH { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { myVTKViewWindow->RemoveActor(myPreviewActor); + myVTKViewWindow->RemoveActor(myFaceOrientation); } myPreviewActor->Delete(); + myFaceOrientation->Delete(); myMapper->RemoveAllInputs(); myMapper->Delete(); + myFaceOrientationFilter->Delete(); + + myFaceOrientationDataMapper->RemoveAllInputs(); + myFaceOrientationDataMapper->Delete(); + myGrid->Delete(); // myProp->Delete(); @@ -319,17 +358,48 @@ static int LastHexahedronIds[] = {1,2,3,0,5,6,7,4,4,5,6,7}; -class SMESHGUI_IdEditItem: public QTableWidgetItem +/*! + \class BusyLocker + \brief Simple 'busy state' flag locker. + \internal +*/ + +class BusyLocker { public: - SMESHGUI_IdEditItem(const QString& text ): - QTableWidgetItem(text, QTableWidgetItem::UserType+100) {}; - ~SMESHGUI_IdEditItem() {}; + //! Constructor. Sets passed boolean flag to \c true. + BusyLocker( bool& busy ) : myBusy( busy ) { myBusy = true; } + //! Destructor. Clear external boolean flag passed as parameter to the constructor to \c false. + ~BusyLocker() { myBusy = false; } +private: + bool& myBusy; //! External 'busy state' boolean flag +}; + +/*! + \class IdEditItem + \brief Simple editable table item. + \internal +*/ + +class IdEditItem: public QTableWidgetItem +{ +public: + IdEditItem(const QString& text ); + ~IdEditItem(); QWidget* createEditor() const; }; -QWidget* SMESHGUI_IdEditItem::createEditor() const +IdEditItem::IdEditItem(const QString& text ) + : QTableWidgetItem(text, QTableWidgetItem::UserType+100) +{ +} + +IdEditItem::~IdEditItem() +{ +} + +QWidget* IdEditItem::createEditor() const { QLineEdit *aLineEdit = new QLineEdit(text(), tableWidget()); aLineEdit->setValidator( new SMESHGUI_IdValidator(tableWidget(), 1) ); @@ -345,7 +415,8 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myType( theType ) + myType( theType ), + myBusy( false ) { setModal( false ); setAttribute( Qt::WA_DeleteOnClose, true ); @@ -440,7 +511,7 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM aGroupButtonsLayout->setSpacing(SPACING); aGroupButtonsLayout->setMargin(MARGIN); - buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons); + buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); buttonOk->setAutoDefault(true); buttonOk->setDefault(true); buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); @@ -482,7 +553,6 @@ SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg() void SMESHGUI_AddQuadraticElementDlg::Init() { myRadioButton1->setChecked(true); - myIsEditCorners = true; mySMESHGUI->SetActiveDialogBox((QDialog*)this); myActor = 0; @@ -549,9 +619,15 @@ void SMESHGUI_AddQuadraticElementDlg::Init() for ( int row = 0; row < myTable->rowCount(); row++ ) { - SMESHGUI_IdEditItem* anEditItem = new SMESHGUI_IdEditItem( "" ); + myTable->setItem( row, 0, new QTableWidgetItem( "" ) ); + myTable->item( row, 0 )->setFlags(0); + + IdEditItem* anEditItem = new IdEditItem( "" ); anEditItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); myTable->setItem(row, 1, anEditItem); + + myTable->setItem( row, 2, new QTableWidgetItem( "" ) ); + myTable->item( row, 2 )->setFlags(0); } /* signals and slots connections */ @@ -576,8 +652,6 @@ void SMESHGUI_AddQuadraticElementDlg::Init() if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode( NodeSelection ); - myBusy = false; - SetEditCorners(); } @@ -587,68 +661,66 @@ void SMESHGUI_AddQuadraticElementDlg::Init() //================================================================================= void SMESHGUI_AddQuadraticElementDlg::ClickOnApply() { - if (IsValid() && !mySMESHGUI->isActiveStudyLocked()) { - myBusy = true; - - std::vector anIds; + if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() ) + return; - switch (myType) { - case QUAD_EDGE: - anIds.push_back(myTable->item(0, 0)->text().toInt()); - anIds.push_back(myTable->item(0, 2)->text().toInt()); - anIds.push_back(myTable->item(0, 1)->text().toInt()); - break; - case QUAD_TRIANGLE: - case QUAD_QUADRANGLE: - case QUAD_TETRAHEDRON: - case QUAD_PYRAMID: - case QUAD_PENTAHEDRON: - case QUAD_HEXAHEDRON: - for ( int row = 0; row < myNbCorners; row++ ) - anIds.push_back(myTable->item(row, 0)->text().toInt()); - for ( int row = 0; row < myTable->rowCount(); row++ ) - anIds.push_back(myTable->item(row, 1)->text().toInt()); - break; - } - if ( myReverseCB->isChecked()) - SMESH::ReverseConnectivity( anIds, myType ); + BusyLocker lock( myBusy ); + + std::vector anIds; + + switch (myType) { + case QUAD_EDGE: + anIds.push_back(myTable->item(0, 0)->text().toInt()); + anIds.push_back(myTable->item(0, 2)->text().toInt()); + anIds.push_back(myTable->item(0, 1)->text().toInt()); + break; + case QUAD_TRIANGLE: + case QUAD_QUADRANGLE: + case QUAD_TETRAHEDRON: + case QUAD_PYRAMID: + case QUAD_PENTAHEDRON: + case QUAD_HEXAHEDRON: + for ( int row = 0; row < myNbCorners; row++ ) + anIds.push_back(myTable->item(row, 0)->text().toInt()); + for ( int row = 0; row < myTable->rowCount(); row++ ) + anIds.push_back(myTable->item(row, 1)->text().toInt()); + break; + } + if ( myReverseCB->isChecked()) + SMESH::ReverseConnectivity( anIds, myType ); - int aNumberOfIds = anIds.size(); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length( aNumberOfIds ); + int aNumberOfIds = anIds.size(); + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length( aNumberOfIds ); - for (int i = 0; i < aNumberOfIds; i++) - anArrayOfIdeces[i] = anIds[ i ]; + for (int i = 0; i < aNumberOfIds; i++) + anArrayOfIdeces[i] = anIds[ i ]; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - switch (myType) { - case QUAD_EDGE: - aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break; - case QUAD_TRIANGLE: - case QUAD_QUADRANGLE: - aMeshEditor->AddFace(anArrayOfIdeces.inout()); break; - case QUAD_TETRAHEDRON: - case QUAD_PYRAMID: - case QUAD_PENTAHEDRON: - case QUAD_HEXAHEDRON: - aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break; - } + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + switch (myType) { + case QUAD_EDGE: + aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break; + case QUAD_TRIANGLE: + case QUAD_QUADRANGLE: + aMeshEditor->AddFace(anArrayOfIdeces.inout()); break; + case QUAD_TETRAHEDRON: + case QUAD_PYRAMID: + case QUAD_PENTAHEDRON: + case QUAD_HEXAHEDRON: + aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break; + } - SALOME_ListIO aList; aList.Append( myActor->getIO() ); - mySelector->ClearIndex(); - mySelectionMgr->setSelectedObjects( aList, false ); + SALOME_ListIO aList; aList.Append( myActor->getIO() ); + mySelector->ClearIndex(); + mySelectionMgr->setSelectedObjects( aList, false ); - SMESH::UpdateView(); - mySimulation->SetVisibility(false); + mySimulation->SetVisibility(false); + SMESH::UpdateView(); - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - UpdateTable(); - SetEditCorners(); + UpdateTable(); + SetEditCorners(); - myBusy = false; - } + updateButtons(); } //================================================================================= @@ -708,11 +780,8 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp() void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) { if (myBusy) return; - myBusy = true; + BusyLocker lock( myBusy ); - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - mySimulation->SetVisibility(false); // hilight entered nodes @@ -726,13 +795,15 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); bool allOk = true; for (int i = 0; i < aListId.count(); i++) { - if( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) ) + if ( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) ) + { newIndices.Add( n->GetID() ); + } else - { - allOk = false; - break; - } + { + allOk = false; + break; + } } mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); @@ -743,15 +814,8 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) UpdateTable( allOk ); } - if( IsValid() ) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - - if ( sender() == myTable ) - displaySimulation(); - - myBusy = false; + updateButtons(); + displaySimulation(); } //================================================================================= @@ -761,73 +825,65 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() { if (myBusy) return; + BusyLocker lock( myBusy ); if ( myIsEditCorners ) - { - // clear - myActor = 0; - - myBusy = true; - myCornerNodes->setText(""); - myBusy = false; - - if (!GroupButtons->isEnabled()) // inactive - return; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - mySimulation->SetVisibility(false); - - // get selected mesh - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); + { + // clear + myActor = 0; + + myCornerNodes->setText(""); + + if (!GroupButtons->isEnabled()) // inactive + return; + + mySimulation->SetVisibility(false); - if (aList.Extent() != 1) - { - UpdateTable(); - return; - } + // get selected mesh + SALOME_ListIO aList; + mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); + + if (aList.Extent() != 1) + { + UpdateTable(); + updateButtons(); + return; + } - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; + Handle(SALOME_InteractiveObject) anIO = aList.First(); + myMesh = SMESH::GetMeshByIO(anIO); + if (myMesh->_is_nil()) { + updateButtons(); + return; + } - myActor = SMESH::FindActorByEntry(anIO->getEntry()); + myActor = SMESH::FindActorByEntry(anIO->getEntry()); - } + } - if (!myActor) + if (!myActor) { + updateButtons(); return; + } // get selected nodes QString aString = ""; int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,myActor->getIO(),aString); if ( myIsEditCorners ) - { - myBusy = true; - myCornerNodes->setText(aString); - myBusy = false; - - UpdateTable(); - } + { + myCornerNodes->setText(aString); + + UpdateTable(); + } else if ( myTable->isEnabled() && nbNodes == 1 ) - { - myBusy = true; - int theRow = myTable->currentRow(), theCol = myTable->currentColumn(); - if ( theCol == 1 ) - myTable->item(theRow, 1)->setText(aString); - myBusy = false; - } + { + int theRow = myTable->currentRow(), theCol = myTable->currentColumn(); + if ( theCol == 1 ) + myTable->item(theRow, 1)->setText(aString); + } - if ( IsValid() ) - { - buttonOk->setEnabled( true ); - buttonApply->setEnabled( true ); - } - + updateButtons(); displaySimulation(); } @@ -837,42 +893,47 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() //================================================================================= void SMESHGUI_AddQuadraticElementDlg::displaySimulation() { - if (!myIsEditCorners) { + if ( IsValid() ) + { SMESH::TElementSimulation::TVTKIds anIds; // Collect ids from the dialog int anID; bool ok; int aDisplayMode = VTK_SURFACE; - + if ( myType == QUAD_EDGE ) - { - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 0)->text().toInt() ) ); - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 2)->text().toInt() ) ); - anID = myTable->item(0, 1)->text().toInt(&ok); - if (!ok) anID = myTable->item(0, 0)->text().toInt(); - anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); - aDisplayMode = VTK_WIREFRAME; - } + { + anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 0)->text().toInt() ) ); + anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 2)->text().toInt() ) ); + anID = myTable->item(0, 1)->text().toInt(&ok); + if (!ok) anID = myTable->item(0, 0)->text().toInt(); + anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); + aDisplayMode = VTK_WIREFRAME; + } else + { + for ( int row = 0; row < myNbCorners; row++ ) + anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) ); + + for ( int row = 0; row < myTable->rowCount(); row++ ) { - for ( int row = 0; row < myNbCorners; row++ ) - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) ); - - for ( int row = 0; row < myTable->rowCount(); row++ ) - { - anID = myTable->item(row, 1)->text().toInt(&ok); - if (!ok) { - anID = myTable->item(row, 0)->text().toInt(); - aDisplayMode = VTK_WIREFRAME; - } - anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); - } + anID = myTable->item(row, 1)->text().toInt(&ok); + if (!ok) { + anID = myTable->item(row, 0)->text().toInt(); + aDisplayMode = VTK_WIREFRAME; + } + anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); } + } mySimulation->SetPosition(myActor,myType,anIds,aDisplayMode,myReverseCB->isChecked()); - SMESH::UpdateView(); } + else + { + mySimulation->SetVisibility(false); + } + SMESH::UpdateView(); } //================================================================================= @@ -883,8 +944,8 @@ void SMESHGUI_AddQuadraticElementDlg::SetEditCorners() { myCornerNodes->setFocus(); myIsEditCorners = true; - SelectionIntoArgument(); + updateButtons(); } //================================================================================= @@ -960,13 +1021,9 @@ void SMESHGUI_AddQuadraticElementDlg::hideEvent (QHideEvent*) //================================================================================= void SMESHGUI_AddQuadraticElementDlg::onReverse (int state) { - if (!IsValid()) - return; - - if (state >= 0) { - mySimulation->SetVisibility(false); - displaySimulation(); - } + mySimulation->SetVisibility(false); + displaySimulation(); + updateButtons(); } @@ -985,15 +1042,15 @@ bool SMESHGUI_AddQuadraticElementDlg::IsValid() bool ok; for ( int row = 0; row < myTable->rowCount(); row++ ) - { - int anID = myTable->item(row, 1)->text().toInt(&ok); - if ( !ok ) - return false; - - const SMDS_MeshNode * aNode = aMesh->FindNode(anID); - if ( !aNode ) - return false; - } + { + int anID = myTable->item(row, 1)->text().toInt(&ok); + if ( !ok ) + return false; + + const SMDS_MeshNode * aNode = aMesh->FindNode(anID); + if ( !aNode ) + return false; + } return true; } @@ -1007,63 +1064,63 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) QStringList aListCorners = myCornerNodes->text().split(" ", QString::SkipEmptyParts); if ( aListCorners.count() == myNbCorners && theConersValidity ) - { - myTable->setEnabled( true ); - - // clear the Middle column - for ( int row = 0; row < myTable->rowCount(); row++ ) - myTable->item( row, 1 )->setText(""); - - int* aFirstColIds; - int* aLastColIds; - - switch (myType) { - case QUAD_EDGE: - aFirstColIds = FirstEdgeIds; - aLastColIds = LastEdgeIds; - break; - case QUAD_TRIANGLE: - aFirstColIds = FirstTriangleIds; - aLastColIds = LastTriangleIds; - break; - case QUAD_QUADRANGLE: - aFirstColIds = FirstQuadrangleIds; - aLastColIds = LastQuadrangleIds; - break; - case QUAD_TETRAHEDRON: - aFirstColIds = FirstTetrahedronIds; - aLastColIds = LastTetrahedronIds; - break; - case QUAD_PYRAMID: - aFirstColIds = FirstPyramidIds; - aLastColIds = LastPyramidIds; - break; - case QUAD_PENTAHEDRON: - aFirstColIds = FirstPentahedronIds; - aLastColIds = LastPentahedronIds; - break; - case QUAD_HEXAHEDRON: - aFirstColIds = FirstHexahedronIds; - aLastColIds = LastHexahedronIds; - break; - } - - // fill the First and the Last columns - for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++) - myTable->item( i, 0 )->setText( aListCorners[ aFirstColIds[i] ] ); - - for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++) - myTable->item( i, 2 )->setText( aListCorners[ aLastColIds[i] ] ); + { + myTable->setEnabled( true ); + + // clear the Middle column + for ( int row = 0; row < myTable->rowCount(); row++ ) + myTable->item( row, 1 )->setText(""); + + int* aFirstColIds; + int* aLastColIds; + + switch (myType) { + case QUAD_EDGE: + aFirstColIds = FirstEdgeIds; + aLastColIds = LastEdgeIds; + break; + case QUAD_TRIANGLE: + aFirstColIds = FirstTriangleIds; + aLastColIds = LastTriangleIds; + break; + case QUAD_QUADRANGLE: + aFirstColIds = FirstQuadrangleIds; + aLastColIds = LastQuadrangleIds; + break; + case QUAD_TETRAHEDRON: + aFirstColIds = FirstTetrahedronIds; + aLastColIds = LastTetrahedronIds; + break; + case QUAD_PYRAMID: + aFirstColIds = FirstPyramidIds; + aLastColIds = LastPyramidIds; + break; + case QUAD_PENTAHEDRON: + aFirstColIds = FirstPentahedronIds; + aLastColIds = LastPentahedronIds; + break; + case QUAD_HEXAHEDRON: + aFirstColIds = FirstHexahedronIds; + aLastColIds = LastHexahedronIds; + break; } + + // fill the First and the Last columns + for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++) + myTable->item( i, 0 )->setText( aListCorners[ aFirstColIds[i] ] ); + + for (int i = 0, iEnd = myTable->rowCount(); i < iEnd; i++) + myTable->item( i, 2 )->setText( aListCorners[ aLastColIds[i] ] ); + } else - { - // clear table - for ( int row = 0; row < myTable->rowCount(); row++ ) - for ( int col = 0; col < myTable->columnCount(); col++ ) - if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText(""); - - myTable->setEnabled( false ); - } + { + // clear table + for ( int row = 0; row < myTable->rowCount(); row++ ) + for ( int col = 0; col < myTable->columnCount(); col++ ) + if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText(""); + + myTable->setEnabled( false ); + } } @@ -1073,10 +1130,9 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) //================================================================================= void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol ) { - if ( theCol == 1 ) - myIsEditCorners = false; - + myIsEditCorners = false; displaySimulation(); + updateButtons(); } @@ -1086,7 +1142,9 @@ void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCo //================================================================================= void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol) { - onTextChange( myTable->item(theRow, theCol)->text() ); + myIsEditCorners = false; + displaySimulation(); + updateButtons(); } //================================================================================= @@ -1104,3 +1162,10 @@ void SMESHGUI_AddQuadraticElementDlg::keyPressEvent( QKeyEvent* e ) ClickOnHelp(); } } + +void SMESHGUI_AddQuadraticElementDlg::updateButtons() +{ + bool valid = IsValid(); + buttonOk->setEnabled( valid ); + buttonApply->setEnabled( valid ); +}