Проблемы с примером vtk HardwareSelector.py - работает только с перебоями - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь использовать пример 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()

1 Ответ

1 голос
/ 05 июля 2019

В примере HardwareSelector.py используйте клавишу «u» для вызова selectionCallback (), чтобы он печатал «Идентификаторы видимой ячейки», и ваш код работает нормально.Без анаконды.В примере с Лоренсеном Hardselector может потерять окно, если курсор мыши находится вне окна примера.Итак, у нас есть «Идентификаторы видимых ячеек: [6711651]».Но все работает нормально, если окно развернуто.PS Может проблема в обсуждении решена с вашей ссылки?hsel.SetArea (0, 0, x-1, y-1) вместо hsel.SetArea (0, 0, x, y)

...