My intention is to click between different sources. Usually it works for first few clicks, but then breaks.
Minimal example here
source_data.py
import vtk
class SourceData:
def __init__(self):
self.blocks = {}
self.blocks["sphere"] = self._create_sphere()
self.blocks["cylinder"] = self._create_cylinder()
def _create_sphere(self):
sphere_source = vtk.vtkSphereSource()
sphere_source.SetCenter(0.0, 0.0, 0.0);
sphere_source.SetRadius(5.0);
sphere_source.Update()
append_filter = vtk.vtkAppendFilter()
append_filter.AddInputData(sphere_source.GetOutput())
append_filter.Update()
ugrid = vtk.vtkUnstructuredGrid()
ugrid.ShallowCopy(append_filter.GetOutput())
return ugrid
def _create_cylinder(self):
cylinder_source = vtk.vtkCylinderSource()
cylinder_source.SetCenter(0.0, 0.0, 0.0);
cylinder_source.SetRadius(5.0);
cylinder_source.Update()
append_filter = vtk.vtkAppendFilter()
append_filter.AddInputData(cylinder_source.GetOutput())
append_filter.Update()
ugrid = vtk.vtkUnstructuredGrid()
ugrid.ShallowCopy(append_filter.GetOutput())
return ugrid
def get_unstructured_grid(self, block_names):
if not block_names:
return vtk.vtkUnstructuredGrid()
appendFilter = vtk.vtkAppendFilter()
for bl in block_names:
appendFilter.AddInputData(self.blocks[bl])
appendFilter.Update()
unstructuredGrid=vtk.vtkUnstructuredGrid()
unstructuredGrid.ShallowCopy(appendFilter.GetOutput())
return unstructuredGrid
def get_block_names(self):
res = []
for bl in self.blocks:
res.append(bl)
return res
def get_renderer(self, block_names):
ugrid = self.get_unstructured_grid(block_names)
mapper = vtk.vtkDataSetMapper()
mapper.SetInputData(ugrid)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# Renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
return renderer
executed script:
import vtk
from vtk.util.colors import tomato
import panel as pn
import resultData
import source_data
colors = vtk.vtkNamedColors()
def callback(event):
if event.name == "value":
new_renderer = result_data.get_renderer(event.new)
geom_pane.object.RemoveRenderer(geom_pane.object.GetRenderers().GetFirstRenderer())
geom_pane.object.AddRenderer(new_renderer)
geom_pane.synchronize()
result_data = source_data.SourceData()
checkbox_group = pn.widgets.CheckBoxGroup(
name='Select Domains Group', value=['sphere'], options=result_data.get_block_names())
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(result_data.get_renderer(checkbox_group.value))
checkbox_group.param.watch(callback, ['value'], onlychanged=True)
geom_pane = pn.pane.VTK(renWin, width=500, height=500)
combined = pn.Row(geom_pane, checkbox_group).servable()
combined.show()
Using python 3.10.5 on windows.
Any ideas what could be wrong?