嗨,最近,我将 Mayavi 从 4.4.4 更新到 4.5.0。 更新后,我在使用mlab
函数axes()
时观察到异常。 这是一个测试代码(导致错误的行由注释指示):
from mayavi import mlab
from numpy import pi, sin, cos, mgrid
dphi, dtheta = pi/250.0, pi/250.0
[phi,theta] = mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta]
m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4;
r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
x = r*sin(phi)*cos(theta)
y = r*cos(phi)
z = r*sin(phi)*sin(theta)
s = mlab.mesh(x, y, z)
mlab.axes(color=(0.9,0.9,0.9)) # LINE CAUSING ERROR
mlab.show()
在 Windows 和 anaconda 环境中运行上述代码时,我看到以下错误消息:
弹出消息(框):
Exception
In c:\anaconda\lib\site-packages\mayavi-4.5.0-py2.7-win-amd64.egg\tvtk\tvtk_base.py:569
TypeError: SetInputData argument 1:method requires a vtkDataSet, a vtkPolyDataNormals was provided. (in _wrap_call)
控制台窗口中的消息:
No handlers could be found for logger "mayavi.core.common"
Exception occurred in traits notification handler.
Please check the log file for details.
Exception occurred in traits notification handler for object: <mayavi.tools.decorations.Axes object at 0x0000000011AC00A0>, trait: extent, old value: [0 0 0 0 0 0], new value: [-1.53801118 1.53801118 -2. 2.27326963 -1.53801118 1.53801118]
Traceback (most recent call last):
File "C:\Anaconda\lib\site-packages\traits\trait_notifiers.py", line 340, in __call__
self.handler( *args )
File "C:\Anaconda\lib\site-packages\mayavi-4.5.0-py2.7-win-amd64.egg\mayavi\tools\decorations.py", line 373, in _extent_changed
axes.module_manager.source.outputs[0].bounds
AttributeError: 'PolyDataNormals' object has no attribute 'bounds'
额外的信息
上述异常发生的环境
操作系统:Windows 10
Python安装:使用Anaconda安装Python 2.7
Mayavi 软件包:mayavi 4.5.0 py27_0 menpo
VTK 包:vtk 7.0.0 py27_0 menpo
PyQt 包:pyqt 5.6.0 py27_1
以上代码运行环境OK
操作系统:Windows 7
Python 安装:使用 Anaconda 安装 Python 2.7
Mayavi 软件包:mayavi 4.4.4 py27_0 menpo
VTK 包:vtk 7.0.0 py27_0 menpo
PyQt 包:pyqt 4.11.4 py27_5
对于它的价值,我只是在以下条件下复制了这个错误:
操作系统:Windows 10
Python 安装:使用 Anaconda 安装 Python 2.7
Mayavi 软件包:mayavi 4.5.0 py27_0
VTK 包:vtk 6.3.0 py27_1
PyQt 包:pyqt 4.11.4 py27_4
如果我使用conda install mayavi=4.4
降级 * 代码有效
Mayavi -> 4.4.0
VTK -> 5.10.1
*不相关的说明 - 这将 numpy 从 1.10 降级到 1.9.3,这会破坏 Spyder,因此您必须手动重新升级它
我在这里也有同样的问题。 没有人有线索吗?
如果仍然有任何兴趣,使用与 Jeitan 类似的配置,我只是遇到了同样的错误,并通过在 update_pipeline 中编辑 mayavi\modules\axes.py 来消除它,更改:
self.configure_input_data(self.axes, src.outputs[0])
到:
self.configure_input_data(self.axes, src.outputs[0].output)
(前者是 PolyDataNormals 类型,后者是 PolyData,它派生自 DataSet。)
我也遇到了这个问题。
@jdonegan您的建议解决了我的问题:+1
我也遇到了这个问题, @jdonegan的修复效果很好。 本来打算提交 PR,但看起来@prabhuramachandran已经推送了一个修复此问题的提交,而是将有问题的行替换为:
self.configure_input(self.axes, src.outputs[0])
也许这个问题应该关闭以防止混淆?
同样,同样的问题和类似的修复应该应用到decorations.py 中的第 373 行:
轴.轴.范围= \
axis.module_manager.source.outputs[0].output.bounds
解决错误
“AttributeError: 'PolyDataNormals' 对象没有属性 'bounds'”
所以我相信 commit 996fb25 只解决了部分问题。
正如@TinghuiWang 所指出的,这需要在多个地方修复。 但是,根据您的绘图调用(对我而言,它是 plot3d 与 points3d),您可能需要将其改回。 我将其修复如下:
在mayavi\modules\axes.py
173 行的
self.configure_input_data(self.axes, src.outputs[0])
到
data = src.outputs[0] if not hasattr(src.outputs[0], 'output') else src.outputs[0].output
self.configure_input_data(self.axes, data)
同样在\mayavi\tools\decorations.py
372 行的
axes.axes.ranges = axes.module_manager.source.outputs[0].bounds
到
src = axes.module_manager.source
data = src.outputs[0] if not hasattr(src.outputs[0], 'output') else src.outputs[0].output
axes.axes.ranges = data.bounds
请修复它伙计们。 真正需要轴。
按照上面的方法,我只解决了一部分问题,我仍然有异常:
Exception occurred in traits notification handler for object: <mayavi.tools.decorations.Axes object at 0x11a41ce60>, trait: extent, old value: [0 0 0 0 0 0], new value: [ -2. 17. -2. 17. -4.85316642
6.54683358]
NoneType: None
并且图像上没有轴标签。
任何人都可以帮忙吗? 谢谢!
最有用的评论
如果仍然有任何兴趣,使用与 Jeitan 类似的配置,我只是遇到了同样的错误,并通过在 update_pipeline 中编辑 mayavi\modules\axes.py 来消除它,更改:
self.configure_input_data(self.axes, src.outputs[0])
到:
self.configure_input_data(self.axes, src.outputs[0].output)
(前者是 PolyDataNormals 类型,后者是 PolyData,它派生自 DataSet。)