Я пытаюсь использовать пример HardwareSelector.py, приведенный в https://lorensen.github.io/VTKExamples/site/Python/Visualization/HardwareSelector/
Единственная часть, которую я изменил, - это заменить «UserInput» на «MiddleButtonPressEvent».
Проблема в том, что это работает только периодически.
Моя цель - взять файл stl и найти только те элементы, которые видны с определенной точки зрения.
Я использую Python 3.7.3 64bit и VTK 8.2.0. упаковано в Анаконде.
Я не могу найти какую-либо информацию по этой проблеме, но попытался создать новую среду анаконды и получить ту же проблему. Я не опытный программист, поэтому не уверен, что попытаться решить эту проблему.
Ожидаемый результат - список видимых ячеек в окне интерактора. Это только иногда печатается.
В остальное время окно интерактора закрывается, и в терминале нет вывода.
В идеале это было бы решено, хотя если бы у кого-нибудь были какие-либо предложения относительно лучшего способа получения этих ячеек, я был бы признателен за это.
Я впервые публикую здесь вопрос, поэтому я прошу прощения, если я пропустил какую-либо важную информацию, и был бы рад предоставить дополнительную информацию, если / когда потребуется.
edit - код теперь присоединен в соответствии с запросом (это в основном то же самое, что и пример кода, как указано ранее).
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()