如何将Jupyter Slider-Widget链接到实时视图中的VTK对象

问题描述 投票:0回答:1

我想移动滑块,从而影响3D点的Z坐标,该点是直线的一部分。然后,我想通过以下视图在jupyter笔记本中可视化这一行-在itkwidgets库中找到的小部件。

到目前为止我提出的内容看起来像这样,但是无论我做什么,view-widget中的对象都是相同的。

import numpy as np
import vtk

from ipywidgets import widgets, interactive
from itkwidgets import view


def moveZ(zVal=0.2):
    rail_points.SetPoint(0, (x_res[0],y_res[0],zVal))
    rail.SetPoints(rail_points)
    rail.Update()
    tube.Update()
    mappers[0].Update()


rail = vtk.vtkLineSource()

rail_points = vtk.vtkPoints()
for _x, _y, _z in zip(x_res, y_res, np.linspace(1,0,len(x_res))):
    rail_points.InsertNextPoint(np.array([_x,_y,_z],dtype='float32'))

rail.SetPoints(rail_points)
rail.SetPoint1([0,0,0])
rail.SetPoint2([0,0,0])

tube = vtk.vtkTubeFilter()
tube.SetInputConnection(rail.GetOutputPort())
tube.SetVaryRadiusToVaryRadiusOff()
tube.SetRadius(0.1)

geometricObjectSources=[]

geometricObjectSources.append(tube)

mappers = []
actors = []

for i in range(len(geometricObjectSources)):
    geometricObjectSources[i].Update()

    mappers.append(vtk.vtkPolyDataMapper())
    mappers[i].SetInputConnection(geometricObjectSources[i].GetOutputPort())

    actors.append(vtk.vtkActor())
    actors[i].SetMapper(mappers[i])


viewer = view(actors=actors)

slider = interactive(moveZ, zVal=(-1, 1, 0.1))

widgets.VBox([viewer, slider])

[此外,我尝试通过滑块更改其他属性,例如管半径,球体的位置,但到目前为止没有成功。不知何故,我感觉一旦对象更新,视图窗口就不会真正更新。

谢谢!

python widget vtk
1个回答
0
投票

我不了解您的代码,但我认为您需要做的是将所谓的“观察者”回调附加到变化的滑块上您要更改的参数。这是with的屏幕截图一个滑块,可在图表小部件中更改三角形的高度:enter image description here这是设置图表的可粘贴代码

import ipywidgets as widgets
from jp_doodle import dual_canvas
from IPython.display import display

# create a triangle diagram
swatch = dual_canvas.swatch(pixels=200)
points = [[-1,-1], [0,1], [1, -1]]
triangle = swatch.polygon(points, color="red", name="triangle")
swatch.fit(margin=10)

这是创建滑块并附加更改回调的代码。

# make a slider that changes the height of the triangle
slider = widgets.FloatSlider(value=1.0, min=-1.0, max=1.0, step=0.1)
def onchange(*ignored):
    points[1][1] = slider.value  # set the tip height
    triangle.change(points=points)
slider.observe(onchange)
slider

该图是使用此处提供的jp_doodle包创建的:

https://github.com/AaronWatters/jp_doodle

在此处阅读有关“观察”回调的更多信息:

https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.