首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python在VTK-7中进行2D Actor拾取

使用Python在VTK-7中进行2D Actor拾取
EN

Stack Overflow用户
提问于 2016-07-06 03:37:37
回答 0查看 740关注 0票数 1

我在Python中有一个简单的程序-VTK(7),它有三个2D磁盘,可以点击并移动。

为此,我创建了一个自定义的交互器样式,在该样式中,我在LeftButtonClick事件上存储所选元素,在MouseMove事件上更改先前所选元素的位置,并在LeftButtonRelease事件上将所选元素设置为None

下面是完整的VTK代码,它(理想情况下)应该做到这一点:

代码语言:javascript
复制
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中的错误吗?或者在某种程度上改变了实现?或者是其他原因?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38211381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档