X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_AddQuadraticElementDlg.cxx;h=94819e6cebac9dc8511d130e7d7a3821b6ee0b2c;hp=da47fe19081e47ac2fbc9f86728dc91511288ed2;hb=14fc167a5302d96f900352c52688462298b0d4c0;hpb=c63ee099ad2b149bd70136839c973e8910137bc5 diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index da47fe190..94819e6ce 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -1,12 +1,14 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // -// This library is distributed in the hope that it will be useful +// This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. @@ -17,129 +19,101 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_AddMeshElementDlg.cxx +// Author : Nicolas REJNERI, Open CASCADE S.A.S. +// SMESH includes +// #include "SMESHGUI_AddQuadraticElementDlg.h" #include "SMESHGUI.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_VTKUtils.h" #include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_GroupUtils.h" #include "SMESHGUI_IdValidator.h" -#include "SMESH_ActorUtils.h" -#include "SMDS_Mesh.hxx" -#include "SMESH_Actor.h" +#include +#include +#include +#include -#include "SUIT_Session.h" -#include "SUIT_MessageBox.h" -#include "LightApp_Application.h" +// SALOME GUI includes +#include +#include +#include +#include +#include -#include "SVTK_Selection.h" -#include "SVTK_Selector.h" -#include "SALOME_ListIO.hxx" -#include "SALOME_ListIteratorOfListIO.hxx" +#include -#include "SalomeApp_Study.h" -#include "SalomeApp_Application.h" +#include +#include -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" +#include -#include "utilities.h" +#include -// OCCT Includes +#include + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) + +// OCCT includes #include -#include -// VTK Includes -#include +// VTK includes #include -#include -#include -#include #include #include +#include #include - -#include -#include -#include -#include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // STL includes -#include +#include -using namespace std; +#define SPACING 6 +#define MARGIN 11 -namespace SMESH { - - void ReverseConnectivity( vector & ids, int type ) +namespace +{ + void ReverseConnectivity( std::vector & ids, SMDSAbs_EntityType type, + bool toReverse, // inverse element + bool toVtkOrder ) // smds connectivity to vtk one { - // for reverse connectivity of other types keeping the first id, see - // void SMESH_VisualObjDef::buildElemPrs() in SMESH_Object.cxx:900 - const int* conn = 0; - - switch ( type ) { - case QUAD_TETRAHEDRON: { - static int aConn[] = {0,2,1,3,6,5,4,7,9,8}; - conn = aConn; - break; - } - case QUAD_PYRAMID: { - static int aConn[] = {0,3,2,1,4,8,7,6,5,9,12,11,10}; - conn = aConn; - break; - } - case QUAD_PENTAHEDRON: { - static int aConn[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13}; - conn = aConn; - break; - } - case QUAD_HEXAHEDRON: { - static int aConn[] = {0,3,2,1,4,7,6,5,11,10,9,8,15,14,13,12,16,19,18,17}; - conn = aConn; - break; - } - case QUAD_EDGE: { - static int aConn[] = {1,0,2}; - conn = aConn; - break; - } - case QUAD_TRIANGLE: { - static int aConn[] = {0,2,1,5,4,3}; - conn = aConn; - break; - } - case QUAD_QUADRANGLE: { - static int aConn[] = {0,3,2,1,7,6,5,4}; - conn = aConn; - break; - } - default:; - } - if ( !conn ) { - reverse( ids.begin(), ids.end() ); + if ( toReverse ) // first reverse smds order + { + const std::vector& index = SMDS_MeshCell::reverseSmdsOrder(type); + SMDS_MeshCell::applyInterlace( index, ids ); } - else { - vector aRevIds( ids.size() ); - for ( int i = 0; i < ids.size(); i++) - aRevIds[ i ] = ids[ conn[ i ]]; - ids = aRevIds; + if ( toVtkOrder ) // from smds to vtk connectivity + { + const std::vector& index = SMDS_MeshCell::toVtkOrder(type); + SMDS_MeshCell::applyInterlace( index, ids ); } } - - class TElementSimulation { +} +namespace SMESH +{ + class TElementSimulationQuad { SalomeApp_Application* myApplication; SUIT_ViewWindow* myViewWindow; SVTK_ViewWindow* myVTKViewWindow; @@ -149,10 +123,14 @@ namespace SMESH { vtkUnstructuredGrid* myGrid; //vtkProperty* myBackProp, *myProp; - vtkFloatingPointType myRGB[3], myBackRGB[3]; + //double myRGB[3], myBackRGB[3]; + + SALOME_Actor* myFaceOrientation; + vtkPolyDataMapper* myFaceOrientationDataMapper; + SMESH_FaceOrientationFilter* myFaceOrientationFilter; public: - TElementSimulation (SalomeApp_Application* theApplication) + TElementSimulationQuad (SalomeApp_Application* theApplication) { myApplication = theApplication; SUIT_ViewManager* mgr = theApplication->activeViewManager(); @@ -164,124 +142,111 @@ namespace SMESH { // Create and display actor myMapper = vtkDataSetMapper::New(); - myMapper->SetInput(myGrid); + myMapper->SetInputData(myGrid); myPreviewActor = SALOME_Actor::New(); myPreviewActor->PickableOff(); myPreviewActor->VisibilityOff(); myPreviewActor->SetMapper(myMapper); - + + QColor ffc, bfc; + int delta; 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] ); + SMESH::GetColor( "SMESH", "preview_color", ffc, delta, "0, 255, 0|-100" ) ; + + myProp->SetColor( ffc.red() / 255. , ffc.green() / 255. , ffc.blue() / 255. ); 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] ); + bfc = Qtx::mainColorToSecondary(ffc, delta); + myBackProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); myPreviewActor->SetBackfaceProperty( myBackProp ); myBackProp->Delete(); myVTKViewWindow->AddActor(myPreviewActor); + + // Orientation of faces + myFaceOrientationFilter = SMESH_FaceOrientationFilter::New(); + myFaceOrientationFilter->SetInputData(myGrid); + + myFaceOrientationDataMapper = vtkPolyDataMapper::New(); + myFaceOrientationDataMapper->SetInputConnection(myFaceOrientationFilter->GetOutputPort()); + + myFaceOrientation = SALOME_Actor::New(); + myFaceOrientation->PickableOff(); + myFaceOrientation->VisibilityOff(); + myFaceOrientation->SetMapper(myFaceOrientationDataMapper); + + vtkProperty* anOrientationProp = vtkProperty::New(); + double aRGB[3]; + 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; - void SetPosition (SMESH_Actor* theActor, - const int theType, - TVTKIds& theIds, - const int theMode, - const bool theReverse) + void SetPosition (SMESH_Actor* theActor, + SMDSAbs_EntityType theType, + TVTKIds& theIds, + const int theMode, + const bool theReverse) { vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid(); myGrid->SetPoints(aGrid->GetPoints()); //add points - vtkIdType aType = 0; + ReverseConnectivity( theIds, theType, theReverse, /*toVtkOrder=*/true); - switch (theType) { - case QUAD_EDGE: - aType = VTK_QUADRATIC_EDGE; - break; - case QUAD_TRIANGLE: - aType = VTK_QUADRATIC_TRIANGLE; - break; - case QUAD_QUADRANGLE: - aType = VTK_QUADRATIC_QUAD; - break; - case QUAD_TETRAHEDRON: - aType = VTK_QUADRATIC_TETRA; - break; - case QUAD_PYRAMID: - //aType = VTK_QUADRATIC_PYRAMID; // NOT SUPPORTED IN VTK4.2 - aType = VTK_CONVEX_POINT_SET; - break; - case QUAD_PENTAHEDRON: - //aType = VTK_QUADRATIC_WEDGE; // NOT SUPPORTED IN VTK4.2 - aType = VTK_CONVEX_POINT_SET; - break; - case QUAD_HEXAHEDRON: - aType = VTK_QUADRATIC_HEXAHEDRON; - break; - } - - // take care of orientation - if ( aType == VTK_CONVEX_POINT_SET ) { - if ( theReverse && theMode == VTK_SURFACE ) { - //myPreviewActor->GetProperty()->SetColor( myBackRGB[0], myBackRGB[1], myBackRGB[2] ); - } - } - else { - // VTK cell connectivity opposites the MED one for volumic elements - if ( theIds.size() > 8 ? !theReverse : theReverse ) { - ReverseConnectivity( theIds, theType ); - } - } - myGrid->Reset(); vtkIdList *anIds = vtkIdList::New(); - + for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) { anIds->InsertId(i,theIds[i]); //std::cout << i<< ": " << theIds[i] << std::endl; } - + + vtkIdType aType = SMDS_MeshCell::toVtkType(theType); myGrid->InsertNextCell(aType,anIds); anIds->Delete(); - + myGrid->Modified(); myPreviewActor->GetMapper()->Update(); myPreviewActor->SetRepresentation( theMode ); - SetVisibility(true); - - // restore normal orientation - if ( aType == VTK_CONVEX_POINT_SET ) { - if ( theReverse && theMode == VTK_SURFACE ) { - //myPreviewActor->GetProperty()->SetColor( myRGB[0], myRGB[1], myRGB[2] ); - } - } + SetVisibility(true, theActor->GetFacesOriented()); } - void SetVisibility (bool theVisibility) + void SetVisibility (bool theVisibility, bool theShowOrientation = false) { myPreviewActor->SetVisibility(theVisibility); + myFaceOrientation->SetVisibility(theShowOrientation); RepaintCurrentView(); } - ~TElementSimulation() + ~TElementSimulationQuad() { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { - myVTKViewWindow->RemoveActor(myPreviewActor); + myVTKViewWindow->RemoveActor(myPreviewActor); + myVTKViewWindow->RemoveActor(myFaceOrientation); } myPreviewActor->Delete(); + myFaceOrientation->Delete(); myMapper->RemoveAllInputs(); myMapper->Delete(); + myFaceOrientationFilter->Delete(); + + myFaceOrientationDataMapper->RemoveAllInputs(); + myFaceOrientationDataMapper->Delete(); + myGrid->Delete(); // myProp->Delete(); @@ -313,156 +278,228 @@ static int LastPentahedronIds[] = {1,2,0,4,5,3,3,4,5}; static int FirstHexahedronIds[] = {0,1,2,3,4,5,6,7,0,1,2,3}; static int LastHexahedronIds[] = {1,2,3,0,5,6,7,4,4,5,6,7}; +/*! + \class BusyLocker + \brief Simple 'busy state' flag locker. + \internal +*/ +class BusyLocker +{ +public: + //! 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; +}; + +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) ); + return aLineEdit; +} //================================================================================= // function : SMESHGUI_AddQuadraticElementDlg() // purpose : constructor //================================================================================= + SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theModule, - const int theType, - const char* name, - bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myType( theType ) + const SMDSAbs_EntityType theType ) + : QDialog( SMESH::GetDesktop( theModule ) ), + mySMESHGUI( theModule ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), + myGeomType( theType ), + //myType( theType ), + myBusy( false ) { + setModal( false ); + setAttribute( Qt::WA_DeleteOnClose, true ); + SalomeApp_Application* anApp = dynamic_cast (SUIT_Session::session()->activeApplication()); - - mySimulation = new SMESH::TElementSimulation (anApp); + + mySimulation = new SMESH::TElementSimulationQuad (anApp); mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); QString anElementName; - switch ( myType ) { - case QUAD_EDGE: + switch ( myGeomType ) { + case SMDSEntity_Quad_Edge: anElementName = QString("QUADRATIC_EDGE"); break; - case QUAD_TRIANGLE: + case SMDSEntity_Quad_Triangle: anElementName = QString("QUADRATIC_TRIANGLE"); - break; - case QUAD_QUADRANGLE: + break; + case SMDSEntity_Quad_Quadrangle: anElementName = QString("QUADRATIC_QUADRANGLE"); break; - case QUAD_TETRAHEDRON: + case SMDSEntity_BiQuad_Quadrangle: + anElementName = QString("BIQUADRATIC_QUADRANGLE"); + break; + case SMDSEntity_BiQuad_Triangle: + anElementName = QString("BIQUADRATIC_TRIANGLE"); + break; + case SMDSEntity_Quad_Tetra: anElementName = QString("QUADRATIC_TETRAHEDRON"); break; - case QUAD_PYRAMID: + case SMDSEntity_Quad_Pyramid: anElementName = QString("QUADRATIC_PYRAMID"); break; - case QUAD_PENTAHEDRON: + case SMDSEntity_Quad_Penta: anElementName = QString("QUADRATIC_PENTAHEDRON"); break; - case QUAD_HEXAHEDRON: + case SMDSEntity_Quad_Hexa: anElementName = QString("QUADRATIC_HEXAHEDRON"); break; + case SMDSEntity_TriQuad_Hexa: + anElementName = QString("TRIQUADRATIC_HEXAHEDRON"); + break; default: - myType = QUAD_EDGE; + myGeomType = SMDSEntity_Quad_Edge; anElementName = QString("QUADRATIC_EDGE"); } - QString iconName = tr(QString("ICON_DLG_%1").arg(anElementName)); - QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(anElementName)); - QString argumentsGrTitle = tr(QString("SMESH_ADD_%1").arg(anElementName)); - QString constructorGrTitle = tr(QString("SMESH_%1").arg(anElementName)); - + QString iconName = tr(QString("ICON_DLG_%1").arg(anElementName).toLatin1().data()); + QString caption = tr(QString("SMESH_ADD_%1_TITLE").arg(anElementName).toLatin1().data()); + QString argumentsGrTitle = tr(QString("SMESH_ADD_%1").arg(anElementName).toLatin1().data()); + QString constructorGrTitle = tr(QString("SMESH_%1").arg(anElementName).toLatin1().data()); + QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", iconName)); QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - if (!name) - setName("SMESHGUI_AddQuadraticElementDlg"); - setCaption(caption); - - setSizeGripEnabled(TRUE); - QGridLayout* aDialogLayout = new QGridLayout(this); - aDialogLayout->setSpacing(6); - aDialogLayout->setMargin(11); + setWindowTitle(caption); + + setSizeGripEnabled(true); + + QVBoxLayout* aDialogLayout = new QVBoxLayout(this); + aDialogLayout->setSpacing(SPACING); + aDialogLayout->setMargin(MARGIN); + + /***************************************************************/ + GroupConstructors = new QGroupBox(constructorGrTitle, this); + QButtonGroup* ButtonGroup = new QButtonGroup(this); + QHBoxLayout* aGroupConstructorsLayout = new QHBoxLayout(GroupConstructors); + aGroupConstructorsLayout->setSpacing(SPACING); + aGroupConstructorsLayout->setMargin(MARGIN); + + myRadioButton1 = new QRadioButton(GroupConstructors); + myRadioButton1->setIcon(image0); + aGroupConstructorsLayout->addWidget(myRadioButton1); + ButtonGroup->addButton(myRadioButton1, 0); /***************************************************************/ - GroupConstructors = new QButtonGroup(this, "GroupConstructors"); - GroupConstructors->setTitle(constructorGrTitle); - - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - GroupConstructors->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed)); - QGridLayout* aGroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - aGroupConstructorsLayout->setAlignment(Qt::AlignTop); - aGroupConstructorsLayout->setSpacing(6); - aGroupConstructorsLayout->setMargin(11); - myRadioButton1 = new QRadioButton(GroupConstructors, "myRadioButton1"); - myRadioButton1->setText(tr("" )); - myRadioButton1->setPixmap(image0); - myRadioButton1->setChecked(TRUE); - myRadioButton1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, myRadioButton1->sizePolicy().hasHeightForWidth())); - aGroupConstructorsLayout->addWidget(myRadioButton1, 0, 0); - aGroupConstructorsLayout->addItem( new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1); - aDialogLayout->addWidget(GroupConstructors, 0, 0); + GroupArguments = new QGroupBox(argumentsGrTitle, this); + QGridLayout* aGroupArgumentsLayout = new QGridLayout(GroupArguments); + aGroupArgumentsLayout->setSpacing(SPACING); + aGroupArgumentsLayout->setMargin(MARGIN); + + // Corner nodes + QLabel* aCornerNodesLabel = new QLabel(tr("SMESH_CORNER_NODES"), GroupArguments); + myCornerSelectButton = new QPushButton(GroupArguments); + myCornerSelectButton->setIcon(image1); + myCornerNodes = new QLineEdit(GroupArguments); + + // Mid-edge nodes + myTable = new QTableWidget(GroupArguments); + + // Mid-face nodes + myMidFaceLabel = new QLabel(tr("SMESH_MIDFACE_NODES"), GroupArguments); + myMidFaceSelectButton = new QPushButton(GroupArguments); + myMidFaceSelectButton->setIcon(image1); + myMidFaceNodes = new QLineEdit(GroupArguments); + myMidFaceNodes->setValidator(new SMESHGUI_IdValidator(this, 6)); + + // Central node + myCenterLabel = new QLabel(tr("SMESH_CENTER_NODE"), GroupArguments); + myCenterSelectButton = new QPushButton(GroupArguments); + myCenterSelectButton->setIcon(image1); + myCenterNode = new QLineEdit(GroupArguments); + myCenterNode->setValidator(new SMESHGUI_IdValidator(this, 1)); + + myReverseCB = new QCheckBox(tr("SMESH_REVERSE"), GroupArguments); + + aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0); + aGroupArgumentsLayout->addWidget(myCornerSelectButton, 0, 1); + aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2); + aGroupArgumentsLayout->addWidget(myTable, 1, 0, 1, 3); + aGroupArgumentsLayout->addWidget(myMidFaceLabel, 2, 0); + aGroupArgumentsLayout->addWidget(myMidFaceSelectButton, 2, 1); + aGroupArgumentsLayout->addWidget(myMidFaceNodes, 2, 2); + aGroupArgumentsLayout->addWidget(myCenterLabel, 3, 0); + aGroupArgumentsLayout->addWidget(myCenterSelectButton, 3, 1); + aGroupArgumentsLayout->addWidget(myCenterNode, 3, 2); + aGroupArgumentsLayout->addWidget(myReverseCB, 4, 0, 1, 3); + + /***************************************************************/ + GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this ); + GroupGroups->setCheckable( true ); + QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups); + GroupGroupsLayout->setSpacing(SPACING); + GroupGroupsLayout->setMargin(MARGIN); + + TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups ); + ComboBox_GroupName = new QComboBox( GroupGroups ); + ComboBox_GroupName->setEditable( true ); + ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert ); + + GroupGroupsLayout->addWidget( TextLabel_GroupName ); + GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 ); /***************************************************************/ - GroupArguments = new QGroupBox(this, "GroupArguments"); - GroupArguments->setTitle(argumentsGrTitle); - GroupArguments->setColumnLayout(0, Qt::Vertical); - GroupArguments->layout()->setSpacing(0); - GroupArguments->layout()->setMargin(0); - GroupArguments->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding)); - QGridLayout* aGroupArgumentsLayout = new QGridLayout(GroupArguments->layout()); - aGroupArgumentsLayout->setAlignment(Qt::AlignTop); - aGroupArgumentsLayout->setSpacing(6); - aGroupArgumentsLayout->setMargin(11); - QLabel* aCornerNodesLabel = new QLabel(GroupArguments, "aCornerNodesLabel"); - aCornerNodesLabel->setText(tr("SMESH_CORNER_NODES" )); - aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0); - mySelectButton = new QPushButton(GroupArguments, "mySelectButton"); - mySelectButton->setPixmap(image1); - aGroupArgumentsLayout->addWidget(mySelectButton, 0, 1); - myCornerNodes = new QLineEdit(GroupArguments, "myCornerNodes"); - aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2); - - myTable = new QTable(GroupArguments); - aGroupArgumentsLayout->addMultiCellWidget(myTable, 1, 1, 0, 2); - - myReverseCB = new QCheckBox(GroupArguments, "myReverseCB"); - myReverseCB->setText(tr("SMESH_REVERSE" )); - aGroupArgumentsLayout->addWidget(myReverseCB, 2, 0); - - aDialogLayout->addWidget(GroupArguments, 1, 0); - - + GroupButtons = new QGroupBox(this); + QHBoxLayout* aGroupButtonsLayout = new QHBoxLayout(GroupButtons); + aGroupButtonsLayout->setSpacing(SPACING); + aGroupButtonsLayout->setMargin(MARGIN); + + buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); + buttonOk->setAutoDefault(true); + buttonOk->setDefault(true); + buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); + buttonApply->setAutoDefault(true); + buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); + buttonCancel->setAutoDefault(true); + buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons); + buttonHelp->setAutoDefault(true); + + aGroupButtonsLayout->addWidget(buttonOk); + aGroupButtonsLayout->addSpacing(10); + aGroupButtonsLayout->addWidget(buttonApply); + aGroupButtonsLayout->addSpacing(10); + aGroupButtonsLayout->addStretch(); + aGroupButtonsLayout->addWidget(buttonCancel); + aGroupButtonsLayout->addWidget(buttonHelp); + /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - GroupButtons->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - QGridLayout* aGroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - aGroupButtonsLayout->setAlignment(Qt::AlignTop); - aGroupButtonsLayout->setSpacing(6); - aGroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - aGroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - aGroupButtonsLayout->addWidget(buttonApply, 0, 1); - aGroupButtonsLayout->addItem( new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - aGroupButtonsLayout->addWidget(buttonOk, 0, 0); - buttonHelp = new QPushButton(GroupButtons, "buttonHelp"); - buttonHelp->setText(tr("SMESH_BUT_HELP" )); - buttonHelp->setAutoDefault(TRUE); - aGroupButtonsLayout->addWidget(buttonHelp, 0, 4); - - aDialogLayout->addWidget(GroupButtons, 2, 0); + aDialogLayout->addWidget(GroupConstructors); + aDialogLayout->addWidget(GroupArguments); + aDialogLayout->addWidget(GroupGroups); + aDialogLayout->addWidget(GroupButtons); Init(); /* Initialisations */ } @@ -471,9 +508,9 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM // function : ~SMESHGUI_AddQuadraticElementDlg() // purpose : Destroys the object and frees any allocated resources //================================================================================= + SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg() { - // no need to delete child widgets, Qt does it all for us delete mySimulation; } @@ -481,99 +518,140 @@ SMESHGUI_AddQuadraticElementDlg::~SMESHGUI_AddQuadraticElementDlg() // function : Init() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::Init() { - GroupArguments->show(); - myRadioButton1->setChecked(TRUE); - myIsEditCorners = true; + myRadioButton1->setChecked(true); mySMESHGUI->SetActiveDialogBox((QDialog*)this); - + + /* reset "Add to group" control */ + GroupGroups->setChecked( false ); + myActor = 0; + myNbMidFaceNodes = 0; + myNbCenterNodes = 0; int aNumRows; - switch (myType) { - case QUAD_EDGE: + switch (myGeomType) { + case SMDSEntity_Quad_Edge: aNumRows = 1; myNbCorners = 2; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_edges + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_edges break; - case QUAD_TRIANGLE: + case SMDSEntity_Quad_Triangle: aNumRows = 3; myNbCorners = 3; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_triangles + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles break; - case QUAD_QUADRANGLE: + case SMDSEntity_BiQuad_Triangle: + aNumRows = 3; + myNbCorners = 3; + myNbCenterNodes = 1; + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles + break; + case SMDSEntity_Quad_Quadrangle: aNumRows = 4; myNbCorners = 4; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_quadrangles + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles break; - case QUAD_TETRAHEDRON: + case SMDSEntity_BiQuad_Quadrangle: + aNumRows = 4; + myNbCorners = 4; + myNbCenterNodes = 1; + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles + break; + case SMDSEntity_Quad_Tetra: aNumRows = 6; myNbCorners = 4; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_tetrahedrons + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_tetrahedrons break; - case QUAD_PYRAMID: + case SMDSEntity_Quad_Pyramid: aNumRows = 8; myNbCorners = 5; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_pyramids + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pyramids break; - case QUAD_PENTAHEDRON: + case SMDSEntity_Quad_Penta: aNumRows = 9; myNbCorners = 6; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_pentahedrons - break; - case QUAD_HEXAHEDRON: + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pentahedrons + break; + case SMDSEntity_Quad_Hexa: aNumRows = 12; myNbCorners = 8; - myHelpFileName = "/adding_quadratic_nodes_and_elements.htm#?"; //Adding_hexahedrons + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons + break; + case SMDSEntity_TriQuad_Hexa: + aNumRows = 12; + myNbCorners = 8; + myNbMidFaceNodes = 6; + myNbCenterNodes = 1; + myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons break; } - - myCornerNodes->setValidator(new SMESHGUI_IdValidator(this, "validator", myNbCorners)); + + myMidFaceLabel ->setVisible( myNbMidFaceNodes ); + myMidFaceSelectButton->setVisible( myNbMidFaceNodes ); + myMidFaceNodes ->setVisible( myNbMidFaceNodes ); + myCenterLabel ->setVisible( myNbCenterNodes ); + myCenterSelectButton ->setVisible( myNbCenterNodes ); + myCenterNode ->setVisible( myNbCenterNodes ); + + myCornerNodes->setValidator(new SMESHGUI_IdValidator(this, myNbCorners)); /* initialize table */ - myTable->setNumCols(3); - myTable->setNumRows(aNumRows); + myTable->setColumnCount(3); + myTable->setRowCount(aNumRows); QStringList aColLabels; aColLabels.append(tr("SMESH_FIRST")); aColLabels.append(tr("SMESH_MIDDLE")); aColLabels.append(tr("SMESH_LAST")); - myTable->setColumnLabels(aColLabels); - - for ( int col = 0; col < myTable->numCols(); col++ ) + myTable->setHorizontalHeaderLabels(aColLabels); + + for ( int col = 0; col < myTable->columnCount(); col++ ) myTable->setColumnWidth(col, 80); - myTable->setColumnReadOnly(0, true); - myTable->setColumnReadOnly(2, true); + //myTable->setColumnReadOnly(0, true); // VSR: TODO + //myTable->setColumnReadOnly(2, true); // VSR: TODO myTable->setEnabled( false ); - - for ( int row = 0; row < myTable->numRows(); row++ ) - { - SMESHGUI_IdEditItem* anEditItem = new SMESHGUI_IdEditItem( myTable, QTableItem::OnTyping, "" ); - anEditItem->setReplaceable(false); - myTable->setItem(row, 1, anEditItem); - } - + + for ( int row = 0; row < myTable->rowCount(); row++ ) + { + 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 */ - connect(mySelectButton, SIGNAL(clicked()), SLOT(SetEditCorners())); + connect(myCornerSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection())); + connect(myMidFaceSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection())); + connect(myCenterSelectButton, SIGNAL(clicked()), SLOT(SetCurrentSelection())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument())); - connect(myTable, SIGNAL(doubleClicked(int, int, int, const QPoint&)), SLOT(onCellDoubleClicked(int, int, int, const QPoint&))); - connect(myTable, SIGNAL(valueChanged (int, int)), SLOT(onCellTextChange(int, int))); + connect(myTable, SIGNAL(cellDoubleClicked(int, int)), SLOT(onCellDoubleClicked(int, int))); + connect(myTable, SIGNAL(cellChanged (int, int)), SLOT(onCellTextChange(int, int))); connect(myCornerNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); + connect(myMidFaceNodes, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); + connect(myCenterNode, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); connect(myReverseCB, SIGNAL(stateChanged(int)), SLOT(onReverse(int))); connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel())); + connect(buttonCancel, SIGNAL(clicked()), SLOT(reject())); connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply())); connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp())); connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog())); - connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(ClickOnCancel())); + connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(reject())); + connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(reject())); - this->show(); // displays Dialog + myCurrentLineEdit = myCornerNodes; // set selection mode SMESH::SetPointRepresentation(true); @@ -581,97 +659,180 @@ void SMESHGUI_AddQuadraticElementDlg::Init() if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode( NodeSelection ); - myBusy = false; - - SetEditCorners(); + SelectionIntoArgument(); } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::ClickOnApply() + +bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() { - if (IsValid() && !mySMESHGUI->isActiveStudyLocked()) { - myBusy = true; - - vector anIds; - - switch (myType) { - case QUAD_EDGE: - anIds.push_back(myTable->text(0, 0).toInt()); - anIds.push_back(myTable->text(0, 2).toInt()); - anIds.push_back(myTable->text(0, 1).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->text(row, 0).toInt()); - for ( int row = 0; row < myTable->numRows(); row++ ) - anIds.push_back(myTable->text(row, 1).toInt()); - break; + if( !isValid() ) + return false; + + if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() ) + return false; + + BusyLocker lock( myBusy ); + + std::vector anIds; + + switch (myGeomType) { + case SMDSEntity_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 SMDSEntity_Quad_Triangle: + case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_BiQuad_Triangle: + case SMDSEntity_BiQuad_Quadrangle: + case SMDSEntity_Quad_Tetra: + case SMDSEntity_Quad_Pyramid: + case SMDSEntity_Quad_Penta: + case SMDSEntity_Quad_Hexa: + case SMDSEntity_TriQuad_Hexa: + 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()); + if ( myNbMidFaceNodes ) + { + QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts); + for (int i = 0; i < aListId.count(); i++) + anIds.push_back( aListId[ i ].toInt() ); + } + if ( myNbCenterNodes ) + { + QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts); + anIds.push_back( aListId[ 0 ].toInt() ); } - if ( myReverseCB->isChecked()) - SMESH::ReverseConnectivity( anIds, myType ); - - 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 ]; - - 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; + break; + } + if ( myReverseCB->isChecked()) + ReverseConnectivity( anIds, myGeomType, /*toReverse=*/true, /*toVtkOrder=*/false ); + + 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 ]; + + bool addToGroup = GroupGroups->isChecked(); + QString aGroupName; + + SMESH::SMESH_GroupBase_var aGroup; + int idx = 0; + if( addToGroup ) { + aGroupName = ComboBox_GroupName->currentText(); + for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) { + QString aName = ComboBox_GroupName->itemText( i ); + if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) ) + idx = i; } - - SALOME_ListIO aList; aList.Append( myActor->getIO() ); - mySelector->ClearIndex(); - mySelectionMgr->setSelectedObjects( aList, false ); + if ( idx > 0 && idx <= myGroups.count() ) { + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] ); + if ( !aGeomGroup->_is_nil() ) { + int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ), + tr( "MESH_STANDALONE_GRP_CHOSEN" ).arg( aGroupName ), + tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 ); + if ( res == 1 ) return false; + } + aGroup = myGroups[idx-1]; + } + } - SMESH::UpdateView(); - mySimulation->SetVisibility(false); - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); + SMESH::ElementType anElementType; + long anElemId = -1; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + switch (myGeomType) { + case SMDSEntity_Quad_Edge: + anElementType = SMESH::EDGE; + anElemId = aMeshEditor->AddEdge(anArrayOfIdeces.inout()); break; + case SMDSEntity_Quad_Triangle: + case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_BiQuad_Triangle: + case SMDSEntity_BiQuad_Quadrangle: + anElementType = SMESH::FACE; + anElemId = aMeshEditor->AddFace(anArrayOfIdeces.inout()); break; + case SMDSEntity_Quad_Tetra: + case SMDSEntity_Quad_Pyramid: + case SMDSEntity_Quad_Penta: + case SMDSEntity_Quad_Hexa: + case SMDSEntity_TriQuad_Hexa: + anElementType = SMESH::VOLUME; + anElemId = aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break; + default: break; + } - UpdateTable(); - SetEditCorners(); + if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) { + SMESH::SMESH_Group_var aGroupUsed; + if ( aGroup->_is_nil() ) { + // create new group + aGroupUsed = SMESH::AddGroup( myMesh, anElementType, aGroupName ); + if ( !aGroupUsed->_is_nil() ) { + myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroupUsed)); + ComboBox_GroupName->addItem( aGroupName ); + } + } + else { + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); + if ( !aGeomGroup->_is_nil() ) { + aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup ); + if ( !aGroupUsed->_is_nil() && idx > 0 ) { + myGroups[idx-1] = SMESH::SMESH_GroupBase::_duplicate(aGroupUsed); + SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser(); + } + } + else + aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup ); + } - myBusy = false; + if ( !aGroupUsed->_is_nil() ) { + SMESH::long_array_var anIdList = new SMESH::long_array; + anIdList->length( 1 ); + anIdList[0] = anElemId; + aGroupUsed->Add( anIdList.inout() ); + } } + + SALOME_ListIO aList; aList.Append( myActor->getIO() ); + mySelector->ClearIndex(); + mySelectionMgr->setSelectedObjects( aList, false ); + + mySimulation->SetVisibility(false); + SMESH::UpdateView(); + + UpdateTable(); + SetCurrentSelection(); + + updateButtons(); + + SMESHGUI::Modified(); + + return true; } //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::ClickOnOk() { - ClickOnApply(); - ClickOnCancel(); - return; + if ( ClickOnApply() ) + reject(); } //================================================================================= -// function : ClickOnCancel() +// function : reject() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::ClickOnCancel() + +void SMESHGUI_AddQuadraticElementDlg::reject() { mySelectionMgr->clearSelected(); mySimulation->SetVisibility(false); @@ -680,24 +841,31 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnCancel() aViewWindow->SetSelectionMode( ActorSelection ); disconnect(mySelectionMgr, 0, this, 0); mySMESHGUI->ResetState(); - reject(); - return; + QDialog::reject(); } //================================================================================= // function : ClickOnHelp() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); - if (app) + if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { - SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"), - QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName), - QObject::tr("BUT_OK")); + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -705,13 +873,11 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp() // function : onTextChange() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) { if (myBusy) return; - myBusy = true; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); + BusyLocker lock( myBusy ); mySimulation->SetVisibility(false); @@ -720,114 +886,143 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) if (myActor) aMesh = myActor->GetObject()->GetMesh(); + QLineEdit* send = (QLineEdit*)sender(); + if (send == myCornerNodes || + send == myMidFaceNodes || + send == myCenterNode) + myCurrentLineEdit = send; + if (aMesh) { TColStd_MapOfInteger newIndices; - - QStringList aListId = QStringList::split(" ", theNewText, false); + + 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() ) ) - newIndices.Add( n->GetID() ); + 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 ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->highlight( myActor->getIO(), true, true ); - - if ( sender() == myCornerNodes ) + + if ( myCurrentLineEdit == myCornerNodes ) UpdateTable( allOk ); } - - if( IsValid() ) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - if ( sender() == myTable ) - displaySimulation(); - - myBusy = false; + updateButtons(); + displaySimulation(); } //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection has changed //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() { if (myBusy) return; - - 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()); - - if (aList.Extent() != 1) - { - UpdateTable(); - return; - } - - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByEntry(anIO->getEntry()); - + BusyLocker lock( myBusy ); + + QString aCurrentEntry = myEntry; + + // clear + myActor = 0; + if ( myCurrentLineEdit ) + myCurrentLineEdit->setText(""); + + if (!GroupButtons->isEnabled()) // inactive + return; + + mySimulation->SetVisibility(false); + + // get selected mesh + SALOME_ListIO aList; + mySelectionMgr->selectedObjects(aList); + + if (aList.Extent() != 1) + { + UpdateTable(); + updateButtons(); + return; + } + + Handle(SALOME_InteractiveObject) anIO = aList.First(); + myEntry = anIO->getEntry(); + myMesh = SMESH::GetMeshByIO(anIO); + if (myMesh->_is_nil()) { + updateButtons(); + return; + } + + myActor = SMESH::FindActorByEntry(anIO->getEntry()); + + // process groups + if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) { + SMESH::ElementType anElementType; + switch ( myGeomType ) { + case SMDSEntity_Quad_Edge: + anElementType = SMESH::EDGE; break; + case SMDSEntity_Quad_Triangle: + case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_BiQuad_Triangle: + case SMDSEntity_BiQuad_Quadrangle: + anElementType = SMESH::FACE; break; + case SMDSEntity_Quad_Tetra: + case SMDSEntity_Quad_Pyramid: + case SMDSEntity_Quad_Penta: + case SMDSEntity_Quad_Hexa: + case SMDSEntity_TriQuad_Hexa: + anElementType = SMESH::VOLUME; break; + } + myGroups.clear(); + ComboBox_GroupName->clear(); + ComboBox_GroupName->addItem( QString() ); + SMESH::ListOfGroups aListOfGroups = *myMesh->GetGroups(); + for ( int i = 0, n = aListOfGroups.length(); i < n; i++ ) { + SMESH::SMESH_GroupBase_var aGroup = aListOfGroups[i]; + if ( !aGroup->_is_nil() && aGroup->GetType() == anElementType ) { + QString aGroupName( aGroup->GetName() ); + if ( !aGroupName.isEmpty() ) { + myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroup)); + ComboBox_GroupName->addItem( aGroupName ); + } + } } - - 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; - + + if ( myCurrentLineEdit ) + { + if ( myCurrentLineEdit != myCenterNode || nbNodes == 1 ) + myCurrentLineEdit->setText(aString); + + if ( myCurrentLineEdit == myCornerNodes ) UpdateTable(); - } + } else if ( myTable->isEnabled() && nbNodes == 1 ) - { - myBusy = true; - int theRow = myTable->currentRow(), theCol = myTable->currentColumn(); - if ( theCol == 1 ) - myTable->setText(theRow, 1, aString); - myBusy = false; - } - - if ( IsValid() ) - { - buttonOk->setEnabled( true ); - buttonApply->setEnabled( true ); - } + { + int theRow = myTable->currentRow(), theCol = myTable->currentColumn(); + if ( theCol == 1 ) + myTable->item(theRow, 1)->setText(aString); + } + updateButtons(); displaySimulation(); } @@ -835,62 +1030,92 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() // function : displaySimulation() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::displaySimulation() { - if (!myIsEditCorners) { - SMESH::TElementSimulation::TVTKIds anIds; - + if ( IsValid() ) + { + SMESH::TElementSimulationQuad::TVTKIds anIds; + // Collect ids from the dialog int anID; bool ok; int aDisplayMode = VTK_SURFACE; - if ( myType == QUAD_EDGE ) + if ( myGeomType == SMDSEntity_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; + } + 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++ ) { - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(0, 0).toInt() ) ); - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(0, 2).toInt() ) ); - anID = (myTable->text(0, 1)).toInt(&ok); - if (!ok) anID = (myTable->text(0, 0)).toInt(); - anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); - aDisplayMode = VTK_WIREFRAME; + 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) ); } - else + if ( myNbMidFaceNodes ) { - for ( int row = 0; row < myNbCorners; row++ ) - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->text(row, 0).toInt() ) ); - - for ( int row = 0; row < myTable->numRows(); row++ ) - { - anID = (myTable->text(row, 1)).toInt(&ok); - if (!ok) { - anID = (myTable->text(row, 0)).toInt(); - aDisplayMode = VTK_WIREFRAME; - } - anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); - } + QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts); + for (int i = 0; i < aListId.count(); i++) + anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ i ].toInt() )); } - - mySimulation->SetPosition(myActor,myType,anIds,aDisplayMode,myReverseCB->isChecked()); - SMESH::UpdateView(); + if ( myNbCenterNodes ) + { + QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts); + anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ 0 ].toInt() )); + } + } + + mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked()); + } + else + { + mySimulation->SetVisibility(false); } + SMESH::UpdateView(); } //================================================================================= -// function : SetEditCorners() +// function : SetCurrentSelection() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::SetEditCorners() + +void SMESHGUI_AddQuadraticElementDlg::SetCurrentSelection() { - myCornerNodes->setFocus(); - myIsEditCorners = true; - - SelectionIntoArgument(); + QPushButton* send = (QPushButton*)sender(); + myCurrentLineEdit = 0; + + if (send == myCornerSelectButton) + myCurrentLineEdit = myCornerNodes; + else if ( send == myMidFaceSelectButton ) + myCurrentLineEdit = myMidFaceNodes; + else if ( send == myCenterSelectButton ) + myCurrentLineEdit = myCenterNode; + + if ( myCurrentLineEdit ) + { + myCurrentLineEdit->setFocus(); + SelectionIntoArgument(); + } } //================================================================================= // function : DeactivateActiveDialog() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::DeactivateActiveDialog() { if (GroupConstructors->isEnabled()) { @@ -907,6 +1132,7 @@ void SMESHGUI_AddQuadraticElementDlg::DeactivateActiveDialog() // function : ActivateThisDialog() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog() { /* Emit a signal to deactivate the active dialog */ @@ -927,55 +1153,31 @@ void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog() // function : enterEvent() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::enterEvent (QEvent*) { if (GroupConstructors->isEnabled()) return; ActivateThisDialog(); - return; -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_AddQuadraticElementDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - ClickOnCancel(); - return; -} - -//================================================================================= -// function : hideEvent() -// purpose : caused by ESC key -//================================================================================= -void SMESHGUI_AddQuadraticElementDlg::hideEvent (QHideEvent*) -{ - if (!isMinimized()) - ClickOnCancel(); } //================================================================================= // function : onReverse() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::onReverse (int state) { - if (!IsValid()) - return; - - if (state >= 0) { - mySimulation->SetVisibility(false); - displaySimulation(); - } + mySimulation->SetVisibility(false); + displaySimulation(); + updateButtons(); } - //================================================================================= // function : IsValid() // purpose : //================================================================================= + bool SMESHGUI_AddQuadraticElementDlg::IsValid() { SMDS_Mesh* aMesh = 0; @@ -985,117 +1187,174 @@ bool SMESHGUI_AddQuadraticElementDlg::IsValid() return false; bool ok; - - for ( int row = 0; row < myTable->numRows(); row++ ) - { - int anID = (myTable->text(row, 1)).toInt(&ok); - if ( !ok ) - return false; - - const SMDS_MeshNode * aNode = aMesh->FindNode(anID); - if ( !aNode ) - return false; - } - - return true; + std::set< int > okIDs; + 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; + okIDs.insert( anID ); + } + + QStringList aListId; + if ( myNbMidFaceNodes ) + aListId += myMidFaceNodes->text().split(" ", QString::SkipEmptyParts); + if ( myNbCenterNodes ) + aListId += myCenterNode->text().split(" ", QString::SkipEmptyParts); + + for (int i = 0; i < aListId.count(); i++) + { + int anID = aListId[ i ].toInt(&ok); + if ( !ok ) + return false; + + if ( !aMesh->FindNode(anID) ) + return false; + okIDs.insert( anID ); + } + + return okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes; } //================================================================================= // function : UpdateTable() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) { - QStringList aListCorners = QStringList::split(" ", myCornerNodes->text(), false); - + 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->numRows(); row++ ) - myTable->setText( row, 1, ""); - - 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->numRows(); i < iEnd; i++) - myTable->setText( i, 0, aListCorners[ aFirstColIds[i] ] ); - - for (int i = 0, iEnd = myTable->numRows(); i < iEnd; i++) - myTable->setText( i, 2, 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 (myGeomType) { + case SMDSEntity_Quad_Edge: + aFirstColIds = FirstEdgeIds; + aLastColIds = LastEdgeIds; + break; + case SMDSEntity_Quad_Triangle: + case SMDSEntity_BiQuad_Triangle: + aFirstColIds = FirstTriangleIds; + aLastColIds = LastTriangleIds; + break; + case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_BiQuad_Quadrangle: + aFirstColIds = FirstQuadrangleIds; + aLastColIds = LastQuadrangleIds; + break; + case SMDSEntity_Quad_Tetra: + aFirstColIds = FirstTetrahedronIds; + aLastColIds = LastTetrahedronIds; + break; + case SMDSEntity_Quad_Pyramid: + aFirstColIds = FirstPyramidIds; + aLastColIds = LastPyramidIds; + break; + case SMDSEntity_Quad_Penta: + aFirstColIds = FirstPentahedronIds; + aLastColIds = LastPentahedronIds; + break; + case SMDSEntity_Quad_Hexa: + case SMDSEntity_TriQuad_Hexa: + 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->numRows(); row++ ) - for ( int col = 0; col < myTable->numCols(); col++ ) - myTable->setText(row, col, ""); - - 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 ); + } +} //================================================================================= // function : onTableActivate() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol, int theButton, const QPoint& theMousePos ) + +void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol ) { - if ( theButton == 1 && theCol == 1 ) - myIsEditCorners = false; - + myCurrentLineEdit = 0; displaySimulation(); - return; + updateButtons(); } - //================================================================================= // function : onCellTextChange() // purpose : //================================================================================= + void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol) { - onTextChange( myTable->text(theRow, theCol) ); + myCurrentLineEdit = 0; + displaySimulation(); + updateButtons(); } +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= -QWidget* SMESHGUI_IdEditItem::createEditor() const +void SMESHGUI_AddQuadraticElementDlg::keyPressEvent( QKeyEvent* e ) { - QLineEdit *aLineEdit = new QLineEdit(text(), table()->viewport()); - aLineEdit->setValidator( new SMESHGUI_IdValidator(table()->viewport(), "validator", 1) ); - return aLineEdit; + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + +//======================================================================= +//function : updateButtons +//purpose : +//======================================================================= + +void SMESHGUI_AddQuadraticElementDlg::updateButtons() +{ + bool valid = IsValid(); + buttonOk->setEnabled( valid ); + buttonApply->setEnabled( valid ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= + +bool SMESHGUI_AddQuadraticElementDlg::isValid() +{ + if( GroupGroups->isChecked() && ComboBox_GroupName->currentText().isEmpty() ) { + SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) ); + return false; + } + return true; }