start implementing RemoveExternalCellsFilter
This commit is contained in:
parent
ee47d24a3c
commit
621f24dd8b
@ -9,7 +9,9 @@ set(VTK_COMPONENTS
|
|||||||
VTK::CommonColor
|
VTK::CommonColor
|
||||||
VTK::CommonDataModel
|
VTK::CommonDataModel
|
||||||
VTK::IOLegacy
|
VTK::IOLegacy
|
||||||
VTK::IOXML)
|
VTK::IOGeometry
|
||||||
|
VTK::IOXML
|
||||||
|
VTK::FiltersModeling)
|
||||||
set(ENABLE_VIEWER OFF CACHE BOOL "Enable the 3D viewer, depends on Qt.")
|
set(ENABLE_VIEWER OFF CACHE BOOL "Enable the 3D viewer, depends on Qt.")
|
||||||
if(ENABLE_VIEWER)
|
if(ENABLE_VIEWER)
|
||||||
list(APPEND VTK_COMPONENTS
|
list(APPEND VTK_COMPONENTS
|
||||||
@ -55,7 +57,9 @@ target_sources(pfe PRIVATE
|
|||||||
src/point_tris_dist.cc
|
src/point_tris_dist.cc
|
||||||
src/point_tris_dist.h
|
src/point_tris_dist.h
|
||||||
src/project_surface_points_on_poly.cc
|
src/project_surface_points_on_poly.cc
|
||||||
src/project_surface_points_on_poly.h)
|
src/project_surface_points_on_poly.h
|
||||||
|
src/remove_external_cells_filter.cc
|
||||||
|
src/remove_external_cells_filter.h)
|
||||||
|
|
||||||
target_link_libraries(pfe PRIVATE ${VTK_COMPONENTS})
|
target_link_libraries(pfe PRIVATE ${VTK_COMPONENTS})
|
||||||
|
|
||||||
|
126
src/main.cc
126
src/main.cc
@ -5,14 +5,16 @@
|
|||||||
#include "project_surface_points_on_poly.h"
|
#include "project_surface_points_on_poly.h"
|
||||||
#include "mesh_fit_filter.h"
|
#include "mesh_fit_filter.h"
|
||||||
#include "point_tris_dist.h"
|
#include "point_tris_dist.h"
|
||||||
|
#include "remove_external_cells_filter.h"
|
||||||
|
|
||||||
#include <vtkCellData.h>
|
#include <vtkCellData.h>
|
||||||
#include <vtkUnstructuredGrid.h>
|
#include <vtkUnstructuredGrid.h>
|
||||||
#include <vtkUnstructuredGridReader.h>
|
#include <vtkUnstructuredGridReader.h>
|
||||||
#include <vtkUnstructuredGridWriter.h>
|
#include <vtkXMLUnstructuredGridWriter.h>
|
||||||
#include <vtkPolyData.h>
|
#include <vtkPolyData.h>
|
||||||
#include <vtkCellArrayIterator.h>
|
#include <vtkCellArrayIterator.h>
|
||||||
#include <vtkXMLPolyDataReader.h>
|
#include <vtkXMLPolyDataReader.h>
|
||||||
|
#include <vtkOBJReader.h>
|
||||||
|
|
||||||
#ifdef USE_VIEWER
|
#ifdef USE_VIEWER
|
||||||
#include <vtkNamedColors.h>
|
#include <vtkNamedColors.h>
|
||||||
@ -36,117 +38,33 @@ int main(int argc, char **argv) {
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reader */
|
vtkNew<vtkUnstructuredGridReader> tetMeshReader;
|
||||||
vtkNew<vtkUnstructuredGridReader> reader;
|
tetMeshReader->SetFileName(argv[1]);
|
||||||
reader->SetFileName(argv[1]);
|
|
||||||
|
|
||||||
|
|
||||||
/* Angles filter */
|
|
||||||
vtkNew<AnglesFilter> anglesFilter;
|
|
||||||
anglesFilter->SetInputConnection(reader->GetOutputPort());
|
|
||||||
|
|
||||||
/* Display angles in console. */
|
|
||||||
// anglesFilter->Update();
|
|
||||||
// vtkUnstructuredGrid *grid = anglesFilter->GetOutput();
|
|
||||||
// auto *angles = grid->GetCellData()->GetArray("angles");
|
|
||||||
// for (ssize_t i = 0; i < angles->GetNumberOfTuples(); i++) {
|
|
||||||
// std::cerr << "cell " << i << ": ";
|
|
||||||
// for (ssize_t j = 0; j < angles->GetNumberOfComponents(); j++) {
|
|
||||||
// std::cerr << angles->GetTuple(i)[j] << ", ";
|
|
||||||
// }
|
|
||||||
// std::cerr << "\b\b \n";
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* Aspect ratio */
|
|
||||||
vtkNew<AspectRatioFilter> aspectRatioFilter;
|
|
||||||
aspectRatioFilter->SetInputConnection(anglesFilter->GetOutputPort());
|
|
||||||
|
|
||||||
/* Display aspect ratios in console. */
|
|
||||||
// aspectRatioFilter->Update();
|
|
||||||
// grid = aspectRatioFilter->GetOutput();
|
|
||||||
// auto *aspectRatios = grid->GetCellData()->GetArray("aspect_ratio");
|
|
||||||
// for (ssize_t i = 0; i < aspectRatios->GetNumberOfTuples(); i++) {
|
|
||||||
// std::cerr << "cell " << i << ": "
|
|
||||||
// << aspectRatios->GetTuple1(i) << "\n";
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* Dihedral angles filter */
|
|
||||||
vtkNew<DihedralAnglesFilter> dihedralAnglesFilter;
|
vtkNew<DihedralAnglesFilter> dihedralAnglesFilter;
|
||||||
dihedralAnglesFilter->SetInputConnection(aspectRatioFilter->GetOutputPort());
|
dihedralAnglesFilter->SetInputConnection(tetMeshReader->GetOutputPort());
|
||||||
|
|
||||||
/* Display dihedral angles in console. */
|
// vtkNew<vtkXMLPolyDataReader> polyMeshReader;
|
||||||
// dihedralAnglesFilter->Update();
|
// polyMeshReader->SetFileName(argv[2]);
|
||||||
// grid = dihedralAnglesFilter->GetOutput();
|
vtkNew<vtkOBJReader> polyMeshReader;
|
||||||
// auto dihedralAngles = grid->GetCellData()->GetArray("dihedral_angles");
|
polyMeshReader->SetFileName(argv[2]);
|
||||||
// for (vtkIdType i = 0; i < grid->GetNumberOfCells(); i++) {
|
|
||||||
// std::cerr << "dihedral angles ";
|
|
||||||
// for (vtkIdType j = 0; j < 6; j++) {
|
|
||||||
// std::cerr << dihedralAngles->GetTuple(i)[j] << ", ";
|
|
||||||
// }
|
|
||||||
// std::cerr << "\b\b\n";
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* External faces filter. */
|
vtkNew<RemoveExternalCellsFilter> removeExternalCellsFilter;
|
||||||
// vtkNew<vtkmExternalFaces> externalFacesFilter;
|
removeExternalCellsFilter->SetInputConnection(0,
|
||||||
// externalFacesFilter->DebugOn();
|
dihedralAnglesFilter->GetOutputPort());
|
||||||
// externalFacesFilter->SetInputConnection(dihedralAnglesFilter->GetOutputPort());
|
removeExternalCellsFilter->SetInputConnection(1,
|
||||||
|
polyMeshReader->GetOutputPort());
|
||||||
|
|
||||||
/* Surface points filter. */
|
// vtkNew<ProjectSurfacePointsOnPoly> project;
|
||||||
vtkNew<SurfacePointsFilter> surfacePointsFilter;
|
// project->SetInputConnection(0, removeExternalCellsFilter->GetOutputPort());
|
||||||
surfacePointsFilter->SetInputConnection(dihedralAnglesFilter->GetOutputPort());
|
// project->SetInputConnection(1, pdReader->GetOutputPort());
|
||||||
|
|
||||||
|
vtkNew<vtkXMLUnstructuredGridWriter> writer;
|
||||||
// vtkNew<MeshFitFilter> meshFitFilter;
|
writer->SetInputConnection(removeExternalCellsFilter->GetOutputPort());
|
||||||
// meshFitFilter->SetInputConnection(surfacePointsFilter->GetOutputPort());
|
writer->SetDataModeToAscii();
|
||||||
|
writer->SetFileName("out.vtu");
|
||||||
vtkNew<vtkXMLPolyDataReader> pdReader;
|
|
||||||
pdReader->SetFileName(argv[2]);
|
|
||||||
|
|
||||||
vtkNew<ProjectSurfacePointsOnPoly> project;
|
|
||||||
project->SetInputConnection(0, surfacePointsFilter->GetOutputPort());
|
|
||||||
project->SetInputConnection(1, pdReader->GetOutputPort());
|
|
||||||
|
|
||||||
|
|
||||||
vtkNew<vtkUnstructuredGridWriter> writer;
|
|
||||||
writer->SetInputConnection(project->GetOutputPort());
|
|
||||||
writer->SetFileTypeToASCII();
|
|
||||||
writer->SetFileName("out.vtk");
|
|
||||||
writer->Write();
|
writer->Write();
|
||||||
|
|
||||||
|
|
||||||
// vtkNew<vtkPoints> points;
|
|
||||||
// points->InsertPoint(0, 0., 0., 0.);
|
|
||||||
// points->InsertPoint(1, 1., 0., 0.);
|
|
||||||
// points->InsertPoint(2, 1., 1., 0.);
|
|
||||||
|
|
||||||
// vtkNew<vtkCellArray> strips;
|
|
||||||
// strips->InsertNextCell(3);
|
|
||||||
// strips->InsertCellPoint(0);
|
|
||||||
// strips->InsertCellPoint(1);
|
|
||||||
// strips->InsertCellPoint(2);
|
|
||||||
|
|
||||||
// vtkNew<vtkPolyData> profile;
|
|
||||||
// profile->SetPoints(points);
|
|
||||||
// profile->SetStrips(strips);
|
|
||||||
|
|
||||||
// vtkCell *cell = profile->GetCell(0);
|
|
||||||
// // vtkTriangle *triangle = vtkTriangle::SafeDownCast(cell);
|
|
||||||
// // vtkTriangle *triangle = (vtkTriangle *) cell;
|
|
||||||
|
|
||||||
// double direction[3];// = {0, 0, 0};
|
|
||||||
// double point[3] = {0, 1, 0};
|
|
||||||
|
|
||||||
// double d = pointTriangleDistance(point, cell, direction);
|
|
||||||
// //double d = 5;
|
|
||||||
|
|
||||||
// std::cout << "[" << point[0]
|
|
||||||
// << ", " << point[1]
|
|
||||||
// << ", " << point[2]
|
|
||||||
// << "] (" << d << ")"
|
|
||||||
// << "[" << direction[0]
|
|
||||||
// << ", " << direction[1]
|
|
||||||
// << ", " << direction[2] << "]\n";
|
|
||||||
|
|
||||||
#ifdef USE_VIEWER
|
#ifdef USE_VIEWER
|
||||||
/* Volume rendering properties */
|
/* Volume rendering properties */
|
||||||
vtkNew<vtkOpenGLProjectedTetrahedraMapper> volumeMapper;
|
vtkNew<vtkOpenGLProjectedTetrahedraMapper> volumeMapper;
|
||||||
|
152
src/remove_external_cells_filter.cc
Normal file
152
src/remove_external_cells_filter.cc
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
#include "remove_external_cells_filter.h"
|
||||||
|
#include "point_tris_dist.h"
|
||||||
|
|
||||||
|
#include <vtkUnstructuredGrid.h>
|
||||||
|
#include <vtkDataObject.h>
|
||||||
|
#include <vtkPolyData.h>
|
||||||
|
#include <vtkPointData.h>
|
||||||
|
#include <vtkCellData.h>
|
||||||
|
#include <vtkCellIterator.h>
|
||||||
|
#include <vtkSelectEnclosedPoints.h>
|
||||||
|
|
||||||
|
|
||||||
|
vtkStandardNewMacro(RemoveExternalCellsFilter);
|
||||||
|
|
||||||
|
|
||||||
|
RemoveExternalCellsFilter::RemoveExternalCellsFilter() {
|
||||||
|
SetNumberOfInputPorts(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RemoveExternalCellsFilter::FillInputPortInformation(
|
||||||
|
int port, vtkInformation *info) {
|
||||||
|
if (port == 0) {
|
||||||
|
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkUnstructuredGrid");
|
||||||
|
} else if (port == 1) {
|
||||||
|
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkPolyData");
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static bool isSurfaceCell(vtkUnstructuredGrid *tetMesh, vtkIdType cellId) {
|
||||||
|
// vtkNew<vtkIdList> facePoints;
|
||||||
|
// vtkNew<vtkIdList> sharedCells;
|
||||||
|
// for (vtkIdType faceId = 0; faceId < 4; faceId++) {
|
||||||
|
// facePoints->InsertNextId((faceId + 0) % 4);
|
||||||
|
// facePoints->InsertNextId((faceId + 1) % 4);
|
||||||
|
// facePoints->InsertNextId((faceId + 2) % 4);
|
||||||
|
// tetMesh->GetCellNeighbors(cellId, facePoints, sharedCells);
|
||||||
|
// if (sharedCells->GetNumberOfIds() == 1) { // Surface cell.
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// facePoints->Reset();
|
||||||
|
// sharedCells->Reset();
|
||||||
|
// }
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// static void closestTri(vtkPolyData *polyMesh,
|
||||||
|
// vtkKdTree *kdTree,
|
||||||
|
// vtkStaticCellLinks *polyMeshLinks,
|
||||||
|
// double *point,
|
||||||
|
// double *closestTriDist,
|
||||||
|
// double *closestTriDirection) {
|
||||||
|
// vtkIdType closestPoint;
|
||||||
|
// {
|
||||||
|
// double dummy;
|
||||||
|
// closestPoint = kdTree->FindClosestPoint(point, dummy);
|
||||||
|
// }
|
||||||
|
// vtkIdType *triIds = polyMeshLinks->GetCells(closestPoint);
|
||||||
|
// vtkIdType nTris = polyMeshLinks->GetNcells(closestPoint);
|
||||||
|
|
||||||
|
// *closestTriDist = std::numeric_limits<double>::infinity();
|
||||||
|
// for (vtkIdType j = 0; j < nTris; j++) {
|
||||||
|
// vtkIdType cellId = triIds[j];
|
||||||
|
// double direction[3];
|
||||||
|
// double dist = pointTriangleDistance(point, polyMesh->GetCell(cellId),
|
||||||
|
// direction);
|
||||||
|
// if (dist < *closestTriDist) {
|
||||||
|
// *closestTriDist = dist;
|
||||||
|
// closestTriDirection[0] = direction[0];
|
||||||
|
// closestTriDirection[1] = direction[1];
|
||||||
|
// closestTriDirection[2] = direction[2];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// static bool isExternalCell(vtkUnstructuredGrid *tetMesh,
|
||||||
|
// vtkPolyData *polyMesh,
|
||||||
|
// vtkStaticCellLinks *polyMeshLinks,
|
||||||
|
// vtkKdTree *kdTree,
|
||||||
|
// vtkIdType cellId) {
|
||||||
|
// vtkNew<vtkIdList> pointIds;
|
||||||
|
// tetMesh->GetCellPoints(cellId, pointIds);
|
||||||
|
// double a[3], b[3], c[3];
|
||||||
|
// tetMesh->GetPoint(pointIds->GetId(0), a);
|
||||||
|
// tetMesh->GetPoint(pointIds->GetId(1), b);
|
||||||
|
// tetMesh->GetPoint(pointIds->GetId(2), c);
|
||||||
|
|
||||||
|
// double aDist, bDist, cDist;
|
||||||
|
// double aDirection[3], bDirection[3], cDirection[3];
|
||||||
|
// closestTri(polyMesh, kdTree, polyMeshLinks, a,
|
||||||
|
// &aDist, aDirection);
|
||||||
|
// closestTri(polyMesh, kdTree, polyMeshLinks, b,
|
||||||
|
// &bDist, bDirection);
|
||||||
|
// closestTri(polyMesh, kdTree, polyMeshLinks, c,
|
||||||
|
// &cDist, cDirection);
|
||||||
|
// if (aDist > 0 && bDist > 0 && cDist > 0) {
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
vtkTypeBool RemoveExternalCellsFilter::RequestData(
|
||||||
|
vtkInformation *request,
|
||||||
|
vtkInformationVector **inputVector,
|
||||||
|
vtkInformationVector *outputVector) {
|
||||||
|
(void) request;
|
||||||
|
vtkUnstructuredGrid* tetMesh = vtkUnstructuredGrid::GetData(inputVector[0]);
|
||||||
|
vtkPolyData *polyMesh = vtkPolyData::GetData(inputVector[1]);
|
||||||
|
vtkUnstructuredGrid* output = vtkUnstructuredGrid::GetData(outputVector);
|
||||||
|
// output->CopyStructure(tetMesh);
|
||||||
|
// output->GetPointData()->PassData(tetMesh->GetPointData());
|
||||||
|
// output->GetCellData()->PassData(tetMesh->GetCellData());
|
||||||
|
|
||||||
|
vtkNew<vtkSelectEnclosedPoints> selectEnclosedPoints;
|
||||||
|
selectEnclosedPoints->SetInputDataObject(0, tetMesh);
|
||||||
|
selectEnclosedPoints->SetInputDataObject(1, polyMesh);
|
||||||
|
selectEnclosedPoints->Update();
|
||||||
|
unsigned char *enclosedPoints = (unsigned char *)
|
||||||
|
selectEnclosedPoints->GetOutput()->GetPointData()
|
||||||
|
->GetArray("SelectedPoints")->GetVoidPointer(0);
|
||||||
|
vtkNew<vtkPoints> outPoints;
|
||||||
|
vtkNew<vtkIdList> outPointIds;
|
||||||
|
vtkIdType outPointId = 0;
|
||||||
|
outPointIds->Allocate(3);
|
||||||
|
output->Allocate();
|
||||||
|
auto it = tetMesh->NewCellIterator();
|
||||||
|
for (it->InitTraversal();
|
||||||
|
!it->IsDoneWithTraversal();
|
||||||
|
it->GoToNextCell()) {
|
||||||
|
vtkIdList *pointIds = it->GetPointIds();
|
||||||
|
if (!enclosedPoints[pointIds->GetId(0)]
|
||||||
|
&& !enclosedPoints[pointIds->GetId(1)]
|
||||||
|
&& !enclosedPoints[pointIds->GetId(2)]
|
||||||
|
&& !enclosedPoints[pointIds->GetId(3)]) {
|
||||||
|
outPointIds->SetId(0, outPointId + 0);
|
||||||
|
outPointIds->SetId(1, outPointId + 1);
|
||||||
|
outPointIds->SetId(2, outPointId + 2);
|
||||||
|
outPointId += 3;
|
||||||
|
outPoints->InsertPoints(outPointIds, pointIds,
|
||||||
|
tetMesh->GetPoints());
|
||||||
|
output->InsertNextCell(it->GetCellType(), outPointIds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output->SetPoints(outPoints);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
29
src/remove_external_cells_filter.h
Normal file
29
src/remove_external_cells_filter.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef REMOVE_EXTERNAL_CELLS_FILTER_H
|
||||||
|
#define REMOVE_EXTERNAL_CELLS_FILTER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <vtkUnstructuredGridAlgorithm.h>
|
||||||
|
#include <vtkIdList.h>
|
||||||
|
#include <vtkInformation.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Removes cells from the UnstructuredGrid passed as first input that
|
||||||
|
lay outside the PolyData passed as second input.
|
||||||
|
*/
|
||||||
|
class RemoveExternalCellsFilter : public vtkUnstructuredGridAlgorithm {
|
||||||
|
public:
|
||||||
|
static RemoveExternalCellsFilter *New();
|
||||||
|
vtkTypeMacro(RemoveExternalCellsFilter, vtkUnstructuredGridAlgorithm);
|
||||||
|
RemoveExternalCellsFilter();
|
||||||
|
int FillInputPortInformation(int port, vtkInformation *info) override;
|
||||||
|
vtkTypeBool RequestData(vtkInformation *request,
|
||||||
|
vtkInformationVector **inputVector,
|
||||||
|
vtkInformationVector *outputVector) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
~RemoveExternalCellsFilter() override = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user