diff --git a/requirements.txt b/requirements.txt index 5750c62..13efd77 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.1.1 diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index 4fb092a..4b6d513 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -18,7 +18,7 @@ vtkRenderWindow, vtkCompositePolyDataMapper, ) -from vtkmodules.vtkCommonDataModel import vtkDataObject +from vtkmodules.vtkCommonDataModel import vtkDataObject, vtkBoundingBox from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget @@ -122,12 +122,36 @@ def get_data_file_path(self, data_id: str, filename: str | None = None) -> str: def get_renderer(self) -> vtkRenderer: return cast(vtkRenderer, self.getSharedObject("renderer")) - def render(self, view: int = -1) -> None: + def reset_camera_clipping_range(self) -> None: + renderer = self.get_renderer() + grid_scale = self.get_grid_scale() + if grid_scale is not None and grid_scale.GetVisibility(): + grid_scale.SetUseBounds(True) + renderer.ResetCameraClippingRange() + grid_scale.SetUseBounds(False) + else: + renderer.ResetCameraClippingRange() + + def update_grid_scale_and_clipping_range(self) -> None: grid_scale = self.get_grid_scale() if grid_scale is not None: renderer = self.get_renderer() - renderer_bounds = renderer.ComputeVisiblePropBounds() - grid_scale.SetBounds(renderer_bounds) + bounds = vtkBoundingBox() + props = renderer.GetViewProps() + props.InitTraversal() + prop = props.GetNextProp() + while prop: + if prop.GetUseBounds() and prop != grid_scale: + bounds.AddBounds(prop.GetBounds()) + prop = props.GetNextProp() + if bounds.IsValid(): + final_bounds = [0.0] * 6 + bounds.GetBounds(final_bounds) + grid_scale.SetBounds(final_bounds) + self.reset_camera_clipping_range() + + def render(self, view: int = -1) -> None: + self.update_grid_scale_and_clipping_range() self.getSharedObject("publisher").imagePush({"view": view}) def register_object(self, id: str, data: VtkPipeline) -> None: diff --git a/tests/data/images/viewer/combined_scaling_and_grid.jpeg b/tests/data/images/viewer/combined_scaling_and_grid.jpeg index 9b7af6c..d5f1540 100644 Binary files a/tests/data/images/viewer/combined_scaling_and_grid.jpeg and b/tests/data/images/viewer/combined_scaling_and_grid.jpeg differ diff --git a/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg b/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg index 6dbaab1..f460a12 100644 Binary files a/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg and b/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg differ