From f912d039022d467261402330a7ecbe747e23950f Mon Sep 17 00:00:00 2001 From: Pierre Gibertini Date: Wed, 22 Jul 2026 20:55:52 +0200 Subject: [PATCH] feat(knapsack): use the new volmdlr GLB viewer + require volmdlr>=0.22.2 - pyproject: require volmdlr>=0.22.2. - add a @volmdlr_view (model.json v2.6 + GLB) display to each class, alongside the existing @cad_view (Babylon). Import VolumeModel from volmdlr.model (the display-capable class in 0.22.2; volmdlr.core.VolumeModel is a stub) and name it with the object name so the viewer tree root shows it. - KnapsackPackage.volmdlr_primitives: delegate to self.items (an Items wrapper) anchored at "{reference_path}/items", so item paths resolve as #/items/items/{i} via get_in_object_from_path (were #/items/{i}, which hit the Items wrapper and failed). Geometry unchanged. reference_path is threaded through volmdlr_primitives and the export root. https://claude.ai/code/session_01MkzWt77anKrfiZb7Te7syn --- pyproject.toml | 4 ++-- src/tutorials/knapsack_problem.py | 40 ++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 23358fa..e04e4f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,9 +10,9 @@ authors = [ ] requires-python = ">=3.12" dependencies = [ - "dessia_common>=1.0.0rc1" + "dessia_common>=1.0.0rc1", # "plot_data", - # "volmdlr>=0.18.0" + "volmdlr>=0.22.2" ] dynamic = ["version"] diff --git a/src/tutorials/knapsack_problem.py b/src/tutorials/knapsack_problem.py index 6cd2d93..47b89dd 100644 --- a/src/tutorials/knapsack_problem.py +++ b/src/tutorials/knapsack_problem.py @@ -6,12 +6,12 @@ from dessia_common.models.core import Model from dessia_common.files import BinaryFile from datatools.dataset import Dataset -from dessia_common.decorators import cad_view, plot_data_view, markdown_view +from dessia_common.decorators import cad_view, volmdlr_view, plot_data_view, markdown_view from dessia_common.models.decorators import modelclass, model_property from plot_data import PrimitiveGroup, SurfaceStyle, Text, TextStyle from plot_data.colors import BLACK, Color from volmdlr import O3D, X3D, Y3D, Z3D, Frame3D, Point2D -from volmdlr.core import VolumeModel +from volmdlr.model import VolumeModel from volmdlr.shapes import Solid import volmdlr.step as vms from volmdlr.wires import ClosedPolygon2D @@ -71,6 +71,11 @@ def volmdlr_primitives(self, z_offset: float = 0., reference_path: str = "#", ** def cadview(self, reference_path: str = "#"): return VolumeModel(self.volmdlr_primitives(reference_path=reference_path)).babylon_data() + @volmdlr_view("Item view") + def volmdlr_view(self, reference_path: str = "#") -> str: + return VolumeModel(self.volmdlr_primitives(reference_path=reference_path), name=self.name).volmdlr_view( + reference_path=reference_path) + @plot_data_view("2D display for Item") def display_2d(self, y_offset: float = 0., reference_path: str = "#"): contour = ClosedPolygon2D([ @@ -154,6 +159,11 @@ def volmdlr_primitives(self, z_offset: float = 0., reference_path: str = "#", ** def cadview(self, reference_path: str = "#"): return VolumeModel(self.volmdlr_primitives(reference_path=reference_path)).babylon_data() + @volmdlr_view("Item view") + def volmdlr_view(self, reference_path: str = "#") -> str: + return VolumeModel(self.volmdlr_primitives(reference_path=reference_path), name=self.name).volmdlr_view( + reference_path=reference_path) + @plot_data_view("2D display for Item") def display_2d(self, y_offset: float = 0., reference_path: str = "#"): contour = ClosedPolygon2D([ @@ -210,6 +220,11 @@ def volmdlr_primitives(self, reference_path: str = "#", **kwargs): def cadview(self, reference_path: str = "#"): return VolumeModel(self.volmdlr_primitives(reference_path=reference_path)).babylon_data() + @volmdlr_view("Knapsack view") + def volmdlr_view(self, reference_path: str = "#") -> str: + return VolumeModel(self.volmdlr_primitives(reference_path=reference_path), name=self.name).volmdlr_view( + reference_path=reference_path) + @plot_data_view("2D display for KnapsackPackage") def display_2d(self, reference_path: str = "#"): primitives = [] @@ -264,6 +279,11 @@ def from_step_stream(cls, file_component: BinaryFile) -> Knapsack: def cadview(self, reference_path: str = "#"): return VolumeModel(self.volmdlr_primitives(reference_path=reference_path)).babylon_data() + @volmdlr_view("Knapsack view") + def volmdlr_view(self, reference_path: str = "#") -> str: + return VolumeModel(self.volmdlr_primitives(reference_path=reference_path), name=self.name).volmdlr_view( + reference_path=reference_path) + @modelclass class KnapsackPackage(Knapsack): """ @@ -299,18 +319,20 @@ def golds(self) -> int: return len([i for i in self.items.items if i.color == "gold"]) def volmdlr_primitives(self, reference_path: str = "#"): - knapsack_primitives = Knapsack.volmdlr_primitives(self, reference_path=reference_path) - z_offset = 0 - for i, item in enumerate(self.items.items): - item_primitives = item.volmdlr_primitives(z_offset=z_offset, reference_path=f"{reference_path}/items/{i}") - knapsack_primitives.extend(item_primitives) - z_offset += item.mass / 2 + 0.05 - return knapsack_primitives + # self.items is an Items wrapper -> anchor one level deeper so item paths resolve. + primitives = Knapsack.volmdlr_primitives(self, reference_path=reference_path) + primitives += self.items.volmdlr_primitives(reference_path=f"{reference_path}/items") + return primitives @cad_view("Knapsack Package CAD") def cadview(self, reference_path: str = "#"): return VolumeModel(self.volmdlr_primitives(reference_path=reference_path)).babylon_data() + @volmdlr_view("Knapsack Package view") + def volmdlr_view(self, reference_path: str = "#") -> str: + return VolumeModel(self.volmdlr_primitives(reference_path=reference_path), name=self.name).volmdlr_view( + reference_path=reference_path) + @plot_data_view("2D display for KnapsackPackage", picture=True) def display_2d(self): primitives = []