我正在尝试使用https://lorensen.github.io/VTKExamples/site/Python/Visualization/HardwareSelector/中给出的HardwareSelector.py示例 我唯一更改的部分是将“ UserInput”替换为“ MiddleButtonPressEvent”。
问题是这只能间歇性地工作。
我的目标是获取一个stl文件,并仅查找从某个角度可见的那些元素。 我正在使用python 3.7.3 64bit和vtk 8.2.0。包装在Anaconda中。
我似乎找不到有关此问题的任何信息,但尝试创建一个新的anaconda环境并遇到相同的问题。我不是一个经验丰富的程序员,所以不确定如何解决这个问题。
预期结果是交互器窗口中可见单元的列表。仅在某些时候打印。 其余时间,交互器窗口关闭,终端中没有输出。
虽然如果有人对采用更好的方法获得这些细胞有任何建议,我会对此予以解决。
这是我第一次在此处发布问题,因此,如果我错过任何重要信息,我深表歉意,并很乐意在需要时提供更多详细信息。
编辑-现在按要求附加了代码(这基本上与前面所述的示例代码相同)。
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()
答案 0 :(得分:1)
在HardwareSelector.py示例中,使用“ u”键调用selectionCallback()
因此,它会显示“可见单元格ID”,并且您的代码工作正常。没有水蟒。
在lorensen的示例中,如果鼠标光标移出示例窗口,则Hardselector可能会丢失窗口。因此,我们有“可见的单元ID:[6711651]”。但是,如果窗口最大化,一切都可以正常工作。
P.S.您的链接可能在讨论中解决了问题?
hsel.SetArea(0,0,x-1,y-1)代替hsel.SetArea(0,0,x,y)