X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_AddQuadraticElementDlg.cxx;h=d6fe5d426dcd5dc1d83281ee41bb11cc01ee2075;hp=49d24f18c1d39c0b59829496ce48b8ecedc68e44;hb=b7a7d49664daa32e1befb558280e13ed0bde37c9;hpb=1c3a10f8107fc78132341eb9543a42b4ea0e4fa0 diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index 49d24f18c..d6fe5d426 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -36,7 +36,6 @@ #include #include -#include #include #include @@ -53,8 +52,6 @@ #include #include -#include -#include #include @@ -68,14 +65,12 @@ #include // VTK includes -#include #include #include #include #include #include #include -#include // Qt includes #include @@ -100,13 +95,39 @@ namespace { + + // Define the sequences of ids + static int FirstEdgeIds[] = {0}; + static int LastEdgeIds[] = {1}; + + static int FirstTriangleIds[] = {0,1,2}; + static int LastTriangleIds[] = {1,2,0}; + + static int FirstQuadrangleIds[] = {0,1,2,3}; + static int LastQuadrangleIds[] = {1,2,3,0}; + + static int FirstTetrahedronIds[] = {0,1,2,3,3,3}; + static int LastTetrahedronIds[] = {1,2,0,0,1,2}; + + static int FirstPyramidIds[] = {0,1,2,3,4,4,4,4}; + static int LastPyramidIds[] = {1,2,3,0,0,1,2,3}; + + static int FirstPentahedronIds[] = {0,1,2,3,4,5,0,1,2}; + 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}; + + static std::vector FirstPolygonIds; + static std::vector LastPolygonIds; + void ReverseConnectivity( std::vector & ids, SMDSAbs_EntityType type, bool toReverse, // inverse element bool toVtkOrder ) // smds connectivity to vtk one { if ( toReverse ) // first reverse smds order { - const std::vector& index = SMDS_MeshCell::reverseSmdsOrder(type); + const std::vector& index = SMDS_MeshCell::reverseSmdsOrder(type, ids.size()); SMDS_MeshCell::applyInterlace( index, ids ); } if ( toVtkOrder ) // from smds to vtk connectivity @@ -118,7 +139,8 @@ namespace } namespace SMESH { - class TElementSimulationQuad { + class TElementSimulationQuad + { SalomeApp_Application* myApplication; SUIT_ViewWindow* myViewWindow; SVTK_ViewWindow* myVTKViewWindow; @@ -126,14 +148,7 @@ namespace SMESH SALOME_Actor* myPreviewActor; vtkDataSetMapper* myMapper; vtkUnstructuredGrid* myGrid; - - SALOME_Actor* myCornerActor; - VTKViewer_PolyDataMapper* myCornerMapper; - vtkPolyData* myCornerPolyData; - - SALOME_Actor* mySelectCornerActor; - VTKViewer_PolyDataMapper* mySelectCornerMapper; - vtkPolyData* mySelectCornerPolyData; + //vtkProperty* myBackProp, *myProp; //double myRGB[3], myBackRGB[3]; @@ -160,7 +175,7 @@ namespace SMESH myPreviewActor->PickableOff(); myPreviewActor->VisibilityOff(); myPreviewActor->SetMapper(myMapper); - + QColor ffc, bfc; int delta; vtkProperty* myProp = vtkProperty::New(); @@ -198,45 +213,6 @@ namespace SMESH anOrientationProp->Delete(); myVTKViewWindow->AddActor(myFaceOrientation); - - // Create and display actor with corner nodes - myCornerPolyData = vtkPolyData::New(); - myCornerPolyData->Allocate(); - myCornerMapper = VTKViewer_PolyDataMapper::New(); - myCornerMapper->SetInputData(myCornerPolyData); - myCornerMapper->SetMarkerEnabled(true); - - myCornerActor = SALOME_Actor::New(); - myCornerActor->PickableOff(); - myCornerActor->VisibilityOff(); - myCornerActor->SetMapper(myCornerMapper); - - vtkProperty* myCornerProp = vtkProperty::New(); - myCornerProp->SetColor( 50 / 255. , 100 / 255. , 0 / 255. ); - myCornerActor->SetProperty( myCornerProp ); - myCornerProp->Delete(); - - myVTKViewWindow->AddActor(myCornerActor); - - // Create and display actor with selected corner nodes - mySelectCornerPolyData = vtkPolyData::New(); - mySelectCornerPolyData->Allocate(); - mySelectCornerMapper = VTKViewer_PolyDataMapper::New(); - mySelectCornerMapper->SetInputData(mySelectCornerPolyData); - mySelectCornerMapper->SetMarkerEnabled(true); - - mySelectCornerActor = SALOME_Actor::New(); - mySelectCornerActor->PickableOff(); - mySelectCornerActor->VisibilityOff(); - mySelectCornerActor->SetMapper(mySelectCornerMapper); - - vtkProperty* mySelectCornerProp = vtkProperty::New(); - mySelectCornerProp->SetColor( ffc.red() / 255. , ffc.green() / 255. , ffc.blue() / 255. ); - mySelectCornerActor->SetProperty( mySelectCornerProp ); - mySelectCornerProp->Delete(); - - myVTKViewWindow->AddActor(mySelectCornerActor); - } typedef std::vector TVTKIds; @@ -269,76 +245,26 @@ namespace SMESH myPreviewActor->GetMapper()->Update(); myPreviewActor->SetRepresentation( theMode ); + SetVisibility(true, theActor->GetFacesOriented()); } - void SetCornerNodes (SMESH_Actor* theActor, - TVTKIds& theIds) - { - vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid(); - - myCornerMapper->SetMarkerStd(theActor->GetMarkerType(), theActor->GetMarkerScale()); - myCornerPolyData->Reset(); - myCornerPolyData->DeleteCells(); - myCornerPolyData->SetPoints(aGrid->GetPoints()); - vtkIdList *anIds = vtkIdList::New(); - for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) { - anIds->InsertId(i,theIds[i]); - myCornerPolyData->InsertNextCell(VTK_VERTEX, anIds); - anIds->Reset(); - } - anIds->Delete(); - myCornerPolyData->Modified(); - myCornerActor->GetMapper()->Update(); - myCornerActor->SetRepresentation(SMESH_Actor::ePoint); - } - void SetSelectedNodes (SMESH_Actor* theActor, - TVTKIds& theIds) - { - vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid(); - - mySelectCornerMapper->SetMarkerStd(theActor->GetMarkerType(), theActor->GetMarkerScale()); - - mySelectCornerPolyData->Reset(); - mySelectCornerPolyData->DeleteCells(); - mySelectCornerPolyData->SetPoints(aGrid->GetPoints()); - - vtkIdList *anIds = vtkIdList::New(); - for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) { - anIds->InsertId(i,theIds[i]); - mySelectCornerPolyData->InsertNextCell(VTK_VERTEX, anIds); - anIds->Reset(); - } - anIds->Delete(); - mySelectCornerPolyData->Modified(); - mySelectCornerActor->GetMapper()->Update(); - mySelectCornerActor->SetRepresentation(SMESH_Actor::ePoint); - } - - void SetVisibility ( bool theVisibility, - bool theCornerVisibility = false, - bool theSelectCornerVisibility = false, - bool theShowOrientation = false ) + void SetVisibility (bool theVisibility, bool theShowOrientation = false) { myPreviewActor->SetVisibility(theVisibility); myFaceOrientation->SetVisibility(theShowOrientation); - myCornerActor->SetVisibility(theCornerVisibility); - mySelectCornerActor->SetVisibility(theSelectCornerVisibility); RepaintCurrentView(); } + ~TElementSimulationQuad() { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { myVTKViewWindow->RemoveActor(myPreviewActor); myVTKViewWindow->RemoveActor(myFaceOrientation); - myVTKViewWindow->RemoveActor(myCornerActor); - myVTKViewWindow->RemoveActor(mySelectCornerActor); } myPreviewActor->Delete(); myFaceOrientation->Delete(); - myCornerActor->Delete(); - mySelectCornerActor->Delete(); myMapper->RemoveAllInputs(); myMapper->Delete(); @@ -350,43 +276,12 @@ namespace SMESH myGrid->Delete(); - myCornerMapper->RemoveAllInputs(); - myCornerMapper->Delete(); - myCornerPolyData->Delete(); - - mySelectCornerMapper->RemoveAllInputs(); - mySelectCornerMapper->Delete(); - mySelectCornerPolyData->Delete(); - -// myProp->Delete(); -// myBackProp->Delete(); + // myProp->Delete(); + // myBackProp->Delete(); } }; } - -// Define the sequences of ids -static int FirstEdgeIds[] = {0}; -static int LastEdgeIds[] = {1}; - -static int FirstTriangleIds[] = {0,1,2}; -static int LastTriangleIds[] = {1,2,0}; - -static int FirstQuadrangleIds[] = {0,1,2,3}; -static int LastQuadrangleIds[] = {1,2,3,0}; - -static int FirstTetrahedronIds[] = {0,1,2,3,3,3}; -static int LastTetrahedronIds[] = {1,2,0,0,1,2}; - -static int FirstPyramidIds[] = {0,1,2,3,4,4,4,4}; -static int LastPyramidIds[] = {1,2,3,0,0,1,2,3}; - -static int FirstPentahedronIds[] = {0,1,2,3,4,5,0,1,2}; -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. @@ -443,9 +338,8 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myGeomType( theType ), - //myType( theType ), - myBusy( false ) + myBusy( false ), + myGeomType( theType ) { setModal( false ); setAttribute( Qt::WA_DeleteOnClose, true ); @@ -468,6 +362,9 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM case SMDSEntity_Quad_Quadrangle: anElementName = QString("QUADRATIC_QUADRANGLE"); break; + case SMDSEntity_Quad_Polygon: + anElementName = QString("QUADRATIC_POLYGON"); + break; case SMDSEntity_BiQuad_Quadrangle: anElementName = QString("BIQUADRATIC_QUADRANGLE"); break; @@ -483,6 +380,9 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM case SMDSEntity_Quad_Penta: anElementName = QString("QUADRATIC_PENTAHEDRON"); break; + case SMDSEntity_BiQuad_Penta: + anElementName = QString("BIQUADRATIC_PENTAHEDRON"); + break; case SMDSEntity_Quad_Hexa: anElementName = QString("QUADRATIC_HEXAHEDRON"); break; @@ -552,30 +452,19 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM myCenterNode->setValidator(new SMESHGUI_IdValidator(this, 1)); myReverseCB = new QCheckBox(tr("SMESH_REVERSE"), GroupArguments); - myAutomaticPresentation = (myGeomType == SMDSEntity_Quad_Quadrangle || myGeomType == SMDSEntity_BiQuad_Quadrangle || - myGeomType == SMDSEntity_Quad_Pyramid || myGeomType == SMDSEntity_Quad_Penta || - myGeomType == SMDSEntity_Quad_Hexa || myGeomType == SMDSEntity_TriQuad_Hexa ) ? new QCheckBox(tr("SMESH_AUTOMATIC_PRESENTATION"), GroupArguments) : 0; - if ( myAutomaticPresentation ) { - myNextPresentationButton = new QPushButton(tr("SMESH_BUT_GET_NEXT_SHAPE"), GroupArguments); - myNextPresentationButton->setAutoDefault(false); - } aGroupArgumentsLayout->addWidget(aCornerNodesLabel, 0, 0); aGroupArgumentsLayout->addWidget(myCornerSelectButton, 0, 1); aGroupArgumentsLayout->addWidget(myCornerNodes, 0, 2); - if ( myAutomaticPresentation ) { - myAutomaticPresentation->setChecked(true); - aGroupArgumentsLayout->addWidget(myAutomaticPresentation, 1, 0, 1, 2); - aGroupArgumentsLayout->addWidget(myNextPresentationButton, 1, 2, 1, 1); - } - aGroupArgumentsLayout->addWidget(myTable, 2, 0, 1, 3); - aGroupArgumentsLayout->addWidget(myMidFaceLabel, 3, 0); - aGroupArgumentsLayout->addWidget(myMidFaceSelectButton, 3, 1); - aGroupArgumentsLayout->addWidget(myMidFaceNodes, 3, 2); - aGroupArgumentsLayout->addWidget(myCenterLabel, 4, 0); - aGroupArgumentsLayout->addWidget(myCenterSelectButton, 4, 1); - aGroupArgumentsLayout->addWidget(myCenterNode, 4, 2); - aGroupArgumentsLayout->addWidget(myReverseCB, 5, 0, 1, 3); + 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 ); @@ -651,63 +540,75 @@ void SMESHGUI_AddQuadraticElementDlg::Init() myNbMidFaceNodes = 0; myNbCenterNodes = 0; - int aNumRows; + int aNumRows = 0; switch (myGeomType) { case SMDSEntity_Quad_Edge: aNumRows = 1; myNbCorners = 2; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_edges + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_edges break; case SMDSEntity_Quad_Triangle: aNumRows = 3; myNbCorners = 3; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_triangles break; case SMDSEntity_BiQuad_Triangle: aNumRows = 3; myNbCorners = 3; myNbCenterNodes = 1; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_triangles + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_triangles break; case SMDSEntity_Quad_Quadrangle: aNumRows = 4; myNbCorners = 4; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_quadrangles break; case SMDSEntity_BiQuad_Quadrangle: aNumRows = 4; myNbCorners = 4; myNbCenterNodes = 1; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_quadrangles + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_quadrangles + break; + case SMDSEntity_Quad_Polygon: + aNumRows = 5; + myNbCorners = 0; // no limit + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_polygons break; case SMDSEntity_Quad_Tetra: aNumRows = 6; myNbCorners = 4; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_tetrahedrons + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_tetrahedrons break; case SMDSEntity_Quad_Pyramid: aNumRows = 8; myNbCorners = 5; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pyramids + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_pyramids break; case SMDSEntity_Quad_Penta: aNumRows = 9; myNbCorners = 6; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_pentahedrons + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_pentahedrons + break; + case SMDSEntity_BiQuad_Penta: + aNumRows = 9; + myNbCorners = 6; + myNbMidFaceNodes = 3; + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_pentahedrons break; case SMDSEntity_Quad_Hexa: aNumRows = 12; myNbCorners = 8; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_hexahedrons break; case SMDSEntity_TriQuad_Hexa: aNumRows = 12; myNbCorners = 8; myNbMidFaceNodes = 6; myNbCenterNodes = 1; - myHelpFileName = "adding_quadratic_elements_page.html#?"; //Adding_hexahedrons + myHelpFileName = "adding_quadratic_elements.html#?"; //Adding_hexahedrons break; + default:; } myMidFaceLabel ->setVisible( myNbMidFaceNodes ); @@ -770,10 +671,9 @@ void SMESHGUI_AddQuadraticElementDlg::Init() connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog())); connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(reject())); connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(reject())); - if (myAutomaticPresentation) { - connect(myAutomaticPresentation, SIGNAL(stateChanged(int)), SLOT(SetCurrentSelection())); - connect(myNextPresentationButton, SIGNAL(clicked()), SLOT(SetCurrentSelection())); - } + connect(mySMESHGUI, SIGNAL (SignalActivatedViewManager()), SLOT(onOpenView())); + connect(mySMESHGUI, SIGNAL (SignalCloseView()), SLOT(onCloseView())); + myCurrentLineEdit = myCornerNodes; // set selection mode @@ -795,7 +695,7 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() if( !isValid() ) return false; - if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() ) + if ( SMESHGUI::isStudyLocked() || myBusy || !IsValid() ) return false; BusyLocker lock( myBusy ); @@ -810,11 +710,13 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() break; case SMDSEntity_Quad_Triangle: case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_Quad_Polygon: case SMDSEntity_BiQuad_Triangle: case SMDSEntity_BiQuad_Quadrangle: case SMDSEntity_Quad_Tetra: case SMDSEntity_Quad_Pyramid: case SMDSEntity_Quad_Penta: + case SMDSEntity_BiQuad_Penta: case SMDSEntity_Quad_Hexa: case SMDSEntity_TriQuad_Hexa: for ( int row = 0; row < myNbCorners; row++ ) @@ -833,11 +735,12 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() anIds.push_back( aListId[ 0 ].toInt() ); } break; + default:; } if ( myReverseCB->isChecked()) ReverseConnectivity( anIds, myGeomType, /*toReverse=*/true, /*toVtkOrder=*/false ); - int aNumberOfIds = anIds.size(); + int aNumberOfIds = anIds.size(); SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; anArrayOfIdeces->length( aNumberOfIds ); @@ -860,7 +763,14 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() 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( "MESH_GEOM_GRP_CHOSEN" ).arg( aGroupName ), + tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 ); + if ( res == 1 ) return false; + } + SMESH::SMESH_GroupOnFilter_var aFilterGroup = SMESH::SMESH_GroupOnFilter::_narrow( myGroups[idx-1] ); + if ( !aFilterGroup->_is_nil() ) { + int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ), + tr( "MESH_FILTER_GRP_CHOSEN" ).arg( aGroupName ), tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 ); if ( res == 1 ) return false; } @@ -868,25 +778,33 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() } } - SMESH::ElementType anElementType; - long anElemId = -1; + SMESH::ElementType anElementType = SMESH::ALL; + long anElemId = -1, nbElemsBefore = 0; SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); switch (myGeomType) { case SMDSEntity_Quad_Edge: anElementType = SMESH::EDGE; + nbElemsBefore = myMesh->NbEdges(); 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; + nbElemsBefore = myMesh->NbFaces(); anElemId = aMeshEditor->AddFace(anArrayOfIdeces.inout()); break; + case SMDSEntity_Quad_Polygon: + anElementType = SMESH::FACE; + nbElemsBefore = myMesh->NbFaces(); + anElemId = aMeshEditor->AddQuadPolygonalFace(anArrayOfIdeces.inout()); break; case SMDSEntity_Quad_Tetra: case SMDSEntity_Quad_Pyramid: case SMDSEntity_Quad_Penta: + case SMDSEntity_BiQuad_Penta: case SMDSEntity_Quad_Hexa: case SMDSEntity_TriQuad_Hexa: anElementType = SMESH::VOLUME; + nbElemsBefore = myMesh->NbVolumes(); anElemId = aMeshEditor->AddVolume(anArrayOfIdeces.inout()); break; default: break; } @@ -902,7 +820,8 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() } } else { - SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); + SMESH::SMESH_GroupOnFilter_var aFilterGroup = SMESH::SMESH_GroupOnFilter::_narrow( aGroup ); if ( !aGeomGroup->_is_nil() ) { aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup ); if ( !aGroupUsed->_is_nil() && idx > 0 ) { @@ -910,6 +829,13 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser(); } } + else if ( !aFilterGroup->_is_nil() ) { + aGroupUsed = myMesh->ConvertToStandalone( aFilterGroup ); + 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 ); } @@ -922,6 +848,24 @@ bool SMESHGUI_AddQuadraticElementDlg::ClickOnApply() } } + if ( nbElemsBefore == 0 ) + { + // 1st element of the type has been added, update actor to show this entity + unsigned int aMode = myActor->GetEntityMode(); + switch ( anElementType ) { + case SMESH::EDGE: + myActor->SetRepresentation(SMESH_Actor::eEdge); + myActor->SetEntityMode( aMode |= SMESH_Actor::eEdges ); break; + case SMESH::FACE: + myActor->SetRepresentation(SMESH_Actor::eSurface); + myActor->SetEntityMode( aMode |= SMESH_Actor::eFaces ); break; + case SMESH::VOLUME: + myActor->SetRepresentation(SMESH_Actor::eSurface); + myActor->SetEntityMode( aMode |= SMESH_Actor::eVolumes ); break; + default:; + } + } + SALOME_ListIO aList; aList.Append( myActor->getIO() ); mySelector->ClearIndex(); mySelectionMgr->setSelectedObjects( aList, false ); @@ -967,6 +911,35 @@ void SMESHGUI_AddQuadraticElementDlg::reject() QDialog::reject(); } +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_AddQuadraticElementDlg::onOpenView() +{ + if ( mySelector && mySimulation ) { + mySimulation->SetVisibility(false); + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + mySimulation = new SMESH::TElementSimulationQuad( + dynamic_cast( mySMESHGUI->application() ) ); + ActivateThisDialog(); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_AddQuadraticElementDlg::onCloseView() +{ + DeactivateActiveDialog(); + mySelector = 0; + delete mySimulation; + mySimulation = 0; +} //================================================================================= // function : ClickOnHelp() // purpose : @@ -1004,7 +977,7 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) mySimulation->SetVisibility(false); - // hilight entered nodes + // highlight entered nodes SMDS_Mesh* aMesh = 0; if (myActor) aMesh = myActor->GetObject()->GetMesh(); @@ -1039,6 +1012,7 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) if ( myCurrentLineEdit == myCornerNodes ) UpdateTable( allOk ); } + updateButtons(); displaySimulation(); } @@ -1054,57 +1028,62 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() BusyLocker lock( myBusy ); QString aCurrentEntry = myEntry; - QString anOldEditArgument = ""; - // clear - myActor = 0; - if ( myCurrentLineEdit ) { - anOldEditArgument = myCurrentLineEdit->text(); + + if ( myCurrentLineEdit ) + { + // clear + myActor = 0; + myCurrentLineEdit->setText(""); - } - if (!GroupButtons->isEnabled()) // inactive - return; + if (!GroupButtons->isEnabled()) // inactive + return; - mySimulation->SetVisibility(false); + mySimulation->SetVisibility(false); - // get selected mesh - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList); + // get selected mesh + SALOME_ListIO aList; + mySelectionMgr->selectedObjects(aList); - if (aList.Extent() != 1) - { - UpdateTable(); - updateButtons(); - return; - } + 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; - } + Handle(SALOME_InteractiveObject) anIO = aList.First(); + myEntry = anIO->getEntry(); + myMesh = SMESH::GetMeshByIO(anIO); + if (myMesh->_is_nil()) { + updateButtons(); + return; + } - myActor = SMESH::FindActorByEntry(anIO->getEntry()); + myActor = SMESH::FindActorByEntry(anIO->getEntry()); + + } // process groups if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) { - SMESH::ElementType anElementType; + SMESH::ElementType anElementType = SMESH::ALL; switch ( myGeomType ) { case SMDSEntity_Quad_Edge: anElementType = SMESH::EDGE; break; case SMDSEntity_Quad_Triangle: case SMDSEntity_Quad_Quadrangle: + case SMDSEntity_Quad_Polygon: 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_BiQuad_Penta: case SMDSEntity_Quad_Hexa: case SMDSEntity_TriQuad_Hexa: anElementType = SMESH::VOLUME; break; + default:; } myGroups.clear(); ComboBox_GroupName->clear(); @@ -1126,42 +1105,18 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() updateButtons(); return; } - if ( myAutomaticPresentation ) - myNextPresentationButton->setEnabled(false); + // get selected nodes QString aString = ""; - int nbNodes = 0; - while ( aString == "" || anOldEditArgument == aString ) { - if ( myAutomaticPresentation && myAutomaticPresentation->isChecked() ) { - nbNodes = SMESH::GetNameOfSelectedSortedNodes( myGeomType , mySelector, myActor, myShift, aString ); - } - else - nbNodes = SMESH::GetNameOfSelectedNodes( mySelector, myActor->getIO(), aString ); - if ( aString!= "" && myNbCorners == nbNodes && anOldEditArgument == aString && myAutomaticPresentation && myAutomaticPresentation->isChecked()) { - myShift++; - if ( myShift > nbNodes ) { - myShift = 0; - break; - } - continue; - } - if (myNbCorners != nbNodes && myNbCorners != 1) { - myShift = 0; - break; - } - if ( !myAutomaticPresentation || !myAutomaticPresentation->isChecked() ) - break; - } + int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,myActor->getIO(),aString); + if ( myCurrentLineEdit ) { - if ( myCurrentLineEdit != myCenterNode || nbNodes == 1) + if ( myCurrentLineEdit != myCenterNode || nbNodes == 1 ) myCurrentLineEdit->setText(aString); - if ( myCurrentLineEdit == myCornerNodes ) { + if ( myCurrentLineEdit == myCornerNodes ) UpdateTable(); - if ( myAutomaticPresentation && myAutomaticPresentation->isChecked() && myNbCorners == nbNodes) - myNextPresentationButton->setEnabled(true); - } } else if ( myTable->isEnabled() && nbNodes == 1 ) { @@ -1169,6 +1124,7 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() if ( theCol == 1 ) myTable->item(theRow, 1)->setText(aString); } + updateButtons(); displaySimulation(); } @@ -1178,10 +1134,9 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::displaySimulation(int theRow, int theCol) +void SMESHGUI_AddQuadraticElementDlg::displaySimulation() { - bool isValid = IsValid(); - if ( ( isValid || myTable->isEnabled() ) && myActor ) + if ( IsValid() ) { SMESH::TElementSimulationQuad::TVTKIds anIds; @@ -1189,6 +1144,7 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation(int theRow, int theCol) int anID; bool ok; int aDisplayMode = VTK_SURFACE; + if ( myGeomType == SMDSEntity_Quad_Edge ) { anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(0, 0)->text().toInt() ) ); @@ -1212,33 +1168,20 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation(int theRow, int theCol) } anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); } - if ( myNbMidFaceNodes && isValid) + if ( myNbMidFaceNodes ) { QStringList aListId = myMidFaceNodes->text().split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ i ].toInt() )); } - if ( myNbCenterNodes && isValid) + if ( myNbCenterNodes ) { QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts); anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ 0 ].toInt() )); } } - if ( isValid ) - mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked()); - mySimulation->SetCornerNodes(myActor, anIds); - if ( theCol == 1 ) { - anIds.clear(); - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(theRow, 0)->text().toInt() ) ); - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(theRow, 2)->text().toInt() ) ); - bool ok; - int anID; - anID = myTable->item(theRow, 1)->text().toInt(&ok); - if (ok) - anIds.push_back(myActor->GetObject()->GetNodeVTKId(anID)); - mySimulation->SetSelectedNodes(myActor, anIds); - } - mySimulation->SetVisibility(isValid, true, true, myActor->GetFacesOriented()); + + mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked()); } else { @@ -1257,16 +1200,12 @@ void SMESHGUI_AddQuadraticElementDlg::SetCurrentSelection() QPushButton* send = (QPushButton*)sender(); myCurrentLineEdit = 0; - if (send == myCornerSelectButton || (QCheckBox*)sender() == myAutomaticPresentation) + if (send == myCornerSelectButton) myCurrentLineEdit = myCornerNodes; else if ( send == myMidFaceSelectButton ) myCurrentLineEdit = myMidFaceNodes; else if ( send == myCenterSelectButton ) myCurrentLineEdit = myCenterNode; - else if (send == myNextPresentationButton ) { - myShift++; - myCurrentLineEdit = myCornerNodes; - } if ( myCurrentLineEdit ) { @@ -1317,12 +1256,17 @@ void SMESHGUI_AddQuadraticElementDlg::ActivateThisDialog() // function : enterEvent() // purpose : //================================================================================= - void SMESHGUI_AddQuadraticElementDlg::enterEvent (QEvent*) { - if (GroupConstructors->isEnabled()) - return; - ActivateThisDialog(); + if ( !GroupConstructors->isEnabled() ) { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + if ( aViewWindow && !mySelector && !mySimulation) { + mySelector = aViewWindow->GetSelector(); + mySimulation = new SMESH::TElementSimulationQuad( + dynamic_cast( mySMESHGUI->application() ) ); + } + ActivateThisDialog(); + } } //================================================================================= @@ -1381,7 +1325,7 @@ bool SMESHGUI_AddQuadraticElementDlg::IsValid() okIDs.insert( anID ); } - return okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes; + return (int) okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes; } //================================================================================= @@ -1393,6 +1337,44 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) { QStringList aListCorners = myCornerNodes->text().split(" ", QString::SkipEmptyParts); + if ( myGeomType == SMDSEntity_Quad_Polygon ) // POLYGON + { + if ( aListCorners.count() < 3 ) + theConersValidity = false; + + if ( aListCorners.count() != myTable->rowCount() && theConersValidity ) + { + // adjust nb of rows for the polygon + int oldNbRows = myTable->rowCount(); + myTable->setRowCount( aListCorners.count() ); + for ( int row = oldNbRows; 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); + } + myNbCorners = aListCorners.count(); + + // fill FirstPolygonIds and LastPolygonIds + FirstPolygonIds.resize( aListCorners.count() ); + LastPolygonIds .resize( aListCorners.count() ); + for ( int i = 0; i < aListCorners.count(); ++i ) + { + FirstPolygonIds[i] = i; + LastPolygonIds [i] = i+1; + } + LastPolygonIds.back() = 0; + + myNbCorners = aListCorners.count(); + } + } + if ( aListCorners.count() == myNbCorners && theConersValidity ) { myTable->setEnabled( true ); @@ -1401,8 +1383,8 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) for ( int row = 0; row < myTable->rowCount(); row++ ) myTable->item( row, 1 )->setText(""); - int* aFirstColIds; - int* aLastColIds; + int* aFirstColIds = 0; + int* aLastColIds = 0; switch (myGeomType) { case SMDSEntity_Quad_Edge: @@ -1419,6 +1401,10 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) aFirstColIds = FirstQuadrangleIds; aLastColIds = LastQuadrangleIds; break; + case SMDSEntity_Quad_Polygon: + aFirstColIds = & FirstPolygonIds[0]; + aLastColIds = & LastPolygonIds[0]; + break; case SMDSEntity_Quad_Tetra: aFirstColIds = FirstTetrahedronIds; aLastColIds = LastTetrahedronIds; @@ -1428,6 +1414,7 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) aLastColIds = LastPyramidIds; break; case SMDSEntity_Quad_Penta: + case SMDSEntity_BiQuad_Penta: aFirstColIds = FirstPentahedronIds; aLastColIds = LastPentahedronIds; break; @@ -1436,6 +1423,7 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) aFirstColIds = FirstHexahedronIds; aLastColIds = LastHexahedronIds; break; + default:; } // fill the First and the Last columns @@ -1464,7 +1452,7 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol ) { myCurrentLineEdit = 0; - displaySimulation(theRow, theCol); + displaySimulation(); updateButtons(); } @@ -1476,7 +1464,7 @@ void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCo void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol) { myCurrentLineEdit = 0; - displaySimulation(theRow, theCol); + displaySimulation(); updateButtons(); }