ヘルパー#

pyvista モジュールには,メッシュの作成と操作,またはVTKデータセットとのインターフェースを簡素化するためのいくつかの関数が含まれています.

VTKデータセットのラップ#

helpers.wrap() pyvista.DataSet | pyvista.pyvista_ndarray | None[ソース]#

与えられたVTKデータオブジェクトを適切なPyVistaデータオブジェクトにラップします.

その他,対応しているフォーマットは以下の通りです.

バージョン 0.38.0 で変更: 渡されたオブジェクトがすでにラップされたPyVistaオブジェクトである場合,これはノー・オペレーションで,そのオブジェクトを直接返します.以前のバージョンのPyVistaでは,これは浅いコピーを実行します.

パラメータ:
datasetnumpy.ndarray | trimesh.Trimesh | vtk.DataSet

ラップするデータセット.

戻り値:
pyvista.DataSet

PyVistaのラッピングデータセット.

​ランダムなポイントクラウドを表すnumpy配列をラップする.

>>> import numpy as np
>>> import pyvista as pv
>>> points = np.random.random((10, 3))
>>> cloud = pv.wrap(points)
>>> cloud
PolyData (...)
  N Cells:    10
  N Points:   10
  N Strips:   0
  X Bounds:   ...
  Y Bounds:   ...
  Z Bounds:   ...
  N Arrays:   0

​VTKオブジェクトをラップする.

>>> import pyvista as pv
>>> import vtk
>>> points = vtk.vtkPoints()
>>> p = [1.0, 2.0, 3.0]
>>> vertices = vtk.vtkCellArray()
>>> pid = points.InsertNextPoint(p)
>>> _ = vertices.InsertNextCell(1)
>>> _ = vertices.InsertCellPoint(pid)
>>> point = vtk.vtkPolyData()
>>> _ = point.SetPoints(points)
>>> _ = point.SetVerts(vertices)
>>> mesh = pv.wrap(point)
>>> mesh
PolyData (...)
  N Cells:    1
  N Points:   1
  N Strips:   0
  X Bounds:   1.000e+00, 1.000e+00
  Y Bounds:   2.000e+00, 2.000e+00
  Z Bounds:   3.000e+00, 3.000e+00
  N Arrays:   0

​Trimeshオブジェクトをラップする.

>>> import trimesh
>>> import pyvista as pv
>>> points = [[0, 0, 0], [0, 0, 1], [0, 1, 0]]
>>> faces = [[0, 1, 2]]
>>> tmesh = trimesh.Trimesh(points, faces=faces, process=False)
>>> mesh = pv.wrap(tmesh)
>>> mesh  
PolyData (0x7fc55ff27ad0)
  N Cells:  1
  N Points: 3
  X Bounds: 0.000e+00, 0.000e+00
  Y Bounds: 0.000e+00, 1.000e+00
  Z Bounds: 0.000e+00, 1.000e+00
  N Arrays: 0

単純化された3角形メッシュの作成#

points.make_tri_mesh(faces)[ソース]#

点と面の配列を使用して pyvista.PolyData メッシュを作成します.

ポイントのNx 3配列と3角形のインデックスのMx 3配列からメッシュを作成し,N個の頂点とM個の3角形を持つメッシュを作成します.この機能は,標準のVTK "padding" カラムを必要とせず,メッシュ作成を簡素化します.

パラメータ:
pointsnp.ndarray

3角形メッシュの頂点を格納する (N, 3) の形を持つポイントの配列.

facesnp.ndarray

3角形のインデックスを含みます (M, 3) の形を持つインデックスの配列.

戻り値:
pyvista.PolyData

3角形メッシュを含みますPolyDataインスタンス.

次の使用例は,単位正方形を9つの頂点と8つの面を持つ3角形メッシュに離散化します.

>>> import numpy as np
>>> import pyvista as pv
>>> points = np.array(
...     [
...         [0, 0, 0],
...         [0.5, 0, 0],
...         [1, 0, 0],
...         [0, 0.5, 0],
...         [0.5, 0.5, 0],
...         [1, 0.5, 0],
...         [0, 1, 0],
...         [0.5, 1, 0],
...         [1, 1, 0],
...     ]
... )
>>> faces = np.array(
...     [
...         [0, 1, 4],
...         [4, 7, 6],
...         [2, 5, 4],
...         [4, 5, 8],
...         [0, 4, 3],
...         [3, 4, 6],
...         [1, 2, 4],
...         [4, 8, 7],
...     ]
... )
>>> tri_mesh = pv.make_tri_mesh(points, faces)
>>> tri_mesh.plot(show_edges=True, line_width=5)
../../_images/helpers-2_00_00.png

点からの線分#

points.lines_from_points(close=False)[ソース]#

点の配列を指定して,接続された線分セットを作成します.

パラメータ:
pointsarray_like[float]

接続されたセグメントの頂点を表すポイント.たとえば,2つの線分セグメントは np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0]]) のように表されます.

closebool, default: False

True の場合,線分セグメントを閉じてループを作成します.

戻り値:
pyvista.PolyData

ラインやセルを使用したPolyData.

>>> import numpy as np
>>> import pyvista as pv
>>> points = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0]])
>>> poly = pv.lines_from_points(points)
>>> poly.plot(line_width=5)
../../_images/helpers-3_00_00.png

点からの線分セグメント#

points.line_segments_from_points()[ソース]#

点から接続されていない線分セグメントを生成します.

点が線分セグメントと偶数個の点として順序付けられる.

パラメータ:
pointsarray_like[float]

線分セグメントを表すポイント.2つの頂点が1つの線分セグメントを表すため,偶数を指定する必要があります.たとえば,2つの線分セグメントは np.array([[0, 0, 0], [1, 0, 0], [1, 0, 0], [1, 1, 0]]) のように表されます.

戻り値:
pyvista.PolyData

ラインやセルを使用したPolyData.

次の使用例は,2つの線分を直角にプロットします.

>>> import pyvista as pv
>>> import numpy as np
>>> points = np.array([[0, 0, 0], [1, 0, 0], [1, 0, 0], [1, 1, 0]])
>>> lines = pv.line_segments_from_points(points)
>>> lines.plot()
../../_images/helpers-4_00_00.png

VTKデータ型との変換#

arrays.convert_array(name=None, deep=False, array_type=None)[ソース]#

NumPy配列をvtkDataArrayに,またはその逆に変換します.

パラメータ:
arrnp.ndarray | vtkDataArray

変換する数値配列あるいはvtkDataArry.

namestr, optional

VTKのデータ配列の名前.

deepbool, default: False

入力がnumpy arrayであれば,値を深くコピーします.

array_typeint, optional

vtkType.h で指定されているVTK配列タイプのIDです.

戻り値:
vtkDataArray or numpy.ndarray

変換後の配列です. 入力が numpy.ndarray であれば vtkDataArray を返し,入力が vtkDataArray であれば NumPy の ndarray を返す.

平面を点にフィット#

points.fit_plane_to_points(return_meta=False)[ソース]#

SVDアルゴリズムを用いて,平面を点の集合にフィットさせます.

平面は,ポイントの範囲に合うように自動的にサイズと向きが調整されます.

パラメータ:
pointsarray_like[float]

平面を通過させるための [N x 3] 個の点の列の大きさ.

return_metabool, default: False

もし True ならば,生成された平面の中心と法線も返します.

戻り値:
pyvista.PolyData

平面メッシュです.

numpy.ndarray

return_meta=True の場合は平面の中心.

numpy.ndarray

return_meta=True の場合は平面の法線.

ランダムな点群に平面を当てはめます.

>>> import pyvista as pv
>>> import numpy as np
>>>
>>> # Create point cloud
>>> cloud = np.random.random((10, 3))
>>> cloud[:, 2] *= 0.1
>>>
>>> # Fit plane
>>> plane, center, normal = pv.fit_plane_to_points(
...     cloud, return_meta=True
... )
>>>
>>> # Plot the fitted plane
>>> pl = pv.Plotter()
>>> _ = pl.add_mesh(
...     plane, color='lightblue', style='wireframe', line_width=4
... )
>>> _ = pl.add_points(
...     cloud,
...     render_points_as_spheres=True,
...     color='r',
...     point_size=30,
... )
>>> pl.show()
../../_images/helpers-5_00_00.png

平面をメッシュにフィットさせます.

>>> import pyvista as pv
>>> from pyvista import examples
>>>
>>> # Create mesh
>>> mesh = examples.download_shark()
>>>
>>> # Fit plane
>>> plane = pv.fit_plane_to_points(mesh.points)
>>>
>>> # Plot the fitted plane
>>> pl = pv.Plotter()
>>> _ = pl.add_mesh(
...     plane, show_edges=True, color='lightblue', opacity=0.25
... )
>>> _ = pl.add_mesh(mesh, color='gray')
>>> pl.camera_position = [
...     (-117, 76, 235),
...     (1.69, -1.38, 0),
...     (0.189, 0.957, -0.22),
... ]
>>> pl.show()
../../_images/helpers-5_01_00.png