diff --git a/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_actor_topomesh.py b/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_actor_topomesh.py index 04af0b17687f0f2e9db84b4f16f7de90e0130437..7582c57c3fe870c85464b631660e25089446458e 100644 --- a/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_actor_topomesh.py +++ b/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_actor_topomesh.py @@ -58,6 +58,7 @@ class VtkActorTopomesh(): self.glyph_scale = kwargs.get('glyph_scale',1.) self.polydata = None + self.display_polydata = None self.actor = None self.scalar_mode = None @@ -107,6 +108,9 @@ class VtkActorTopomesh(): def update_polydata(self): logging.info("--> Update polydata (modified="+str(self._modified)+")") + self.display_polydata = None + self._modified = True + if self.degree == 3: positions = self.topomesh.wisp_property("barycenter", 0) compute_topomesh_property(self.topomesh,"oriented_vertices",2) @@ -152,6 +156,8 @@ class VtkActorTopomesh(): elif self.degree == 2: wisp_ids = numpy_to_vtk(np.array([fid for fid in self.topomesh.wisps(2)]), deep=True, array_type=vtk.VTK_LONG) + wisp_ids.SetName("WispId") + positions = self.topomesh.wisp_property("barycenter", 0) compute_topomesh_property(self.topomesh,"oriented_vertices",2) face_vertices = self.topomesh.wisp_property("oriented_vertices", 2).values() @@ -168,19 +174,23 @@ class VtkActorTopomesh(): positions = self.topomesh.wisp_property("barycenter", 2) if property_data.shape[1] == 3 and property_data.shape[2] == 3: - self.polydata = vertex_tensor_property_polydata(positions, property_data, self.polydata, tensor_glyph=self.tensor_glyph,glyph_scale=self.glyph_scale) + self.polydata = vertex_tensor_property_polydata(positions, property_data, self.polydata) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata, tensor_glyph=self.tensor_glyph, glyph_scale=self.glyph_scale) self.scalar_mode = 'point_data' elif property_data.ndim == 2: print("VERTEX VECTOR PROP") compute_topomesh_property(self.topomesh, 'barycenter', 2) positions = self.topomesh.wisp_property("barycenter", 2) - vector_polydata = vertex_vector_property_polydata(positions, property_data, self.polydata, update_polydata=self._modified) - self.polydata = vtk_glyph_polydata(vector_polydata, vector_glyph=self.vector_glyph, glyph_scale=self.glyph_scale) + self.polydata = vertex_vector_property_polydata(positions, property_data, self.polydata, update_polydata=self._modified) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata, vector_glyph=self.vector_glyph, glyph_scale=self.glyph_scale) self.scalar_mode = 'point_data' elif property_data.ndim == 1: self.polydata = face_scalar_property_polydata(positions, face_vertices, property_data, self.polydata, update_polydata=self._modified) + self.polydata.GetCellData().AddArray(wisp_ids) self.scalar_mode = 'cell_data' else: if self.topomesh.has_wisp_property(self.property_name,self._property_degree,is_computed=True): @@ -188,14 +198,10 @@ class VtkActorTopomesh(): if property_data.ndim == 1: self.polydata = face_scalar_vertex_property_polydata(positions, face_vertices, property_data, self.polydata, update_polydata=self._modified) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata, vector_glyph=self.vector_glyph, glyph_scale=self.glyph_scale) self.scalar_mode = 'point_data' - wisp_ids.SetName("WispId") - if self.scalar_mode == 'point_data': - self.polydata.GetPointData().AddArray(wisp_ids) - elif self.scalar_mode == 'cell_data': - self.polydata.GetCellData().AddArray(wisp_ids) - elif self.degree == 1: wisp_ids = numpy_to_vtk(np.array([fid for fid in self.topomesh.wisps(1)]), deep=True, array_type=vtk.VTK_LONG) positions = self.topomesh.wisp_property("barycenter", 0) @@ -228,29 +234,29 @@ class VtkActorTopomesh(): if property_data.ndim == 3: if property_data.shape[1] == 3 and property_data.shape[2] == 3: - tensor_polydata = vertex_tensor_property_polydata(positions, property_data) + self.polydata = vertex_tensor_property_polydata(positions, property_data) self.scalar_mode = 'point_data' - tensor_polydata.GetPointData().AddArray(wisp_ids) - self.polydata = vtk_glyph_polydata(tensor_polydata,tensor_glyph=self.tensor_glyph,glyph_scale=self.glyph_scale) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata,tensor_glyph=self.tensor_glyph,glyph_scale=self.glyph_scale) elif property_data.ndim == 2: - vector_polydata = vertex_vector_property_polydata(positions, property_data) + self.polydata = vertex_vector_property_polydata(positions, property_data) self.scalar_mode = 'point_data' - vector_polydata.GetPointData().AddArray(wisp_ids) - self.polydata = vtk_glyph_polydata(vector_polydata,vector_glyph=self.vector_glyph, glyph_scale=self.glyph_scale) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata,vector_glyph=self.vector_glyph, glyph_scale=self.glyph_scale) elif property_data.ndim == 1: - point_polydata = vertex_scalar_property_polydata(positions, property_data) + self.polydata = vertex_scalar_property_polydata(positions, property_data) self.scalar_mode = 'point_data' - point_polydata.GetPointData().AddArray(wisp_ids) - self.polydata = vtk_glyph_polydata(point_polydata, point_glyph=self.point_glyph, glyph_scale=self.glyph_scale) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata, point_glyph=self.point_glyph, glyph_scale=self.glyph_scale) else: property_data = np.ones(self.topomesh.nb_wisps(0)) - point_polydata = vertex_scalar_property_polydata(positions, property_data) + self.polydata = vertex_scalar_property_polydata(positions, property_data) self.scalar_mode = 'point_data' - point_polydata.GetPointData().AddArray(wisp_ids) - self.polydata = vtk_glyph_polydata(point_polydata, point_glyph=self.point_glyph, glyph_scale=self.glyph_scale) + self.polydata.GetPointData().AddArray(wisp_ids) + self.display_polydata = vtk_glyph_polydata(self.polydata, point_glyph=self.point_glyph, glyph_scale=self.glyph_scale) def update_actor(self, colormap='viridis', value_range=None, opacity=1): @@ -277,7 +283,10 @@ class VtkActorTopomesh(): elif self.scalar_mode == 'point_data': mapper.SetScalarModeToUsePointData() - mapper.SetInputData(self.polydata) + if self.display_polydata is not None: + mapper.SetInputData(self.display_polydata) + else: + mapper.SetInputData(self.polydata) mapper.SetLookupTable(lut) if self.actor is None: diff --git a/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_tools.py b/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_tools.py index 3bb3f3e3f014c6714bf406ad6702070897848636..2ccc079b9601a2b1e4e25d166175c88c2fe261a5 100644 --- a/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_tools.py +++ b/src/vplants/cellcomplex/property_topomesh/property_topomesh_visualization/vtk_tools.py @@ -26,6 +26,8 @@ from vplants.container import array_dict from time import time as current_time import logging +logging.getLogger().setLevel(logging.INFO) + def vtk_lookuptable_from_mpl_cmap(colormap='gray',value_range=(0,1)): @@ -223,7 +225,7 @@ def vtk_tube_polydata(input_polydata, radius=1): return vtk_combine_polydatas(line_polydatas) -def face_scalar_property_polydata(positions, face_vertex_ids, face_property_data, polydata=None, update_polydata=False): +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'] @@ -236,6 +238,7 @@ def face_scalar_property_polydata(positions, face_vertex_ids, face_property_data update_polydata = True if update_polydata: + polydata.Initialize() logging.info("--> Face Scalar Polydata : Re-computing polydata...") vtk_points = vtk.vtkPoints() vtk_faces = vtk.vtkCellArray() @@ -255,11 +258,13 @@ def face_scalar_property_polydata(positions, face_vertex_ids, face_property_data 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 -def face_scalar_vertex_property_polydata(positions, face_vertex_ids, vertex_property_data, polydata=None, update_polydata=False): + +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'] @@ -272,6 +277,7 @@ def face_scalar_vertex_property_polydata(positions, face_vertex_ids, vertex_prop update_polydata = True if update_polydata: + polydata.Initialize() logging.info("--> Face Scalar Polydata : Re-computing polydata...") vtk_points = vtk.vtkPoints() vtk_faces = vtk.vtkCellArray() @@ -291,6 +297,7 @@ def face_scalar_vertex_property_polydata(positions, face_vertex_ids, vertex_prop 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 @@ -308,6 +315,8 @@ def edge_scalar_property_polydata(positions, edge_vertex_ids, edge_property_data if polydata is None: polydata = vtk.vtkPolyData() + + polydata.Initialize() vtk_points = vtk.vtkPoints() vtk_edges = vtk.vtkCellArray() @@ -324,6 +333,7 @@ def edge_scalar_property_polydata(positions, edge_vertex_ids, edge_property_data 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) @@ -343,6 +353,8 @@ def vertex_tensor_property_polydata(positions, vertex_property_data, polydata=No 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) @@ -357,7 +369,7 @@ def vertex_tensor_property_polydata(positions, vertex_property_data, polydata=No 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)) @@ -367,7 +379,7 @@ def vertex_tensor_property_polydata(positions, vertex_property_data, polydata=No return polydata -def vertex_vector_property_polydata(positions, vertex_property_data, polydata=None, update_polydata=False): +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) @@ -376,18 +388,20 @@ def vertex_vector_property_polydata(positions, vertex_property_data, polydata=No 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() + # 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) + # 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 @@ -401,6 +415,8 @@ def vertex_scalar_property_polydata(positions, vertex_property_data, polydata=No 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) @@ -408,6 +424,7 @@ def vertex_scalar_property_polydata(positions, vertex_property_data, polydata=No 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) @@ -489,6 +506,7 @@ def property_topomesh_to_vtk_polydata(topomesh, degree=2, property_name=None, te return vertex_scalar_property_polydata(positions, property_data) + def vtk_actor(polydata, actor=None, colormap='viridis', value_range=None, opacity=1): if value_range is None: if polydata.GetCellData().GetNumberOfArrays()>0: @@ -541,6 +559,7 @@ def vtk_scalar_bar_widget(actor, render_window_interactor, scalar_bar_widget=Non return scalar_bar_widget + def vtk_axes_actor(actor, axes_actor=None, font_size=20): if axes_actor is None: axes = vtk.vtkAxesActor()