You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1191 lines
35 KiB
C++
1191 lines
35 KiB
C++
#include "FITKFluidVTKGraphObjectModel.h"
|
|
|
|
// VTK
|
|
#include <vtkObject.h>
|
|
#include <vtkProperty.h>
|
|
#include <vtkUnstructuredGrid.h>
|
|
#include <vtkPolyData.h>
|
|
#include <vtkPoints.h>
|
|
#include <vtkIdList.h>
|
|
#include <vtkCellType.h>
|
|
#include <vtkCellArray.h>
|
|
#include <vtkDoubleArray.h>
|
|
#include <vtkPointData.h>
|
|
#include <vtkPolygon.h>
|
|
|
|
// Graph
|
|
#include "FITKFluidVTKCommons.h"
|
|
#include "FITKFluidVTKShapeColorMap.h"
|
|
#include "FITKFluidVTKGraphObjectSelect.h"
|
|
#include "FITK_Interface/FITKVTKAlgorithm/FITKGraphActor.h"
|
|
|
|
// Data
|
|
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h"
|
|
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoShapeAgent.h"
|
|
#include "FITK_Interface/FITKInterfaceGeometry/FITKVirtualTopoManager.h"
|
|
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeometryMeshVS.h"
|
|
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeometryMeshEntity.h"
|
|
|
|
namespace Exchange
|
|
{
|
|
FITKFluidVTKGraphObjectModel::FITKFluidVTKGraphObjectModel(Interface::FITKAbsGeoCommand* modelData)
|
|
: FITKFluidVTKGraphObject3D(modelData)
|
|
{
|
|
if (!modelData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Initialize.
|
|
init();
|
|
|
|
// Convert shape data.
|
|
bool flag = generateDataSet();
|
|
if (!flag)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Generate the shape actors.
|
|
generateGraph();
|
|
|
|
// Save the data type.
|
|
m_shapeInfo.Type = FITKFluidVTKCommons::ModelShape;
|
|
|
|
// Set the layer need to be rendered.
|
|
setRenderLayer(0, 2);
|
|
}
|
|
|
|
bool FITKFluidVTKGraphObjectModel::test(QVariant& details)
|
|
{
|
|
if (!details.isValid())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
FITKFluidVTKGraphObjectModel::~FITKFluidVTKGraphObjectModel()
|
|
{
|
|
// Delete the model data.
|
|
deleteVtkObj(m_gridVertex);
|
|
deleteVtkObj(m_gridEdge);
|
|
deleteVtkObj(m_gridFace);
|
|
|
|
// Delete face normals.
|
|
deleteVtkObj(m_normalFacePoint);
|
|
|
|
// Clear the maps.
|
|
m_solidFaceIdsHash.clear();
|
|
m_faceSolidIdMap.clear();
|
|
m_cellIdVertexIdMap.clear();
|
|
m_cellIdEdgeIdMap.clear();
|
|
m_cellIdFaceIdMap.clear();
|
|
m_vertexIdCellIdMap.clear();
|
|
m_edgeIdCellIdMap.clear();
|
|
|
|
// Delete color maps.
|
|
deleteObj(m_colorMapVertex);
|
|
deleteObj(m_colorMapEdge);
|
|
deleteObj(m_colorMapFace);
|
|
|
|
// Set the pointer to NULL.
|
|
m_triData = nullptr;
|
|
m_topoMgr = nullptr;
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::init()
|
|
{
|
|
// Create model grid data.
|
|
//@{
|
|
m_gridVertex = vtkUnstructuredGrid::New();
|
|
m_gridVertex->SetPoints(vtkSmartPointer<vtkPoints>::New());
|
|
m_gridEdge = vtkUnstructuredGrid::New();
|
|
m_gridEdge->SetPoints(vtkSmartPointer<vtkPoints>::New());
|
|
m_gridFace = vtkPolyData::New();
|
|
m_gridFace->SetPoints(vtkSmartPointer<vtkPoints>::New());
|
|
m_gridFace->SetPolys(vtkSmartPointer<vtkCellArray>::New());
|
|
|
|
// Add the points normals for face grid.
|
|
m_normalFacePoint = vtkDoubleArray::New();
|
|
m_normalFacePoint->SetNumberOfComponents(3);
|
|
m_gridFace->GetPointData()->SetNormals(m_normalFacePoint);
|
|
//@}
|
|
|
|
// Create the highlight selector.
|
|
m_highlightSelector = new FITKFluidVTKGraphObjectSelect;
|
|
m_addinGraphObjList.push_back(m_highlightSelector);
|
|
}
|
|
|
|
bool FITKFluidVTKGraphObjectModel::meshVSToVtkDataSet()
|
|
{
|
|
// Check the input data.
|
|
if (!m_triData || !m_gridVertex || !m_gridEdge || !m_gridFace)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Initialize the vertex grid.
|
|
createVertexGrid();
|
|
|
|
// Initialize the edge grid.
|
|
createEdgeGrid();
|
|
|
|
// Initialize the face grid.
|
|
createFaceGrid();
|
|
|
|
// Initialize the solid face ID map.
|
|
initializeSolidFaceMap();
|
|
|
|
return true;
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::createVertexGrid()
|
|
{
|
|
// Check the data set and its points.
|
|
if (!m_gridVertex || !m_triData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
vtkPoints* points = m_gridVertex->GetPoints();
|
|
if (!points)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get all points.
|
|
const QHash<int, Interface::FITKGeoMeshVSPt*> pointsHash = m_triData->getPointItems();
|
|
QHashIterator<int, Interface::FITKGeoMeshVSPt*> iter(pointsHash);
|
|
|
|
int ptIndex = -1;
|
|
|
|
while (iter.hasNext())
|
|
{
|
|
iter.next();
|
|
|
|
int meshPtId = iter.key();
|
|
Interface::FITKGeoMeshVSPt* pt = iter.value();
|
|
|
|
// Add point.
|
|
ptIndex = points->InsertNextPoint(pt->x(), pt->y(), pt->z());
|
|
|
|
// Add vertex cell.
|
|
vtkSmartPointer<vtkIdList> cell = vtkSmartPointer<vtkIdList>::New();
|
|
cell->InsertNextId(ptIndex);
|
|
m_gridVertex->InsertNextCell(VTKCellType::VTK_VERTEX, cell);
|
|
|
|
// Save the vertex id.
|
|
m_cellIdVertexIdMap.push_back(meshPtId);
|
|
m_vertexIdCellIdMap.insert(meshPtId, ptIndex);
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::createEdgeGrid()
|
|
{
|
|
// Check the data set and its points.
|
|
if (!m_gridEdge || !m_triData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
vtkPoints* points = m_gridEdge->GetPoints();
|
|
if (!points)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get all edges.
|
|
const QHash<int, Interface::FITKGeoMeshVSEdgeEntity*> edgesHash = m_triData->getEdgeItems();
|
|
QHashIterator<int, Interface::FITKGeoMeshVSEdgeEntity*> iter(edgesHash);
|
|
|
|
int ptIndex = -1, cellIndex = -1;
|
|
|
|
while (iter.hasNext())
|
|
{
|
|
iter.next();
|
|
|
|
int meshEdgeId = iter.key();
|
|
Interface::FITKGeoMeshVSEdgeEntity* edge = iter.value();
|
|
|
|
// Get edge points.
|
|
const QList<Interface::FITKGeoMeshVSPt*> & pts = edge->getPoints();
|
|
|
|
// Get the node data and create poly line.
|
|
vtkSmartPointer<vtkIdList> polyLineCell = vtkSmartPointer<vtkIdList>::New();
|
|
|
|
for (Interface::FITKGeoMeshVSPt* pt : pts)
|
|
{
|
|
// Add point.
|
|
ptIndex = points->InsertNextPoint(pt->x(), pt->y(), pt->z());
|
|
polyLineCell->InsertNextId(ptIndex);
|
|
}
|
|
|
|
// Add cell.
|
|
cellIndex = m_gridEdge->InsertNextCell(VTKCellType::VTK_POLY_LINE, polyLineCell);
|
|
|
|
// Save the edge id.
|
|
m_cellIdEdgeIdMap.push_back(meshEdgeId);
|
|
m_edgeIdCellIdMap.insert(meshEdgeId, cellIndex);
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::createFaceGrid()
|
|
{
|
|
// Check the data set and its points.
|
|
if (!m_gridFace || !m_triData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
vtkPoints* points = m_gridFace->GetPoints();
|
|
if (!points)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get all faces.
|
|
const QHash<int, Interface::FITKGeoMeshVSFaceEntity*> facesHash = m_triData->getFaceItems();
|
|
QHashIterator<int, Interface::FITKGeoMeshVSFaceEntity*> iter(facesHash);
|
|
|
|
int cellIndex = -1;
|
|
|
|
// For computing points nromals.
|
|
//@{
|
|
vtkDoubleArray* tempCellNormals = vtkDoubleArray::New();
|
|
tempCellNormals->SetNumberOfComponents(3);
|
|
vtkPoints* tempPts = vtkPoints::New();
|
|
tempPts->SetNumberOfPoints(3);
|
|
double tempNor3[3]{ 0., 0., 0. };
|
|
//@}
|
|
|
|
int ptIndexStart = 0;
|
|
|
|
while (iter.hasNext())
|
|
{
|
|
iter.next();
|
|
|
|
int meshFaceId = iter.key();
|
|
Interface::FITKGeoMeshVSFaceEntity* face = iter.value();
|
|
|
|
// Get all points of the face.
|
|
const QList<Interface::FITKGeoMeshVSPt*> & facePoints = face->getPoints();
|
|
for (Interface::FITKGeoMeshVSPt* facePoint : facePoints)
|
|
{
|
|
points->InsertNextPoint(facePoint->x(), facePoint->y(), facePoint->z());
|
|
}
|
|
|
|
// Get face triangles.
|
|
const QList<Interface::FITKGeoMeshVSTri*> & tris = face->getTriangles();
|
|
|
|
for (Interface::FITKGeoMeshVSTri* tri : tris)
|
|
{
|
|
// Get points indice pf the triangle.
|
|
const int* nodes = tri->getNode();
|
|
|
|
// Get points index in VTK grid of vertice
|
|
int ptIndex1 = ptIndexStart + nodes[0];
|
|
int ptIndex2 = ptIndexStart + nodes[1];
|
|
int ptIndex3 = ptIndexStart + nodes[2];
|
|
|
|
// Add temp points for calculating normals.
|
|
tempPts->SetPoint(0, points->GetPoint(ptIndex1));
|
|
tempPts->SetPoint(1, points->GetPoint(ptIndex2));
|
|
tempPts->SetPoint(2, points->GetPoint(ptIndex3));
|
|
|
|
// Add cell.
|
|
vtkSmartPointer<vtkIdList> triCell = vtkSmartPointer<vtkIdList>::New();
|
|
triCell->InsertNextId(ptIndex1);
|
|
triCell->InsertNextId(ptIndex2);
|
|
triCell->InsertNextId(ptIndex3);
|
|
cellIndex = m_gridFace->InsertNextCell(VTKCellType::VTK_TRIANGLE, triCell);
|
|
|
|
// Add cell normals.
|
|
vtkPolygon::ComputeNormal(tempPts, tempNor3);
|
|
tempCellNormals->InsertNextTuple3(tempNor3[0], tempNor3[1], tempNor3[2]);
|
|
|
|
// Save the face id.
|
|
m_cellIdFaceIdMap.push_back(meshFaceId);
|
|
m_faceCellIdsHash[meshFaceId].push_back(cellIndex);
|
|
}
|
|
|
|
// Update the point start index.
|
|
ptIndexStart += facePoints.count();
|
|
}
|
|
|
|
// Calculate points normals for the face grid.
|
|
m_normalFacePoint->SetNumberOfTuples(m_gridFace->GetNumberOfPoints());
|
|
m_normalFacePoint->FillComponent(0, 0);
|
|
m_normalFacePoint->FillComponent(1, 0);
|
|
m_normalFacePoint->FillComponent(2, 0);
|
|
|
|
int cellId = 0;
|
|
vtkIdType npts = 0;
|
|
#if VTK_MAJOR_VERSION < 9
|
|
vtkIdType* pts = nullptr;
|
|
#else
|
|
const vtkIdType* pts = nullptr;
|
|
#endif
|
|
|
|
// Add two double array.
|
|
auto addDouble3 = [&](double* v1, double* v2, double* result)
|
|
{
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
result[i] = v1[i] + v2[i];
|
|
}
|
|
};
|
|
|
|
double result[3]{ 0., 0., 0. };
|
|
for (cellId = 0, m_gridFace->GetPolys()->InitTraversal(); m_gridFace->GetPolys()->GetNextCell(npts, pts); ++cellId)
|
|
{
|
|
double* norCellCurrent = tempCellNormals->GetTuple3(cellId);
|
|
|
|
for (vtkIdType i = 0; i < npts; ++i)
|
|
{
|
|
double* norPtCurrent = m_normalFacePoint->GetTuple3(pts[i]);
|
|
|
|
// Add normals.
|
|
addDouble3(norPtCurrent, norCellCurrent, result);
|
|
m_normalFacePoint->SetTuple3(pts[i], result[0], result[1], result[2]);
|
|
}
|
|
}
|
|
|
|
double flipDirection = 1.0;
|
|
for (vtkIdType i = 0; i < m_gridFace->GetNumberOfPoints(); ++i)
|
|
{
|
|
double* ptNormal = m_normalFacePoint->GetTuple3(i);
|
|
const double length = sqrt(pow(ptNormal[0], 2) + pow(ptNormal[1], 2) + pow(ptNormal[2], 2)) * flipDirection;
|
|
if (!qFuzzyCompare(length, 0.))
|
|
{
|
|
ptNormal[0] /= length;
|
|
ptNormal[1] /= length;
|
|
ptNormal[2] /= length;
|
|
}
|
|
|
|
m_normalFacePoint->SetTuple3(i, ptNormal[0], ptNormal[1], ptNormal[2]);
|
|
}
|
|
|
|
// Delete temp data.
|
|
tempCellNormals->Delete();
|
|
tempPts->Delete();
|
|
|
|
// Initialize the face-solid hash array length.
|
|
// m_faceSolidIdMap.resize(iCell + 1);
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::initializeSolidFaceMap()
|
|
{
|
|
// Check the model topo-mamager.
|
|
if (!m_topoMgr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get the solid manager.
|
|
Interface::FITKShapeVirtualTopoManager* tpSolidMgr = m_topoMgr->getShapeVirtualTopoManager(Interface::FITKGeoEnum::VTopoShapeType::VSSolid);
|
|
if (!tpSolidMgr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get all solid of the model.
|
|
int nSolids = tpSolidMgr->getDataCount();
|
|
for (int i = 0; i < nSolids; i++)
|
|
{
|
|
Interface::FITKAbsVirtualTopo* vSolid = tpSolidMgr->getDataByIndex(i);
|
|
int solidId = vSolid->getDataObjectID();
|
|
|
|
// Get all sub-shapes of the solid.( faces )
|
|
int nSubShape = vSolid->getSubTopoCount();
|
|
for (int j = 0; j < nSubShape; j++)
|
|
{
|
|
Interface::FITKAbsVirtualTopo* vFace = vSolid->getSubTopo(j);
|
|
int faceId = vFace->getDataObjectID();
|
|
|
|
// Save the ids.
|
|
m_solidFaceIdsHash[solidId].push_back(faceId);
|
|
|
|
// Insert the face-solid id.
|
|
m_faceSolidIdMap[faceId] = solidId;
|
|
}
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::update(bool forceUpdate)
|
|
{
|
|
Interface::FITKAbsGeoCommand* modelData = dynamic_cast<Interface::FITKAbsGeoCommand*>(_dataObj);
|
|
if (!modelData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get the abastract shape agent.
|
|
Interface::FITKAbsGeoShapeAgent* shapeAgent = modelData->getShapeAgent();
|
|
if (!shapeAgent)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!shapeAgent || m_testFlag)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Update visibility first.
|
|
updateVisibility();
|
|
|
|
// Check if the shape has been changed.
|
|
if (shapeAgent->shapeHashCode() == m_hashCode && !forceUpdate)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Clear data set first.
|
|
clearData();
|
|
|
|
shapeAgent->buildVirtualTopo();
|
|
|
|
// Re-generate the shape.
|
|
generateDataSet();
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::setVisible(bool visibility)
|
|
{
|
|
// Show or hide face.
|
|
if (m_fActorFace)
|
|
{
|
|
m_fActorFace->SetVisibility(m_viewModes[FITKFluidVTKCommons::SMVM_Shade] && visibility);
|
|
}
|
|
|
|
// Show or hide edge.
|
|
if (m_fActorEdge)
|
|
{
|
|
m_fActorEdge->SetVisibility(m_viewModes[FITKFluidVTKCommons::SMVM_Wireframe] && visibility);
|
|
}
|
|
|
|
// Show or hide vertex.
|
|
if (m_fActorVertex)
|
|
{
|
|
m_fActorVertex->SetVisibility(m_viewModes[FITKFluidVTKCommons::SMVM_Vertex] && visibility);
|
|
}
|
|
|
|
// The highlightor.
|
|
if (m_highlightSelector)
|
|
{
|
|
m_highlightSelector->setVisible(visibility && getDataVisibility() && (m_isHighlighting || m_isAdvHighlighting));
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::setViewMode(FITKFluidVTKCommons::ShapeMeshViewMode type, bool visible)
|
|
{
|
|
// Get the shape mesh actor by the given type.
|
|
FITKGraphActor* fActor{ nullptr };
|
|
|
|
switch (type)
|
|
{
|
|
case FITKFluidVTKCommons::SMVM_Shade:
|
|
fActor = m_fActorFace;
|
|
break;
|
|
case FITKFluidVTKCommons::SMVM_Wireframe:
|
|
fActor = m_fActorEdge;
|
|
break;
|
|
case FITKFluidVTKCommons::SMVM_Vertex:
|
|
fActor = m_fActorVertex;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
if (!fActor)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Set the visibility for the actor.
|
|
fActor->SetVisibility(visible);
|
|
|
|
// Save flag.
|
|
FITKFluidVTKGraphObject3D::setViewMode(type, visible);
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::setTransparent(bool isOn)
|
|
{
|
|
// Get the opacity.
|
|
double opa = isOn ? 1. - FITKFluidVTKCommons::s_transparency : 1.;
|
|
|
|
if (m_fActorFace)
|
|
{
|
|
m_fActorFace->GetProperty()->SetOpacity(opa);
|
|
}
|
|
|
|
if (m_fActorEdge)
|
|
{
|
|
m_fActorEdge->GetProperty()->SetOpacity(opa);
|
|
}
|
|
|
|
if (m_fActorVertex)
|
|
{
|
|
m_fActorVertex->GetProperty()->SetOpacity(opa);
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::setColor(QColor color, FITKFluidVTKCommons::ShapeType type, int index)
|
|
{
|
|
switch (type)
|
|
{
|
|
case FITKFluidVTKCommons::ModelVertex:
|
|
{
|
|
// Get the vertex cell ( vertex cell ) id by the given vertex id.
|
|
int cellId = -1;
|
|
if (!m_vertexIdCellIdMap.contains(index) || !m_colorMapVertex)
|
|
{
|
|
return;
|
|
}
|
|
|
|
cellId = m_vertexIdCellIdMap[index];
|
|
m_colorMapVertex->setCellsColor(c_defaultArrName, { cellId }, color);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ModelEdge:
|
|
{
|
|
// Get the edge cell ( poly-line cell ) id by the given edge id.
|
|
int cellId = -1;
|
|
if (!m_edgeIdCellIdMap.contains(index) || !m_colorMapEdge)
|
|
{
|
|
return;
|
|
}
|
|
|
|
cellId = m_edgeIdCellIdMap[index];
|
|
m_colorMapEdge->setCellsColor(c_defaultArrName, { cellId }, color);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ModelFace:
|
|
{
|
|
// Get the face cell ( triangle cell ) ids by the given face id.
|
|
if (!m_faceCellIdsHash.contains(index) || !m_colorMapFace)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const QVector<int> & cellIds = m_faceCellIdsHash[index];
|
|
m_colorMapFace->setCellsColor(c_defaultArrName, cellIds.toList(), color);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ModelSolid:
|
|
{
|
|
// Get the solid face ids by the given solid id.
|
|
if (!m_solidFaceIdsHash.contains(index) || !m_colorMapFace)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const QVector<int> & faceIds = m_solidFaceIdsHash[index];
|
|
|
|
// Get the face cell ids.
|
|
QVector<int> cellIds;
|
|
for (const int & faceId : faceIds)
|
|
{
|
|
cellIds << m_faceCellIdsHash[faceId];
|
|
}
|
|
|
|
m_colorMapFace->setCellsColor(c_defaultArrName, cellIds.toList(), color);
|
|
break;
|
|
}
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::highlight(FITKFluidVTKCommons::ShapeType type, QColor color)
|
|
{
|
|
// Show the actor and initialize the data.
|
|
if (!m_highlightSelector)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Default highlight all faces.
|
|
if (type == FITKFluidVTKCommons::ShapeType::ShapeTypeNone)
|
|
{
|
|
type = FITKFluidVTKCommons::ShapeType::ModelFace;
|
|
}
|
|
|
|
vtkDataSet* meshDataSet = getMesh(type);
|
|
if (!meshDataSet)
|
|
{
|
|
return;
|
|
}
|
|
|
|
QVector<int> indice;
|
|
for (int i = 0; i < meshDataSet->GetNumberOfCells(); i++)
|
|
{
|
|
indice.push_back(i);
|
|
}
|
|
|
|
// Check the color.
|
|
if (!color.isValid())
|
|
{
|
|
color = Qt::red;
|
|
}
|
|
|
|
m_highlightSelector->setColor(color);
|
|
m_highlightSelector->setSelectData(meshDataSet, indice, type);
|
|
m_highlightSelector->setVisible(getDataVisibility());
|
|
|
|
// Save the highlight flag.
|
|
FITKFluidVTKGraphObject3D::highlight();
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::disHighlight()
|
|
{
|
|
// Hide the actor only.
|
|
if (m_highlightSelector)
|
|
{
|
|
m_highlightSelector->setVisible(false);
|
|
}
|
|
|
|
// Save the highlight flag.
|
|
FITKFluidVTKGraphObject3D::disHighlight();
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::advanceHighlight(FITKFluidVTKCommons::ShapeType type, QVector<int> indice, QColor color)
|
|
{
|
|
// Show the actor and initialize the data.
|
|
if (!m_highlightSelector)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (indice.isEmpty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
vtkDataSet* meshDataSet = getMesh(type);
|
|
if (!meshDataSet)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get the model shape type.
|
|
FITKFluidVTKCommons::ShapeAbsEnum shapeEnum;
|
|
switch (type)
|
|
{
|
|
case FITKFluidVTKCommons::ModelVertex:
|
|
shapeEnum = FITKFluidVTKCommons::ShapeAbsEnum::STA_VERTEX;
|
|
break;
|
|
case FITKFluidVTKCommons::ModelEdge:
|
|
shapeEnum = FITKFluidVTKCommons::ShapeAbsEnum::STA_EDGE;
|
|
break;
|
|
case FITKFluidVTKCommons::ModelFace:
|
|
shapeEnum = FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE;
|
|
break;
|
|
case FITKFluidVTKCommons::ModelSolid:
|
|
shapeEnum = FITKFluidVTKCommons::ShapeAbsEnum::STA_SOLID;
|
|
break;
|
|
case FITKFluidVTKCommons::ShapeTypeNone:
|
|
case FITKFluidVTKCommons::MeshNode:
|
|
case FITKFluidVTKCommons::MeshElement:
|
|
default:
|
|
return;
|
|
}
|
|
|
|
// Get the cell ids in VTK.
|
|
int nCells = meshDataSet->GetNumberOfCells();
|
|
QVector<int> cellFlags;
|
|
cellFlags.resize(nCells);
|
|
cellFlags.fill(0);
|
|
|
|
// Get VTK ids by Shape ids.
|
|
for (const int & index : indice)
|
|
{
|
|
QVector<int> vtkIds = getVTKCellIdsByShapeId(index, shapeEnum);
|
|
|
|
for (const int & vtkId : vtkIds)
|
|
{
|
|
cellFlags[vtkId] = 1;
|
|
}
|
|
}
|
|
|
|
QVector<int> vtkIndice;
|
|
for (int i = 0; i < cellFlags.count(); i++)
|
|
{
|
|
if (cellFlags[i])
|
|
{
|
|
vtkIndice.push_back(i);
|
|
}
|
|
}
|
|
|
|
// Check the color.
|
|
if (!color.isValid())
|
|
{
|
|
color = Qt::red;
|
|
}
|
|
|
|
m_highlightSelector->setColor(color);
|
|
m_highlightSelector->setSelectData(meshDataSet, vtkIndice, type);
|
|
m_highlightSelector->setVisible(getDataVisibility());
|
|
|
|
// Save the highlight flag.
|
|
FITKFluidVTKGraphObject3D::advanceHighlight(type, indice, color);
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::disAdvanceHighlight()
|
|
{
|
|
// Clear data and hide the actor.
|
|
if (m_highlightSelector)
|
|
{
|
|
m_highlightSelector->clearData();
|
|
m_highlightSelector->setVisible(false);
|
|
}
|
|
|
|
// Save the highlight flag.
|
|
FITKFluidVTKGraphObject3D::disAdvanceHighlight();
|
|
}
|
|
|
|
int FITKFluidVTKGraphObjectModel::getNumberOf(FITKFluidVTKCommons::ShapeType type)
|
|
{
|
|
if (!m_triData)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
switch (type)
|
|
{
|
|
case FITKFluidVTKCommons::ModelVertex:
|
|
return m_triData->getPointItems().count();
|
|
case FITKFluidVTKCommons::ModelEdge:
|
|
return m_triData->getEdgeItems().count();
|
|
case FITKFluidVTKCommons::ModelFace:
|
|
return m_triData->getFaceItems().count();
|
|
case FITKFluidVTKCommons::ModelSolid:
|
|
return 0;//m_triData->
|
|
case FITKFluidVTKCommons::ShapeTypeNone:
|
|
case FITKFluidVTKCommons::MeshNode:
|
|
case FITKFluidVTKCommons::MeshElement:
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::setPickMode(FITKFluidVTKCommons::ShapePickMode mode)
|
|
{
|
|
// Lambda for set actor pickable.
|
|
auto setActorPickable = [=](FITKGraphActor* fActor, bool isOn)
|
|
{
|
|
if (fActor)
|
|
{
|
|
fActor->SetPickable(isOn);
|
|
}
|
|
};
|
|
|
|
switch (mode)
|
|
{
|
|
case FITKFluidVTKCommons::PickNone:
|
|
setActorPickable(m_fActorVertex, false);
|
|
setActorPickable(m_fActorEdge, false);
|
|
setActorPickable(m_fActorFace, false);
|
|
break;
|
|
case FITKFluidVTKCommons::PickVertex:
|
|
setActorPickable(m_fActorVertex, true);
|
|
setActorPickable(m_fActorEdge, false);
|
|
setActorPickable(m_fActorFace, false);
|
|
break;
|
|
case FITKFluidVTKCommons::PickEdge:
|
|
setActorPickable(m_fActorVertex, false);
|
|
setActorPickable(m_fActorEdge, true);
|
|
setActorPickable(m_fActorFace, false);
|
|
break;
|
|
case FITKFluidVTKCommons::PickFace:
|
|
case FITKFluidVTKCommons::PickSolid:
|
|
setActorPickable(m_fActorVertex, false);
|
|
setActorPickable(m_fActorEdge, false);
|
|
setActorPickable(m_fActorFace, true);
|
|
break;
|
|
case FITKFluidVTKCommons::PickAll:
|
|
setActorPickable(m_fActorVertex, true);
|
|
setActorPickable(m_fActorEdge, true);
|
|
setActorPickable(m_fActorFace, true);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
// Save the pick mode.
|
|
FITKFluidVTKGraphObject3D::setPickMode(mode);
|
|
}
|
|
|
|
int FITKFluidVTKGraphObjectModel::getShapeIdByVTKCellId(int vtkCellId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType)
|
|
{
|
|
int id = -1;
|
|
if (vtkCellId < 0)
|
|
{
|
|
return id;
|
|
}
|
|
|
|
switch (topAbsShapeType)
|
|
{
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SOLID:
|
|
{
|
|
// Try to get the face.
|
|
if (m_cellIdFaceIdMap.count() <= vtkCellId)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Try to get the solid id.
|
|
const int & faceId = m_cellIdFaceIdMap[vtkCellId];
|
|
|
|
if (m_faceSolidIdMap.count() <= faceId)
|
|
{
|
|
break;
|
|
}
|
|
|
|
id = m_faceSolidIdMap[faceId];
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE:
|
|
{
|
|
// Try to get the face.
|
|
if (m_cellIdFaceIdMap.count() <= vtkCellId)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the face id.
|
|
id = m_cellIdFaceIdMap[vtkCellId];
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_EDGE:
|
|
{
|
|
// Try to get the edge.
|
|
if (m_cellIdEdgeIdMap.count() <= vtkCellId)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the edge id.
|
|
id = m_cellIdEdgeIdMap[vtkCellId];
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_VERTEX:
|
|
{
|
|
// Try to get the vertex.
|
|
if (m_cellIdVertexIdMap.count() <= vtkCellId)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the vertex id.
|
|
id = m_cellIdVertexIdMap[vtkCellId];
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPOUND:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPSOLID:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHELL:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_WIRE:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHAPE:
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
const QVector<int> FITKFluidVTKGraphObjectModel::getVTKCellIdsByShapeId(int shapeId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType)
|
|
{
|
|
QVector<int> cellIds;
|
|
|
|
switch (topAbsShapeType)
|
|
{
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SOLID:
|
|
{
|
|
// Try to get the solid's faces.
|
|
if (!m_solidFaceIdsHash.contains(shapeId))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Try to get the faces' cells.
|
|
const QVector<int> & faceIds = m_solidFaceIdsHash[shapeId];
|
|
for (const int & fId : faceIds)
|
|
{
|
|
cellIds << getVTKCellIdsByShapeId(fId, FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE:
|
|
{
|
|
if (!m_faceCellIdsHash.contains(shapeId))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the face's cell ids.
|
|
cellIds = m_faceCellIdsHash[shapeId];
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_EDGE:
|
|
{
|
|
if (!m_edgeIdCellIdMap.contains(shapeId))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the edge's cell id.( Poly line cell )
|
|
cellIds.push_back(m_edgeIdCellIdMap[shapeId]);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_VERTEX:
|
|
{
|
|
if (!m_vertexIdCellIdMap.contains(shapeId))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the vertex's cell id.( Vertex cell )
|
|
cellIds.push_back(m_vertexIdCellIdMap[shapeId]);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPOUND:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPSOLID:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHELL:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_WIRE:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHAPE:
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return cellIds;
|
|
}
|
|
|
|
const QVector<int> FITKFluidVTKGraphObjectModel::getVTKCellIdsByVTKCellId(int cellId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType)
|
|
{
|
|
QVector<int> cellIds;
|
|
|
|
switch (topAbsShapeType)
|
|
{
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SOLID:
|
|
{
|
|
if (cellId >= m_cellIdFaceIdMap.count())
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the cell's solid id, and the solid's faces.
|
|
int faceId = m_cellIdFaceIdMap[cellId];
|
|
int solidId = m_faceSolidIdMap[faceId];
|
|
|
|
// Try to get the faces' cells.
|
|
const QVector<int> & faceIds = m_solidFaceIdsHash[solidId];
|
|
for (const int & fId : faceIds)
|
|
{
|
|
cellIds << getVTKCellIdsByShapeId(fId, FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_FACE:
|
|
{
|
|
if (cellId >= m_cellIdFaceIdMap.count())
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get the face id.
|
|
int faceId = m_cellIdFaceIdMap[cellId];
|
|
cellIds = m_faceCellIdsHash[faceId];
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_EDGE:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_VERTEX:
|
|
{
|
|
// The edge and vertex cell id is the given cell id.
|
|
cellIds.push_back(cellId);
|
|
break;
|
|
}
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPOUND:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_COMPSOLID:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHELL:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_WIRE:
|
|
case FITKFluidVTKCommons::ShapeAbsEnum::STA_SHAPE:
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return cellIds;
|
|
}
|
|
|
|
vtkDataSet* FITKFluidVTKGraphObjectModel::getMesh(FITKFluidVTKCommons::ShapeType type)
|
|
{
|
|
// Get the mesh data for extractor.
|
|
switch (type)
|
|
{
|
|
case FITKFluidVTKCommons::ModelVertex:
|
|
return m_gridVertex;
|
|
case FITKFluidVTKCommons::ModelEdge:
|
|
return m_gridEdge;
|
|
case FITKFluidVTKCommons::ModelFace:
|
|
case FITKFluidVTKCommons::ModelSolid:
|
|
return m_gridFace;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
bool FITKFluidVTKGraphObjectModel::generateDataSet()
|
|
{
|
|
Interface::FITKAbsGeoCommand* modelData = dynamic_cast<Interface::FITKAbsGeoCommand*>(_dataObj);
|
|
if (!modelData)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Get the abastract shape agent.
|
|
Interface::FITKAbsGeoShapeAgent* shapeAgent = modelData->getShapeAgent();
|
|
if (!shapeAgent)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Trianglate.
|
|
shapeAgent->triangulation();
|
|
|
|
// Get the trianglation of the shape.
|
|
Interface::FITKGeometryMeshVS* triData = shapeAgent->getMeshVS();
|
|
if (!triData)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Save the trianglation data and the topo-manager.
|
|
m_triData = triData;
|
|
m_topoMgr = shapeAgent->getVirtualTopoManager();
|
|
|
|
// Save the hash code of the shape.
|
|
m_hashCode = shapeAgent->shapeHashCode();
|
|
|
|
bool flag = meshVSToVtkDataSet();
|
|
return flag;
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::generateGraph()
|
|
{
|
|
if (!m_gridVertex || !m_gridEdge || !m_gridFace)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Create vertex actor.
|
|
m_fActorVertex = FITKGraphActor::New();
|
|
m_fActorVertex->setGraphObject(this);
|
|
m_fActorVertex->setActorType(ActorType::VertexActor);
|
|
m_fActorVertex->SetPickable(false);
|
|
m_fActorVertex->SetVisibility(true);
|
|
m_fActorVertex->GetProperty()->SetPointSize(5);
|
|
m_fActorVertex->GetProperty()->SetRepresentation(2);
|
|
m_fActorVertex->setInputDataObject(m_gridVertex);
|
|
addActor(m_fActorVertex);
|
|
|
|
// Create edge actor.
|
|
m_fActorEdge = FITKGraphActor::New();
|
|
m_fActorEdge->setGraphObject(this);
|
|
m_fActorEdge->setActorType(ActorType::EdgeActor);
|
|
m_fActorEdge->SetPickable(false);
|
|
m_fActorEdge->SetVisibility(true);
|
|
m_fActorEdge->GetProperty()->SetLineWidth(2);
|
|
m_fActorEdge->GetProperty()->SetRepresentation(1);
|
|
m_fActorEdge->setInputDataObject(m_gridEdge);
|
|
addActor(m_fActorEdge);
|
|
|
|
// Create face actor.
|
|
m_fActorFace = FITKGraphActor::New();
|
|
m_fActorFace->setGraphObject(this);
|
|
m_fActorFace->setActorType(ActorType::SurfaceActor);
|
|
m_fActorFace->SetPickable(false);
|
|
m_fActorFace->SetVisibility(true);
|
|
m_fActorFace->GetProperty()->SetRepresentation(2);
|
|
m_fActorFace->GetProperty()->SetEdgeVisibility(false);
|
|
m_fActorFace->GetProperty()->SetLineWidth(0.);
|
|
m_fActorFace->setInputDataObject(m_gridFace);
|
|
addActor(m_fActorFace);
|
|
|
|
// Set the colors.
|
|
//@{
|
|
m_colorMapVertex = new FITKFluidVTKShapeColorMap;
|
|
m_colorMapEdge = new FITKFluidVTKShapeColorMap;
|
|
m_colorMapFace = new FITKFluidVTKShapeColorMap;
|
|
|
|
m_colorMapVertex->setInputData(m_gridVertex);
|
|
m_colorMapEdge->setInputData(m_gridEdge);
|
|
m_colorMapFace->setInputData(m_gridFace);
|
|
|
|
m_colorMapVertex->setColor(c_defaultArrName, FITKFluidVTKCommons::s_geoVertexColor);
|
|
m_colorMapEdge->setColor(c_defaultArrName, FITKFluidVTKCommons::s_geoEdgeColor);
|
|
m_colorMapFace->setColor(c_defaultArrName, FITKFluidVTKCommons::s_geoFaceColor);
|
|
//@}
|
|
|
|
// Enable color arrays.
|
|
//@{
|
|
m_fActorVertex->setScalarVisibility(true);
|
|
m_fActorEdge->setScalarVisibility(true);
|
|
m_fActorFace->setScalarVisibility(true);
|
|
|
|
m_fActorVertex->setScalarModeToUseCellFieldData();
|
|
m_fActorEdge->setScalarModeToUseCellFieldData();
|
|
m_fActorFace->setScalarModeToUseCellFieldData();
|
|
|
|
m_colorMapVertex->update();
|
|
m_colorMapEdge->update();
|
|
m_colorMapFace->update();
|
|
|
|
m_fActorVertex->selectScalarArray(c_defaultArrName);
|
|
m_fActorEdge->selectScalarArray(c_defaultArrName);
|
|
m_fActorFace->selectScalarArray(c_defaultArrName);
|
|
//@}
|
|
}
|
|
|
|
void FITKFluidVTKGraphObjectModel::clearData()
|
|
{
|
|
// Reset all data set.
|
|
resetVtkObj(m_gridVertex);
|
|
resetVtkObj(m_gridEdge);
|
|
resetVtkObj(m_gridFace);
|
|
|
|
resetVtkObj(m_gridVertex->GetPoints());
|
|
resetVtkObj(m_gridEdge->GetPoints());
|
|
resetVtkObj(m_gridFace->GetPoints());
|
|
|
|
// Clear normals.
|
|
resetVtkObj(m_normalFacePoint);
|
|
|
|
// Clear the maps.
|
|
m_solidFaceIdsHash.clear();
|
|
m_faceSolidIdMap.clear();
|
|
m_cellIdVertexIdMap.clear();
|
|
m_cellIdEdgeIdMap.clear();
|
|
m_cellIdFaceIdMap.clear();
|
|
m_vertexIdCellIdMap.clear();
|
|
m_edgeIdCellIdMap.clear();
|
|
|
|
// Clear color maps.
|
|
m_colorMapVertex->clear();
|
|
m_colorMapEdge->clear();
|
|
m_colorMapFace->clear();
|
|
|
|
// Clear the selector.
|
|
if (m_highlightSelector)
|
|
{
|
|
m_highlightSelector->clearData();
|
|
}
|
|
}
|
|
} // namespace Exchange
|