From 7b2f2e45ee5b334457476c9e730dc6398ecf9d20 Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Mon, 15 Jul 2024 17:05:27 -0600 Subject: [PATCH 1/2] use shallow copy when converting to pyvista.PolyData --- stl_reader/reader.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/stl_reader/reader.py b/stl_reader/reader.py index de8c207..9a470ba 100644 --- a/stl_reader/reader.py +++ b/stl_reader/reader.py @@ -1,4 +1,5 @@ """Read a STL file using a wrapper of https://github.com/aki5/libstl.""" + import numpy as np from stl_reader import _stlfile_wrapper @@ -21,26 +22,27 @@ def _polydata_from_faces(points, faces): import pyvista as pv except ModuleNotFoundError: raise ModuleNotFoundError( - "To use this functionality, install PyVista with\n\npip install pyvista" + "To use this functionality, install PyVista with:\n\npip install pyvista" ) from pyvista import ID_TYPE - - try: - from pyvista.core.utilities import numpy_to_idarr - except ModuleNotFoundError: # pragma: no cover - from pyvista.utilities.cells import numpy_to_idarr + from vtkmodules.util.numpy_support import numpy_to_vtk, vtkConstants from vtkmodules.vtkCommonDataModel import vtkCellArray if faces.ndim != 2: raise ValueError("Expected a two dimensional face array.") + if faces.dtype != ID_TYPE: + faces = faces.astype(ID_TYPE) pdata = pv.PolyData() pdata.points = points carr = vtkCellArray() offset = np.arange(0, faces.size + 1, faces.shape[1], dtype=ID_TYPE) - carr.SetData(numpy_to_idarr(offset, deep=True), numpy_to_idarr(faces, deep=True)) + carr.SetData( + numpy_to_vtk(offset, deep=False, array_type=vtkConstants.VTK_ID_TYPE), # type: ignore + numpy_to_vtk(faces.ravel(), deep=False, array_type=vtkConstants.VTK_ID_TYPE), # type: ignore + ) pdata.SetPolys(carr) return pdata From d705c785b5e9d69696d49a547cde60796ac34d8d Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Mon, 15 Jul 2024 20:52:18 -0600 Subject: [PATCH 2/2] reuse existing pyvista logic --- stl_reader/reader.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/stl_reader/reader.py b/stl_reader/reader.py index 9a470ba..845605a 100644 --- a/stl_reader/reader.py +++ b/stl_reader/reader.py @@ -25,25 +25,17 @@ def _polydata_from_faces(points, faces): "To use this functionality, install PyVista with:\n\npip install pyvista" ) - from pyvista import ID_TYPE - from vtkmodules.util.numpy_support import numpy_to_vtk, vtkConstants - from vtkmodules.vtkCommonDataModel import vtkCellArray + from pyvista import ID_TYPE, CellArray if faces.ndim != 2: raise ValueError("Expected a two dimensional face array.") - if faces.dtype != ID_TYPE: - faces = faces.astype(ID_TYPE) + # zero copy polydata creation + offset = np.arange(0, faces.size + 1, faces.shape[1], dtype=ID_TYPE) pdata = pv.PolyData() pdata.points = points + pdata.faces = CellArray.from_arrays(offset, faces) - carr = vtkCellArray() - offset = np.arange(0, faces.size + 1, faces.shape[1], dtype=ID_TYPE) - carr.SetData( - numpy_to_vtk(offset, deep=False, array_type=vtkConstants.VTK_ID_TYPE), # type: ignore - numpy_to_vtk(faces.ravel(), deep=False, array_type=vtkConstants.VTK_ID_TYPE), # type: ignore - ) - pdata.SetPolys(carr) return pdata