在traits脚本中更改mlab quiver3d和surf数据源而不清除图形

1 投票
1 回答
1886 浏览
提问于 2025-04-18 08:27

我有一个使用Traits和Mayavi的脚本,它可以展示一个mlab场景和几个属性编辑器。这些编辑器会影响在surfacequiver3d和图例(标量LUT管理器)中显示的数据,通过调用我的绘图方法来实现。每次更改都会导致清空图形并重新绘制。

Mlab交互对话框示例中我学到,plot3d*使用mlab_source.set来更改数据,而不需要清空图形和重新绘制。在update_plot()中:

if self.plot is None:
    self.plot = self.scene.mlab.plot3d(x, y, z, t, tube_radius=0.025, colormap='Spectral')
else:
    self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)

我的surfacequiver3d调用返回的是mayavi.modules.surface.Surfacemayavi.modules.vectors.Vectors对象。Surface和LUTManager报告没有mlab_source: AttributeError: 'Surface'/'LUTManager' object has no attribute 'mlab_source'。而Quiver3d报告的是mayavi.tools.sources.MGlyphSource

1) 我该如何更改我的surfacescalar LUTManager中的数据/源?

2) 我该如何正确更改quiver的数据/源?

当我尝试更改quiver的值时,出现了TraitError: Cannot set the undefined 'u' attribute of a 'Vectors' object.这个让我很困惑,因为我使用了六个值的初始化器

if self.quiver is None:
    self.quiver = self.scene.mlab.quiver3d(xyz[:,0], xyz[:,1], xyz[:,2],
        velocity[:,0], velocity[:,1], velocity[:,2], 
        figure=self.scene.mayavi_scene, scale_factor = self.scale)
else:
    self.quiver.mlab_source.set(x = xyz[:,0], y = xyz[:,1], z = xyz[:,2],
            u = velocity[:,0], v = velocity[:,1], w = velocity[:,2])

在这个示例中,plot3d返回一个mayavi.modules.surface.Surface,它的mlab_source对象是mayavi.tools.sources.MLineSource。在文档中搜索MLineSource没有结果,但在外部找到的Enthought工具套件3.2的结果。工具套件的文档是最新的吗?

*self.plot、self.surface和self.quiver被声明为variable = Instance(PipelineBase)PipelineBase是从mayavi.core.api导入的。

1 个回答

2

根据你的评论:

之所以在 surface 中没有提到 mlab 源,是因为根本没有 mlab 源。你的模块只是一个原始的 vtk 源,mayavi 可以很高兴地直接渲染这个源。不过,你保留了对 PolyData 的引用,所以你可以从中编辑标量值。(你也可以使用 mlab.triangular_mesh,这很可能能满足你的需求,同时引入一个 TriangularMeshSource 来控制 vtk PolyData)。

你可以通过 surface.module_manager.scalar_lut_manager 来访问 LUT。

而且你应该也能获取到 mlab 级别的向量源,正如评论中提到的那样。如果还有问题,我不太清楚是什么原因。使用 traitsui 应该不会有影响——问题可能是 mayavi 和你的对象模型之间的冲突。试着把你的 mayavi 对象的特性类型设置为 Any

撰写回答