如何在pyvista中切割连接到低于某个值的点的顶点和面?

问题描述

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

enter image description here

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

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()

导致:

enter image description here

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

链接example .vtk

解决方法

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

只要您只有一组标量,您就可以将 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 开始基于每个标量数组进行过滤,因此这只会在没有其他标量的情况下执行您期望的操作。此外,不幸的是,似乎有 a bug in 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(在threshold中)和adjacent_cells(在extract_points中)的主要观点是只保留每个点都满足条件的单元格。

通过以上两种情况,我使用您的数据得到下图: fixed mesh: small flat surface without spurious jumps

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...