From 2b96c0d91199618fec51a5771e7713cabb1a19ff Mon Sep 17 00:00:00 2001 From: imn Date: Fri, 11 Jul 2014 12:33:38 +0400 Subject: [PATCH] Implementation: Show a link of quadratic element --- .../SMESHGUI_AddQuadraticElementDlg.cxx | 148 ++++++++++++++++-- .../SMESHGUI_AddQuadraticElementDlg.h | 2 +- 2 files changed, 136 insertions(+), 14 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index 94819e6ce..f469941ca 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -52,6 +53,8 @@ #include #include +#include +#include #include @@ -65,12 +68,14 @@ #include // VTK includes +#include #include #include #include #include #include #include +#include // Qt includes #include @@ -121,7 +126,14 @@ namespace SMESH SALOME_Actor* myPreviewActor; vtkDataSetMapper* myMapper; vtkUnstructuredGrid* myGrid; - //vtkProperty* myBackProp, *myProp; + + SALOME_Actor* myCornerActor; + VTKViewer_PolyDataMapper* myCornerMapper; + vtkPolyData* myCornerPolyData; + + SALOME_Actor* mySelectCornerActor; + VTKViewer_PolyDataMapper* mySelectCornerMapper; + vtkPolyData* mySelectCornerPolyData; //double myRGB[3], myBackRGB[3]; @@ -186,6 +198,45 @@ 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; @@ -218,26 +269,76 @@ 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 theShowOrientation = false) + void SetVisibility ( bool theVisibility, + bool theCornerVisibility = false, + bool theSelectCornerVisibility = false, + 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(); @@ -249,6 +350,14 @@ namespace SMESH myGrid->Delete(); + myCornerMapper->RemoveAllInputs(); + myCornerMapper->Delete(); + myCornerPolyData->Delete(); + + mySelectCornerMapper->RemoveAllInputs(); + mySelectCornerMapper->Delete(); + mySelectCornerPolyData->Delete(); + // myProp->Delete(); // myBackProp->Delete(); } @@ -1031,9 +1140,10 @@ void SMESHGUI_AddQuadraticElementDlg::SelectionIntoArgument() // purpose : //================================================================================= -void SMESHGUI_AddQuadraticElementDlg::displaySimulation() +void SMESHGUI_AddQuadraticElementDlg::displaySimulation(int theRow, int theCol) { - if ( IsValid() ) + bool isValid = IsValid(); + if ( ( isValid || myTable->isEnabled() ) && myActor ) { SMESH::TElementSimulationQuad::TVTKIds anIds; @@ -1041,7 +1151,6 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation() 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() ) ); @@ -1065,20 +1174,33 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation() } anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); } - if ( myNbMidFaceNodes ) + if ( myNbMidFaceNodes && isValid) { 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 ) + if ( myNbCenterNodes && isValid) { QStringList aListId = myCenterNode->text().split(" ", QString::SkipEmptyParts); anIds.push_back( myActor->GetObject()->GetNodeVTKId( aListId[ 0 ].toInt() )); } } - - mySimulation->SetPosition(myActor,myGeomType,anIds,aDisplayMode,myReverseCB->isChecked()); + 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()); } else { @@ -1300,7 +1422,7 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCol ) { myCurrentLineEdit = 0; - displaySimulation(); + displaySimulation(theRow, theCol); updateButtons(); } @@ -1312,7 +1434,7 @@ void SMESHGUI_AddQuadraticElementDlg::onCellDoubleClicked( int theRow, int theCo void SMESHGUI_AddQuadraticElementDlg::onCellTextChange(int theRow, int theCol) { myCurrentLineEdit = 0; - displaySimulation(); + displaySimulation(theRow, theCol); updateButtons(); } diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h index bc336e668..991b220fb 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h @@ -75,7 +75,7 @@ private: void Init(); void enterEvent( QEvent* ); /* mouse enter the QWidget */ void keyPressEvent( QKeyEvent* ); - void displaySimulation(); + void displaySimulation(int = -1, int = -1); void UpdateTable( bool = true ); bool IsValid(); void updateButtons(); -- 2.39.2