From b2bfa3051f9f44ef8b1caf45a9d034f4bfbd2911 Mon Sep 17 00:00:00 2001 From: Dave Parker Date: Tue, 12 Mar 2024 13:16:44 -0700 Subject: [PATCH] Create mesh complete folder python 1049 (#1050) * Add functionality to add a ModelFaceID array and Normals to a mesh face. * Add creating a ModelRegionID array and move adding Normal data into sv_tetgenmesh_utils.cxx. --- .../PythonAPI/MeshingMesher_PyClass.cxx | 5 ++- .../MeshingTetGenOptions_PyClass.cxx | 2 +- .../TetGenMeshObject/sv_tetgenmesh_utils.cxx | 41 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Code/Source/PythonAPI/MeshingMesher_PyClass.cxx b/Code/Source/PythonAPI/MeshingMesher_PyClass.cxx index b0fcdbe1d..81ee1c9c2 100644 --- a/Code/Source/PythonAPI/MeshingMesher_PyClass.cxx +++ b/Code/Source/PythonAPI/MeshingMesher_PyClass.cxx @@ -39,6 +39,7 @@ #include #include "sv_TetGenMeshObject.h" +#include "vtkPolyDataNormals.h" extern cvSolidModel * GetModelFromPyObj(PyObject* obj); @@ -238,6 +239,7 @@ Mesher_get_face_polydata(PyMeshingMesher* self, PyObject* args, PyObject* kwargs vtkSmartPointer polydata = vtkSmartPointer::New(); polydata = cvPolydata->GetVtkPolyData(); + return PyUtilGetVtkObject(api, polydata); } @@ -535,8 +537,9 @@ Mesher_get_surface(PyMeshingMesher* self, PyObject* args) return nullptr; } - vtkSmartPointer polydata = vtkSmartPointer::New(); + auto polydata = vtkSmartPointer::New(); polydata = cvPolydata->GetVtkPolyData(); + return PyUtilGetVtkObject(api, polydata); } diff --git a/Code/Source/PythonAPI/MeshingTetGenOptions_PyClass.cxx b/Code/Source/PythonAPI/MeshingTetGenOptions_PyClass.cxx index 14ed7d67d..b154860d7 100644 --- a/Code/Source/PythonAPI/MeshingTetGenOptions_PyClass.cxx +++ b/Code/Source/PythonAPI/MeshingTetGenOptions_PyClass.cxx @@ -875,7 +875,7 @@ PyTetGenOptionsCreateFromList(cvMeshObject* mesher, std::vector& op try { SetValueMap[name](options, tokens, faceMap); } catch (const std::bad_function_call& except) { - std::cout << "[PyTetGenOptionsCreateFromList] Unknown name: " << name << std::endl; + std::cout << "[SV.PythonAPI] An unknown meshing option '" << name << "' was found in the MESH.msh file." << std::endl; } // Save commands not processed in cvTetGenMeshObject::SetMeshOptions(). diff --git a/Code/Source/sv/Mesh/TetGenMeshObject/sv_tetgenmesh_utils.cxx b/Code/Source/sv/Mesh/TetGenMeshObject/sv_tetgenmesh_utils.cxx index 36fda9602..602dfb8c3 100644 --- a/Code/Source/sv/Mesh/TetGenMeshObject/sv_tetgenmesh_utils.cxx +++ b/Code/Source/sv/Mesh/TetGenMeshObject/sv_tetgenmesh_utils.cxx @@ -661,6 +661,9 @@ int TGenUtils_GetFacePolyData(int id,vtkPolyData *mesh, vtkPolyData *face) vtkSmartPointer lessNodeIds = vtkSmartPointer::New(); vtkSmartPointer lessElementIds = vtkSmartPointer::New(); vtkSmartPointer globalElement2Ids = vtkSmartPointer::New(); + vtkSmartPointer modelFaceIds = vtkSmartPointer::New(); + vtkSmartPointer modelFaceRegionIds = vtkSmartPointer::New(); + vtkSmartPointer modelRegionIds = vtkSmartPointer::New(); if (VtkUtils_PDCheckArrayName(mesh,0,"GlobalNodeID") != SV_OK) { @@ -668,12 +671,14 @@ int TGenUtils_GetFacePolyData(int id,vtkPolyData *mesh, vtkPolyData *face) fprintf(stderr," IDs on mesh may not have been assigned properly\n"); return SV_ERROR; } + if (VtkUtils_PDCheckArrayName(mesh,1,"GlobalElementID") != SV_OK) { fprintf(stderr,"Array name 'GlobalElementID' does not exist."); fprintf(stderr," IDs on mesh may not have been assigned properly\n"); return SV_ERROR; } + if (VtkUtils_PDCheckArrayName(mesh,1,"ModelFaceID") != SV_OK) { fprintf(stderr,"Array name 'ModelFaceID' does not exist. Regions must be identified"); @@ -681,6 +686,14 @@ int TGenUtils_GetFacePolyData(int id,vtkPolyData *mesh, vtkPolyData *face) return SV_ERROR; } + bool has_ModelRegionIDs = false; + + if (VtkUtils_PDCheckArrayName(mesh,1,"ModelRegionID") == SV_OK) + { + has_ModelRegionIDs = true; + modelRegionIds = vtkIntArray::SafeDownCast(mesh->GetCellData()->GetScalars("ModelRegionID")); + } + globalNodeIds = vtkIntArray::SafeDownCast(mesh->GetPointData()->GetScalars("GlobalNodeID")); globalElementIds = vtkIntArray::SafeDownCast(mesh->GetCellData()->GetScalars("GlobalElementID")); boundaryScalars = vtkIntArray::SafeDownCast(mesh->GetCellData()->GetScalars("ModelFaceID")); @@ -747,6 +760,10 @@ int TGenUtils_GetFacePolyData(int id,vtkPolyData *mesh, vtkPolyData *face) selectFaces->InsertNextCell(facePointIds); globalElement2Ids->InsertNextValue(globalElement2); lessElementIds->InsertNextValue(globalElementIds->GetValue(cellId)); + modelFaceIds->InsertNextValue(id); + if (has_ModelRegionIDs) { + modelFaceRegionIds->InsertNextValue(modelRegionIds->GetValue(cellId)); + } } } @@ -767,6 +784,30 @@ int TGenUtils_GetFacePolyData(int id,vtkPolyData *mesh, vtkPolyData *face) tempFace->GetCellData()->AddArray(lessElementIds); tempFace->GetCellData()->SetActiveScalars("GlobalElementID"); + modelFaceIds->SetName("ModelFaceID"); + tempFace->GetCellData()->AddArray(modelFaceIds); + tempFace->GetCellData()->SetActiveScalars("ModelFaceID"); + + if (has_ModelRegionIDs) { + modelFaceRegionIds->SetName("ModelRegionID"); + tempFace->GetCellData()->AddArray(modelFaceRegionIds); + tempFace->GetCellData()->SetActiveScalars("ModelRegionID"); + } + + // Add cell normals. + // + auto normals = vtkSmartPointer::New(); + normals->SplittingOff(); + normals->ConsistencyOn(); + normals->AutoOrientNormalsOn(); + normals->ComputeCellNormalsOn(); + normals->ComputePointNormalsOff(); + normals->SetInputData(tempFace); + normals->Update(); + + tempFace->DeepCopy(normals->GetOutput()); + tempFace->GetCellData()->GetNormals()->SetName("Normals"); + delete [] pointOnFace; delete [] pointMapping; delete [] cellOnFace;