如何创建多个 vtkContourWidget 实例

How to create many instances of vtkContourWidget

我希望能够创建许多 vtkContourWidget 实例,让用户绘制线条并操纵节点,但我似乎做得不对。

代码如下:

import vtk

def main():

    # Create a renderer, render window, and interactor
    renderer = vtk.vtkRenderer()
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.AddRenderer(renderer)

    Interactor = vtk.vtkRenderWindowInteractor()
    Interactor.SetRenderWindow(renderWindow)

    style = vtk.vtkInteractorStyleTerrain()
    Interactor.SetInteractorStyle(style)

    Interactor.AddObserver("KeyPressEvent", keyPressEvent)

    # Render and interact
    renderWindow.Render()
    Interactor.Start()

def keyPressEvent(obj, event):

    key = obj.GetKeySym()

    if key == 'n':
        contourRep = vtk.vtkOrientedGlyphContourRepresentation()

        contourWidget = vtk.vtkContourWidget()
        contourWidget.SetInteractor(obj)
        contourWidget.SetRepresentation(contourRep)
        contourWidget.On()

        #contourWidget.SetEnabled()
        obj.Start()

    return

main()

这样几乎可以正常工作,问题是,当我想关闭应用程序 window 时,我必须多次单击按钮才能关闭 window。我必须为每个创建的 vtkContourWidget 单击一次。

似乎每次我调用函数 keyPressEvent 并创建一个 vtkContourWidget 时,obj.Start()(与 Interactor.Start() 相同)行实例化了另一个实例申请?

我也尝试过 contourWidget.SetEnabled()obj.Start() 被注释掉),它可以创建 vtkContourWidget 的新实例,但是当我尝试关闭应用程序时 window,应用程序冻结。

在代码上同时使用obj.Start()contourWidget.SetEnabled(),我可以创建很多实例,但每次创建新实例时,之前的实例都会消失。

我认为this topic可能有解决方案,但我不知道如何实施。

只需复制粘贴您的代码,然后 运行 使用 VTK 6.3 在 Ubuntu 16.04 上似乎可以正常工作。 window 使用关闭按钮或 "q".

按预期关闭

所以这似乎是一个与您在系统上使用的 VTK 版本相关的错误。

亲切的问候。