使用新标量更新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
相关产品推荐
相关产品推荐

