You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用新标量更新PyVista网格数据后绘图无法正常刷新问题求助

问题原因
  • 预先生成的四个切片是初始网格的独立副本,原始网格标量更新不会同步到已生成的切片数据
  • 原代码update函数中使用time.sleep(1)会阻塞Qt事件循环,导致界面无法正常刷新
  • plotter.update_scalars仅更新了原始网格的标量,界面实际渲染的是切片对象,因此看不到更新效果
修复后可正常运行的代码
import pyvista as pv
import pyvistaqt as pvqt
import numpy as np

cmap='viridis'    
nx,ny,nz = 60, 40, 42
nc = nx*ny*nz

np.random.seed(0)
inidata = np.random.randint(1, 100, nc)

# 生成用于更新的随机数据
data = [np.random.randint(1, 1000, nc), 
        np.random.randint(1, 10000, nc),
        np.random.randint(1, 100000, nc),
        np.random.randint(1, 1000000, nc)]

gridata = np.ones((nx,ny,nz))

mesh = pv.UniformGrid()
mesh.dimensions = np.array(gridata.shape) + 1 

mesh.origin = (0, 0, 0)  # 数据集的左下角坐标
mesh.spacing = (30, 30, 2.5)  # 各轴方向的单元格尺寸

mesh.cell_arrays["Data"] = inidata

plotter = pvqt.BackgroundPlotter()

# 存储切片actor用于后续更新
slice_actors = []
# 添加初始切片
for normal in ['x', 'y', 'z', [1,1,0]]:
    slc = mesh.slice(normal=normal)
    actor = plotter.add_mesh(slc, cmap=cmap)
    slice_actors.append(actor)

# 添加网格轮廓
plotter.add_mesh(mesh.outline(), color="k")

# 更新索引计数器
update_counter = 0

def update():
    global update_counter
    current_data = data[update_counter % len(data)]
    update_counter += 1
    # 更新原始网格标量
    mesh.cell_arrays["Data"] = current_data
    # 逐个更新切片数据
    for idx, normal in enumerate(['x', 'y', 'z', [1,1,0]]):
        new_slice = mesh.slice(normal=normal)
        slice_actors[idx].mapper.SetInputDataObject(new_slice)
    # 刷新界面
    plotter.update()

# 每1000毫秒触发一次更新,对应1秒间隔
plotter.add_callback(update, interval=1000)

内容的提问来源于stack exchange,提问作者Red Sparrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:00:02