-// 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
#include <SMESH_Actor.h>
#include <SMESH_ActorUtils.h>
-#include <SMESH_DeviceActor.h>
#include <SMESH_FaceOrientationFilter.h>
#include <SMDS_Mesh.hxx>
#include <SVTK_ViewWindow.h>
#include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
-#include <VTKViewer_PolyDataMapper.h>
#include <SalomeApp_Application.h>
#include <TColStd_MapOfInteger.hxx>
// VTK includes
-#include <vtkCell.h>
#include <vtkIdList.h>
#include <vtkUnstructuredGrid.h>
#include <vtkDataSetMapper.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkCellType.h>
-#include <vtkCellData.h>
// Qt includes
#include <QComboBox>
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<int> FirstPolygonIds;
+ static std::vector<int> LastPolygonIds;
+
void ReverseConnectivity( std::vector<vtkIdType> & ids, SMDSAbs_EntityType type,
bool toReverse, // inverse element
bool toVtkOrder ) // smds connectivity to vtk one
{
if ( toReverse ) // first reverse smds order
{
- const std::vector<int>& index = SMDS_MeshCell::reverseSmdsOrder(type);
+ const std::vector<int>& index = SMDS_MeshCell::reverseSmdsOrder(type, ids.size());
SMDS_MeshCell::applyInterlace( index, ids );
}
if ( toVtkOrder ) // from smds to vtk connectivity
}
namespace SMESH
{
- class TElementSimulationQuad {
+ class TElementSimulationQuad
+ {
SalomeApp_Application* myApplication;
SUIT_ViewWindow* myViewWindow;
SVTK_ViewWindow* myVTKViewWindow;
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];
myPreviewActor->PickableOff();
myPreviewActor->VisibilityOff();
myPreviewActor->SetMapper(myMapper);
-
+
QColor ffc, bfc;
int delta;
vtkProperty* myProp = vtkProperty::New();
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<vtkIdType> TVTKIds;
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();
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.
: 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 );
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;
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;
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 );
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 );
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
if( !isValid() )
return false;
- if ( mySMESHGUI->isActiveStudyLocked() || myBusy || !IsValid() )
+ if ( SMESHGUI::isStudyLocked() || myBusy || !IsValid() )
return false;
BusyLocker lock( myBusy );
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++ )
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 );
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;
}
}
}
- 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;
}
}
}
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 ) {
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 );
}
}
}
+ 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 );
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<SalomeApp_Application*>( mySMESHGUI->application() ) );
+ ActivateThisDialog();
+ }
+}
+
+//=================================================================================
+// function : onCloseView()
+// purpose :
+//=================================================================================
+void SMESHGUI_AddQuadraticElementDlg::onCloseView()
+{
+ DeactivateActiveDialog();
+ mySelector = 0;
+ delete mySimulation;
+ mySimulation = 0;
+}
//=================================================================================
// function : ClickOnHelp()
// purpose :
mySimulation->SetVisibility(false);
- // hilight entered nodes
+ // highlight entered nodes
SMDS_Mesh* aMesh = 0;
if (myActor)
aMesh = myActor->GetObject()->GetMesh();
if ( myCurrentLineEdit == myCornerNodes )
UpdateTable( allOk );
}
+
updateButtons();
displaySimulation();
}
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();
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 )
{
if ( theCol == 1 )
myTable->item(theRow, 1)->setText(aString);
}
+
updateButtons();
displaySimulation();
}
// 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;
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() ) );
}
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
{
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 )
{
// 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<SalomeApp_Application*>( mySMESHGUI->application() ) );
+ }
+ ActivateThisDialog();
+ }
}
//=================================================================================
okIDs.insert( anID );
}
- return okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes;
+ return (int) okIDs.size() == myTable->rowCount() + myNbMidFaceNodes + myNbCenterNodes;
}
//=================================================================================
{
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 );
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:
aFirstColIds = FirstQuadrangleIds;
aLastColIds = LastQuadrangleIds;
break;
+ case SMDSEntity_Quad_Polygon:
+ aFirstColIds = & FirstPolygonIds[0];
+ aLastColIds = & LastPolygonIds[0];
+ break;
case SMDSEntity_Quad_Tetra:
aFirstColIds = FirstTetrahedronIds;
aLastColIds = LastTetrahedronIds;
aLastColIds = LastPyramidIds;
break;
case SMDSEntity_Quad_Penta:
+ case SMDSEntity_BiQuad_Penta:
aFirstColIds = FirstPentahedronIds;
aLastColIds = LastPentahedronIds;
break;
aFirstColIds = FirstHexahedronIds;
aLastColIds = LastHexahedronIds;
break;
+ default:;
}
// fill the First and the Last columns
void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol )
{
myCurrentLineEdit = 0;
- displaySimulation(theRow, theCol);
+ displaySimulation();
updateButtons();
}
void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol)
{
myCurrentLineEdit = 0;
- displaySimulation(theRow, theCol);
+ displaySimulation();
updateButtons();
}