2014-05-09 13 views
5

Tôi muốn vô hiệu hóa cửa sổ cảnh báo VTK hoặc, tốt hơn, hãy bắt chúng xử lý bằng hệ thống ghi nhật ký của ứng dụng của tôi. Ứng dụng của tôi đang sử dụng chế độ xem được nhúng trong chế độ xem itavi và tôi không muốn cửa sổ lỗi xuất hiện mà tôi không có quyền kiểm soát. Đoạn mã sau thể hiện cửa sổ cảnh báo.Tắt hoặc bắt cảnh báo VTK trong vtkOutputWindow khi nhúng 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() 

Ok, tôi đã thực hiện một số nghiên cứu và phát hiện ra rằng vtk.vtkObject.GlobalWarningDisplayOff() sẽ tắt hoàn toàn cửa sổ, điều này thật tuyệt. Hơn thế nữa các followingcode sẽ đăng những lời cảnh báo đến một tập tin (tìm thấy nó 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) 

Vì vậy, trong khi đây là tốt đẹp, tôi vẫn không thể ống các cảnh báo trực tiếp vào một handler khai thác gỗ. Tôi không muốn có tệp vtk_log bên cạnh tệp nhật ký thông thường của mình. Ngoài ra tôi có thể muốn xử lý các cảnh báo trong GUI của tôi bằng cách nào đó, hoặc cung cấp cho người dùng các tùy chọn về cách xử lý chúng và liên tục xem một tệp nhật ký để thay đổi có vẻ như một cách kém để làm điều đó.

Bất kỳ đề xuất nào về cách thức mạnh mẽ để xử lý cảnh báo vtk trong ứng dụng nhúng mayavi/vtk?

+0

Tôi không có ý tưởng làm thế nào để làm điều này. Nhưng nếu bạn bắt đầu với một hack để làm điều gì đó tốt đẹp, tôi sẽ sử dụng nó. – aestrivex

Trả lời

4

Tôi đoán điều này trả lời một phần câu hỏi của bạn, nhưng bạn có thể triển khai trình theo dõi lỗi trong python như được giải thích tại đây http://public.kitware.com/pipermail/vtkusers/2012-June/074703.html và thêm nó vào lớp vtk bạn quan tâm.

Trong C++ Tôi thấy đơn giản hơn nhiều để chuyển hướng đầu ra để stderr (ví dụ này là cho các cửa sổ):

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

Trong python Tôi cố gắng

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

nó sẽ gửi các lỗi để an ủi, nhưng Tôi vẫn thấy cửa sổ vtk và nó không thực sự có vẻ bắt lỗi.

Tùy chọn khác có thể là để biên dịch lại vtk với VTK_USE_DISPLAY bị tắt (http://osdir.com/ml/python-enthought-devel/2009-11/msg00164.html). Tôi sẽ không thử điều này vì tôi đang sử dụng phân phối vtk đã được biên soạn trong paraview

+0

Người quan sát lỗi python trong liên kết dường như là giải pháp tự nhiên nhất cho vấn đề này và cũng đề cập đến báo trước rằng nếu điều này được thực hiện trên tất cả các đối tượng VTK, mặc định chúng sẽ trở nên cồng kềnh hơn về bộ nhớ và chi phí xử lý. Mặc dù điều này tác giả thậm chí đề cập rằng kỹ thuật này có thể dẫn đến một sự thay thế python tinh khiết của vtkOutputWindow hoặc ít nhất là truyền các lỗi VTK vào Python RuntimeErrors. Tôi không có thời gian để khám phá điều này ngay bây giờ và tôi đang cố gắng rời Mayavi để chuyển sang python 3, nhưng tôi sẽ đánh dấu điều này đúng. Cảm ơn! – flutefreak7

1

Bạn có thể tạo một phân lớp bắt nguồn từ vtkOutputWindow và triển khai xử lý tin nhắn của bạn theo phương thức void DisplayText(const char* someText). Tôi đã làm điều này là trong một dự án C + + để redirect all output to cerr và thậm chí ngăn chặn các cảnh báo cụ thể.

-1

Tôi không biết liệu điều này sẽ làm việc trong môi trường Mayavi, nhưng hoạt động này cho bao bì Python để VTK

# pipe vtk output errors to file 
errOut = vtk.vtkFileOutputWindow() 
errOut.SetFileName("VTK Error Out.txt") 
vtkStdErrOut = vtk.vtkOutputWindow() 
vtkStdErrOut.SetInstance(errOut) 
Các vấn đề liên quan