1

因此,当从 Grass GIS 导出时r.out.vtk,我们会得到一个带有 -99999 点而不是空值的坏表面:

在此处输入图像描述

我想删除它们,但一个简单的剪辑是不够的:

pd = pv.read('./pid1.vtk')
pd = pd.clip((0,1,1), invert=False).extract_surface()
p.add_mesh(pd ) #add atoms to scene
p.show()

导致: 在此处输入图像描述

所以我想知道如何只保留顶部(> -999)点和连接的顶点 - 以便使用 pyvista 仅获得顶部平面(实际上是弯曲的\不是平面的)?

链接到示例 .vtk

4

1 回答 1

2

有一种简单的方法可以做到这一点,但没有...

只要您只有一组标量,您就可以使用 pyvista 的threshold过滤器:all_scalars=True

import pyvista as pv

pd = pv.read('./pid1.vtk')
pd = pd.threshold(-999, all_scalars=True)

plotter = pv.Plotter()
plotter.add_mesh(pd) #add atoms to scene

plotter.show()

由于all_scalars开始基于每个标量数组进行过滤,因此只有在没有其他标量的情况下才会执行您所期望的操作。此外,不幸的是,pyvista 中似乎存在一个错误(预计将在 0.32.0 版本中修复),这使得无法使用此关键字。

同时你可以做的(如果你不想在修复发布之前使用 pyvista 的主分支)是使用 numpy 自己阈值数据:

import pyvista as pv

pd = pv.read('./pid1.vtk')

scalars = pd.active_scalars
keep_inds = (scalars > -999).nonzero()[0]
pd = pd.extract_points(keep_inds, adjacent_cells=False)

plotter = pv.Plotter()
plotter.add_mesh(pd) #add atoms to scene

plotter.show()

all_scalars(in threshold) 和adjacent_cells(in ) 的要点extract_points是只保留每个点都满足条件的单元格。

通过以上两种方法,我使用您的数据得到下图: 固定网格:没有虚假跳跃的小平面

于 2021-07-05T00:01:44.680 回答