如何在live view中将Jupyter SliderWidget链接到VTK对象

2024-05-29 11:01:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想移动一个滑块,从而影响作为直线一部分的3D点的Z坐标。然后,我想通过itkwidgets库中的view-widget在jupyter笔记本中可视化这一行

到目前为止,我提出的是这样的,但无论我做什么,视图中的对象小部件都是一样的

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])

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

谢谢


Tags: importviewnpactorsupdaterespoints滑块
1条回答
网友
1楼 · 发布于 2024-05-29 11:01:36

我不明白你的代码,但我认为你需要做的是 将一个所谓的“观察者”回调附加到一个可更改的滑块 要更改的参数。下面是一个带有 在图表小部件中更改三角形高度的滑块: 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

希望有帮助

相关问题 更多 >

    热门问题