簡體   English   中英

使用Python在VTK-7中挑選2D演員

[英]2D Actor Picking in VTK-7 with Python

我在Python-VTK(7)中有一個簡單的程序,它有三個2D的磁盤,可以點擊和移動。

我通過制作自定義交互器樣式來實現這一點,在該樣式中,我將所選元素存儲在LeftButtonClick事件上,在MouseMove事件上更改先前所選元素的位置,並在LeftButtonRelease事件LeftButtonRelease所選元素設置為None

這是完整的VTK代碼(理想情況下)應該這樣做:

import vtk

class CustomInteractor(vtk.vtkInteractorStyleTrackballCamera):

    def __init__(self, renderer, renWin):
        self.AddObserver('LeftButtonPressEvent', self.OnLeftButtonDown)
        self.AddObserver('LeftButtonReleaseEvent', self.OnLeftButtonRelease)
        self.AddObserver('MouseMoveEvent', self.OnMouseMove)

        self.renderer = renderer
        self.chosenPiece = None
        self.renWin = renWin

    def OnLeftButtonRelease(self, obj, eventType):
        self.chosenPiece = None
        vtk.vtkInteractorStyleTrackballCamera.OnLeftButtonUp(self)

    def OnLeftButtonDown(self, obj, eventType):
        clickPos = self.GetInteractor().GetEventPosition()

        picker = vtk.vtkPropPicker()
        picker.Pick(clickPos[0], clickPos[1], 0, self.renderer)
        actor = picker.GetActor2D()

        self.chosenPiece = actor

        vtk.vtkInteractorStyleTrackballCamera.OnLeftButtonDown(self)

    def OnMouseMove(self, obj, eventType):
        if self.chosenPiece is not None:

            mousePos = self.GetInteractor().GetEventPosition()

            self.chosenPiece.SetPosition(mousePos[0], mousePos[1])

            self.renWin.Render()
        else :
            vtk.vtkInteractorStyleTrackballCamera.OnMouseMove(self)


def buildDiskActor(inner_radius = 10, outer_radius = 20, position = (100, 20), color = (1, 1, 1)):
    disk = vtk.vtkDiskSource()
    disk.SetInnerRadius(inner_radius)
    disk.SetOuterRadius(outer_radius)
    disk.SetRadialResolution(100)
    disk.SetCircumferentialResolution(100)
    disk.Update()

    mapper = vtk.vtkPolyDataMapper2D()
    mapper.SetInputConnection(disk.GetOutputPort())

    actor = vtk.vtkActor2D()
    actor.SetMapper(mapper)

    actor.SetPosition(position[0], position[1])

    actor.GetProperty().SetColor(color)

    return actor

ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.SetSize(600, 600)

elements = [
    buildDiskActor(position = (200, 400), color=(1, 0, 0)),
    buildDiskActor(position = (400, 400), color=(0, 1, 0)),
    buildDiskActor(position = (300, 200), color=(0, 0, 1)),
]

for actor in elements:
    ren.AddActor(actor)

iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
inStyle = CustomInteractor(ren, renWin)
iren.SetInteractorStyle(inStyle)

renWin.Render()
iren.Start()

結果如下:

在此輸入圖像描述

即,無論我選擇哪個磁盤, vtkPropPicker只選擇綠色磁盤。

出於某種原因,當我使用Python2-VTK6.3.0而不是Python3-VTK7時,事情按預期工作。 這是VTK7中的錯誤嗎? 或者實施是否以某種方式改變了? 或者是別的什么?

VTK 7切換到新的渲染后端。 在7.0中,渲染后端有一個選擇2D actor的錯誤。

該錯誤在7.1中修復; Kitware / VTK @ 5559c11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM