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)
我正在尝试使用在 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)