嵌入Mayavi时,在vtkOutputWindow中禁用或捕获VTK警告

时间:2014-05-09 20:47:41

标签: python-2.7 logging vtk enthought mayavi

我想要禁用VTK警告窗口,或者更好的是,抓住它们来处理我的应用程序的日志记录系统。我的应用程序使用的是嵌入式mayavi视图,我不希望错误窗口弹出,我无法控制。以下代码演示了警告窗口。

import numpy as np
from mayavi import mlab

x1 = np.array([1, 1, 2, 3])
y1 = np.array([1, 1, 4, 2])
z1 = np.array([1, 1, 5, 1])

mlab.plot3d(x1, y1, z1)

mlab.show()

好的,我做了一些研究,发现vtk.vtkObject.GlobalWarningDisplayOff()会完全禁用窗口,这很好。更好的是,以下代码会将警告记录到文件中(找到它here):

def redirect_vtk_messages ():
    """ Can be used to redirect VTK related error messages to a
    file."""
    import tempfile
    tempfile.template = 'vtk-err'
    f = tempfile.mktemp('.log')
    log = vtkpython.vtkFileOutputWindow()
    log.SetFlush(1)
    log.SetFileName(f)
    log.SetInstance(log)

所以虽然这很好,但我仍然无法将警告直接传递给日志记录处理程序。我宁愿不必在常规日志文件旁边有一个vtk_log文件。此外,我可能想以某种方式处理我的GUI中的警告,或者让用户选择如何处理它们,并且不断观察日志文件的变化似乎是一种糟糕的方式。

关于在嵌入mayavi / vtk的应用程序中处理vtk警告的强大pythonic方法的任何建议?

4 个答案:

答案 0 :(得分:4)

我想这部分回答了你的问题,但你可以在python中实现一个错误观察器​​,如http://public.kitware.com/pipermail/vtkusers/2012-June/074703.html所述,并将它添加到你感兴趣的vtk类中。

在c ++中,我发现将输出重定向到stderr要简单得多(这个例子适用于windows):

vtkSmartPointer<vtkWin32OutputWindow> myOutputWindow = vtkSmartPointer<vtkWin32OutputWindow>::New(); 
myOutputWindow->SetSendToStdErr(true);
vtkOutputWindow::SetInstance(myOutputWindow);

在python中我试过

ow = vtk.vtkOutputWindow()
ow.SendToStdErrOn()

它将错误发送到控制台,但我仍然看到vtk窗口,它似乎并没有抓住错误。

另一种选择可能是在关闭VTK_USE_DISPLAY(http://osdir.com/ml/python-enthought-devel/2009-11/msg00164.html)的情况下重新编译vtk。我不会尝试这个,因为我正在使用已在paraview

中编译的vtk发行版

答案 1 :(得分:3)

我不知道这是否适用于Mayavi环境,但这适用于包装到VTK的Python包装

{{1}}

答案 2 :(得分:1)

您可以创建一个派生自vtkOutputWindow的子类,并在方法void DisplayText(const char* someText)中实现您的消息处理。我这样做是在redirect all output to cerr的C ++项目中,甚至禁止特定的警告。

答案 3 :(得分:0)

我发现一种与@SciCompLover的答案类似的方法,该方法在显示到控制台的同时抑制输出窗口:

import vtk
vtk_out = vtk.vtkOutputWindow()
vtk_out.SetInstance(vtk_out)

在Windows和MacOS的Mayavi 4.7.1和VTK 8.2.0上进行了测试。