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.
AppFlow/FITK_Interface/FITKInterfaceMesh/FITKMeshFeatureVTK.cpp

168 lines
4.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "FITKMeshFeatureVTK.h"
// VTK
#include <vtkPolyData.h>
#include <vtkCellData.h>
#include <vtkDataArray.h>
// 过滤器
#include "FITK_Interface/FITKVTKAlgorithm/FITKSurfaceFilter.h"
#include "FITK_Interface/FITKVTKAlgorithm/FITKShellFeatureEdges.h"
#include "FITK_Interface/FITKVTKAlgorithm/FITKPolyDataNormals.h"
#include "FITK_Interface/FITKVTKAlgorithm/FITKHighOrderCellFilter.h"
namespace Interface
{
FITKMeshFeatureVTK::FITKMeshFeatureVTK(vtkDataSet* dataSet)
{
// 设置模型数据。
this->reset(dataSet);
// 初始化。
//@{
// 提取表面数据过滤器。
_surfaceFilter = FITKSurfaceFilter::New();
// _surfaceFilter->SetInputData(_dataSet);
// 保存单元与原数据拓扑对应关系必须设置为true。
_surfaceFilter->SetPassThroughPointIds(true);
// 处理高阶单元数据时必须设置为true。
_surfaceFilter->SetPassThroughCellIds(true);
// 高阶单元划分级为0才能正常显示。
_surfaceFilter->SetNonlinearSubdivisionLevel(0);
// 法向提取过滤器。
_normalFilter = FITKPolyDataNormals::New();
_normalFilter->SetInputConnection(_surfaceFilter->GetOutputPort());
_normalFilter->SetComputeCellNormals(true);
_normalFilter->SetComputePointNormals(false);
// 特征边提取过滤器。
_featureEdgeFilter = FITKShellFeatureEdges::New();
_featureEdgeFilter->SetInputConnection(_surfaceFilter->GetOutputPort());
_featureEdgeFilter->BoundaryEdgesOn();
_featureEdgeFilter->FeatureEdgesOn();
// 处理高阶单元过滤器。
_highOrderFilter = FITKHighOrderCellFilter::New();
// 需要用到提取表面时生成的原始单元id数据
// 默认array名称为表面提取生成的默认名称vtkOriginalCellIds。
_highOrderFilter->SetInputConnection(_surfaceFilter->GetOutputPort());
//@}
}
FITKMeshFeatureVTK::~FITKMeshFeatureVTK()
{
// 手动删除所有过滤器。
//@{
if (_highOrderFilter)
{
_highOrderFilter->Delete();
_highOrderFilter = nullptr;
}
if (_normalFilter)
{
_normalFilter->Delete();
_normalFilter = nullptr;
}
if (_featureEdgeFilter)
{
_featureEdgeFilter->Delete();
_featureEdgeFilter = nullptr;
}
if (_surfaceFilter)
{
_surfaceFilter->Delete();
_surfaceFilter = nullptr;
}
//@}
}
void FITKMeshFeatureVTK::update()
{
// 更新数据,提取表面用来提取法向与特征边等。
//@{
_surfaceFilter->SetInputData(_dataSet);
_surfaceFilter->Update();
//@}
// 更新法线、特征边。
//@{
_normalFilter->Update();
_featureEdgeFilter->Update();
//@}|
// 处理高阶单元,此处生成的为实际可视化的表面数据。
//@{
_highOrderFilter->Update();
//@}
_dataSet->Modified();
}
void FITKMeshFeatureVTK::reset(vtkDataSet* dataSet)
{
_dataSet = dataSet;
}
FITKSurfaceFilter* FITKMeshFeatureVTK::getSurfaceFilter()
{
return _surfaceFilter;
}
FITKShellFeatureEdges* FITKMeshFeatureVTK::getFeatureEdgeFilter()
{
return _featureEdgeFilter;
}
FITKHighOrderCellFilter* FITKMeshFeatureVTK::getHighOrderFilter()
{
return _highOrderFilter;
}
FITKPolyDataNormals* FITKMeshFeatureVTK::getNormalsFilter()
{
return _normalFilter;
}
vtkPolyData* FITKMeshFeatureVTK::getFeatureMesh(int type)
{
// 1 - 表面 2 - 法向 3 - 特征边
switch (type)
{
case 1: return _highOrderFilter->GetOutput();
case 2: return _normalFilter->GetOutput();
case 3: return _featureEdgeFilter->GetOutput();
default: return nullptr;
}
return nullptr;
}
vtkDataArray* FITKMeshFeatureVTK::getCellNormals()
{
vtkPolyData* normalMesh = getFeatureMesh(2);
if (!normalMesh)
{
return nullptr;
}
vtkCellData* cellData = normalMesh->GetCellData();
if (!cellData)
{
return nullptr;
}
return cellData->GetNormals();
}
}