Source code for cellcomplex.property_topomesh.visualization.vtk_tools

# Version: $Id$
#
#

# Commentary:
#
#

# Change Log:
#
#

# Code:

import numpy as np

import matplotlib.pyplot as plt
import matplotlib as mpl

import vtk
from vtk.util.numpy_support import numpy_to_vtk, vtk_to_numpy, get_vtk_array_type

from cellcomplex.property_topomesh.analysis import compute_topomesh_property
from cellcomplex.utils import array_dict

from time import time as current_time
import logging

logging.getLogger().setLevel(logging.INFO)


[docs]def vtk_lookuptable_from_mpl_cmap(colormap='gray',value_range=(0,1)): cmap = mpl.cm.get_cmap(colormap) if isinstance(cmap,mpl.colors.LinearSegmentedColormap): if np.all([np.all(np.sort(np.array(cmap._segmentdata[k])[:,0])==np.array(cmap._segmentdata['red'])[:,0]) for k in ['red','green','blue']]): cmap_data = np.transpose([cmap._segmentdata[k] for k in ['red','green','blue']],(1,0,2))[:,:,:2] cmap_dict = dict(zip(cmap_data[:,0,0],cmap_data[:,:,1])) else: cmap_keys = np.unique(np.concatenate([np.array(cmap._segmentdata[k])[:,0] for k in ['red','green','blue']])) cmap_values = mpl.cm.ScalarMappable(cmap=cmap,norm=mpl.colors.Normalize(0,1)).to_rgba(cmap_keys)[:,:3] cmap_dict = dict(zip(cmap_keys,cmap_values)) elif isinstance(cmap,mpl.colors.ListedColormap): cmap_dict = dict(zip(np.linspace(0,1,len(cmap.colors)),cmap.colors)) lut = vtk.vtkColorTransferFunction() lut.RemoveAllPoints() for val in np.sort(list(cmap_dict.keys())): node = val*value_range[1] + (1-val)*value_range[0] lut.AddRGBPoint(node, *cmap_dict[val]) lut.ClampingOn() lut.Modified() return lut
[docs]def vtk_glyph_polydata(input_polydata, glyph_scale=1., tensor_glyph='crosshair', vector_glyph='arrow', point_glyph='sphere'): print(input_polydata.GetNumberOfCells(),"Cells, ",input_polydata.GetNumberOfPoints()," Points") print("Point Data : ",input_polydata.GetPointData().GetArray(0).GetNumberOfComponents()) if (input_polydata.GetNumberOfCells() == 0) and (input_polydata.GetNumberOfPoints() > 0): if input_polydata.GetPointData().GetArray(0).GetNumberOfComponents() == 1: glyph = vtk.vtkGlyph3D() if point_glyph == 'sphere': sphere = vtk.vtkSphereSource() sphere.SetRadius(glyph_scale) sphere.SetThetaResolution(12) sphere.SetPhiResolution(12) sphere.Update() glyph.SetSourceData(sphere.GetOutput()) elif point_glyph == 'point': point = vtk.vtkPointSource() point.SetRadius(0) point.SetNumberOfPoints(1) point.Update() glyph.SetSourceData(point.GetOutput()) glyph.SetScaleModeToDataScalingOff() glyph.SetColorModeToColorByScalar() glyph.SetInputData(input_polydata) elif input_polydata.GetPointData().GetArray(0).GetNumberOfComponents() == 3: glyph = vtk.vtkGlyph3D() if vector_glyph == 'line': line = vtk.vtkLineSource() line.SetPoint1(0,0,0) line.SetPoint2(1,0,0) line.Update() glyph.SetSourceConnection(line.GetOutputPort()) elif vector_glyph == 'arrow': arrow = vtk.vtkArrowSource() arrow.SetTipLength(0.2) arrow.SetShaftRadius(0.05) arrow.SetTipRadius(0.1) arrow.SetTipResolution(32) arrow.SetShaftResolution(32) arrow.Update() glyph.SetSourceConnection(arrow.GetOutputPort()) elif vector_glyph == 'tube': tube = vtk.vtkCylinderSource() tube.SetRadius(0.5) tube.SetResolution(100) tube.CappingOff() tube.Update() rotation = vtk.vtkTransform() rotation.RotateZ(90) rotation.Translate(0,-0.5,0) transform = vtk.vtkTransformPolyDataFilter() transform.SetInputConnection(tube.GetOutputPort()) transform.SetTransform(rotation) transform.Update() glyph.SetSourceData(transform.GetOutput()) glyph.SetInputData(input_polydata) glyph.SetVectorModeToUseVector() glyph.SetColorModeToColorByVector() glyph.SetScaleModeToScaleByVector() glyph.SetScaleFactor(glyph_scale) elif input_polydata.GetPointData().GetArray(0).GetNumberOfComponents() == 9: glyph = vtk.vtkTensorGlyph() if tensor_glyph == 'ellipsoid': sphere = vtk.vtkSphereSource() sphere.SetThetaResolution(12) sphere.SetPhiResolution(8) sphere.Update() glyph.SetSourceConnection(sphere.GetOutputPort()) glyph.ThreeGlyphsOff() elif tensor_glyph == 'crosshair': # line = vtk.vtkLineSource() # line.SetPoint1(0,0,0) # line.SetPoint2(1,0,0) line = vtk.vtkCylinderSource() line.SetCenter(0.0, 0.0, 0.0) line.SetRadius(0.05/np.sqrt(glyph_scale)) line.SetHeight(1.0) line.SetResolution(16) line.Update() rotation = vtk.vtkTransform() rotation.RotateZ(90) rotation_filter = vtk.vtkTransformPolyDataFilter() rotation_filter.SetInputConnection(line.GetOutputPort()) rotation_filter.SetTransform(rotation) translation = vtk.vtkTransform() translation.Translate(0.5,0,0) translation_filter = vtk.vtkTransformPolyDataFilter() translation_filter.SetInputConnection(rotation_filter.GetOutputPort()) translation_filter.SetTransform(translation) glyph.SetSourceConnection(translation_filter.GetOutputPort()) glyph.ThreeGlyphsOn() glyph.SetInputData(input_polydata) glyph.ColorGlyphsOn() glyph.SetColorModeToEigenvalues() glyph.SymmetricOn() glyph.SetScaleFactor(glyph_scale) glyph.ExtractEigenvaluesOn() glyph.Update() polydata = glyph.GetOutput() else: polydata = input_polydata return polydata
[docs]def vtk_combine_polydatas(polydata_list): if len(polydata_list)>0: appender = vtk.vtkAppendPolyData() for polydata in polydata_list: appender.AddInputData(polydata) appender.Update() cleaner = vtk.vtkCleanPolyData() cleaner.SetInputConnection(appender.GetOutputPort()) cleaner.Update() return cleaner.GetOutput() else: return vtk.vtkPolyData()
[docs]def vtk_tube_polydata(input_polydata, radius=1.): all_lines = input_polydata.GetLines() all_line_data = input_polydata.GetCellData().GetArray(0) line_polydatas = [] all_lines.InitTraversal() point_list = vtk.vtkIdList() # for line_id in range(all_lines.GetNumberOfCells()): while (all_lines.GetNextCell(point_list)): # point_list = vtk.vtkIdList() # all_lines.GetCell(line_id, point_list) # line_data = all_line_data.GetNextTuple() line_data = 0 print("Line : "+str(point_list.GetNumberOfIds())+" Points") if point_list.GetNumberOfIds() == 2: points = vtk.vtkPoints() for i_point in range(point_list.GetNumberOfIds()): print(" -->"+str(i_point)+" : "+str(input_polydata.GetPoint(point_list.GetId(i_point)))) points.InsertPoint(i_point,input_polydata.GetPoint(point_list.GetId(i_point))) spline = vtk.vtkParametricSpline() spline.SetPoints(points) function_source = vtk.vtkParametricFunctionSource() function_source.SetParametricFunction(spline) function_source.SetUResolution(8*points.GetNumberOfPoints()) function_source.Update() n_points = function_source.GetOutput().GetNumberOfPoints() interpolated_radius = vtk.vtkTupleInterpolator() interpolated_radius.SetInterpolationTypeToLinear() interpolated_radius.SetNumberOfComponents(1) for i_r in range(point_list.GetNumberOfIds()): interpolated_radius.AddTuple(i_r,[radius]) tube_data = vtk.vtkDoubleArray() tube_data.SetNumberOfTuples(n_points) tube_data.SetName("TubeData") tube_radius = vtk.vtkDoubleArray() tube_radius.SetNumberOfTuples(n_points) tube_radius.SetName("TubeRadius") tMin = interpolated_radius.GetMinimumT() tMax = interpolated_radius.GetMaximumT() for i_r,i in enumerate(np.arange(n_points)/float(n_points-1)): r = [0.] interpolated_radius.InterpolateTuple(tMin + i*(tMax - tMin),r) tube_radius.SetTuple1(i_r,r[0]) tube_data.SetTuple1(i_r,line_data) tube_polydata = function_source.GetOutput() tube_polydata.GetPointData().AddArray(tube_radius) tube_polydata.GetPointData().AddArray(tube_data) tube_polydata.GetPointData().SetActiveScalars("TubeRadius") tuber = vtk.vtkTubeFilter() tuber.SetInputData(tube_polydata) tuber.SetNumberOfSides(16) tuber.SetVaryRadiusToVaryRadiusByAbsoluteScalar() tuber.Update() polydata = tuber.GetOutput() polydata.GetPointData().RemoveArray("TubeRadius") polydata.GetPointData().SetActiveScalars("TubeData") line_polydatas += [polydata] return vtk_combine_polydatas(line_polydatas)
[docs]def face_scalar_property_polydata(positions, face_vertex_ids, face_property_data, polydata=None, update_polydata=True): assert face_property_data.ndim == 1 assert not face_property_data.dtype in ['O'] assert len(face_property_data) == len(face_vertex_ids) unique_vertex_ids = np.unique(np.concatenate(face_vertex_ids)) if polydata is None: polydata = vtk.vtkPolyData() update_polydata = True if update_polydata: polydata.Initialize() logging.info("--> Face Scalar Polydata : Re-computing polydata...") vtk_points = vtk.vtkPoints() vtk_faces = vtk.vtkCellArray() double_array = numpy_to_vtk(positions.values(unique_vertex_ids), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) point_mapping = array_dict(dict(zip(unique_vertex_ids, range(len(unique_vertex_ids))))) for face_vids, face_property in zip(face_vertex_ids, face_property_data): vtk_face_point_ids = point_mapping.values(face_vids) vtk_face_id = vtk_faces.InsertNextCell(len(vtk_face_point_ids)) for vtk_point_id in vtk_face_point_ids: vtk_faces.InsertCellPoint(vtk_point_id) polydata.SetPoints(vtk_points) polydata.SetPolys(vtk_faces) property_double_array = numpy_to_vtk(face_property_data.astype(float), deep=True, array_type=vtk.VTK_DOUBLE) property_double_array.SetName("Property") polydata.GetCellData().SetScalars(property_double_array) return polydata
[docs]def face_scalar_vertex_property_polydata(positions, face_vertex_ids, vertex_property_data, polydata=None, update_polydata=True): assert vertex_property_data.ndim == 1 assert not vertex_property_data.dtype in ['O'] assert len(vertex_property_data) == len(positions) unique_vertex_ids = np.unique(np.concatenate(face_vertex_ids)) if polydata is None: polydata = vtk.vtkPolyData() update_polydata = True if update_polydata: polydata.Initialize() logging.info("--> Face Scalar Polydata : Re-computing polydata...") vtk_points = vtk.vtkPoints() vtk_faces = vtk.vtkCellArray() double_array = numpy_to_vtk(positions.values(unique_vertex_ids), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) point_mapping = array_dict(dict(zip(unique_vertex_ids, range(len(unique_vertex_ids))))) for face_vids in face_vertex_ids: vtk_face_point_ids = point_mapping.values(face_vids) vtk_face_id = vtk_faces.InsertNextCell(len(vtk_face_point_ids)) for vtk_point_id in vtk_face_point_ids: vtk_faces.InsertCellPoint(vtk_point_id) polydata.SetPoints(vtk_points) polydata.SetPolys(vtk_faces) property_double_array = numpy_to_vtk(vertex_property_data.astype(float), deep=True, array_type=vtk.VTK_DOUBLE) property_double_array.SetNumberOfComponents(1) property_double_array.SetName("Property") polydata.GetPointData().SetScalars(property_double_array) return polydata
[docs]def edge_scalar_property_polydata(positions, edge_vertex_ids, edge_property_data, polydata=None, line_glyph='line', glyph_scale=1.): assert edge_property_data.ndim == 1 assert not edge_property_data.dtype in ['O'] assert edge_vertex_ids.ndim == 2 assert edge_vertex_ids.shape[1] == 2 assert len(edge_property_data) == len(edge_vertex_ids) unique_vertex_ids = np.unique(np.concatenate(edge_vertex_ids)) if polydata is None: polydata = vtk.vtkPolyData() polydata.Initialize() vtk_points = vtk.vtkPoints() vtk_edges = vtk.vtkCellArray() vtk_edge_data = vtk.vtkDoubleArray() double_array = numpy_to_vtk(positions.values(unique_vertex_ids), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) point_mapping = array_dict(dict(zip(unique_vertex_ids, range(len(unique_vertex_ids))))) for edge_vids, edge_property in zip(edge_vertex_ids, edge_property_data): vtk_edge_point_ids = point_mapping.values(edge_vids) line = vtk.vtkLine() for i_p,vtk_point_id in enumerate(vtk_edge_point_ids): line.GetPointIds().SetId(i_p,vtk_point_id) vtk_edge_id = vtk_edges.InsertNextCell(line) print("Line "+str(vtk_edge_id)+" : "+str(line.GetPointIds().GetNumberOfIds())+" Points") # vtk_edge_id = vtk_edges.InsertNextCell(len(vtk_edge_point_ids)) # print("Line "+str(vtk_edge_id)+" : "+str(len(vtk_edge_point_ids))+" Points") # for vtk_point_id in vtk_edge_point_ids: # vtk_edges.InsertCellPoint(vtk_point_id) vtk_edge_data.InsertValue(vtk_edge_id, edge_property) vtk_edge_data.SetName("Property") polydata.SetPoints(vtk_points) polydata.SetLines(vtk_edges) polydata.GetPointData().Initialize() polydata.GetCellData().SetScalars(vtk_edge_data) if line_glyph == 'line': return polydata elif line_glyph == 'tube': return vtk_tube_polydata(polydata, radius=glyph_scale)
[docs]def vertex_tensor_property_polydata(positions, vertex_property_data, polydata=None): assert vertex_property_data.ndim == 3 assert len(vertex_property_data) == len(positions) if polydata is None: polydata = vtk.vtkPolyData() polydata.Initialize() vtk_points = vtk.vtkPoints() double_array = numpy_to_vtk(positions.values(), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) property_validity = np.logical_not(np.any(np.any(np.isnan(vertex_property_data),axis=1),axis=1)) eigval, eigvec = np.linalg.eig(vertex_property_data[property_validity]) eps = 1e-2 eigval[eigval < 1e-4] = eps vertex_property_data[property_validity] = np.einsum('ni, nji, nki->njk', eigval,eigvec,eigvec) vtk_point_data = numpy_to_vtk(vertex_property_data.reshape(len(positions),9), deep=True, array_type=vtk.VTK_DOUBLE) vtk_point_data.SetName("Property") # for fid, face_property in enumerate(face_property_data): # vtk_point_data.InsertTuple9(fid, *np.ravel(face_property)) polydata.SetPoints(vtk_points) polydata.GetPointData().SetTensors(vtk_point_data) return polydata
[docs]def vertex_vector_property_polydata(positions, vertex_property_data, polydata=None, update_polydata=True): assert vertex_property_data.ndim == 2 assert len(vertex_property_data) == len(positions) if polydata is None: polydata = vtk.vtkPolyData() update_polydata = True polydata.Initialize() # if update_polydata: logging.info("--> Vertex Vector Polydata : Re-computing polydata...") vtk_points = vtk.vtkPoints() # vtk_faces = vtk.vtkCellArray() double_array = numpy_to_vtk(positions.values(), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) polydata.SetPoints(vtk_points) # polydata.SetPolys(vtk_faces) vtk_point_data = numpy_to_vtk(vertex_property_data.reshape(len(positions), 3), deep=True, array_type=vtk.VTK_DOUBLE) vtk_point_data.SetName("Property") polydata.GetPointData().SetVectors(vtk_point_data) return polydata
[docs]def vertex_scalar_property_polydata(positions, vertex_property_data, polydata=None): assert vertex_property_data.ndim == 1 assert not vertex_property_data.dtype in ['O'] assert len(vertex_property_data) == len(positions) if polydata is None: polydata = vtk.vtkPolyData() polydata.Initialize() vtk_points = vtk.vtkPoints() double_array = numpy_to_vtk(positions.values(), deep=True, array_type=vtk.VTK_DOUBLE) vtk_points.SetData(double_array) vtk_point_data = numpy_to_vtk(vertex_property_data, deep=True, array_type=vtk.VTK_DOUBLE) vtk_point_data.SetNumberOfComponents(1) vtk_point_data.SetName("Property") polydata.SetPoints(vtk_points) polydata.GetPointData().SetScalars(vtk_point_data) return polydata
[docs]def property_topomesh_to_vtk_polydata(topomesh, degree=2, property_name=None, tensor_glyph='ellipsoid', vector_glyph='arrow', glyph_scale=1.): if degree == 3: positions = topomesh.wisp_property("barycenter", 0) compute_topomesh_property(topomesh,"oriented_vertices",2) if topomesh.has_wisp_property(property_name,3,is_computed=True): cell_property = topomesh.wisp_property(property_name,3) else: cell_property = array_dict(dict(zip(topomesh.wisps(3),topomesh.wisps(3)))) cell_polydatas = [] for cid in topomesh.wisps(3): face_vertices = topomesh.wisp_property("oriented_vertices", 2).values(list(topomesh.borders(3,cid))) property_data = np.array([cell_property[cid] for fid in topomesh.borders(3,cid)]) cell_polydatas += [face_scalar_property_polydata(positions, face_vertices, property_data)] return vtk_combine_polydatas(cell_polydatas) elif degree == 2: positions = topomesh.wisp_property("barycenter", 0) compute_topomesh_property(topomesh,"oriented_vertices",2) face_vertices = topomesh.wisp_property("oriented_vertices", 2).values() if topomesh.has_wisp_property(property_name,2,is_computed=True): property_data = topomesh.wisp_property(property_name,2).values() if property_data.ndim == 3: compute_topomesh_property(topomesh, 'barycenter', 2) positions = topomesh.wisp_property("barycenter", 2) if property_data.shape[1] == 3 and property_data.shape[2] == 3: return vertex_tensor_property_polydata(positions, property_data,tensor_glyph=tensor_glyph, glyph_scale=glyph_scale) if property_data.ndim == 2: compute_topomesh_property(topomesh, 'barycenter', 2) positions = topomesh.wisp_property("barycenter", 2) return vertex_vector_property_polydata(positions, property_data, vector_glyph=vector_glyph, glyph_scale=glyph_scale) else: property_data = np.ones(topomesh.nb_wisps(2)) return face_scalar_property_polydata(positions, face_vertices, property_data) elif degree == 1: positions = topomesh.wisp_property("barycenter", 0) compute_topomesh_property(topomesh,"vertices",1) edge_vertices = topomesh.wisp_property("vertices", 1).values() if topomesh.has_wisp_property(property_name,1,is_computed=True): property_data = topomesh.wisp_property(property_name,1).values() else: property_data = np.ones(topomesh.nb_wisps(1)) return edge_scalar_property_polydata(positions, edge_vertices, property_data) elif degree == 0: positions = topomesh.wisp_property("barycenter", 0) if topomesh.has_wisp_property(property_name,0,is_computed=True): property_data = topomesh.wisp_property(property_name,0).values(positions.keys()) else: property_data = np.ones(topomesh.nb_wisps(0)) return vertex_scalar_property_polydata(positions, property_data)
[docs]def vtk_actor(polydata, actor=None, colormap='viridis', value_range=None, opacity=1): if value_range is None: if polydata.GetCellData().GetNumberOfArrays()>0: scalars = vtk_to_numpy(polydata.GetCellData().GetArray(0)) value_range = (np.nanmin(scalars),np.nanmax(scalars)) elif polydata.GetPointData().GetNumberOfArrays()>0: scalars = vtk_to_numpy(polydata.GetPointData().GetArray(0)) value_range = (np.nanmin(scalars),np.nanmax(scalars)) else: value_range = (0,1) lut = vtk_lookuptable_from_mpl_cmap(colormap,value_range) mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) mapper.SetLookupTable(lut) if actor is None: actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetOpacity(opacity) return actor
[docs]def vtk_display_polydata(polydata, background=(0.1, 0.1, 0.15), focal_point=(1, 0, 0), view_up=(0, 0, 1)): mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) actor = vtk.vtkActor() actor.SetMapper(mapper) vtk_display_actor(actor, background=background, focal_point=focal_point, view_up=view_up)
[docs]def vtk_scalar_bar_widget(actor, render_window_interactor, scalar_bar_widget=None, number_labels=5, font_size=20): scalar_bar = vtk.vtkScalarBarActor() scalar_bar.SetOrientationToHorizontal() if not isinstance(actor,vtk.vtkAssembly): scalar_bar.SetLookupTable(actor.GetMapper().GetLookupTable()) else: scalar_bar.SetLookupTable(actor.GetActors().GetNextProp3D().GetMapper().GetLookupTable()) scalar_bar.SetNumberOfLabels(number_labels) scalar_bar.GetLabelTextProperty().SetFontSize(font_size) if scalar_bar_widget is None: scalar_bar_widget = vtk.vtkScalarBarWidget() scalar_bar_widget.SetInteractor(render_window_interactor) scalar_bar_widget.SetScalarBarActor(scalar_bar) return scalar_bar_widget
[docs]def vtk_axes_actor(actor, axes_actor=None, font_size=20): if axes_actor is None: axes = vtk.vtkAxesActor() transform = vtk.vtkTransform() bounds = np.array(actor.GetBounds()) min_x = bounds[0] max_x = bounds[1] mean_x = 0.1*(max_x - min_x) min_y = bounds[2] max_y = bounds[3] mean_y = 0.1*(max_y- min_y) min_z = bounds[4] max_z = bounds[5] mean_z = 0.1*(max_z - min_z) max = np.max(np.array((mean_x, mean_y, mean_z))) axes.SetTotalLength(max, max, max) transform.Translate(min_x-0.5*mean_x, min_y-0.5*mean_y, min_z-0.5*mean_z) axes.SetUserTransform(transform) axes.GetXAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() axes.GetYAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() axes.GetZAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize(font_size) axes.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize(font_size) axes.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize(font_size) return axes
[docs]def vtk_display_actors(actors, renderer=None, background=(0.1, 0.1, 0.1), focal_point=(1, 0, 0), view_up=(0, 0, 1), set_scalar_bar=False, set_axes=False, show=True): actor = vtk.vtkAssembly() for a in actors: if a is not None: actor.AddPart(a) return vtk_display_actor(actor, renderer, background, focal_point, view_up, set_scalar_bar, set_axes, show=show)
[docs]def vtk_display_actor(actor, renderer=None, background=(0.1, 0.1, 0.1), focal_point=(1, 0, 0), view_up=(0, 0, 1), set_scalar_bar=False, set_axes=False, show=True): if renderer is None: renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetSize(1000,1000) if set_axes: axes = vtk_axes_actor(actor) renderer.AddActor(axes) renderer.AddActor(actor) renderer.SetBackground(*background) camera = renderer.GetActiveCamera() camera.SetPosition(0, 0, 0) camera.SetFocalPoint(*focal_point) camera.SetViewUp(*view_up) renderer.ResetCamera() render_window.Render() if show: render_window_interactor = vtk.vtkRenderWindowInteractor() render_window_interactor.SetRenderWindow(render_window) render_window_interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) if set_scalar_bar: scalar_bar_widget = vtk_scalar_bar_widget(actor, render_window_interactor) scalar_bar_widget.On() render_window_interactor.Start() return renderer
[docs]def vtk_save_webgl_actors(actors, webgl_filename, background=(0.1, 0.1, 0.1), focal_point=(1, 0, 0), view_up=(0, 0, 1)): renderer = vtk_display_actors(actors,background=background,focal_point=focal_point,view_up=view_up,show=False) render_window = renderer.GetRenderWindow() webgl_exporter = vtk.vtkPVWebGLExporter() webgl_exporter.SetFileName(webgl_filename) webgl_exporter.SetRenderWindow(render_window) webgl_exporter.Update()
[docs]def vtk_save_png_actors(actors, png_filename, background=(0.1, 0.1, 0.1), focal_point=(1, 0, 0), view_up=(0, 0, 1)): renderer = vtk_display_actors(actors, background=background, focal_point=focal_point, view_up=view_up, show=False) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetOffScreenRendering(1) render_window.SetSize(1500, 1500) render_window.Render() window_to_image = vtk.vtkWindowToImageFilter() window_to_image.SetInput(render_window) window_to_image.SetInputBufferTypeToRGBA() window_to_image.Update() png_writer = vtk.vtkPNGWriter() png_writer.SetInputConnection(window_to_image.GetOutputPort()) png_writer.SetFileName(png_filename) png_writer.Write()
[docs]def vtk_image_actors(actors, focal_point=(1, 0, 0), view_up=(0, 0, 1)): actor = vtk.vtkAssembly() for a in actors: if a is not None: actor.AddPart(a) renderer = vtk.vtkRenderer() renderer.AddActor(actor) size = 2000 pad = 300 render_window = vtk.vtkRenderWindow() render_window.SetOffScreenRendering(1) render_window.AddRenderer(renderer) render_window.SetSize(size+2*pad, size+2*pad) camera = renderer.GetActiveCamera() camera.SetPosition(0, 0, 0) camera.SetFocalPoint(*focal_point) camera.SetViewUp(*view_up) renderer.ResetCamera() render_window.Render() renderer.ResetCamera() window_to_image = vtk.vtkWindowToImageFilter() window_to_image.SetInput(render_window) window_to_image.SetInputBufferTypeToRGBA() window_to_image.Update() vtk_image = window_to_image.GetOutput() vtk_array = vtk_image.GetPointData().GetArray(0) shape = (size+2*pad,size+2*pad,4) img = vtk_to_numpy(vtk_array).reshape(shape) img = img[pad:size+pad,pad:size+pad] return img