Как связать виджет-слайдер Jupyter с объектом VTK в режиме реального времени - PullRequest
0 голосов
/ 21 февраля 2020

Я хотел бы переместить ползунок и, таким образом, повлиять на Z-координату 3D-точки, которая является частью линии. Затем эту строку я хочу визуализировать в блокноте jupyter через вид - виджет, найденный в библиотеке itkwidgets.

То, что я до сих пор придумал, выглядит следующим образом, но независимо от того, что я делаю, объект в представлении - виджет такой же.

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

Кроме того, я попытался изменить другие свойства с помощью ползунка, такие как радиус трубки, положение сферы, но пока безуспешно. Почему-то у меня такое ощущение, что окно обзора не обновляется после обновления объектов.

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2020

Я не понимаю ваш код, но я думаю, что вам нужно сделать, это прикрепить так называемый обратный вызов "наблюдателя" к ползунку, который изменяет параметр, который вы хотите изменить. Вот снимок экрана с ползунком, который изменяет высоту треугольника в виджете диаграммы: 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

Надеюсь, это поможет!

...