1+ # Standard library imports
2+ import os
3+
4+ # Third party imports
5+ import vtk
6+ from wslink import register as exportRpc
7+
8+ # Local application imports
9+ from opengeodeweb_viewer .utils_functions import get_schemas_dict , validate_schema
10+ from opengeodeweb_viewer .vtk_protocol import VtkView
11+
12+ schemas_dir = os .path .join (os .path .dirname (__file__ ), "schemas" )
13+ schemas_dict = get_schemas_dict (schemas_dir )
14+
15+
16+ class VtkObjectView (VtkView ):
17+ def __init__ (self ):
18+ super ().__init__ ()
19+
20+ @exportRpc (schemas_dict ["register" ]["rpc" ])
21+ def registerObject (self , params ):
22+ validate_schema (params , schemas_dict ["register" ])
23+ try :
24+ id = params ["id" ]
25+ file_name = params ["file_name" ]
26+ FOLDER_PATH = os .path .dirname (__file__ )
27+
28+ actor = vtk .vtkActor ()
29+ if ".vtm" in file_name :
30+ reader = vtk .vtkXMLMultiBlockDataReader ()
31+ filter = vtk .vtkGeometryFilter ()
32+ filter .SetInputConnection (reader .GetOutputPort ())
33+ mapper = vtk .vtkCompositePolyDataMapper ()
34+ mapper .SetInputConnection (filter .GetOutputPort ())
35+ else :
36+ reader = vtk .vtkXMLGenericDataObjectReader ()
37+ filter = {}
38+ mapper = vtk .vtkDataSetMapper ()
39+ mapper .SetInputConnection (reader .GetOutputPort ())
40+
41+ self .register_object (id , reader , filter , actor , mapper , {})
42+
43+ reader .SetFileName (os .path .join (self .DATA_FOLDER_PATH , file_name ))
44+
45+ actor .SetMapper (mapper )
46+ mapper .SetColorModeToMapScalars ()
47+ mapper .SetResolveCoincidentTopologyLineOffsetParameters (1 , - 0.1 )
48+ mapper .SetResolveCoincidentTopologyPolygonOffsetParameters (2 , 0 )
49+ mapper .SetResolveCoincidentTopologyPointOffsetParameter (- 2 )
50+
51+ renderWindow = self .getView ("-1" )
52+ renderer = renderWindow .GetRenderers ().GetFirstRenderer ()
53+ renderer .AddActor (actor )
54+ renderer .ResetCamera ()
55+ renderWindow .Render ()
56+ self .render ()
57+ except Exception as e :
58+ print ("error : " , str (e ), flush = True )
59+
60+ @exportRpc (schemas_dict ["deregister" ]["rpc" ])
61+ def deregisterObject (self , params ):
62+ validate_schema (params , schemas_dict ["deregister" ])
63+ print (f"{ params = } " , flush = True )
64+ id = params ["id" ]
65+ object = self .get_object (id )
66+ actor = object ["actor" ]
67+ renderWindow = self .getView ("-1" )
68+ renderer = renderWindow .GetRenderers ().GetFirstRenderer ()
69+ renderer .RemoveActor (actor )
70+ print (f"{ object = } " , flush = True )
71+ self .deregister_object (id )
72+ self .render ()
73+
74+
75+ @exportRpc (schemas_dict ["apply_textures" ]["rpc" ])
76+ def applyTextures (self , params ):
77+ validate_schema (params , schemas_dict ["apply_textures" ])
78+ print (f"{ params = } " , flush = True )
79+ id = params ["id" ]
80+ textures = params ["textures" ]
81+ textures_array = []
82+ images_reader_array = []
83+
84+ data = self .get_object (id )
85+ mapper = data ["mapper" ]
86+ actor = data ["actor" ]
87+ reader = data ["reader" ]
88+
89+ polydata_mapper = mapper .GetPolyDataMapper ()
90+ poly_data = reader .GetPolyDataOutput ()
91+
92+ for index , value in enumerate (textures ):
93+ texture_name = value ["texture_name" ]
94+ texture_file_name = value ["texture_file_name" ]
95+ print (f"{ texture_name = } { texture_file_name = } " , flush = True )
96+
97+ new_texture = vtk .vtkTexture ()
98+ image_reader = vtk .vtkXMLImageDataReader ()
99+ image_reader .SetFileName (
100+ os .path .join (self .DATA_FOLDER_PATH , texture_file_name )
101+ )
102+
103+ shader_texture_name = f"VTK_TEXTURE_UNIT_{ index } "
104+ polydata_mapper .MapDataArrayToMultiTextureAttribute (
105+ shader_texture_name ,
106+ texture_name ,
107+ vtk .vtkDataObject .FIELD_ASSOCIATION_POINTS ,
108+ )
109+
110+ if index == 0 :
111+ new_texture .SetBlendingMode (
112+ vtk .vtkTexture .VTK_TEXTURE_BLENDING_MODE_REPLACE
113+ )
114+ else :
115+ new_texture .SetBlendingMode (
116+ vtk .vtkTexture .VTK_TEXTURE_BLENDING_MODE_ADD
117+ )
118+
119+ images_reader_array .append (image_reader )
120+ new_texture .SetInputConnection (image_reader .GetOutputPort ())
121+
122+ actor .GetProperty ().SetTexture (shader_texture_name , new_texture )
123+
124+ textures_array .append (new_texture )
125+ images_reader_array .append (image_reader )
126+
127+ self .render ()
128+
129+
130+ def SetVisibility (self , params ):
131+ validate_schema (params , schemas_dict ["set_visibility" ])
132+ id = params ["id" ]
133+ visibility = bool (params ["visibility" ])
134+ actor = self .get_object (id )["actor" ]
135+ actor .SetVisibility (visibility )
136+ self .render ()
137+
138+ def SetOpacity (self , params ):
139+ print (f"{ params = } " , flush = True )
140+ validate_schema (params , schemas_dict ["set_opacity" ])
141+ id = params ["id" ]
142+ opacity = float (params ["opacity" ])
143+ actor = self .get_object (id )["actor" ]
144+ actor .GetProperty ().SetOpacity (opacity )
145+ self .render ()
146+
147+ def SetColor (self , params ):
148+ validate_schema (params , schemas_dict ["set_color" ])
149+ id = params ["id" ]
150+ color = params ["color" ]
151+ mapper = self .get_object (id )["mapper" ]
152+ mapper .ScalarVisibilityOff ()
153+ actor = self .get_object (id )["actor" ]
154+ actor .GetProperty ().SetColor (color )
155+ self .render ()
156+
157+ def SetEdgeVisibility (self , params ):
158+ print (f"{ params = } " , flush = True )
159+ validate_schema (params , schemas_dict ["set_edge_visibility" ])
160+ id = params ["id" ]
161+ visibility = bool (params ["visibility" ])
162+ actor = self .get_object (id )["actor" ]
163+ actor .GetProperty ().SetEdgeVisibility (visibility )
164+ self .render ()
165+
166+ def SetVertexVisibility (self , params ):
167+ print (f"{ params = } " , flush = True )
168+ validate_schema (params , schemas_dict ["set_vertex_visility" ])
169+ id = params ["id" ]
170+ visibility = bool (params ["visibility" ])
171+ actor = self .get_object (id )["actor" ]
172+ actor .GetProperty ().SetVertexVisibility (visibility )
173+ self .render ()
174+
175+ def SetPointSize (self , params ):
176+ validate_schema (params , schemas_dict ["set_point_size" ])
177+ id = params ["id" ]
178+ size = float (params ["size" ])
179+ actor = self .get_object (id )["actor" ]
180+ actor .GetProperty ().SetPointSize (size )
181+ self .render ()
0 commit comments