Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ac35e89
adding imports fix in mypy.ini
MaxNumerique Jan 6, 2026
1d65aec
Apply prepare changes
MaxNumerique Jan 6, 2026
ac26221
type vtk
MaxNumerique Jan 6, 2026
1e25cf5
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 6, 2026
aebde42
Apply prepare changes
MaxNumerique Jan 6, 2026
54ff411
reapply type ignore for exportRpc
MaxNumerique Jan 6, 2026
889af84
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 6, 2026
b3724ab
mypy.ini restored
MaxNumerique Jan 6, 2026
5177649
type ignore restored
MaxNumerique Jan 6, 2026
69051fa
Apply prepare changes
MaxNumerique Jan 6, 2026
e498e02
vtkw_server typed kinda
MaxNumerique Jan 6, 2026
96c441e
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 6, 2026
98e77f1
Apply prepare changes
MaxNumerique Jan 6, 2026
57178c4
commit
MaxNumerique Jan 6, 2026
5c0e35a
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 6, 2026
03ab993
revert exportRpc type ignore and fixed vtkw_server
MaxNumerique Jan 7, 2026
ba2fb1b
Apply prepare changes
MaxNumerique Jan 7, 2026
f44b149
forgot one exportrpc
MaxNumerique Jan 7, 2026
cb39219
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 7, 2026
fc10d31
revert conftest
MaxNumerique Jan 7, 2026
80706bf
Apply prepare changes
MaxNumerique Jan 7, 2026
b119616
fix(lint): fix some types
MaxNumerique Jan 7, 2026
d2f7abc
Merge branch 'fix/type_checker' of https://github.com/Geode-solutions…
MaxNumerique Jan 7, 2026
ae944df
type ignore fastjsonschema
MaxNumerique Jan 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,3 @@ wslink==1.12.4
yarl>=1
# via aiohttp

opengeodeweb-microservice==1.*,>=1.0.11
5 changes: 3 additions & 2 deletions src/opengeodeweb_viewer/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ def dev_config() -> None:
os.environ["DATA_FOLDER_PATH"] = os.path.join(
"C:/Users", os.getlogin(), "OpenGeodeWeb_Data"
)
if not os.path.exists(os.environ.get("DATA_FOLDER_PATH")):
os.mkdir(os.environ.get("DATA_FOLDER_PATH"))
data_folder_path = os.environ.get("DATA_FOLDER_PATH")
if data_folder_path and not os.path.exists(data_folder_path):
os.mkdir(data_folder_path)


def _copy_test_assets(
Expand Down
29 changes: 21 additions & 8 deletions src/opengeodeweb_viewer/object/object_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@
# Third party imports
from vtkmodules.vtkIOXML import vtkXMLDataReader, vtkXMLImageDataReader
from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm
from vtkmodules.vtkRenderingCore import vtkMapper, vtkActor, vtkTexture
from vtkmodules.vtkCommonDataModel import vtkDataObject
from vtkmodules.vtkRenderingCore import (
vtkMapper,
vtkActor,
vtkTexture,
vtkCompositePolyDataMapper,
)
from vtkmodules.vtkCommonDataModel import vtkDataObject, vtkDataSet

# Local application imports
from opengeodeweb_viewer.vtk_protocol import VtkView, vtkData
Expand All @@ -32,8 +37,10 @@ def registerObject(
renderWindow = self.getView("-1")
renderer = renderWindow.GetRenderers().GetFirstRenderer()
resetCamara = True
for registered_actor in renderer.GetActors():
if registered_actor.visibility == True:
actors = renderer.GetActors()
actors.InitTraversal()
while actor := actors.GetNextItem():
if actor.visibility == True:
resetCamara = False
renderer.AddActor(data.actor)
if resetCamara:
Expand Down Expand Up @@ -104,20 +111,26 @@ def SetBlocksVisibility(
self, data_id: str, block_ids: list[int], visibility: bool
) -> None:
mapper = self.get_object(data_id).mapper
if not isinstance(mapper, vtkCompositePolyDataMapper):
raise Exception("Mapper is not a vtkCompositePolyDataMapper")
for block_id in block_ids:
mapper.SetBlockVisibility(block_id, visibility)

def SetBlocksColor(
self, data_id: str, block_ids: list[int], red: int, green: int, blue: int
) -> None:
mapper = self.get_object(data_id).mapper
if not isinstance(mapper, vtkCompositePolyDataMapper):
raise Exception("Mapper is not a vtkCompositePolyDataMapper")
for block_id in block_ids:
mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255])

def clearColors(self, data_id: str) -> None:
db = self.get_object(data_id)
mapper = db["mapper"]
reader = db["reader"]
reader.GetOutput().GetPointData().SetActiveScalars("")
reader.GetOutput().GetCellData().SetActiveScalars("")
mapper = db.mapper
reader = db.reader
output = reader.GetOutputDataObject(0)
if isinstance(output, vtkDataSet):
output.GetPointData().SetActiveScalars("")
output.GetCellData().SetActiveScalars("")
mapper.ScalarVisibilityOff()
1 change: 0 additions & 1 deletion src/opengeodeweb_viewer/py.typed
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
partial
8 changes: 4 additions & 4 deletions src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None:
if texture_data is None:
continue
texture_file = texture_data.viewable_file
if not texture_file.lower().endswith(".vti"):
if texture_file is None or not texture_file.lower().endswith(".vti"):
continue
texture_file_path = self.get_data_file_path(texture_id)
texture_reader = vtkXMLImageDataReader()
Expand All @@ -119,7 +119,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None:
texture.SetInputConnection(texture_reader.GetOutputPort())
texture.InterpolateOn()
reader = self.get_object(mesh_id).reader
output = reader.GetOutput()
output = reader.GetOutputAsDataSet()
point_data = output.GetPointData()
for i in range(point_data.GetNumberOfArrays()):
array = point_data.GetArray(i)
Expand All @@ -131,7 +131,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None:

def displayAttributeOnVertices(self, data_id: str, name: str) -> None:
reader = self.get_object(data_id).reader
points = reader.GetOutput().GetPointData()
points = reader.GetOutputAsDataSet().GetPointData()
points.SetActiveScalars(name)
mapper = self.get_object(data_id).mapper
mapper.ScalarVisibilityOn()
Expand All @@ -140,7 +140,7 @@ def displayAttributeOnVertices(self, data_id: str, name: str) -> None:

def displayAttributeOnCells(self, data_id: str, name: str) -> None:
reader = self.get_object(data_id).reader
cells = reader.GetOutput().GetCellData()
cells = reader.GetOutputAsDataSet().GetCellData()
cells.SetActiveScalars(name)
mapper = self.get_object(data_id).mapper
mapper.ScalarVisibilityOn()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os

# Third party imports
from wslink import register as exportRpc
from wslink import register as exportRpc # type: ignore
from opengeodeweb_microservice.schemas import get_schemas_dict

# Local application imports
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkMeshPolygonsView(VtkMeshView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(mesh_polygons_prefix + mesh_polygons_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkMeshPolyhedraView(VtkMeshView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(mesh_polyhedra_prefix + mesh_polyhedra_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelBlocksView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_blocks_prefix + model_blocks_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelCornersView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_corners_prefix + model_corners_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelEdgesView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_edges_prefix + model_edges_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelLinesView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_lines_prefix + model_lines_schemas_dict["visibility"]["rpc"])
Expand Down
2 changes: 1 addition & 1 deletion src/opengeodeweb_viewer/rpc/model/model_protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class VtkModelView(VtkObjectView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_prefix + model_schemas_dict["register"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelPointsView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_points_prefix + model_points_schemas_dict["visibility"]["rpc"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class VtkModelSurfacesView(VtkModelView):
os.path.join(os.path.dirname(__file__), "schemas")
)

def __init__(self):
def __init__(self) -> None:
super().__init__()

@exportRpc(model_surfaces_prefix + model_surfaces_schemas_dict["visibility"]["rpc"])
Expand Down
21 changes: 14 additions & 7 deletions src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Standard library imports
import math
import os
from typing import cast, Any

# Third party imports
from wslink import register as exportRpc # type: ignore
Expand All @@ -15,7 +16,7 @@
)
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackball
from vtkmodules.vtkCommonCore import reference
from vtkmodules.vtkCommonDataModel import vtkBoundingBox
from vtkmodules.vtkCommonDataModel import vtkBoundingBox, vtkDataSet
from vtkmodules.vtkCommonTransforms import vtkTransform
from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget
from opengeodeweb_microservice.schemas import get_schemas_dict
Expand Down Expand Up @@ -140,6 +141,7 @@ def takeScreenshot(self, rpc_params: RpcParams) -> dict[str, str | bytes]:
w2if.ReadFrontBufferOff()
w2if.Update()
output_extension = params.output_extension
writer: vtkPNGWriter | vtkJPEGWriter
if output_extension == schemas.OutputExtension.PNG:
writer = vtkPNGWriter()
elif output_extension == schemas.OutputExtension.JPG:
Expand Down Expand Up @@ -167,12 +169,16 @@ def updateData(self, rpc_params: RpcParams) -> None:
)
params = schemas.UpdateData.from_dict(rpc_params)
data = self.get_object(params.id)
reader = data["reader"]
reader = data.reader
reader.Update()
mapper = data["mapper"]
tag = reference(0)
mapper = data.mapper
tag: Any = reference(0)
output = reader.GetOutputDataObject(0)
if not isinstance(output, vtkDataSet):
raise Exception("Output is not a vtkDataSet")

scalars = vtkAbstractMapper.GetAbstractScalars(
reader.GetOutput(),
output,
mapper.GetScalarMode(),
mapper.GetArrayAccessMode(),
mapper.GetArrayId(),
Expand Down Expand Up @@ -203,7 +209,7 @@ def computeEpsilon(self, renderer: vtkRenderer, z: float) -> float:
renderer.SetDisplayPoint(size[0], size[1], z)
renderer.DisplayToWorld()
windowUpperRight = renderer.GetWorldPoint()
epsilon = 0
epsilon: float = 0.0
for i in range(3):
epsilon += (windowUpperRight[i] - windowLowerLeft[i]) * (
windowUpperRight[i] - windowLowerLeft[i]
Expand All @@ -229,7 +235,8 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str]]:
array_ids = []
for id in params.ids:
bounds = self.get_object(id).actor.GetBounds()
if bbox.Intersects(bounds):
bounds_box = vtkBoundingBox(bounds)
if bbox.Intersects(bounds_box):
array_ids.append(id)

return {"array_ids": array_ids}
Expand Down
16 changes: 15 additions & 1 deletion src/opengeodeweb_viewer/vtk_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@
from vtkmodules.vtkIOXML import (
vtkXMLReader,
)
from vtkmodules.vtkWebCore import vtkWebApplication
from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkMapper,
vtkRenderer,
vtkRenderWindow,
vtkCompositePolyDataMapper,
)
from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor
from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget
Expand All @@ -34,7 +37,18 @@ class vtkData:
)


class VtkView(vtk_protocols.vtkWebProtocol):
class VtkTypingMixin:
def getView(self, view_id: str) -> vtkRenderWindow:
return cast(vtkRenderWindow, super().getView(view_id)) # type: ignore

def registerVtkWebProtocol(self, protocol: Any) -> None:
super().registerVtkWebProtocol(protocol) # type: ignore

def getApplication(self) -> vtkWebApplication:
return cast(vtkWebApplication, super().getApplication()) # type: ignore


class VtkView(VtkTypingMixin, vtk_protocols.vtkWebProtocol):
def __init__(self) -> None:
super().__init__()
self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH", ".")
Expand Down
20 changes: 11 additions & 9 deletions src/opengeodeweb_viewer/vtkw_server.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
# Standard library imports
import argparse
import os
from typing import Any, cast, Protocol, runtime_checkable

# Third party imports
from vtkmodules.web import wslink as vtk_wslink
from vtkmodules.web.wslink import ServerProtocol
from vtkmodules.web import protocols as vtk_protocols
from wslink import server # type: ignore
from vtkmodules.vtkWebCore import vtkWebApplication
from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow
from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow
from opengeodeweb_microservice.database import connection

# Local application imports
from .config import *
from .vtk_protocol import VtkView
from .vtk_protocol import VtkView, VtkTypingMixin
from .rpc.viewer.viewer_protocols import VtkViewerView
from .rpc.mesh.mesh_protocols import VtkMeshView
from .rpc.mesh.points.mesh_points_protocols import VtkMeshPointsView
Expand Down Expand Up @@ -48,30 +50,30 @@
# =============================================================================


class _Server(vtk_wslink.ServerProtocol):
class _Server(VtkTypingMixin, ServerProtocol):
# Defaults
authKey = "wslink-secret"
view = None
debug = False

@staticmethod
def add_arguments(parser):
def add_arguments(parser: argparse.ArgumentParser) -> None:
parser.add_argument(
"--data_folder_path",
default=os.environ.get("DATA_FOLDER_PATH"),
help="Path to the folder where data is stored",
)

@staticmethod
def configure(args):
def configure(args: argparse.Namespace) -> None:
# Standard args
_Server.authKey = args.authKey

def initialize(self):
def initialize(self) -> None:
# Bring used components
self.registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler())
self.registerVtkWebProtocol(vtk_protocols.vtkWebViewPort())
publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False)
publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) # type: ignore
publisher.deltaStaleTimeBeforeRender = 0.1
self.registerVtkWebProtocol(publisher)
self.setSharedObject("db", dict())
Expand All @@ -87,7 +89,7 @@ def initialize(self):
self.registerVtkWebProtocol(mesh_protocols)
self.registerVtkWebProtocol(VtkMeshPointsView())
self.registerVtkWebProtocol(VtkMeshEdgesView())
self.registerVtkWebProtocol(VtkMeshCellsView()) # type: ignore
self.registerVtkWebProtocol(VtkMeshCellsView())
self.registerVtkWebProtocol(VtkMeshPolygonsView())
self.registerVtkWebProtocol(VtkMeshPolyhedraView())
self.registerVtkWebProtocol(model_protocols)
Expand Down Expand Up @@ -126,7 +128,7 @@ def initialize(self):
# =============================================================================


def run_server(Server=_Server):
def run_server(Server: type[ServerProtocol] = _Server) -> None:
PYTHON_ENV = os.environ.get("PYTHON_ENV", default="prod").strip().lower()
if PYTHON_ENV == "prod":
prod_config()
Expand Down
Loading