Mayavi: mlab.axes()๋Š” Mayavi 4.5.0์—์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 01์›” 06์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: enthought/mayavi

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— 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 ๋ฐ aconda ํ™˜๊ฒฝ์—์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํŒ์—… ๋ฉ”์‹œ์ง€(์ƒ์ž):

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'

์ถ”๊ฐ€ ์ •๋ณด

์œ„์˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ™˜๊ฒฝ
์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 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

์œ„ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ
์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ์ „ํžˆ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด 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 ์œ ํ˜•์ด๊ณ  ํ›„์ž๋Š” DataSet์—์„œ ํŒŒ์ƒ๋œ PolyData์ž…๋‹ˆ๋‹ค.)

๋ชจ๋“  9 ๋Œ“๊ธ€

๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์กฐ๊ฑด์—์„œ ์ด ์˜ค๋ฅ˜๋ฅผ ๋ณต์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 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 ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด * ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์•ผ๋น„ -> 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 ์œ ํ˜•์ด๊ณ  ํ›„์ž๋Š” DataSet์—์„œ ํŒŒ์ƒ๋œ PolyData์ž…๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๋˜ํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๋‹ค.

@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' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค."

๋”ฐ๋ผ์„œ ์ปค๋ฐ‹ 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์—์„œ ๋‚˜๋Š” canged

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

์ด๋ฏธ์ง€์— ์ถ• ๋ ˆ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰