2014-05-09 9 views
5

Vorrei disabilitare la finestra di avviso VTK o, meglio ancora, prenderli per gestire il sistema di registrazione dell'applicazione. La mia applicazione utilizza una visualizzazione mayavi incorporata e non voglio che si verifichi l'errore di Windows che non ho controllo. Il seguente codice mostra la finestra di avviso.Disabilita o Catch avvisi VTK in vtkOutputWindow durante l'incorporamento di 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, ho fatto qualche ricerca e ha scoperto che vtk.vtkObject.GlobalWarningDisplayOff() disabiliterà la finestra completamente, che è bello. Meglio ancora il followingcode registrerà gli avvisi in un file (trovato 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) 

Così, mentre questo è bello, io sono ancora in grado di tubo gli avvertimenti direttamente in un gestore di registrazione. Preferirei non avere un file vtk_log accanto ai miei normali file di registro. Potrei anche voler gestire gli avvertimenti nella mia GUI in qualche modo, o dare all'utente le opzioni su come gestirli e guardare costantemente un file di log per le modifiche sembra un modo scadente per farlo.

Qualche suggerimento su un robusto modo pythonic per gestire gli avvisi vtk in un'applicazione che incorpora mayavi/vtk?

+0

non ho idea di come fare questo. Ma se vieni con un trucco per fare qualcosa di carino, lo userei. – aestrivex

risposta

4

Immagino che questo risponda parzialmente alla tua domanda, ma potresti implementare un osservatore di errori in python come spiegato qui http://public.kitware.com/pipermail/vtkusers/2012-June/074703.html e aggiungerlo alla classe vtk che ti interessa.

in C++ trovo molto più semplice per reindirizzare l'output a stderr (questo esempio è per Windows):

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

in Python ho cercato

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

invia l'errore di consolarla, ma Vedo ancora la finestra di VTK e non sembra proprio in grado di catturare gli errori.

Un'altra opzione potrebbe essere la ricompilazione di vtk con VTK_USE_DISPLAY disattivato (http://osdir.com/ml/python-enthought-devel/2009-11/msg00164.html). Non ho intenzione di provare questo perché sto usando la distribuzione vtk già compilata in paraview

+0

L'osservatore di errori python nel collegamento sembra essere la soluzione più naturale a questo problema e menziona anche l'avvertenza che, se questo fosse implementato su tutti gli oggetti VTK per impostazione predefinita, sarebbero diventati ancora più ingombranti in termini di memoria ed elaborazione. Nonostante ciò, l'autore menziona addirittura che questa tecnica potrebbe portare a una sostituzione pura di python di vtkOutputWindow o almeno a propagare errori VTK in Python RuntimeErrors. Non ho tempo di esplorarlo ora e sto cercando di lasciare Mayavi per passare a python 3, ma lo contrassegnerò correttamente. Grazie! – flutefreak7

1

È possibile creare una sottoclasse derivante da vtkOutputWindow e implementare la gestione dei messaggi nel metodo void DisplayText(const char* someText). Ho fatto questo è in un progetto C++ a redirect all output to cerr e persino sopprimere avvisi specifici.

-1

Non so se questo funzionerà in ambiente Mayavi, ma questo funziona per confezioni Python per VTK

# pipe vtk output errors to file 
errOut = vtk.vtkFileOutputWindow() 
errOut.SetFileName("VTK Error Out.txt") 
vtkStdErrOut = vtk.vtkOutputWindow() 
vtkStdErrOut.SetInstance(errOut) 
Problemi correlati