vtk HardwareSelector.py 示例的问题 - 只能间歇性工作

Problems with vtk HardwareSelector.py example - Only works intermittently

我正在尝试使用在 https://kitware.github.io/vtk-examples/site/Python/Visualization/HardwareSelector/ 中给出的 HardwareSelector.py 示例 我唯一更改的部分是将“UserInput”替换为“MiddleButtonPressEvent”。

问题是这只能间歇性地工作。

我的目标是获取一个 stl 文件并仅找到从特定视角可见的那些元素。 我正在使用 python 3.7.3 64 位和 vtk 8.2.0。打包在 Anaconda 中。

我似乎找不到关于这个问题的任何信息,但我尝试创建一个新的 anaconda 环境并遇到同样的问题。我不是一个经验丰富的程序员,所以我不确定要尝试解决这个问题。

预期结果是交互器中可见单元格的列表window。这只是有时打印。 其余时间,交互器 window 关闭并且终端中没有输出。

理想情况下,这会得到解决,但如果有人对获得这些细胞的更好方法有任何建议,我将不胜感激。

这是我第一次在这里发布问题,如果我遗漏了任何重要信息,我深表歉意,并且很乐意提供 if/when 要求的更多详细信息。

编辑 - 现在已按要求附上代码(这与前面所述的示例代码基本相同)。

from __future__ import print_function

import vtk
import vtk.util.numpy_support as VN

# Callback for when selection is changed

# This is global - fix later.
ren1 = vtk.vtkRenderer()


def selectionCallback(caller, eventId):
    hsel = vtk.vtkHardwareSelector()
    hsel.SetFieldAssociation(vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS)
    hsel.SetRenderer(ren1)

    x, y = caller.GetRenderWindow().GetSize()

    # Create a small area around clicked point for selector area
    hsel.SetArea(0, 0, x, y)
    res = hsel.Select()

    numNodes = res.GetNumberOfNodes()
    if (numNodes < 1):
        print("No visible cells")
    else:
        sel_node = res.GetNode(0)
        print('Visible cell IDs: ', VN.vtk_to_numpy(sel_node.GetSelectionList()).tolist())


def main():
    colors = vtk.vtkNamedColors()

    sphere = vtk.vtkSphereSource()
    sphere.SetCenter(0, 0, 0)
    sphere.SetRadius(5.0)

    sphereMapper = vtk.vtkPolyDataMapper()
    sphereMapper.SetInputConnection(sphere.GetOutputPort())

    sphereActor = vtk.vtkActor()
    sphereActor.SetMapper(sphereMapper)
    sphereActor.GetProperty().SetColor(colors.GetColor3d('Bisque'))

    ren1.AddActor(sphereActor)
    ren1.SetBackground(0.1, 0.2, 0.4)
    ren1.GetActiveCamera().ParallelProjectionOn()
    ren1.SetBackground(colors.GetColor3d('Navy'))

    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren1)    
    renWin.SetSize(300, 300)
    renWin.Render()

    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    iren.AddObserver('LeftButtonPressEvent', selectionCallback)

    style = vtk.vtkInteractorStyleTrackballCamera()
    iren.SetInteractorStyle(style)
    renWin.GetInteractor().SetInteractorStyle(style)

    ren1.ResetCamera()
    renWin.Render()

    iren.Initialize()
    iren.Start()


if __name__ == '__main__':
    main()

在 HardwareSelector.py 示例中使用 "u" 键调用 selectionCallback() 所以它打印 "Visible cell IDs" 并且你的代码工作正常。没有蟒蛇。 在 lorensen 的示例中,如果鼠标光标超出示例的 window,Hardselector 可能会丢失 window。所以我们有 "Visible cell IDs: [6711651]"。但如果 window 最大化,一切正常。
P.S。问题可能在您的讨论中得到解决 link?
hsel.SetArea(0, 0, x-1, y-1) 而不是 hsel.SetArea(0, 0, x, y)