From 74ebebce541bbc0ef1acbf5e9582b200771496ce Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 14:36:13 +0200 Subject: [PATCH 1/8] feat(ferrispline): add ferrispline submodule --- .gitmodules | 3 +++ ferrispline | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 ferrispline diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f0c7960 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ferrispline"] + path = ferrispline + url = https://github.com/LIHPC-Computational-Geometry/ferrispline diff --git a/ferrispline b/ferrispline new file mode 160000 index 0000000..22179a0 --- /dev/null +++ b/ferrispline @@ -0,0 +1 @@ +Subproject commit 22179a0397eb61a8ddf86db7650c44efc9a6ab36 From 5cca7eebd409c9c92915e19fef659de199dce17a Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 14:58:39 +0200 Subject: [PATCH 2/8] chore(wheel): delete wheels compilation, compilate from submodule --- .github/workflows/lint.yml | 7 ++++++- .github/workflows/tests.yml | 7 ++++++- README.md | 3 ++- pyproject.toml | 6 ++---- ...b-0.1.0-cp39-abi3-manylinux_2_34_x86_64.whl | Bin 345251 -> 0 bytes 5 files changed, 16 insertions(+), 7 deletions(-) delete mode 100644 wheel/nurbslib-0.1.0-cp39-abi3-manylinux_2_34_x86_64.whl diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d448594..4f7e91f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,6 +7,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + submodules: true # for gmsh and panda3D - name: Install system graphics dependencies @@ -14,6 +16,9 @@ jobs: sudo apt-get update sudo apt-get install -y libglu1-mesa libgl1-mesa-dev libosmesa6 + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + - name: Install uv uses: astral-sh/setup-uv@v3 @@ -21,7 +26,7 @@ jobs: run: uv python install - name: Install dependencies - run: uv sync --all-extras --dev --find-links wheel/ + run: uv sync --all-extras --dev - name: Run Ruff Check # Vérifie les erreurs de code et de logique diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b6bf54a..f2504f1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,6 +7,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + submodules: true # for gmsh and panda3D - name: Install system graphics dependencies @@ -14,6 +16,9 @@ jobs: sudo apt-get update sudo apt-get install -y libglu1-mesa libgl1-mesa-dev libosmesa6 + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + - name: Install uv uses: astral-sh/setup-uv@v3 @@ -21,7 +26,7 @@ jobs: run: uv python install - name: Install dependencies - run: uv sync --all-extras --dev --find-links wheel/ + run: uv sync --all-extras --dev - name: Run tests with coverage # On génère un rapport XML pour Codecov diff --git a/README.md b/README.md index 95986e2..89688f1 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ We use [uv](https://docs.astral.sh/uv/) for all dependency and environment manag ### 1. Clone and set up ```bash -git clone https://github.com/franck-ledoux/bot.git +git clone --recurse-submodules https://github.com/franck-ledoux/bot.git cd bot uv sync # creates .venv and installs all production + dev dependencies ``` @@ -193,6 +193,7 @@ bot/ │ └── viewer/ │ ├── viewer.py # Viewer — public API, manages the subprocess │ └── app.py # ViewerApp — Panda3D ShowBase (runs in subprocess) +|── ferrispline/ # Submodule library for generating, manipulating and computing hexahedral meshes ├── tests/ │ ├── unit/ # Isolated class tests (no display required) │ └── system/ # End-to-end workflow tests diff --git a/pyproject.toml b/pyproject.toml index 1ef49c3..2d0b704 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,10 +15,8 @@ dependencies = [ [tool.uv] package = true -# FIXME: will be change, using a path like this isn't good -# NOTE For find nurbslib in the folder wheel, you can run "uv sync --find-links wheel" -# [tool.uv.sources] -# nurbslib = { path = "../vtk_converter/nurbslib", editable = true } +[tool.uv.sources] +nurbslib = { path = "ferrispline/nurbslib" } [build-system] requires = ["hatchling"] diff --git a/wheel/nurbslib-0.1.0-cp39-abi3-manylinux_2_34_x86_64.whl b/wheel/nurbslib-0.1.0-cp39-abi3-manylinux_2_34_x86_64.whl deleted file mode 100644 index c3c2ad667aef737e7ab326d76b6b4c7a9a28bdef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345251 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�AoRBit3m|lc?jz26=qCz`pksy=a`Kz-lyy;ZF96Hly@*;vWXpIV&lv{Kyk%7~t*f4_C2`H9iBM>_ zQX2KIBg#tB>fjO{BJVVI!+HCa&C@z`y1{w;$&wcM6!=N}mtayBzLAPK59+bJWkzvD z^VMlzrFD!#+ZY##YMPlpcEAst?Vgb3o{-_5km8=ePx9L&ohQ7r4AODTpYBw;sfN(s zhAT2C97nA;BAle(BUY1MrQO~O0)p|oUR#TTI*LhfX3(2j!|8W*3sJ3#80%taCn}#4 z1pZ+jwOk;qlK_nNd}UF(O-i^&uBY!x;dE)b22VNdj-0Noh6nO_HCLW6z^X-Z=;VMP z77%Q1aa*be9&8SZpHN+vzO*mzV11A3vu{klgu;-xl!-1r^%ku8f#p$#e<1Qu%K4)& z=4f`-1a>W|G8vXp*Gyv5wlud^ZEP*WkO_8HUocr%KyfO40}B@>DQ%GV%kQrO(tRaJ z0WB!jTl3Uf!i(8I8bBlVG8NE+#%)4W4iDqm@t2j?9$A=L{UmZp( zpG2{r`!`JDzjpi%SM3!tRtuCx(~~em#8{$Y4=or{fD1eZ8aP+E*3j)B))TM8H&%0J z*n`Y!LkvytjOB;YE(A&+N!v?Zj^2z673V-U9`Reg8L{PMxQ98vKTty|Zc+_T&3WBD zLze~?uxo2R(nZSdsTG0)PuGSUn(TMW;KDhQs%JOa@0_pjNhHoDqCp;h+v{(0!>MnW` zD*{(lAh}Lapaj(UMAT?~h;d*G>NXxQ_h53ZZKbAIi=8qQ z7On|BCk(?qRZSNqr77%Jm45g?rYHyHh2?JadDMUvI;tGW%4!|h0eMFYdTQyXE zbLRcx&;rUeitZC$%P4_dw7aXk2S%l-MGKC!`}tr`*ml zdAAo|vTAH;dgC?64e9j@p!Hw{2e55s&=$Nh_l4a zLiKNpK-ZFD!~VY%F(Vi|$O>6d2OD@D14K%P@0m3)zSBc!eNWmBbK1?85M&Vt3bm!qAA36~a!(+3xRITa4-|v8}q}pby=fu)#`7gquFsgq+HkH^7knOlJ=RJ{zj-Ty&fBx87Yaof2 zzvnCMrbE<{ZGw{9B~*JYfjqiZPE(R-d#^pJeRptjJ!syr9g6mU9p~8W_Cupc;gv@D z_mF3MoDA1}Oo-r4b7X%b-F(Dc{JF~db7ci}_+=n)#ot_#>qH2MnFWvB-sLNSn(R?s zd5o?M
  • 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

    doEGSPeR=YKiLpUj0d(g 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

    0g-ASY0 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 E03|reD*ylh From 80370b1ec5b3a6b95fcb1536baca7abbd2a63fa1 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 15:10:04 +0200 Subject: [PATCH 3/8] chore(.github): workflow optimisation, using caches --- .github/workflows/lint.yml | 8 ++++++++ .github/workflows/tests.yml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4f7e91f..0b07fbd 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,8 +19,16 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable + - name: Cache Rust + uses: Swatinem/rust-cache@v2 + with: + workspaces: "ferrispline" + - name: Install uv uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" - name: Set up Python run: uv python install diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f2504f1..4ba47b5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,8 +19,16 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable + - name: Cache Rust + uses: Swatinem/rust-cache@v2 + with: + workspaces: "ferrispline" + - name: Install uv uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" - name: Set up Python run: uv python install From 0cf1ad77f3f80c00d2631ecf931b3db8485b5f92 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 15:19:40 +0200 Subject: [PATCH 4/8] fix(ci): fix bad unit test + add ruff dependencie + update checkout action v4 to v5 --- .github/workflows/lint.yml | 2 +- .github/workflows/tests.yml | 2 +- pyproject.toml | 1 + tests/unit/test_viewer/test_viewer.py | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0b07fbd..ca4d6ef 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,7 +6,7 @@ jobs: ruff: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: submodules: true diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4ba47b5..dd2e296 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,7 +6,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: submodules: true diff --git a/pyproject.toml b/pyproject.toml index 2d0b704..d72605f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ dev = [ "pdoc>=16.0.0", "pytest>=9.0.2", "pytest-cov>=7.0.0", + "ruff", ] [tool.pytest.ini_options] diff --git a/tests/unit/test_viewer/test_viewer.py b/tests/unit/test_viewer/test_viewer.py index d1a4892..ece8ebf 100644 --- a/tests/unit/test_viewer/test_viewer.py +++ b/tests/unit/test_viewer/test_viewer.py @@ -263,8 +263,8 @@ def test_bezier_conversion_success(self, MockBezierCurve): # Assertions viewer.model.get_end_points_coords.assert_called_once_with(42) MockBezierCurve._default_control_points.assert_called_once_with(coords_a, coords_b, degree) - MockBezierCurve.assert_called_once_with("42", MockBezierCurve._default_control_points.return_value, degree) - viewer.model.set_curve.assert_called_once_with("42", mock_curve_instance) + MockBezierCurve.assert_called_once_with(42, MockBezierCurve._default_control_points.return_value, degree) + viewer.model.set_curve.assert_called_once_with(42, mock_curve_instance) def test_bezier_conversion_no_selection(self): """Verifies behavior if no curve is selected/hovered.""" From 27a41ddeb3d25c7cb15d0959652caabaf8007259 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 16:02:50 +0200 Subject: [PATCH 5/8] chore: standardize code style and update project dependencies Applies project-wide formatting and cleans up the dependency stack including submodules and library versions for better maintainability. - Standardizes formatting and string quotes across all files - Updates pyproject.toml and uv.lock with new library requirements - Bumps ferrispline submodule version - Removes wildcard imports in package initializers - Refactors camera and CAD logic for better safety and consistency --- bot/__init__.py | 2 +- bot/control/__init__.py | 4 +- bot/control/camera.py | 80 +-- bot/control/keyboard.py | 69 +- bot/control/mouse.py | 136 ++-- bot/core/__init__.py | 3 - bot/core/cad.py | 137 ++-- bot/core/curve.py | 17 +- bot/view/__init__.py | 2 - bot/view/curve_app.py | 62 +- bot/view/scene.py | 103 +-- bot/viewer/__init__.py | 2 +- bot/viewer/app.py | 66 +- bot/viewer/viewer.py | 88 +-- ferrispline | 2 +- pyproject.toml | 5 + tests/system/test_cad_workflow.py | 46 +- tests/system/test_model_viewer_pipeline.py | 29 +- tests/system/test_viewer_subprocess.py | 8 +- tests/unit/test_cad/test_model.py | 30 +- .../test_mouse_axis_constraint.py | 9 +- .../test_control/test_mouse_drag_session.py | 1 + tests/unit/test_curve/test_bezier-curve.py | 38 +- tests/unit/test_geom/test_geom.py | 11 +- tests/unit/test_utils/test_color_generator.py | 3 +- tests/unit/test_view/test_scene_axis_guide.py | 1 + tests/unit/test_viewer/test_viewer.py | 98 ++- uv.lock | 598 +++++++++++++++++- 28 files changed, 1200 insertions(+), 450 deletions(-) diff --git a/bot/__init__.py b/bot/__init__.py index 8de0e48..adae8b6 100644 --- a/bot/__init__.py +++ b/bot/__init__.py @@ -24,4 +24,4 @@ CADModel = None Model = CADModel -__all__ = ['core', 'control', 'view', 'viewer', 'Model', 'Viewer'] +__all__ = ["core", "control", "view", "viewer", "Model", "Viewer"] diff --git a/bot/control/__init__.py b/bot/control/__init__.py index 52ee808..d327a7b 100644 --- a/bot/control/__init__.py +++ b/bot/control/__init__.py @@ -1,6 +1,4 @@ """ -Control module: This submodule of bot gathers classes and functions for controling the view module and make the link +Control module: This submodule of bot gathers classes and functions for controling the view module and make the link between the view and the model """ - -from . import * diff --git a/bot/control/camera.py b/bot/control/camera.py index de44bde..4d40827 100644 --- a/bot/control/camera.py +++ b/bot/control/camera.py @@ -1,6 +1,7 @@ from panda3d.core import LPoint3, LVector3, OrthographicLens, LineSegs, NodePath from direct.interval.IntervalGlobal import Parallel, LerpFunc, Sequence, Func + class CameraController: """ Orthographic camera controller for the 3D view. @@ -11,7 +12,7 @@ class CameraController: ``cmd_zoom``, ``cmd_center`` and ``cmd_align_plane``. """ - #TODO: check settings maybe a configuration error + # TODO: check settings maybe a configuration error def __init__(self, base, scene, settings): """ Set up the orthographic camera and its node hierarchy. @@ -51,11 +52,10 @@ def __init__(self, base, scene, settings): self.key_pan_speed = 2.0 # Task pour maintenir le marqueur et le gizmo - taskMgr.add(self.update_task, "CameraUpdateTask") + self.taskMgr.add(self.update_task, "CameraUpdateTask") # Configure la camera par rapport au contenu de la scene self.refresh_scene() - def refresh_scene(self): """ Recompute camera parameters from the current scene geometry. @@ -67,7 +67,8 @@ def refresh_scene(self): bounds = self.scene.geom_node.getBounds() center = bounds.getCenter() radius = bounds.getRadius() - if radius <= 0: radius = 1 # Sécurité si modèle vide + if radius <= 0: + radius = 1 # Sécurité si modèle vide # 2. Positionner le pivot au centre de l'objet self.focal_node.setPos(center) @@ -100,10 +101,12 @@ def create_marker(self): """ ls = LineSegs() ls.setThickness(2) - for i, col in enumerate([(1,0,0,1), (0,1,0,1), (0,0,1,1)]): + for i, col in enumerate([(1, 0, 0, 1), (0, 1, 0, 1), (0, 0, 1, 1)]): ls.setColor(col) - v = LVector3(0,0,0); v[i] = 0.5 - ls.moveTo(0,0,0); ls.drawTo(v) + v = LVector3(0, 0, 0) + v[i] = 0.5 + ls.moveTo(0, 0, 0) + ls.drawTo(v) return NodePath(ls.create()) def handle_rotate(self, dx, dy): @@ -114,7 +117,8 @@ def handle_rotate(self, dx, dy): dx: Normalised horizontal delta (screen space, -1..1). dy: Normalised vertical delta (screen space, -1..1). """ - if self.is_animating: return + if self.is_animating: + return sens = 100.0 new_h = self.focal_node.getH() - dx * sens new_p = self.focal_node.getP() + dy * sens @@ -131,7 +135,8 @@ def handle_pan(self, dx, dy): dx: Normalised horizontal delta (screen space, -1..1). dy: Normalised vertical delta (screen space, -1..1). """ - if self.is_animating: return + if self.is_animating: + return # Largeur de la vue actuelle fs = self.lens.getFilmSize().getX() @@ -155,7 +160,8 @@ def handle_zoom(self, factor): factor: Multiplier applied to the current film size (< 1 zooms in, > 1 zooms out). """ - if self.is_animating: return + if self.is_animating: + return # 1. Calculer la nouvelle taille de vue current_size = self.lens.getFilmSize().getX() @@ -180,21 +186,20 @@ def recenter(self): Only the pivot position is animated; rotation and zoom are left unchanged so the user keeps their current viewing angle. """ - if self.is_animating: return + if self.is_animating: + return self.is_animating = True # On récupère le centre réel de l'objet calculé dans analyze_model # target_pos est un LPoint3 (le centre géométrique du modèle) target_pos = self.model_center - duration = 0.4 # Un peu plus rapide pour un recadrage fluide + duration = 0.4 # Un peu plus rapide pour un recadrage fluide # On ne crée qu'UN SEUL intervalle : la position. # On ne touche NI au HPR (rotation) NI au FilmSize (zoom). self.cam_anim = self.focal_node.posInterval( - duration, - target_pos, - blendType='easeInOut' + duration, target_pos, blendType="easeInOut" ) # Séquence pour déverrouiller à la fin Sequence(self.cam_anim, Func(self._unlock)).start() @@ -214,14 +219,15 @@ def align_to_plane(self, axis): axis: One of ``"x"`` (right view), ``"y"`` (front view) or ``"z"`` (top view). """ - if self.is_animating: return + if self.is_animating: + return # 1. Définir les rotations cibles (Heading, Pitch, Roll) - if axis == "z": # Vue de dessus (Top) + if axis == "z": # Vue de dessus (Top) target_hpr = LPoint3(0, -90, 0) - elif axis == "y": # Vue de face (Front) + elif axis == "y": # Vue de face (Front) target_hpr = LPoint3(0, 0, 0) - elif axis == "x": # Vue de côté (Right) + elif axis == "x": # Vue de côté (Right) target_hpr = LPoint3(90, 0, 0) else: return @@ -229,28 +235,30 @@ def align_to_plane(self, axis): self.is_animating = True duration = 0.5 - # 2. Animation fluide de la rotation du pivot + # 2. Animation fluide de la rotation du pivot # On peut aussi combiner cela avec un recentrage automatique - center = LPoint3(*self.scene.bounds['center']) - max_dim = max(self.scene.bounds['size']) if max(self.scene.bounds['size']) > 0 else 1.0 + center = LPoint3(*self.scene.bounds["center"]) + max_dim = ( + max(self.scene.bounds["size"]) + if max(self.scene.bounds["size"]) > 0 + else 1.0 + ) self.transition = Parallel( # 1. Aligne la rotation sur l'axe demandé - self.focal_node.hprInterval(duration, target_hpr, blendType='easeInOut'), - + self.focal_node.hprInterval(duration, target_hpr, blendType="easeInOut"), # 2. Déplace le pivot vers le centre réel du modèle - self.focal_node.posInterval(duration, center, blendType='easeInOut'), - LerpFunc(lambda s: self.lens.setFilmSize(s), - fromData=self.lens.getFilmSize().getX(), - toData=max_dim * 1.5, - duration=duration, - blendType='easeInOut'), + self.focal_node.posInterval(duration, center, blendType="easeInOut"), + LerpFunc( + lambda s: self.lens.setFilmSize(s), + fromData=self.lens.getFilmSize().getX(), + toData=max_dim * 1.5, + duration=duration, + blendType="easeInOut", + ), ) # On lance et on déverrouille à la fin - Sequence( - self.transition, - Func(self._unlock) - ).start() + Sequence(self.transition, Func(self._unlock)).start() # Parallel( # self.focal_node.hprInterval(duration, target_hpr, blendType='easeInOut'), @@ -265,7 +273,6 @@ def align_to_plane(self, axis): # taskMgr.doMethodLater(duration, self._unlock, "UnlockTask") - def update_task(self, task): """ Per-frame task: keep the pivot marker and gizmo in sync with the camera. @@ -276,7 +283,6 @@ def update_task(self, task): # Le marqueur suit le pivot self.marker.setPos(self.focal_node.getPos()) # Mise à jour du Gizmo (orientation de la caméra vers le monde) - if hasattr(self.scene, 'gizmo'): + if hasattr(self.scene, "gizmo"): self.scene.gizmo.update(self.base.camera.getQuat(self.base.render)) return task.cont - diff --git a/bot/control/keyboard.py b/bot/control/keyboard.py index 0e6c1ad..9df7b7e 100644 --- a/bot/control/keyboard.py +++ b/bot/control/keyboard.py @@ -1,6 +1,7 @@ from direct.showbase.InputStateGlobal import inputState import sys + class KeyboardHandler: """ Handles keyboard input and dispatches camera commands via the Panda3D messenger. @@ -20,44 +21,54 @@ def __init__(self, base): # Dictionnaire pour stocker l'état des touches self.keys = {"arrow_left": 0, "arrow_right": 0, "arrow_up": 0, "arrow_down": 0} - + # On écoute l'appui et le relâchement for key in self.keys: self.base.accept(key, self.set_key, [key, 1]) self.base.accept(key + "-up", self.set_key, [key, 0]) # Actions directes (Events) - self.base.accept('escape', sys.exit) - self.base.accept('f5', lambda: base.messenger.send("cmd_hot_reload")) - self.base.accept('c', lambda: base.messenger.send("cmd_center")) - self.base.accept('alt-x', lambda: base.messenger.send("cmd_align_plane", ["x"])) - self.base.accept('alt-y', lambda: base.messenger.send("cmd_align_plane", ["y"])) - self.base.accept('alt-z', lambda: base.messenger.send("cmd_align_plane", ["z"])) - - self.base.accept('x', lambda: base.messenger.send("cmd_axis_constraint", [1])) - self.base.accept('y', lambda: base.messenger.send("cmd_axis_constraint", [2])) - self.base.accept('z', lambda: base.messenger.send("cmd_axis_constraint", [4])) - self.base.accept('shift-x', lambda: base.messenger.send("cmd_axis_constraint", [6])) - self.base.accept('shift-y', lambda: base.messenger.send("cmd_axis_constraint", [5])) - self.base.accept('shift-z', lambda: base.messenger.send("cmd_axis_constraint", [3])) + self.base.accept("escape", sys.exit) + self.base.accept("f5", lambda: base.messenger.send("cmd_hot_reload")) + self.base.accept("c", lambda: base.messenger.send("cmd_center")) + self.base.accept("alt-x", lambda: base.messenger.send("cmd_align_plane", ["x"])) + self.base.accept("alt-y", lambda: base.messenger.send("cmd_align_plane", ["y"])) + self.base.accept("alt-z", lambda: base.messenger.send("cmd_align_plane", ["z"])) + + self.base.accept("x", lambda: base.messenger.send("cmd_axis_constraint", [1])) + self.base.accept("y", lambda: base.messenger.send("cmd_axis_constraint", [2])) + self.base.accept("z", lambda: base.messenger.send("cmd_axis_constraint", [4])) + self.base.accept( + "shift-x", lambda: base.messenger.send("cmd_axis_constraint", [6]) + ) + self.base.accept( + "shift-y", lambda: base.messenger.send("cmd_axis_constraint", [5]) + ) + self.base.accept( + "shift-z", lambda: base.messenger.send("cmd_axis_constraint", [3]) + ) # Axis-constraint shortcuts (0..7 mask). # x=1, y=2, z=4 for mask in range(8): - self.base.accept(str(mask), lambda m=mask: base.messenger.send("cmd_axis_constraint", [m])) + self.base.accept( + str(mask), + lambda m=mask: base.messenger.send("cmd_axis_constraint", [m]), + ) # Flèches directionnelles - #self.base.accept('arrow_left', lambda: base.messenger.send("cmd_pan", [-1, 0])) - #self.base.accept('arrow_right', lambda: base.messenger.send("cmd_pan", [1, 0])) - #self.base.accept('arrow_up', lambda: base.messenger.send("cmd_pan", [0, 1])) - #self.base.accept('arrow_down', lambda: base.messenger.send("cmd_pan", [0, -1])) - - self.base.accept('p', lambda: base.messenger.send("cmd_toggle_marker")) - inputState.watchWithModifiers('up', 'arrow_up') - inputState.watchWithModifiers('down', 'arrow_down') - inputState.watchWithModifiers('left', 'arrow_left') - inputState.watchWithModifiers('right', 'arrow_right') + # self.base.accept('arrow_left', lambda: base.messenger.send("cmd_pan", [-1, 0])) + # self.base.accept('arrow_right', lambda: base.messenger.send("cmd_pan", [1, 0])) + # self.base.accept('arrow_up', lambda: base.messenger.send("cmd_pan", [0, 1])) + # self.base.accept('arrow_down', lambda: base.messenger.send("cmd_pan", [0, -1])) + + self.base.accept("p", lambda: base.messenger.send("cmd_toggle_marker")) + inputState.watchWithModifiers("up", "arrow_up") + inputState.watchWithModifiers("down", "arrow_down") + inputState.watchWithModifiers("left", "arrow_left") + inputState.watchWithModifiers("right", "arrow_right") # On ajoute une tâche pour traiter le mouvement fluide self.base.taskMgr.add(self.move_task, "KeyboardMoveTask") + def set_key(self, key, value): """Update the pressed state of *key* (1 = down, 0 = up).""" self.keys[key] = value @@ -74,13 +85,13 @@ def move_task(self, task): # On calcule le vecteur de direction selon les touches pressées dx = self.keys["arrow_right"] - self.keys["arrow_left"] dy = self.keys["arrow_up"] - self.keys["arrow_down"] - + if dx != 0 or dy != 0: # On envoie une petite valeur de déplacement constante # On multiplie par globalClock.getDt() pour que la vitesse soit # la même peu importe la puissance du PC (Frame Rate Independent) dt = self.base.clock.getDt() - speed = 0.5 # Ajustez cette valeur pour la sensibilité clavier + speed = 0.5 # Ajustez cette valeur pour la sensibilité clavier self.base.messenger.send("cmd_pan", [dx * speed * dt, dy * speed * dt]) - - return task.cont \ No newline at end of file + + return task.cont diff --git a/bot/control/mouse.py b/bot/control/mouse.py index 8403eda..91bee30 100644 --- a/bot/control/mouse.py +++ b/bot/control/mouse.py @@ -1,6 +1,12 @@ from direct.showbase.InputStateGlobal import inputState -from panda3d.core import BitMask32, CollisionHandlerQueue, CollisionNode, CollisionRay, CollisionTraverser -from panda3d.core import GeomNode, MouseButton, Plane, Point2, Point3, Vec3 +from panda3d.core import ( + BitMask32, + CollisionHandlerQueue, + CollisionNode, + CollisionRay, + CollisionTraverser, +) +from panda3d.core import MouseButton, Plane, Point2, Point3, Vec3 class MouseHandler: @@ -25,7 +31,7 @@ def __init__(self, base): self.picker = CollisionTraverser() self.pq = CollisionHandlerQueue() - self.pickerNode = CollisionNode('mouseRay') + self.pickerNode = CollisionNode("mouseRay") self.pickerNP = self.base.camera.attachNewNode(self.pickerNode) self.pickerNode.setFromCollideMask(BitMask32.bit(1) | BitMask32.bit(2)) self.pickerNode.setIntoCollideMask(BitMask32.allOff()) @@ -46,8 +52,12 @@ def __init__(self, base): self.axis_constraint_mask = 7 self._last_drag_emit = 0.0 - self.base.accept("wheel_up", lambda: self.base.messenger.send("cmd_zoom", [0.9])) - self.base.accept("wheel_down", lambda: self.base.messenger.send("cmd_zoom", [1.1])) + self.base.accept( + "wheel_up", lambda: self.base.messenger.send("cmd_zoom", [0.9]) + ) + self.base.accept( + "wheel_down", lambda: self.base.messenger.send("cmd_zoom", [1.1]) + ) self.base.taskMgr.add(self.update, "MouseTask") @@ -86,13 +96,18 @@ def _reset_drag_state(self): def _finalize_drag(self, world_pos): if self.drag_curve_tag is not None and self.drag_cp_index is not None: if getattr(self.base, "_scene", None) is not None: - self.base._scene.set_cp_color(self.drag_curve_tag, self.drag_cp_index, [0.5, 0.5, 0.5, 1]) + self.base._scene.set_cp_color( + self.drag_curve_tag, self.drag_cp_index, [0.5, 0.5, 0.5, 1] + ) self.base._scene.hide_axis_guide() - self.base._on_event_cb('cp_pick_end', { - 'tag': self.drag_curve_tag, - 'cp_index': self.drag_cp_index, - 'world_pos': world_pos, - }) + self.base._on_event_cb( + "cp_pick_end", + { + "tag": self.drag_curve_tag, + "cp_index": self.drag_cp_index, + "world_pos": world_pos, + }, + ) self._reset_drag_state() def _pick_entry(self, m_pos, mask: BitMask32): @@ -107,10 +122,14 @@ def _pick_entry(self, m_pos, mask: BitMask32): def _entry_metadata(self, entry): np = entry.getIntoNodePath() return { - 'curve_tag': np.getNetTag('curve_tag') if np.hasNetTag('curve_tag') else None, - 'cp_index': np.getNetTag('cp_index') if np.hasNetTag('cp_index') else None, - 'pick_kind': np.getNetTag('pick_kind') if np.hasNetTag('pick_kind') else None, - 'point': entry.getSurfacePoint(self.base.render), + "curve_tag": np.getNetTag("curve_tag") + if np.hasNetTag("curve_tag") + else None, + "cp_index": np.getNetTag("cp_index") if np.hasNetTag("cp_index") else None, + "pick_kind": np.getNetTag("pick_kind") + if np.hasNetTag("pick_kind") + else None, + "point": entry.getSurfacePoint(self.base.render), } def _handle_hover(self, m_pos): @@ -119,13 +138,13 @@ def _handle_hover(self, m_pos): hover_entry = self._pick_entry(m_pos, BitMask32.bit(1)) if hover_entry is not None: metadata = self._entry_metadata(hover_entry) - hovered_tag = metadata['curve_tag'] + hovered_tag = metadata["curve_tag"] # Si on survole une nouvelle courbe (ou si on ne survole plus rien) if hovered_tag != self.last_hovered_tag: self.last_hovered_tag = hovered_tag # On envoie l'info au parent via le callback - self.base._on_event_cb('hover', hovered_tag) + self.base._on_event_cb("hover", hovered_tag) def _build_drag_plane(self, start_point: Point3): normal = self.base.render.getRelativeVector(self.base.cam, Vec3(0, 1, 0)) @@ -207,7 +226,9 @@ def _mouse_to_constrained_axis(self, m_pos): } axis_origin = Point3(start[0], start[1], start[2]) axis_dir = axis_map[mask] - result = self._closest_point_on_axis_to_ray(ray_origin, ray_dir, axis_origin, axis_dir) + result = self._closest_point_on_axis_to_ray( + ray_origin, ray_dir, axis_origin, axis_dir + ) if result is not None: return result fallback = self._mouse_to_plane(m_pos) @@ -227,7 +248,9 @@ def _mouse_to_constrained_axis(self, m_pos): return self._apply_axis_constraint(start, fallback) def _handle_cp_interaction(self, m_pos, left_down): - if not getattr(self, "edit_mode_enabled", False) and not getattr(self, "dragging_cp", False): + if not getattr(self, "edit_mode_enabled", False) and not getattr( + self, "dragging_cp", False + ): return # NOTE: Check si une interaction pick un cp vient de commencer @@ -237,26 +260,44 @@ def _handle_cp_interaction(self, m_pos, left_down): if entry is None: return metadata = self._entry_metadata(entry) - if metadata['pick_kind'] != 'cp' or metadata['curve_tag'] is None or metadata['cp_index'] is None: + if ( + metadata["pick_kind"] != "cp" + or metadata["curve_tag"] is None + or metadata["cp_index"] is None + ): return - if self.active_curve_tag is not None and metadata['curve_tag'] != self.active_curve_tag: + if ( + self.active_curve_tag is not None + and metadata["curve_tag"] != self.active_curve_tag + ): return self.dragging_cp = True - self.drag_curve_tag = metadata['curve_tag'] - self.drag_cp_index = int(metadata['cp_index']) - self.drag_plane = self._build_drag_plane(metadata['point']) - self.drag_start_world_pos = [metadata['point'][0], metadata['point'][1], metadata['point'][2]] + self.drag_curve_tag = metadata["curve_tag"] + self.drag_cp_index = int(metadata["cp_index"]) + self.drag_plane = self._build_drag_plane(metadata["point"]) + self.drag_start_world_pos = [ + metadata["point"][0], + metadata["point"][1], + metadata["point"][2], + ] self.drag_last_valid_world_pos = list(self.drag_start_world_pos) self.drag_active_mask = int(self.axis_constraint_mask) - self.base._scene.set_cp_color(self.drag_curve_tag, self.drag_cp_index, [1, 0.5, 0, 1]) + self.base._scene.set_cp_color( + self.drag_curve_tag, self.drag_cp_index, [1, 0.5, 0, 1] + ) if getattr(self.base, "_scene", None) is not None: - self.base._scene.show_axis_guide(self.drag_start_world_pos, self.drag_active_mask) - self.base._on_event_cb('cp_pick_start', { - 'tag': self.drag_curve_tag, - 'cp_index': self.drag_cp_index, - 'world_pos': self.drag_start_world_pos, - }) + self.base._scene.show_axis_guide( + self.drag_start_world_pos, self.drag_active_mask + ) + self.base._on_event_cb( + "cp_pick_start", + { + "tag": self.drag_curve_tag, + "cp_index": self.drag_cp_index, + "world_pos": self.drag_start_world_pos, + }, + ) return # NOTE: le drag du cp est en cours, un envoie régulier de la nouvelle position du cp est envoyé au processus parent @@ -267,13 +308,18 @@ def _handle_cp_interaction(self, m_pos, left_down): return self.drag_last_valid_world_pos = list(world_pos) if getattr(self.base, "_scene", None) is not None: - self.base._scene.preview_control_point(int(self.drag_curve_tag), self.drag_cp_index, world_pos) + self.base._scene.preview_control_point( + int(self.drag_curve_tag), self.drag_cp_index, world_pos + ) self.base._scene.update_axis_guide(world_pos, self.drag_active_mask) - self.base._on_event_cb('cp_drag', { - 'tag': self.drag_curve_tag, - 'cp_index': self.drag_cp_index, - 'world_pos': world_pos, - }) + self.base._on_event_cb( + "cp_drag", + { + "tag": self.drag_curve_tag, + "cp_index": self.drag_cp_index, + "world_pos": world_pos, + }, + ) return # NOTE: Fin de déplacement du cp, envoie de la posistion final du cp @@ -293,8 +339,8 @@ def _handle_curve_click(self, m_pos, left_down): if entry is None: return metadata = self._entry_metadata(entry) - if metadata['pick_kind'] == 'curve' and metadata['curve_tag'] is not None: - self.base._on_event_cb('curve_selected', metadata['curve_tag']) + if metadata["pick_kind"] == "curve" and metadata["curve_tag"] is not None: + self.base._on_event_cb("curve_selected", metadata["curve_tag"]) def _handle_drag(self, curr_pos): """Handles mouse drag for rotating and panning.""" @@ -310,9 +356,13 @@ def _handle_drag(self, curr_pos): # On n'envoie le message QUE si la souris a réellement bougé if delta.lengthSquared() > 0: if self.base.mouseWatcherNode.isButtonDown("shift"): - self.base.messenger.send("cmd_pan", [delta.getX(), delta.getY()]) + self.base.messenger.send( + "cmd_pan", [delta.getX(), delta.getY()] + ) else: - self.base.messenger.send("cmd_rotate", [delta.getX(), delta.getY()]) + self.base.messenger.send( + "cmd_rotate", [delta.getX(), delta.getY()] + ) # CRITIQUE : On met à jour prev_mouse_pos À CHAQUE FRAME # pour que le delta reste minuscule entre deux frames. @@ -346,4 +396,4 @@ def update(self, task): def is_shift_down(self): """Return True if the Shift modifier is currently held.""" - return inputState.isSet('shift') + return inputState.isSet("shift") diff --git a/bot/core/__init__.py b/bot/core/__init__.py index d46eca0..546e02a 100644 --- a/bot/core/__init__.py +++ b/bot/core/__init__.py @@ -1,6 +1,3 @@ """ Kernel module: The model module gathers the business object of our application """ - -from . import * - diff --git a/bot/core/cad.py b/bot/core/cad.py index f775267..d9551c4 100644 --- a/bot/core/cad.py +++ b/bot/core/cad.py @@ -5,15 +5,17 @@ """"global value to indicate how to round floating numbers""" nb_digit_rounding = 4 + class Model: """ The geometric model provides simple and basic function to load geometric files and to query a geometric model based on the OpenCascade technology. To do so, we totally rely on the gmsh library. """ + def __init__(self): self.initialize() self._observers = [] - self.bounds = {'min': [0,0,0], 'max': [0,0,0]} + self.bounds = {"min": [0, 0, 0], "max": [0, 0, 0]} self.curves = {} def set_curve(self, tag: int, curve_object): @@ -58,7 +60,7 @@ def finalize(self): """ gmsh.finalize() - def open(self,filename): + def open(self, filename): """ core.cad.Model.open(filename) @@ -69,7 +71,7 @@ def open(self,filename): - `filename`: string """ if Path(filename).suffix == ".geo": - gmsh.open(filename) + gmsh.open(filename) else: gmsh.model.occ.importShapes(filename) @@ -81,16 +83,22 @@ def _recompute_bounds(self): node_tags, coords, _ = gmsh.model.mesh.getNodes() # The map will be used later to store some geom info # node_map = {tag: i for i, tag in enumerate(node_tags)} - self.points = [(coords[i], coords[i+1], coords[i+2]) for i in range(0, len(coords), 3)] + self.points = [ + (coords[i], coords[i + 1], coords[i + 2]) for i in range(0, len(coords), 3) + ] if not self.points: return - #Compute now the bounds for automatic rescaling + # Compute now the bounds for automatic rescaling xs, ys, zs = zip(*self.points) self.bounds = { - 'min': [min(xs), min(ys), min(zs)], - 'max': [max(xs), max(ys), max(zs)], - 'center': [(min(xs)+max(xs))/2, (min(ys)+max(ys))/2, (min(zs)+max(zs))/2], - 'size': [max(xs)-min(xs), max(ys)-min(ys), max(zs)-min(zs)], + "min": [min(xs), min(ys), min(zs)], + "max": [max(xs), max(ys), max(zs)], + "center": [ + (min(xs) + max(xs)) / 2, + (min(ys) + max(ys)) / 2, + (min(zs) + max(zs)) / 2, + ], + "size": [max(xs) - min(xs), max(ys) - min(ys), max(zs) - min(zs)], } def get_render_data(self) -> dict: @@ -101,7 +109,7 @@ def get_render_data(self) -> dict: node_tags, coords, _ = gmsh.model.mesh.getNodes() node_id_to_coords = { - tag: (coords[i*3], coords[i*3+1], coords[i*3+2]) + tag: (coords[i * 3], coords[i * 3 + 1], coords[i * 3 + 2]) for i, tag in enumerate(node_tags) } @@ -120,44 +128,48 @@ def get_render_data(self) -> dict: local_edges = [] for i in range(0, len(connectivity), 2): - for node_tag in (connectivity[i], connectivity[i+1]): + for node_tag in (connectivity[i], connectivity[i + 1]): if node_tag not in seen: seen[node_tag] = len(local_points) local_points.append(node_id_to_coords[node_tag]) - local_edges.append((seen[connectivity[i]], seen[connectivity[i+1]])) + local_edges.append((seen[connectivity[i]], seen[connectivity[i + 1]])) curve_entry = { - 'points': local_points, - 'edges': local_edges, - 'type': 'linear', + "points": local_points, + "edges": local_edges, + "type": "linear", } # Surcharge si courbe paramétrique connue if tag in self.curves: custom = self.curves[tag] render = custom.get_render_data() - curve_entry.update({ - 'type': 'bezier', - 'degree': render['degree'], - 'control_points': render['control_points'], - 'cp_edges': [(i, i+1) for i in range(len(render['control_points'])-1)], - 'points': render['curve'], # écrase les pts gmsh - 'edges': [(i, i+1) for i in range(len(render['curve'])-1)], - }) + curve_entry.update( + { + "type": "bezier", + "degree": render["degree"], + "control_points": render["control_points"], + "cp_edges": [ + (i, i + 1) for i in range(len(render["control_points"]) - 1) + ], + "points": render["curve"], # écrase les pts gmsh + "edges": [(i, i + 1) for i in range(len(render["curve"]) - 1)], + } + ) curves_data[str(tag)] = curve_entry # Backward-compatible flattened payload expected by existing tests/viewers. offset = len(flat_points) - flat_points.extend(curve_entry['points']) - for idx_a, idx_b in curve_entry['edges']: + flat_points.extend(curve_entry["points"]) + for idx_a, idx_b in curve_entry["edges"]: flat_edges.append((offset + idx_a, offset + idx_b, int(tag))) return { - 'points': flat_points, - 'edges': flat_edges, - 'curves': curves_data, - 'bounds': dict(self.bounds), + "points": flat_points, + "edges": flat_edges, + "curves": curves_data, + "bounds": dict(self.bounds), } def add_point(self, coords: list, mesh_size: float = 1.0) -> int: @@ -176,14 +188,13 @@ def add_point(self, coords: list, mesh_size: float = 1.0) -> int: def __synchronize(self): """ - core.cad.Model.synchronize() + core.cad.Model.synchronize() - This operation must be invocated after applying geometric operations to be sure to have a consistent state. - We advise to call this method before starting the meshing stage. + This operation must be invocated after applying geometric operations to be sure to have a consistent state. + We advise to call this method before starting the meshing stage. """ gmsh.model.occ.synchronize() - def __get_cell_tags(self, dim): """ Private method that returns the tags, i.e. the ids, of the cells of dimension dim. @@ -208,7 +219,6 @@ def __get_cell_tags(self, dim): tags.append(j) return tags - def get_point_tags(self): """ core.cad.Model.get_point_tags(dim) @@ -233,8 +243,7 @@ def get_surface_tags(self): """ return self.__get_cell_tags(2) - - def getClosestPoint(self,dim, tag, coord): + def getClosestPoint(self, dim, tag, coord): """ core.cad.Model.getClosestPoint(dim, tag, coord) @@ -256,15 +265,22 @@ def getClosestPoint(self,dim, tag, coord): raise TypeError("the dimension parameter (dim) must be an int.") if not isinstance(tag, int): raise TypeError("the tag parameter (tag) must be an int.") - if not isinstance(coord, (list, tuple)) or len(coord)%3 != 0 or not all( - isinstance(x, numbers.Real) for x in coord): - raise TypeError("the coord parameter must be a list or tuple of 3 real numbers.") + if ( + not isinstance(coord, (list, tuple)) + or len(coord) % 3 != 0 + or not all(isinstance(x, numbers.Real) for x in coord) + ): + raise TypeError( + "the coord parameter must be a list or tuple of 3 real numbers." + ) if dim < 1 or dim > 2: - raise ValueError("the dim parameter must be an int comprised between 1 and 2.") + raise ValueError( + "the dim parameter must be an int comprised between 1 and 2." + ) return gmsh.model.getClosestPoint(dim, tag, coord)[0] - def get_end_points(self,curve_tag): + def get_end_points(self, curve_tag): """ core.cad.Model.get_end_points(curve_tag) @@ -277,7 +293,7 @@ def get_end_points(self,curve_tag): def get_adjacent_curves_of_point(self, point_tag): # We check if the tag is an existing point tag - if not point_tag in self.get_point_tags() : + if point_tag not in self.get_point_tags(): raise ValueError("Invalid point tag") curves = [] @@ -285,9 +301,9 @@ def get_adjacent_curves_of_point(self, point_tag): for curve_tag in self.get_curve_tags(): # get curve end points end_points = self.get_end_points(curve_tag) - if end_points[0] == point_tag : + if end_points[0] == point_tag: curves.append(curve_tag) - elif end_points[1] == point_tag : + elif end_points[1] == point_tag: curves.append(curve_tag) return curves @@ -380,13 +396,10 @@ def get_curve_discretization(self): # Get all the entities of dim 1 elem_types, elem_tags, elem_node_tags = gmsh.model.mesh.getElements(dim=1) - # On transforme la liste plate [x,y,z,x,y,z] en liste de tuples [(x,y,z), ...] points_3d = [] for i in range(0, len(coords), 3): - points_3d.append((coords[i], coords[i+1], coords[i+2])) - - + points_3d.append((coords[i], coords[i + 1], coords[i + 2])) # 2. Liste finale des données # Structure : (index_sommet_A, index_sommet_B, tag_courbe_origine) @@ -396,7 +409,7 @@ def get_curve_discretization(self): entities = gmsh.model.getEntities(1) for entity in entities: - curve_tag = entity[1] # C'est le Tag de la courbe CAO + curve_tag = entity[1] # C'est le Tag de la courbe CAO # Récupérer les éléments (segments) appartenant UNIQUEMENT à cette courbe _, _, node_tags_per_elem = gmsh.model.mesh.getElements(1, curve_tag) @@ -407,7 +420,7 @@ def get_curve_discretization(self): # Parcourir les nœuds par paires pour former les arêtes for i in range(0, len(connectivity), 2): tag_a = connectivity[i] - tag_b = connectivity[i+1] + tag_b = connectivity[i + 1] # Conversion en indices (0, 1, 2...) pour Panda3D idx_a = node_id_to_index[tag_a] @@ -427,29 +440,31 @@ def __discretize_surfaces(self): gmsh.model.mesh.generate(2) # Get mesh nodes node_tags, node_coords, _ = gmsh.model.mesh.getNodes() - num_nodes = len(node_tags) node_coords_3d = list(zip(*(iter(node_coords),) * 3)) # (x, y, z) tuples - # Build a node_id -> (x, y, z) map for later use - node_map = dict(zip(node_tags, node_coords_3d)) + # NOTE: Build a node_id -> (x, y, z) map for later use + node_map = dict(zip(node_tags, node_coords_3d)) # noqa: F841 # === 2. Get all face elements (triangles & quads) === surfaces = [] # type 1 = edge, type 2 = triangle, type 15 = point surf_tags = self.get_surface_tags() for i in surf_tags: - element_types, element_tags, node_tags_list = gmsh.model.mesh.getElements(2, i) - faces=[] + element_types, element_tags, node_tags_list = gmsh.model.mesh.getElements( + 2, i + ) + faces = [] for elem_tags, elem_node_tags in zip(element_tags, node_tags_list): for i in range(len(elem_tags)): - elem_id = elem_tags[i] - node_ids = [nid - 1 for nid in elem_node_tags[i * 3: (i + 1) * 3]] + node_ids = [nid - 1 for nid in elem_node_tags[i * 3 : (i + 1) * 3]] faces.append(node_ids) surfaces.append(faces) return node_coords_3d, surfaces - def update_control_point(self, tag: int, cp_index: int, new_pt: list(float), notify: bool = True): + def update_control_point( + self, tag: int, cp_index: int, new_pt: list(float), notify: bool = True + ): """Met à jour un point de contrôle d'une courbe et rafraîchit l'affichage.""" if tag in self.curves: curve = self.curves[tag] @@ -469,6 +484,8 @@ def update_control_point(self, tag: int, cp_index: int, new_pt: list(float), not if notify: self._notify_observers() else: - print(f"Erreur : L'index {cp_index} n'existe pas. La courbe a {len(cps)} points de contrôle.") + print( + f"Erreur : L'index {cp_index} n'existe pas. La courbe a {len(cps)} points de contrôle." + ) else: - print(f"Erreur : La courbe {tag} n'est pas une courbe personnalisée.") \ No newline at end of file + print(f"Erreur : La courbe {tag} n'est pas une courbe personnalisée.") diff --git a/bot/core/curve.py b/bot/core/curve.py index bab118f..b494104 100644 --- a/bot/core/curve.py +++ b/bot/core/curve.py @@ -1,9 +1,11 @@ import nurbslib + class BezierCurve: """ This class acts as a bridge between your current geometry and the Rust lib. """ + def __init__(self, tag: str, control_points: list[list[float]], degree: int): self.tag = tag self._engine = nurbslib.PyBezierCurve(degree, control_points, None) @@ -26,10 +28,7 @@ def _default_control_points(coords_a, coords_b, degree=3): # Linear interpolation (lerp) for each axis (x, y, z) # Mathematical formula: point = A + (B - A) * t - current_point = [ - a + (b - a) * t - for a, b in zip(coords_a, coords_b) - ] + current_point = [a + (b - a) * t for a, b in zip(coords_a, coords_b)] points.append(current_point) @@ -50,8 +49,8 @@ def set_control_points(self, control_points: list[list[float]]): def get_render_data(self) -> dict: return { - 'tag': self.tag, - 'control_points': self.get_control_points(), - 'degree': self.get_degree(), - 'curve': self._engine.evaluate(100, False) - } \ No newline at end of file + "tag": self.tag, + "control_points": self.get_control_points(), + "degree": self.get_degree(), + "curve": self._engine.evaluate(100, False), + } diff --git a/bot/view/__init__.py b/bot/view/__init__.py index be39b7a..a0836a4 100644 --- a/bot/view/__init__.py +++ b/bot/view/__init__.py @@ -1,5 +1,3 @@ """ View module: This submodule of bot gathers classes and functions for 2D/3D rendering """ - -from . import * diff --git a/bot/view/curve_app.py b/bot/view/curve_app.py index 6f3349c..f2a3021 100644 --- a/bot/view/curve_app.py +++ b/bot/view/curve_app.py @@ -1,5 +1,12 @@ from panda3d.core import BitMask32, CollisionNode, CollisionSphere, CollisionTube -from panda3d.core import Geom, GeomNode, GeomPoints, GeomVertexData, GeomVertexFormat, GeomVertexWriter +from panda3d.core import ( + Geom, + GeomNode, + GeomPoints, + GeomVertexData, + GeomVertexFormat, + GeomVertexWriter, +) from panda3d.core import LineSegs, NodePath import nurbslib @@ -8,12 +15,13 @@ MASK_CURVE_PICK = BitMask32.bit(1) MASK_CP_PICK = BitMask32.bit(2) + class CurveApp: def __init__(self, tag: str, curve_data: dict): self.tag: int = int(tag) - self.edges: list = curve_data['edges'] - self.points: list = curve_data['points'] - self.type: str = curve_data['type'] + self.edges: list = curve_data["edges"] + self.points: list = curve_data["points"] + self.type: str = curve_data["type"] self.node_path: NodePath | None = None self.curve_render_node: NodePath | None = None @@ -31,23 +39,24 @@ def __init__(self, tag: str, curve_data: dict): self.line_thickness = 2 self.cp_color: list | None = None - if self.type == 'bezier' or self.type == 'bspline': - self.control_points = curve_data['control_points'] - self.cp_color = [[0.5, 0.5, 0.5, 1] for _ in range(len(self.control_points))] - self.degree = curve_data['degree'] + if self.type == "bezier" or self.type == "bspline": + self.control_points = curve_data["control_points"] + self.cp_color = [ + [0.5, 0.5, 0.5, 1] for _ in range(len(self.control_points)) + ] + self.degree = curve_data["degree"] # TODO: bspline / nurbs not already implemented - if self.type == 'bspline': - self.knots = curve_data['knots'] - + if self.type == "bspline": + self.knots = curve_data["knots"] def _draw_control_points(self, node_path: NodePath): format = GeomVertexFormat.getV3cp() # NOTE: correspond à l'espace mémoire utilisé pour stocker les points 3D - vdata = GeomVertexData('anchors', format, Geom.UHDynamic) + vdata = GeomVertexData("anchors", format, Geom.UHDynamic) # NOTE: permet d'écrire dans l'espace mémoire vdata dans la 'colonne' nommé 'vertex' - vertex = GeomVertexWriter(vdata, 'vertex') - color_writer = GeomVertexWriter(vdata, 'color') + vertex = GeomVertexWriter(vdata, "vertex") + color_writer = GeomVertexWriter(vdata, "color") # NOTE: Permet de dire au GPU de traiter les coordonnée en tant que point flottant (on pourrait très bien utiliser GeomTriangles(Geom.UHDynamic) pour dessiner des surffaces) prim = GeomPoints(Geom.UHDynamic) @@ -62,7 +71,7 @@ def _draw_control_points(self, node_path: NodePath): geom = Geom(vdata) geom.addPrimitive(prim) # NOTE: Emballe le Geom pour être lisible par le moteur 3D - gnode = GeomNode(f'anchors_{self.tag}') + gnode = GeomNode(f"anchors_{self.tag}") gnode.addGeom(geom) if self._cp_geom_node is not None: @@ -82,7 +91,6 @@ def _draw_control_points(self, node_path: NodePath): self._cp_line_node.removeNode() self._cp_line_node = node_path.attachNewNode(lines.create()) - def _attachCPNode(self): self.cp_render_node = self.node_path.attachNewNode("cp_render") self.cp_collision_node = self.node_path.attachNewNode("cp_collision") @@ -106,10 +114,9 @@ def _rebuild_cp_collision(self): cnode.setFromCollideMask(BitMask32.allOff()) cnode.addSolid(CollisionSphere(pt[0], pt[1], pt[2], 1.2)) cnp = self.cp_collision_node.attachNewNode(cnode) - cnp.setTag('curve_tag', str(self.tag)) - cnp.setTag('cp_index', str(i)) - cnp.setTag('pick_kind', 'cp') - + cnp.setTag("curve_tag", str(self.tag)) + cnp.setTag("cp_index", str(i)) + cnp.setTag("pick_kind", "cp") def _create_collision(self, cnode: NodePath): for idxA, idxB in self.edges: @@ -119,7 +126,6 @@ def _create_collision(self, cnode: NodePath): tube = CollisionTube(ptA[0], ptA[1], ptA[2], ptB[0], ptB[1], ptB[2], radius) cnode.addSolid(tube) - def _attachColissionNode(self): cnode = CollisionNode(f"col_{self.tag}") cnode.setFromCollideMask(BitMask32.allOff()) @@ -129,8 +135,8 @@ def _attachColissionNode(self): self.curve_collision_node.removeNode() self.curve_collision_node = self.node_path.attachNewNode("curve_collision") cnp = self.curve_collision_node.attachNewNode(cnode) - cnp.setTag('curve_tag', str(self.tag)) - cnp.setTag('pick_kind', 'curve') + cnp.setTag("curve_tag", str(self.tag)) + cnp.setTag("pick_kind", "curve") return cnp def _draw_curve(self): @@ -141,10 +147,9 @@ def _draw_curve(self): self._curve_geom_node.removeNode() self._curve_geom_node = self.curve_render_node.attachNewNode(lines.create()) - def attachCuveNode(self, node_path: NodePath): self.node_path = node_path - self.node_path.setTag('curve_tag', str(self.tag)) + self.node_path.setTag("curve_tag", str(self.tag)) self.curve_render_node = self.node_path.attachNewNode("curve_render") self._draw_curve() self._attachColissionNode() @@ -152,7 +157,6 @@ def attachCuveNode(self, node_path: NodePath): self._attachCPNode() return self.node_path - def set_cp_color(self, cp_index: int, color: list): self.cp_color[cp_index] = color if self.cp_node is not None: @@ -167,7 +171,6 @@ def set_color(self, color: list): else: self.cp_node.hide() - def draw_curve(self, lines: LineSegs): for idxA, idxB in self.edges: ptA = self.points[idxA] @@ -196,7 +199,7 @@ def preview_control_point(self, cp_index: int, new_pos: list[float]): self.control_points[cp_index] = [new_pos[0], new_pos[1], new_pos[2]] - if self.type == 'bezier' and self.degree is not None: + if self.type == "bezier" and self.degree is not None: engine = nurbslib.PyBezierCurve(int(self.degree), self.control_points, None) self.points = engine.evaluate(100, False) self.edges = [(i, i + 1) for i in range(len(self.points) - 1)] @@ -207,6 +210,3 @@ def preview_control_point(self, cp_index: int, new_pos: list[float]): self._draw_control_points(self.cp_render_node) self._attachColissionNode() self._rebuild_cp_collision() - - - diff --git a/bot/view/scene.py b/bot/view/scene.py index 8e5e772..c100e24 100644 --- a/bot/view/scene.py +++ b/bot/view/scene.py @@ -1,12 +1,21 @@ -from panda3d.core import LineSegs, NodePath, LColor, Vec4, Vec3, DirectionalLight, AmbientLight +from panda3d.core import ( + LineSegs, + NodePath, + LColor, + Vec4, + Vec3, + DirectionalLight, + AmbientLight, +) from panda3d.core import CollisionNode, CollisionTube -from panda3d.core import GeomVertexFormat, GeomVertexData, Geom, GeomPoints, GeomNode, GeomVertexWriter from bot.view.curve_app import CurveApp _DEFAULT_BOUNDS = { - 'min': [0, 0, 0], 'max': [0, 0, 0], - 'center': [0, 0, 0], 'size': [1, 1, 1], + "min": [0, 0, 0], + "max": [0, 0, 0], + "center": [0, 0, 0], + "size": [1, 1, 1], } @@ -38,7 +47,8 @@ def _create_axes(self): for i, col in enumerate([(1, 0, 0), (0, 1, 0), (0, 0, 1)]): ls.setColor(LColor(*col, 1)) ls.moveTo(0, 0, 0) - target = [0, 0, 0]; target[i] = 0.1 + target = [0, 0, 0] + target[i] = 0.1 ls.drawTo(*target) self.root.attachNewNode(ls.create()) @@ -75,9 +85,9 @@ def __init__(self, base, geom_data: dict, settings: dict): """ self.base = base self._geom_data = geom_data - self.background_color = settings.get('background_color', [0.1, 0.1, 0.12]) + self.background_color = settings.get("background_color", [0.1, 0.1, 0.12]) self.base.set_background_color(self.background_color) - self.line_thickness = settings.get('line_thickness', 2) + self.line_thickness = settings.get("line_thickness", 2) self.curves = {} self.active_curve_tag = None self.edit_mode_enabled = False @@ -89,10 +99,14 @@ def __init__(self, base, geom_data: dict, settings: dict): self._constraint_guide_visible = False self.geom_node = self._build_from_data(geom_data) - self._constraint_guide_np = self.base.render.attachNewNode("constraint_guide_root") + self._constraint_guide_np = self.base.render.attachNewNode( + "constraint_guide_root" + ) self._constraint_guide_np.hide() self._world_axes_np = self.base.render.attachNewNode("world_axes_root") - self._transform_gizmo_np = self.base.render.attachNewNode("transform_gizmo_root") + self._transform_gizmo_np = self.base.render.attachNewNode( + "transform_gizmo_root" + ) self._transform_gizmo_np.hide() self.gizmo = HUDGizmo(self.base.pixel2d) self.add_lighting() @@ -100,12 +114,11 @@ def __init__(self, base, geom_data: dict, settings: dict): @property def bounds(self) -> dict: """Bounding-box data of the current geometry (center, size, min, max).""" - return self._geom_data.get('bounds', _DEFAULT_BOUNDS) + return self._geom_data.get("bounds", _DEFAULT_BOUNDS) def _group_edges_by_tag(self, edges: list) -> dict: # NOTE: A curve is a liste of small edges. This function group all these edges for set the same color - """Groups a list of edges by their curve tag. - """ + """Groups a list of edges by their curve tag.""" edges_by_tag = {} for e in edges: idxA, idxB = e[0], e[1] @@ -118,7 +131,7 @@ def _group_edges_by_tag(self, edges: list) -> dict: def _create_curve_geometry(self, tag: str, tag_edges: list, points: list): """Creates the visible lines and invisible collision nodes for a set of edges.""" lines = LineSegs() - is_control_polygon = tag.endswith('_cp') + is_control_polygon = tag.endswith("_cp") if is_control_polygon: lines.setThickness(1.0) @@ -138,7 +151,9 @@ def _create_curve_geometry(self, tag: str, tag_edges: list, points: list): if not is_control_polygon: radius = 1.0 - tube = CollisionTube(ptA[0], ptA[1], ptA[2], ptB[0], ptB[1], ptB[2], radius) + tube = CollisionTube( + ptA[0], ptA[1], ptA[2], ptB[0], ptB[1], ptB[2], radius + ) cnode.addSolid(tube) if is_control_polygon: @@ -166,7 +181,7 @@ def _build_from_data(self, geom_data: dict): NodePath: The root node containing all visible and collision geometry, attached to `render`. Returns `None` if there are no edges. """ - curves = geom_data.get('curves', []) + curves = geom_data.get("curves", []) self.curves = {} @@ -191,7 +206,7 @@ def set_curve_color(self, tag: str, color: list): else: try: curve = self.curves.get(int(tag)) - except (TypeError, ValueError): + except TypeError, ValueError: curve = None if curve is not None: @@ -204,7 +219,7 @@ def set_cp_color(self, tag: str, cp_index: int, color: list): else: try: curve = self.curves.get(int(tag)) - except (TypeError, ValueError): + except TypeError, ValueError: curve = None if curve is not None: @@ -220,7 +235,7 @@ def set_edit_mode(self, enabled: bool): def set_active_curve(self, tag): try: normalized = int(tag) if tag is not None else None - except (TypeError, ValueError): + except TypeError, ValueError: normalized = None self.active_curve_tag = normalized for curve_tag, curve in self.curves.items(): @@ -236,43 +251,50 @@ def preview_control_point(self, tag: int, cp_index: int, new_pos: list[float]): def set_axis_constraint(self, mask: int): self.axis_constraint_mask = max(0, min(7, int(mask))) if self._constraint_guide_visible and self._constraint_guide_origin is not None: - self.update_axis_guide(self._constraint_guide_origin, self.axis_constraint_mask) + self.update_axis_guide( + self._constraint_guide_origin, self.axis_constraint_mask + ) def _guide_length(self) -> float: - size = self.bounds.get('size', [1, 1, 1]) + size = self.bounds.get("size", [1, 1, 1]) max_size = max(size) if size else 1 return max(2.0, float(max_size) * 0.15) def _world_axes_length(self) -> float: - size = self.bounds.get('size', [1, 1, 1]) + size = self.bounds.get("size", [1, 1, 1]) max_size = max(size) if size else 1 return max(1000.0, float(max_size) * 100.0) - def _draw_axis_line(self, root: NodePath, origin: list[float], axis: str, length: float): - colors = {'x': (1, 0, 0, 0.2), 'y': (0, 1, 0, 0.2), 'z': (0, 0, 1, 0.2)} - vectors = {'x': (1, 0, 0), 'y': (0, 1, 0), 'z': (0, 0, 1)} + def _draw_axis_line( + self, root: NodePath, origin: list[float], axis: str, length: float + ): + colors = {"x": (1, 0, 0, 0.2), "y": (0, 1, 0, 0.2), "z": (0, 0, 1, 0.2)} + vectors = {"x": (1, 0, 0), "y": (0, 1, 0), "z": (0, 0, 1)} color = colors[axis] vx, vy, vz = vectors[axis] ls = LineSegs() ls.setThickness(2) ls.setColor(*color) - ls.moveTo(origin[0] - vx * length, origin[1] - vy * length, origin[2] - vz * length) - ls.drawTo(origin[0] + vx * length, origin[1] + vy * length, origin[2] + vz * length) + ls.moveTo( + origin[0] - vx * length, origin[1] - vy * length, origin[2] - vz * length + ) + ls.drawTo( + origin[0] + vx * length, origin[1] + vy * length, origin[2] + vz * length + ) root.attachNewNode(ls.create()) - def _update_transform_gizmo(self, origin: list[float], mask: int): if self._transform_gizmo_np is None: return self._transform_gizmo_np.getChildren().detach() length = self._guide_length() if mask & 1: - self._draw_axis_line(self._transform_gizmo_np, origin, 'x', length) + self._draw_axis_line(self._transform_gizmo_np, origin, "x", length) if mask & 2: - self._draw_axis_line(self._transform_gizmo_np, origin, 'y', length) + self._draw_axis_line(self._transform_gizmo_np, origin, "y", length) if mask & 4: - self._draw_axis_line(self._transform_gizmo_np, origin, 'z', length) + self._draw_axis_line(self._transform_gizmo_np, origin, "z", length) def show_axis_guide(self, origin: list[float], mask: int): self._constraint_guide_visible = True @@ -289,11 +311,11 @@ def update_axis_guide(self, origin: list[float], mask: int): length = self._guide_length() if mask & 1: - self._draw_axis_line(self._constraint_guide_np, origin, 'x', length) + self._draw_axis_line(self._constraint_guide_np, origin, "x", length) if mask & 2: - self._draw_axis_line(self._constraint_guide_np, origin, 'y', length) + self._draw_axis_line(self._constraint_guide_np, origin, "y", length) if mask & 4: - self._draw_axis_line(self._constraint_guide_np, origin, 'z', length) + self._draw_axis_line(self._constraint_guide_np, origin, "z", length) self._update_transform_gizmo(origin, mask) def hide_axis_guide(self): @@ -306,7 +328,6 @@ def hide_axis_guide(self): self._transform_gizmo_np.getChildren().detach() self._transform_gizmo_np.hide() - def rebuild(self, geom_data: dict): """Replace displayed geometry with new render data.""" self._geom_data = geom_data @@ -328,7 +349,11 @@ def clear(self): if self._transform_gizmo_np is not None: self._transform_gizmo_np.removeNode() self._transform_gizmo_np = None - if hasattr(self, 'gizmo') and self.gizmo is not None and hasattr(self.gizmo, 'root'): + if ( + hasattr(self, "gizmo") + and self.gizmo is not None + and hasattr(self.gizmo, "root") + ): self.gizmo.root.removeNode() def apply_settings(self, settings: dict): @@ -340,11 +365,11 @@ def apply_settings(self, settings: dict): Args: settings: Partial or full scene configuration dict. """ - if 'background_color' in settings: - self.background_color = settings['background_color'] + if "background_color" in settings: + self.background_color = settings["background_color"] self.base.set_background_color(self.background_color) - if 'line_thickness' in settings: - self.line_thickness = settings['line_thickness'] + if "line_thickness" in settings: + self.line_thickness = settings["line_thickness"] if self.geom_node is not None: self.geom_node.removeNode() self.geom_node = self._build_from_data(self._geom_data) diff --git a/bot/viewer/__init__.py b/bot/viewer/__init__.py index 5670c3b..961657e 100644 --- a/bot/viewer/__init__.py +++ b/bot/viewer/__init__.py @@ -4,4 +4,4 @@ from .viewer import Viewer -__all__ = ['Viewer'] +__all__ = ["Viewer"] diff --git a/bot/viewer/app.py b/bot/viewer/app.py index 7339170..4893e53 100644 --- a/bot/viewer/app.py +++ b/bot/viewer/app.py @@ -13,14 +13,14 @@ from bot.control.keyboard import KeyboardHandler _DEFAULT_SCENE = { - 'background_color': [0.1, 0.1, 0.12], - 'line_thickness': 2, + "background_color": [0.1, 0.1, 0.12], + "line_thickness": 2, } _DEFAULT_CAMERA = { - 'pan_speed': 10.0, - 'rotate_speed': 100.0, - 'animation_duration': 0.5, - 'show_marker_at_start': False, + "pan_speed": 10.0, + "rotate_speed": 100.0, + "animation_duration": 0.5, + "show_marker_at_start": False, } @@ -60,18 +60,16 @@ def __init__(self, config_filename: str, cmd_queue: queue.Queue, on_event_cb): self.accept("cmd_axis_constraint", self._on_axis_constraint_cmd) self.hud = OnscreenText( - text="", - pos=(-1.3, -0.5), - scale=0.06, - fg=(1, 1, 1, 1), - align=TextNode.ALeft + text="", pos=(-1.3, -0.5), scale=0.06, fg=(1, 1, 1, 1), align=TextNode.ALeft ) - taskMgr.add(self._process_commands, "ViewerProcessCommands") + self.taskMgr.add(self._process_commands, "ViewerProcessCommands") def _load_config(self, config_filename: str) -> dict: """Load and parse the TOML config file. Returns an empty dict if not found.""" - base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + base_dir = os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ) path = os.path.join(base_dir, config_filename) if os.path.exists(path): with open(path, "rb") as f: @@ -80,12 +78,12 @@ def _load_config(self, config_filename: str) -> dict: def _scene_cfg(self) -> dict: """Return the ``[view.scene]`` section of the config, or built-in defaults.""" - return self._config.get('view', {}).get('scene', _DEFAULT_SCENE) + return self._config.get("view", {}).get("scene", _DEFAULT_SCENE) def _camera_cfg(self) -> dict: """Return the ``[view.camera]`` section merged with built-in defaults.""" cfg = _DEFAULT_CAMERA.copy() - cfg.update(self._config.get('view', {}).get('camera', {})) + cfg.update(self._config.get("view", {}).get("camera", {})) return cfg def _process_commands(self, task): @@ -100,36 +98,38 @@ def _process_commands(self, task): while not self._cmd_queue.empty(): try: cmd, data = self._cmd_queue.get_nowait() - if cmd == 'load': + if cmd == "load": self.load_scene(data) - elif cmd == 'update': + elif cmd == "update": self.update_scene(data) - elif cmd == 'reload_config': + elif cmd == "reload_config": self._config = data if self._scene: self._scene.apply_settings(self._scene_cfg()) if self._camera_controller: self._camera_controller.apply_settings(self._camera_cfg()) - elif cmd == 'highlight_curve': + elif cmd == "highlight_curve": if self._scene: - self._scene.set_curve_color(data['tag'], data['color']) - elif cmd == 'update_hud': - self.hud.setText(data['text']) - elif cmd == 'set_edit_mode': - enabled = bool(data.get('enabled', False)) - curve_tag = data.get('curve_tag') + self._scene.set_curve_color(data["tag"], data["color"]) + elif cmd == "update_hud": + self.hud.setText(data["text"]) + elif cmd == "set_edit_mode": + enabled = bool(data.get("enabled", False)) + curve_tag = data.get("curve_tag") self.mouse_handler.set_edit_mode(enabled, curve_tag) if self._scene: self._scene.set_edit_mode(enabled) if curve_tag is not None: self._scene.set_active_curve(curve_tag) - elif cmd == 'set_active_curve': - curve_tag = data.get('curve_tag') - self.mouse_handler.set_edit_mode(self.mouse_handler.edit_mode_enabled, curve_tag) + elif cmd == "set_active_curve": + curve_tag = data.get("curve_tag") + self.mouse_handler.set_edit_mode( + self.mouse_handler.edit_mode_enabled, curve_tag + ) if self._scene: self._scene.set_active_curve(curve_tag) - elif cmd == 'set_axis_constraint': - self._set_axis_constraint(data.get('mask', 7)) + elif cmd == "set_axis_constraint": + self._set_axis_constraint(data.get("mask", 7)) except queue.Empty: break return task.cont @@ -137,7 +137,7 @@ def _process_commands(self, task): def _set_axis_constraint(self, mask: int): try: raw_mask = int(mask) - except (TypeError, ValueError): + except TypeError, ValueError: raw_mask = 7 self.hud.setText("Axis constraint invalid, fallback to xyz (7).") self.axis_constraint_mask = max(0, min(7, raw_mask)) @@ -160,7 +160,9 @@ def load_scene(self, geom_data: dict): self._scene.set_axis_constraint(self.axis_constraint_mask) if self._camera_controller is None: - self._camera_controller = CameraController(self, self._scene, self._camera_cfg()) + self._camera_controller = CameraController( + self, self._scene, self._camera_cfg() + ) else: self._camera_controller.scene = self._scene diff --git a/bot/viewer/viewer.py b/bot/viewer/viewer.py index 0c8aeb8..6ef14d8 100644 --- a/bot/viewer/viewer.py +++ b/bot/viewer/viewer.py @@ -8,7 +8,6 @@ in the form of serializable dicts. """ -import math import multiprocessing as mp import threading from typing import Any, Callable, Optional, TYPE_CHECKING @@ -25,12 +24,14 @@ # Subprocess entry function (must be at module level for pickle) # --------------------------------------------------------------------------- + def _viewer_subprocess(conn, config_filename: str): """ Panda3D subprocess entry point. Runs on the subprocess main thread → macOS safe. """ import queue as _queue + cmd_queue = _queue.Queue() # Thread that reads the parent pipe → puts into the internal queue @@ -39,7 +40,7 @@ def _pipe_reader(): try: msg = conn.recv() cmd_queue.put(msg) - if msg[0] == 'exit': # Exit command + if msg[0] == "exit": # Exit command break except EOFError: break @@ -53,14 +54,16 @@ def on_event(event_type, data): pass from bot.viewer.app import ViewerApp + app = ViewerApp(config_filename, cmd_queue, on_event) - app.run() # blocking — intentional, it's the main thread of the subprocess + app.run() # blocking — intentional, it's the main thread of the subprocess # --------------------------------------------------------------------------- # Public API # --------------------------------------------------------------------------- + class Viewer: """ 3D Viewer connected to a Model core. @@ -82,9 +85,9 @@ class Viewer: def __init__(self, config_filename: str = "bot_config.toml"): self._config_filename = config_filename self.model: Optional[Model] = None - self._conn = None # parent end of the Pipe - self._process = None # Panda3D subprocess - self._event_thread = None # event listening thread + self._conn = None # parent end of the Pipe + self._process = None # Panda3D subprocess + self._event_thread = None # event listening thread self._running = False self._default_last_hovered = None @@ -96,37 +99,35 @@ def __init__(self, config_filename: str = "bot_config.toml"): self.on_cp_drag: Optional[Callable] = None self.on_cp_pick_end: Optional[Callable] = self._default_on_cp_pick_end - - # ------------------------------------------------------------------ # Public API # ------------------------------------------------------------------ def highlight_curve(self, tag: str, color: list) -> "Viewer": """Colors the geometry associated with a tag.""" - self._send('highlight_curve', {'tag': tag, 'color': color}) + self._send("highlight_curve", {"tag": tag, "color": color}) return self def set_hud_text(self, text: str) -> "Viewer": """Updates the text displayed in an overlay on the screen.""" - self._send('update_hud', {'text': text}) + self._send("update_hud", {"text": text}) return self def set_edit_mode(self, enabled: bool, curve_tag: Optional[int] = None) -> "Viewer": - self._send('set_edit_mode', {'enabled': enabled, 'curve_tag': curve_tag}) + self._send("set_edit_mode", {"enabled": enabled, "curve_tag": curve_tag}) return self def set_active_curve(self, curve_tag: Optional[int]) -> "Viewer": - self._send('set_active_curve', {'curve_tag': curve_tag}) + self._send("set_active_curve", {"curve_tag": curve_tag}) return self def set_axis_constraint(self, mask: int) -> "Viewer": try: normalized = int(mask) - except (TypeError, ValueError): + except TypeError, ValueError: normalized = 7 normalized = max(0, min(7, normalized)) - self._send('set_axis_constraint', {'mask': normalized}) + self._send("set_axis_constraint", {"mask": normalized}) return self def connect(self, model: Model) -> "Viewer": @@ -140,7 +141,7 @@ def connect(self, model: Model) -> "Viewer": self.model = model model.add_observer(self) if self._conn is not None: - self._send('load', model.get_render_data()) + self._send("load", model.get_render_data()) return self def disconnect(self) -> "Viewer": @@ -157,7 +158,7 @@ def run(self) -> "Viewer": """ self._running = True - ctx = mp.get_context('spawn') + ctx = mp.get_context("spawn") parent_conn, child_conn = ctx.Pipe() self._conn = parent_conn @@ -170,7 +171,7 @@ def run(self) -> "Viewer": child_conn.close() # useless in the parent process if self.model is not None: - self._send('load', self.model.get_render_data()) + self._send("load", self.model.get_render_data()) self._start_event_listener() return self @@ -187,15 +188,15 @@ def stop(self): # 2. Send the stop signal to the subprocess if self._conn is not None: try: - self._send('exit', None) - except: + self._send("exit", None) + except: # noqa: E722 pass # 3. Wait for the process to finish if self._process is not None: - self._process.join(timeout=2.0) # We allow 2 seconds to close + self._process.join(timeout=2.0) # We allow 2 seconds to close if self._process.is_alive(): - self._process.terminate() # Brute force if still alive + self._process.terminate() # Brute force if still alive self._process = None # 4. Close communication @@ -205,13 +206,14 @@ def stop(self): self._event_thread = None print("Stopped Viewer") + # ------------------------------------------------------------------ # Observer callback (called by Model when state changes) # ------------------------------------------------------------------ def update(self, model: Model): """Called by the Model through the observer pattern when geometry changes.""" - self._send('update', model.get_render_data()) + self._send("update", model.get_render_data()) # ------------------------------------------------------------------ # Internal helpers @@ -227,24 +229,34 @@ def _send(self, cmd: str, data): def _start_event_listener(self): """Lightweight thread that receives events from the subprocess (e.g., picking).""" + def _listen(): while self._running: try: if self._conn.poll(0.1): event_type, data = self._conn.recv() - if event_type == 'pick' and self.on_pick is not None: + if event_type == "pick" and self.on_pick is not None: self.on_pick(data) - elif event_type == 'hover' and self.on_hover is not None: + elif event_type == "hover" and self.on_hover is not None: self.on_hover(data) - elif event_type == 'curve_selected' and self.on_curve_selected is not None: + elif ( + event_type == "curve_selected" + and self.on_curve_selected is not None + ): self.on_curve_selected(data) - elif event_type == 'cp_pick_start' and self.on_cp_pick_start is not None: + elif ( + event_type == "cp_pick_start" + and self.on_cp_pick_start is not None + ): self.on_cp_pick_start(data) - elif event_type == 'cp_drag' and self.on_cp_drag is not None: + elif event_type == "cp_drag" and self.on_cp_drag is not None: self.on_cp_drag(data) - elif event_type == 'cp_pick_end' and self.on_cp_pick_end is not None: + elif ( + event_type == "cp_pick_end" + and self.on_cp_pick_end is not None + ): self.on_cp_pick_end(data) - except (EOFError, BrokenPipeError, AttributeError): + except EOFError, BrokenPipeError, AttributeError: break except Exception: pass @@ -273,7 +285,7 @@ def _default_on_hover(self, tag): pt_a = f"({coords_a[0]:.2f}, {coords_a[1]:.2f}, {coords_a[2]:.2f})" pt_b = f"({coords_b[0]:.2f}, {coords_b[1]:.2f}, {coords_b[2]:.2f})" - info_text += f"Type: Segment linéaire\n" + info_text += "Type: Segment linéaire\n" info_text += f"Extrémité A: {pt_a}\n" info_text += f"Extrémité B: {pt_b}" @@ -297,7 +309,7 @@ def _default_on_curve_selected(self, tag): return try: normalized = int(tag) - except (TypeError, ValueError): + except TypeError, ValueError: return self.set_edit_mode(True, normalized) self.set_active_curve(normalized) @@ -307,9 +319,9 @@ def _default_on_cp_pick_end(self, data): if self.model is None or data is None: return try: - tag = int(data['tag']) - cp_index = int(data['cp_index']) - world_pos = data.get('world_pos') + tag = int(data["tag"]) + cp_index = int(data["cp_index"]) + world_pos = data.get("world_pos") if world_pos is None: return self.model.update_control_point(tag, cp_index, world_pos) @@ -321,7 +333,9 @@ def bezier_conversion(self, degree: int): tag = int(self._default_last_hovered) if self.model is not None: coords_a, coords_b = self.model.get_end_points_coords(int(tag)) - control_points = BezierCurve._default_control_points(coords_a, coords_b, degree) + control_points = BezierCurve._default_control_points( + coords_a, coords_b, degree + ) curve = BezierCurve(tag, control_points, degree) self.model.set_curve(tag, curve) else: @@ -332,6 +346,8 @@ def bezier_conversion(self, degree: int): def move_control_point(self, tag: int, cp_index: int, new_pos: list[float]): if self.model is not None: self.model.update_control_point(tag, cp_index, new_pos) - self.set_hud_text(f"Point de contrôle {cp_index} de la courbe {tag} déplacé.") + self.set_hud_text( + f"Point de contrôle {cp_index} de la courbe {tag} déplacé." + ) else: self.set_hud_text("Aucun modèle chargé.") diff --git a/ferrispline b/ferrispline index 22179a0..f5611d2 160000 --- a/ferrispline +++ b/ferrispline @@ -1 +1 @@ -Subproject commit 22179a0397eb61a8ddf86db7650c44efc9a6ab36 +Subproject commit f5611d292bec9fd946017a9d00b8bd36b311c864 diff --git a/pyproject.toml b/pyproject.toml index d72605f..10306ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,10 +24,15 @@ build-backend = "hatchling.build" [dependency-groups] dev = [ + "matplotlib>=3.10.9", + "numpy>=2.4.4", "pdoc>=16.0.0", + "pyqt5>=5.15.11", "pytest>=9.0.2", "pytest-cov>=7.0.0", + "pyvista>=0.47.3", "ruff", + "scipy>=1.17.1", ] [tool.pytest.ini_options] diff --git a/tests/system/test_cad_workflow.py b/tests/system/test_cad_workflow.py index d4c22c6..3a6e0ed 100644 --- a/tests/system/test_cad_workflow.py +++ b/tests/system/test_cad_workflow.py @@ -4,6 +4,7 @@ These tests exercise the Model end-to-end: file loading, topology queries, point addition and render-data consistency. No Panda3D required. """ + import unittest from bot.core.cad import Model as CADModel @@ -59,42 +60,39 @@ def tearDown(self): def test_render_data_has_all_keys(self): data = self.cad.get_render_data() - self.assertIn('points', data) - self.assertIn('edges', data) - self.assertIn('bounds', data) + self.assertIn("points", data) + self.assertIn("edges", data) + self.assertIn("bounds", data) def test_edges_reference_valid_point_indices(self): data = self.cad.get_render_data() - n = len(data['points']) - for idx_a, idx_b, _curve_tag in data['edges']: + n = len(data["points"]) + for idx_a, idx_b, _curve_tag in data["edges"]: self.assertGreaterEqual(idx_a, 0) self.assertLess(idx_a, n) self.assertGreaterEqual(idx_b, 0) self.assertLess(idx_b, n) def test_bounds_center_is_inside_min_max(self): - bounds = self.cad.get_render_data()['bounds'] + bounds = self.cad.get_render_data()["bounds"] for axis in range(3): - self.assertGreaterEqual( - bounds['center'][axis], bounds['min'][axis] - 1e-9 - ) - self.assertLessEqual( - bounds['center'][axis], bounds['max'][axis] + 1e-9 - ) + self.assertGreaterEqual(bounds["center"][axis], bounds["min"][axis] - 1e-9) + self.assertLessEqual(bounds["center"][axis], bounds["max"][axis] + 1e-9) def test_bounds_size_matches_min_max(self): - bounds = self.cad.get_render_data()['bounds'] + bounds = self.cad.get_render_data()["bounds"] for axis in range(3): - expected = bounds['max'][axis] - bounds['min'][axis] - self.assertAlmostEqual(bounds['size'][axis], expected, places=9) + expected = bounds["max"][axis] - bounds["min"][axis] + self.assertAlmostEqual(bounds["size"][axis], expected, places=9) def test_render_data_is_picklable(self): import pickle + data = self.cad.get_render_data() serialised = pickle.dumps(data) restored = pickle.loads(serialised) - self.assertEqual(data['bounds'], restored['bounds']) - self.assertEqual(len(data['points']), len(restored['points'])) + self.assertEqual(data["bounds"], restored["bounds"]) + self.assertEqual(len(data["points"]), len(restored["points"])) class TestAddPointWorkflow(unittest.TestCase): @@ -104,7 +102,7 @@ def setUp(self): self.cad = CADModel() self.cad.open(GEO_FILE) self.initial_point_count = len(self.cad.get_point_tags()) - self.initial_render_pts = len(self.cad.get_render_data()['points']) + self.initial_render_pts = len(self.cad.get_render_data()["points"]) def tearDown(self): self.cad.finalize() @@ -122,16 +120,16 @@ def test_add_point_returns_valid_tag(self): def test_add_point_updates_render_data(self): self.cad.add_point([100.0, 100.0, 0.0]) - new_count = len(self.cad.get_render_data()['points']) + new_count = len(self.cad.get_render_data()["points"]) # Mesh is regenerated: number of discretisation nodes changes self.assertGreater(new_count, 0) def test_bounds_extend_when_point_is_outside(self): - old_bounds = self.cad.get_render_data()['bounds'] - far_x = old_bounds['max'][0] + 1000.0 + old_bounds = self.cad.get_render_data()["bounds"] + far_x = old_bounds["max"][0] + 1000.0 self.cad.add_point([far_x, 0.0, 0.0]) - new_bounds = self.cad.get_render_data()['bounds'] - self.assertGreaterEqual(new_bounds['max'][0], far_x - 1e-6) + new_bounds = self.cad.get_render_data()["bounds"] + self.assertGreaterEqual(new_bounds["max"][0], far_x - 1e-6) def test_cumulative_additions(self): coords = [[10.0, 0.0, 0.0], [20.0, 0.0, 0.0], [30.0, 0.0, 0.0]] @@ -167,5 +165,5 @@ def test_closest_point_result_length_matches_input(self): self.assertEqual(len(result), len(coords)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/system/test_model_viewer_pipeline.py b/tests/system/test_model_viewer_pipeline.py index 08d6010..901bacc 100644 --- a/tests/system/test_model_viewer_pipeline.py +++ b/tests/system/test_model_viewer_pipeline.py @@ -8,8 +8,9 @@ endpoint is replaced by a spy so we can assert on what would have been transmitted to the rendering process. """ + import unittest -from unittest.mock import MagicMock, call +from unittest.mock import MagicMock from bot.core.cad import Model as CADModel from bot.viewer.viewer import Viewer @@ -40,22 +41,22 @@ def test_connect_sends_load_command(self): viewer.connect(self.model) spy.send.assert_called_once() cmd, data = spy.send.call_args[0][0] - self.assertEqual(cmd, 'load') + self.assertEqual(cmd, "load") def test_load_payload_contains_points_and_edges(self): viewer, spy = _make_spied_viewer() viewer.connect(self.model) _, data = spy.send.call_args[0][0] - self.assertIn('points', data) - self.assertIn('edges', data) - self.assertGreater(len(data['points']), 0) - self.assertGreater(len(data['edges']), 0) + self.assertIn("points", data) + self.assertIn("edges", data) + self.assertGreater(len(data["points"]), 0) + self.assertGreater(len(data["edges"]), 0) def test_load_payload_contains_bounds(self): viewer, spy = _make_spied_viewer() viewer.connect(self.model) _, data = spy.send.call_args[0][0] - self.assertIn('bounds', data) + self.assertIn("bounds", data) class TestViewerReceivesUpdate(unittest.TestCase): @@ -66,7 +67,7 @@ def setUp(self): self.model.open(GEO_FILE) self.viewer, self.spy = _make_spied_viewer() self.viewer.connect(self.model) - self.spy.reset_mock() # ignore the initial 'load' call + self.spy.reset_mock() # ignore the initial 'load' call def tearDown(self): self.model.finalize() @@ -75,14 +76,14 @@ def test_add_point_triggers_update(self): self.model.add_point([50.0, 50.0, 0.0]) self.spy.send.assert_called_once() cmd, _ = self.spy.send.call_args[0][0] - self.assertEqual(cmd, 'update') + self.assertEqual(cmd, "update") def test_update_payload_is_consistent_render_data(self): self.model.add_point([50.0, 50.0, 0.0]) _, data = self.spy.send.call_args[0][0] - self.assertIn('points', data) - self.assertIn('edges', data) - self.assertIn('bounds', data) + self.assertIn("points", data) + self.assertIn("edges", data) + self.assertIn("bounds", data) def test_multiple_mutations_each_trigger_update(self): for x in [10.0, 20.0, 30.0]: @@ -90,7 +91,7 @@ def test_multiple_mutations_each_trigger_update(self): self.assertEqual(3, self.spy.send.call_count) for c in self.spy.send.call_args_list: cmd, _ = c[0][0] - self.assertEqual(cmd, 'update') + self.assertEqual(cmd, "update") class TestMultipleViewers(unittest.TestCase): @@ -168,5 +169,5 @@ def test_after_stop_model_mutation_does_not_reach_viewer(self): spy.send.assert_not_called() -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/system/test_viewer_subprocess.py b/tests/system/test_viewer_subprocess.py index 28ebc7b..77f444e 100644 --- a/tests/system/test_viewer_subprocess.py +++ b/tests/system/test_viewer_subprocess.py @@ -8,6 +8,7 @@ Note: these tests will briefly open a Panda3D window. """ + import sys import time import unittest @@ -20,6 +21,7 @@ def _has_display() -> bool: if sys.platform == "darwin": return True # macOS always has a display import os + return bool(os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY")) @@ -29,6 +31,7 @@ class TestViewerSubprocessLifecycle(unittest.TestCase): def _start_viewer(self, model=None): from bot.viewer.viewer import Viewer + v = Viewer() if model: v.connect(model) @@ -60,6 +63,7 @@ def test_stop_closes_the_connection(self): def test_stop_deregisters_observer(self): from bot.core.cad import Model as CADModel + model = CADModel() model.open("data/profil_1.geo") try: @@ -72,6 +76,7 @@ def test_stop_deregisters_observer(self): def test_run_returns_self_for_chaining(self): from bot.viewer.viewer import Viewer + v = Viewer() result = v.run() try: @@ -90,6 +95,7 @@ class TestViewerIPCWithModel(unittest.TestCase): def setUp(self): from bot.core.cad import Model as CADModel from bot.viewer.viewer import Viewer + self.model = CADModel() self.model.open("data/profil_1.geo") self.viewer = Viewer() @@ -116,5 +122,5 @@ def test_multiple_mutations_keep_subprocess_alive(self): self.assertTrue(self.viewer._process.is_alive()) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_cad/test_model.py b/tests/unit/test_cad/test_model.py index 55e7a98..c0ae050 100644 --- a/tests/unit/test_cad/test_model.py +++ b/tests/unit/test_cad/test_model.py @@ -5,12 +5,14 @@ observer pattern, get_render_data structure, add_point side-effects and input-validation errors on getClosestPoint / get_adjacent_curves_of_point. """ + import unittest from bot.core.cad import Model as CADModel class _MockObserver: """Minimal observer that records every update() call.""" + def __init__(self): self.calls = [] @@ -19,7 +21,6 @@ def update(self, model): class TestObserverPattern(unittest.TestCase): - def setUp(self): self.model = CADModel() @@ -64,7 +65,6 @@ def test_multiple_observers_notified_independently(self): class TestGetRenderData(unittest.TestCase): - def setUp(self): self.model = CADModel() @@ -73,30 +73,29 @@ def tearDown(self): def test_returns_dict_with_required_keys(self): data = self.model.get_render_data() - self.assertIn('points', data) - self.assertIn('edges', data) - self.assertIn('bounds', data) + self.assertIn("points", data) + self.assertIn("edges", data) + self.assertIn("bounds", data) def test_points_and_edges_are_lists(self): data = self.model.get_render_data() - self.assertIsInstance(data['points'], list) - self.assertIsInstance(data['edges'], list) + self.assertIsInstance(data["points"], list) + self.assertIsInstance(data["edges"], list) def test_bounds_has_expected_keys(self): self.model.open("data/profil_1.geo") - bounds = self.model.get_render_data()['bounds'] - for key in ('min', 'max', 'center', 'size'): + bounds = self.model.get_render_data()["bounds"] + for key in ("min", "max", "center", "size"): self.assertIn(key, bounds) def test_bounds_are_lists_of_three_floats(self): self.model.open("data/profil_1.geo") - bounds = self.model.get_render_data()['bounds'] - for key in ('min', 'max', 'center', 'size'): + bounds = self.model.get_render_data()["bounds"] + for key in ("min", "max", "center", "size"): self.assertEqual(len(bounds[key]), 3) class TestAddPoint(unittest.TestCase): - def setUp(self): self.model = CADModel() @@ -122,12 +121,11 @@ def test_add_point_notifies_observers(self): def test_add_point_updates_bounds(self): self.model.add_point([10.0, 20.0, 30.0]) bounds = self.model.bounds - self.assertIn('min', bounds) - self.assertIn('max', bounds) + self.assertIn("min", bounds) + self.assertIn("max", bounds) class TestGetClosestPointValidation(unittest.TestCase): - def setUp(self): self.model = CADModel() self.model.open("data/profil_1.geo") @@ -160,5 +158,5 @@ def test_raises_value_error_for_dim_3(self): self.model.getClosestPoint(3, 1, [0, 0, 0]) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_control/test_mouse_axis_constraint.py b/tests/unit/test_control/test_mouse_axis_constraint.py index 1c071b4..218c19c 100644 --- a/tests/unit/test_control/test_mouse_axis_constraint.py +++ b/tests/unit/test_control/test_mouse_axis_constraint.py @@ -5,6 +5,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) try: from bot.control.mouse import MouseHandler + _HAS_PANDA_DEPS = True except ModuleNotFoundError: MouseHandler = None @@ -28,13 +29,17 @@ def test_mask_four_keeps_only_z(self): handler = self._make_handler(4) start = [1.0, 2.0, 3.0] candidate = [9.0, 8.0, 7.0] - self.assertEqual(handler._apply_axis_constraint(start, candidate), [1.0, 2.0, 7.0]) + self.assertEqual( + handler._apply_axis_constraint(start, candidate), [1.0, 2.0, 7.0] + ) def test_mask_three_keeps_xy(self): handler = self._make_handler(3) start = [1.0, 2.0, 3.0] candidate = [9.0, 8.0, 7.0] - self.assertEqual(handler._apply_axis_constraint(start, candidate), [9.0, 8.0, 3.0]) + self.assertEqual( + handler._apply_axis_constraint(start, candidate), [9.0, 8.0, 3.0] + ) def test_mask_seven_keeps_all_axes(self): handler = self._make_handler(7) diff --git a/tests/unit/test_control/test_mouse_drag_session.py b/tests/unit/test_control/test_mouse_drag_session.py index 6e0e405..430dd80 100644 --- a/tests/unit/test_control/test_mouse_drag_session.py +++ b/tests/unit/test_control/test_mouse_drag_session.py @@ -5,6 +5,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) try: from bot.control.mouse import MouseHandler + _HAS_PANDA_DEPS = True except ModuleNotFoundError: MouseHandler = None diff --git a/tests/unit/test_curve/test_bezier-curve.py b/tests/unit/test_curve/test_bezier-curve.py index 527c26d..d586677 100644 --- a/tests/unit/test_curve/test_bezier-curve.py +++ b/tests/unit/test_curve/test_bezier-curve.py @@ -4,6 +4,7 @@ The external Rust dependency (nurbslib) is mocked to allow testing the Python bridge and logic without requiring the compiled engine. """ + import unittest from unittest.mock import MagicMock, patch @@ -11,8 +12,7 @@ class TestBezierCurve(unittest.TestCase): - - @patch('bot.core.curve.nurbslib') + @patch("bot.core.curve.nurbslib") def test_initialization_and_attributes(self, mock_nurbslib): """Tests the initialization of the curve and access to its basic attributes.""" # 1. Data preparation @@ -35,7 +35,9 @@ def test_initialization_and_attributes(self, mock_nurbslib): self.assertEqual(curve.get_degree(), degree) # Ensure the Rust engine was called with the correct arguments - mock_nurbslib.PyBezierCurve.assert_called_once_with(degree, control_points, None) + mock_nurbslib.PyBezierCurve.assert_called_once_with( + degree, control_points, None + ) def test_default_control_points_default_degree(self): """Tests that the method uses default degree 3 if not specified.""" @@ -50,7 +52,7 @@ def test_default_control_points_default_degree(self): [0.0, 0.0, 0.0], [10.0, 0.0, 0.0], [20.0, 0.0, 0.0], - [30.0, 0.0, 0.0] + [30.0, 0.0, 0.0], ] self.assertEqual(len(pts), 4) self.assertEqual(pts, expected_pts) @@ -65,11 +67,7 @@ def test_default_control_points_distribution(self): pts = BezierCurve._default_control_points(coords_a, coords_b, degree) # We expect 3 points: point A, middle point, and point B - expected_pts = [ - [0.0, 0.0, 0.0], - [5.0, 0.0, 0.0], - [10.0, 0.0, 0.0] - ] + expected_pts = [[0.0, 0.0, 0.0], [5.0, 0.0, 0.0], [10.0, 0.0, 0.0]] self.assertEqual(pts, expected_pts) def test_default_control_points_count(self): @@ -93,7 +91,7 @@ def test_default_control_points_degree_zero(self): self.assertEqual(len(pts), 1) self.assertEqual(pts[0], coords_a) - @patch('bot.core.curve.nurbslib') + @patch("bot.core.curve.nurbslib") def test_get_render_data(self, mock_nurbslib): """Tests the structure and content of the render dictionary (used by the viewer).""" tag = "42" @@ -115,20 +113,20 @@ def test_get_render_data(self, mock_nurbslib): data = curve.get_render_data() # Verification of the presence of all required keys - self.assertIn('tag', data) - self.assertIn('control_points', data) - self.assertIn('degree', data) - self.assertIn('curve', data) + self.assertIn("tag", data) + self.assertIn("control_points", data) + self.assertIn("degree", data) + self.assertIn("curve", data) # Verifications of values - self.assertEqual(data['tag'], "42") - self.assertEqual(data['control_points'], control_points) - self.assertEqual(data['degree'], degree) - self.assertEqual(data['curve'], mock_curve_eval) + self.assertEqual(data["tag"], "42") + self.assertEqual(data["control_points"], control_points) + self.assertEqual(data["degree"], degree) + self.assertEqual(data["curve"], mock_curve_eval) # Ensure the engine was called to generate 100 points mock_engine_instance.evaluate.assert_called_once_with(100, False) -if __name__ == '__main__': - unittest.main() \ No newline at end of file +if __name__ == "__main__": + unittest.main() diff --git a/tests/unit/test_geom/test_geom.py b/tests/unit/test_geom/test_geom.py index e7f8845..35cfc49 100644 --- a/tests/unit/test_geom/test_geom.py +++ b/tests/unit/test_geom/test_geom.py @@ -1,8 +1,8 @@ import unittest from bot.core.cad import Model as CADModel -class GeomTest(unittest.TestCase): +class GeomTest(unittest.TestCase): def test_topology_query_2D(self): cad = CADModel() cad.open("data/profil_1.geo") @@ -48,14 +48,15 @@ def test_closest_points(self): coords = [2, 0, 0, 4, 2, 0] # We get the closest points on the 2nd curve which is a straight line # that connects (0,1,0) to (5,1,0) - outputs = cad.getClosestPoint(1,2,coords) + outputs = cad.getClosestPoint(1, 2, coords) # We know what should be the closest points oracle = [2, 1, 0, 4, 1, 0] - #and we compare + # and we compare epsilon = 1e-9 - for v1, v2 in zip(oracle,outputs): + for v1, v2 in zip(oracle, outputs): self.assertAlmostEqual(v1, v2, delta=epsilon) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_utils/test_color_generator.py b/tests/unit/test_utils/test_color_generator.py index aae7190..5b918c5 100644 --- a/tests/unit/test_utils/test_color_generator.py +++ b/tests/unit/test_utils/test_color_generator.py @@ -3,7 +3,6 @@ class TestColorGenerator(unittest.TestCase): - def test_returns_correct_number_of_colors(self): for n in [1, 3, 10]: colors = ColorGenerator.generate_distinct_colors(n) @@ -35,5 +34,5 @@ def test_empty(self): self.assertEqual(colors, []) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_view/test_scene_axis_guide.py b/tests/unit/test_view/test_scene_axis_guide.py index f60f520..f027724 100644 --- a/tests/unit/test_view/test_scene_axis_guide.py +++ b/tests/unit/test_view/test_scene_axis_guide.py @@ -5,6 +5,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) try: from bot.view.scene import Scene + _HAS_PANDA_DEPS = True except ModuleNotFoundError: Scene = None diff --git a/tests/unit/test_viewer/test_viewer.py b/tests/unit/test_viewer/test_viewer.py index ece8ebf..f4f5b7d 100644 --- a/tests/unit/test_viewer/test_viewer.py +++ b/tests/unit/test_viewer/test_viewer.py @@ -4,12 +4,14 @@ The subprocess and multiprocessing pipe are fully mocked so these tests run without Panda3D or a display. """ + import unittest -from unittest.mock import MagicMock, patch, PropertyMock +from unittest.mock import MagicMock, patch class _FakeModel: """Minimal Model stand-in for observer-registration tests.""" + def __init__(self): self._observers = [] @@ -20,13 +22,13 @@ def remove_observer(self, obs): self._observers.remove(obs) def get_render_data(self): - return {'points': [], 'edges': [], 'bounds': {}} + return {"points": [], "edges": [], "bounds": {}} class TestViewerConnect(unittest.TestCase): - def _make_viewer(self): from bot.viewer.viewer import Viewer + return Viewer() def test_connect_registers_viewer_as_observer(self): @@ -59,9 +61,9 @@ def test_connect_replaces_previous_model(self): class TestViewerDisconnect(unittest.TestCase): - def _make_viewer(self): from bot.viewer.viewer import Viewer + return Viewer() def test_disconnect_removes_observer(self): @@ -92,9 +94,9 @@ def test_disconnect_without_model_is_safe(self): class TestViewerUpdate(unittest.TestCase): - def _make_viewer(self): from bot.viewer.viewer import Viewer + return Viewer() def test_update_sends_render_data_over_pipe(self): @@ -106,9 +108,7 @@ def test_update_sends_render_data_over_pipe(self): viewer.update(model) - mock_conn.send.assert_called_once_with( - ('update', model.get_render_data()) - ) + mock_conn.send.assert_called_once_with(("update", model.get_render_data())) def test_update_ignores_broken_pipe(self): viewer = self._make_viewer() @@ -129,17 +129,17 @@ def test_update_does_nothing_without_connection(self): class TestViewerSend(unittest.TestCase): - def _make_viewer(self): from bot.viewer.viewer import Viewer + return Viewer() def test_send_transmits_command(self): viewer = self._make_viewer() mock_conn = MagicMock() viewer._conn = mock_conn - viewer._send('load', {'points': []}) - mock_conn.send.assert_called_once_with(('load', {'points': []})) + viewer._send("load", {"points": []}) + mock_conn.send.assert_called_once_with(("load", {"points": []})) def test_send_silences_broken_pipe(self): viewer = self._make_viewer() @@ -147,12 +147,13 @@ def test_send_silences_broken_pipe(self): mock_conn.send.side_effect = BrokenPipeError viewer._conn = mock_conn # Should not raise - viewer._send('load', {}) + viewer._send("load", {}) def test_send_noop_when_no_connection(self): viewer = self._make_viewer() # No exception expected - viewer._send('load', {}) + viewer._send("load", {}) + class TestViewerDefaultOnHover(unittest.TestCase): """Tests pour le comportement par défaut au survol (HUD et surbrillance).""" @@ -160,6 +161,7 @@ class TestViewerDefaultOnHover(unittest.TestCase): def _make_viewer_with_mocks(self): """Crée un Viewer avec tous les mocks nécessaires pour tester l'interface.""" from bot.viewer.viewer import Viewer + viewer = Viewer() viewer._conn = MagicMock() @@ -179,7 +181,9 @@ def test_default_on_hover_empty_space(self): viewer._default_on_hover(None) viewer.highlight_curve.assert_called_once_with("2", [1, 1, 1, 1]) - viewer.set_hud_text.assert_called_once_with("Prêt. Survolez ou cliquez sur les courbes.") + viewer.set_hud_text.assert_called_once_with( + "Prêt. Survolez ou cliquez sur les courbes." + ) self.assertIsNone(viewer._default_last_hovered) def test_default_on_hover_invalid_tag(self): @@ -193,7 +197,10 @@ def test_default_on_hover_invalid_tag(self): def test_default_on_hover_valid_tag(self): viewer = self._make_viewer_with_mocks() - viewer.model.get_end_points_coords.return_value = [[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]] + viewer.model.get_end_points_coords.return_value = [ + [0.0, 0.0, 0.0], + [1.0, 1.0, 1.0], + ] viewer._default_on_hover("1") @@ -212,7 +219,10 @@ def test_default_on_hover_change_curve(self): viewer = self._make_viewer_with_mocks() viewer._default_last_hovered = "1" - viewer.model.get_end_points_coords.return_value = [[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]] + viewer.model.get_end_points_coords.return_value = [ + [0.0, 0.0, 0.0], + [1.0, 1.0, 1.0], + ] viewer._default_on_hover("3") @@ -220,12 +230,14 @@ def test_default_on_hover_change_curve(self): viewer.highlight_curve.assert_any_call("3", [1, 0.5, 0, 1]) self.assertEqual(viewer._default_last_hovered, "3") + class TestViewerBezierInteractions(unittest.TestCase): """Tests for Bezier curve modification interactions via the Viewer.""" def _make_viewer_with_mocks(self): """Creates a Viewer with all necessary mocks.""" from bot.viewer.viewer import Viewer + viewer = Viewer() # Mock connection and HUD text display @@ -237,8 +249,7 @@ def _make_viewer_with_mocks(self): return viewer - - @patch('bot.viewer.viewer.BezierCurve') + @patch("bot.viewer.viewer.BezierCurve") def test_bezier_conversion_success(self, MockBezierCurve): """Verifies the conversion of a classic curve into a Bezier curve.""" viewer = self._make_viewer_with_mocks() @@ -251,7 +262,12 @@ def test_bezier_conversion_success(self, MockBezierCurve): viewer.model.get_end_points_coords.return_value = [coords_a, coords_b] # Mock configuration for the static method _default_control_points - MockBezierCurve._default_control_points.return_value = [coords_a, [3.3, 0, 0], [6.6, 0, 0], coords_b] + MockBezierCurve._default_control_points.return_value = [ + coords_a, + [3.3, 0, 0], + [6.6, 0, 0], + coords_b, + ] # Configuration of the mocked instance returned by BezierCurve(...) mock_curve_instance = MagicMock() @@ -262,8 +278,12 @@ def test_bezier_conversion_success(self, MockBezierCurve): # Assertions viewer.model.get_end_points_coords.assert_called_once_with(42) - MockBezierCurve._default_control_points.assert_called_once_with(coords_a, coords_b, degree) - MockBezierCurve.assert_called_once_with(42, MockBezierCurve._default_control_points.return_value, degree) + MockBezierCurve._default_control_points.assert_called_once_with( + coords_a, coords_b, degree + ) + MockBezierCurve.assert_called_once_with( + 42, MockBezierCurve._default_control_points.return_value, degree + ) viewer.model.set_curve.assert_called_once_with(42, mock_curve_instance) def test_bezier_conversion_no_selection(self): @@ -274,7 +294,9 @@ def test_bezier_conversion_no_selection(self): viewer.bezier_conversion(3) # Verification of the HUD error - viewer.set_hud_text.assert_called_once_with("Impossible to convert: no curve selected") + viewer.set_hud_text.assert_called_once_with( + "Impossible to convert: no curve selected" + ) # Verifies the model was not called viewer.model.get_end_points_coords.assert_not_called() @@ -287,8 +309,9 @@ def test_bezier_conversion_no_model(self): viewer.bezier_conversion(3) # Verification of the HUD error - viewer.set_hud_text.assert_called_once_with("Impossible to convert: no model loaded") - + viewer.set_hud_text.assert_called_once_with( + "Impossible to convert: no model loaded" + ) def test_move_control_point_success(self): """Verifies that the modification of a control point is correctly transmitted to the model.""" @@ -301,9 +324,13 @@ def test_move_control_point_success(self): viewer.move_control_point(tag, cp_index, new_pos) # Verifies the model is updated - viewer.model.update_control_point.assert_called_once_with(tag, cp_index, new_pos) + viewer.model.update_control_point.assert_called_once_with( + tag, cp_index, new_pos + ) # Verifies the success message in the HUD - viewer.set_hud_text.assert_called_once_with(f"Point de contrôle {cp_index} de la courbe {tag} déplacé.") + viewer.set_hud_text.assert_called_once_with( + f"Point de contrôle {cp_index} de la courbe {tag} déplacé." + ) def test_move_control_point_no_model(self): """Verifies behavior if attempting to move a point without a connected model.""" @@ -317,9 +344,9 @@ def test_move_control_point_no_model(self): class TestViewerCurveEditMode(unittest.TestCase): - def _make_viewer(self): from bot.viewer.viewer import Viewer + viewer = Viewer() viewer._conn = MagicMock() return viewer @@ -327,22 +354,24 @@ def _make_viewer(self): def test_set_edit_mode_sends_command(self): viewer = self._make_viewer() viewer.set_edit_mode(True, 7) - viewer._conn.send.assert_called_with(('set_edit_mode', {'enabled': True, 'curve_tag': 7})) + viewer._conn.send.assert_called_with( + ("set_edit_mode", {"enabled": True, "curve_tag": 7}) + ) def test_set_active_curve_sends_command(self): viewer = self._make_viewer() viewer.set_active_curve(9) - viewer._conn.send.assert_called_with(('set_active_curve', {'curve_tag': 9})) + viewer._conn.send.assert_called_with(("set_active_curve", {"curve_tag": 9})) def test_set_axis_constraint_sends_command(self): viewer = self._make_viewer() viewer.set_axis_constraint(6) - viewer._conn.send.assert_called_with(('set_axis_constraint', {'mask': 6})) + viewer._conn.send.assert_called_with(("set_axis_constraint", {"mask": 6})) def test_set_axis_constraint_clamps_invalid_value(self): viewer = self._make_viewer() viewer.set_axis_constraint("oops") - viewer._conn.send.assert_called_with(('set_axis_constraint', {'mask': 7})) + viewer._conn.send.assert_called_with(("set_axis_constraint", {"mask": 7})) def test_default_on_curve_selected_enables_edit_mode(self): viewer = self._make_viewer() @@ -360,9 +389,12 @@ def test_default_on_cp_pick_end_commits_to_model(self): viewer = self._make_viewer() viewer.model = MagicMock() - viewer._default_on_cp_pick_end({'tag': '4', 'cp_index': 2, 'world_pos': [1.0, 2.0, 3.0]}) + viewer._default_on_cp_pick_end( + {"tag": "4", "cp_index": 2, "world_pos": [1.0, 2.0, 3.0]} + ) viewer.model.update_control_point.assert_called_once_with(4, 2, [1.0, 2.0, 3.0]) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/uv.lock b/uv.lock index 9974f65..f45c4d0 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, ] +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + [[package]] name = "bot" version = "0.1.0" @@ -24,24 +33,86 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "matplotlib" }, + { name = "numpy" }, { name = "pdoc" }, + { name = "pyqt5" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "pyvista" }, + { name = "ruff" }, + { name = "scipy" }, ] [package.metadata] requires-dist = [ { name = "gmsh", specifier = ">=4.15.0" }, { name = "ipython", specifier = ">=9.10.0" }, - { name = "nurbslib" }, + { name = "nurbslib", directory = "ferrispline/nurbslib" }, { name = "panda3d", specifier = ">=1.10.16" }, ] [package.metadata.requires-dev] dev = [ + { name = "matplotlib", specifier = ">=3.10.9" }, + { name = "numpy", specifier = ">=2.4.4" }, { name = "pdoc", specifier = ">=16.0.0" }, + { name = "pyqt5", specifier = ">=5.15.11" }, { name = "pytest", specifier = ">=9.0.2" }, { name = "pytest-cov", specifier = ">=7.0.0" }, + { name = "pyvista", specifier = ">=0.47.3" }, + { name = "ruff" }, + { name = "scipy", specifier = ">=1.17.1" }, +] + +[[package]] +name = "certifi" +version = "2026.4.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] @@ -53,6 +124,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + [[package]] name = "coverage" version = "7.13.4" @@ -92,6 +196,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, ] +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "cyclopts" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "rich-rst" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/fa/eff8f1abae783bade9b5e9bafafd0040d4dbf51988f9384bfdc0326ba1fc/cyclopts-4.11.0.tar.gz", hash = "sha256:1ffcb9990dbd56b90da19980d31596de9e99019980a215a5d76cf88fe452e94d", size = 170690, upload-time = "2026-04-23T00:23:36.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/37/197db187c260d24d4be1f09d427f59f3fb9a89bcf1354e23865c7bff7607/cyclopts-4.11.0-py3-none-any.whl", hash = "sha256:34318e3823b44b5baa754a5e37ec70a5c17dc81c65e4295ed70e17bc1aeae50d", size = 208494, upload-time = "2026-04-23T00:23:34.948Z" }, +] + [[package]] name = "decorator" version = "5.2.1" @@ -101,6 +229,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "docstring-parser" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + [[package]] name = "executing" version = "2.2.1" @@ -110,6 +256,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] +[[package]] +name = "fonttools" +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, + { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, + { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, + { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +] + [[package]] name = "gmsh" version = "4.15.0" @@ -121,6 +292,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/23/51/21175eb9c6a592431a5c87f288ce447af1cea68a6ad4169765dc7ab7a9e7/gmsh-4.15.0-py2.py3-none-win_amd64.whl", hash = "sha256:a5b9867f88af59aff269a93abbd009551fbc263eb94a165a25a0c8072bae13db", size = 42233991, upload-time = "2025-10-26T20:30:32.722Z" }, ] +[[package]] +name = "idna" +version = "3.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -187,6 +367,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + [[package]] name = "markdown2" version = "2.5.4" @@ -226,6 +456,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, + { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, +] + [[package]] name = "matplotlib-inline" version = "0.2.1" @@ -259,16 +522,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/2a/afe0193b673a79ffd2e01ad999511b7e9e6b49af02bb3759d82a78c3043d/maturin-1.13.1-py3-none-win_arm64.whl", hash = "sha256:2839024dcd65776abb4759e5bca29941971e095574162a4d335191da4be9ff24", size = 8905575, upload-time = "2026-04-09T15:14:03.891Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, +] + [[package]] name = "nurbslib" -version = "0.1.0" -source = { registry = "wheel" } +source = { directory = "ferrispline/nurbslib" } dependencies = [ { name = "maturin" }, ] -wheels = [ - { path = "nurbslib-0.1.0-cp39-abi3-manylinux_2_34_x86_64.whl" }, -] + +[package.metadata] +requires-dist = [{ name = "maturin" }] [[package]] name = "packaging" @@ -332,6 +632,48 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -341,6 +683,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "pooch" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "platformdirs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/43/85ef45e8b36c6a48546af7b266592dc32d7f67837a6514d111bced6d7d75/pooch-1.9.0.tar.gz", hash = "sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed", size = 61788, upload-time = "2026-01-30T19:15:09.649Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl", hash = "sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b", size = 67175, upload-time = "2026-01-30T19:15:08.36Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.52" @@ -380,6 +736,55 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyqt5" +version = "5.15.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyqt5-qt5" }, + { name = "pyqt5-sip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775, upload-time = "2024-07-19T08:39:57.756Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776, upload-time = "2024-07-19T08:39:19.775Z" }, + { url = "https://files.pythonhosted.org/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415, upload-time = "2024-07-19T08:39:32.977Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103, upload-time = "2024-07-19T08:39:40.561Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308, upload-time = "2024-07-19T08:39:46.932Z" }, + { url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864, upload-time = "2024-07-19T08:39:53.572Z" }, +] + +[[package]] +name = "pyqt5-qt5" +version = "5.15.18" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/90/bf01ac2132400997a3474051dd680a583381ebf98b2f5d64d4e54138dc42/pyqt5_qt5-5.15.18-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:8bb997eb903afa9da3221a0c9e6eaa00413bbeb4394d5706118ad05375684767", size = 39715743, upload-time = "2025-11-09T12:56:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/24/8e/76366484d9f9dbe28e3bdfc688183433a7b82e314216e9b14c89e5fab690/pyqt5_qt5-5.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c656af9c1e6aaa7f59bf3d8995f2fa09adbf6762b470ed284c31dca80d686a26", size = 36798484, upload-time = "2025-11-09T12:56:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/9a/46/ffe177f99f897a59dc237a20059020427bd2d3853d713992b8081933ddfe/pyqt5_qt5-5.15.18-py3-none-manylinux2014_x86_64.whl", hash = "sha256:bf2457e6371969736b4f660a0c153258fa03dbc6a181348218e6f05421682af7", size = 60864590, upload-time = "2025-11-09T12:57:26.724Z" }, +] + +[[package]] +name = "pyqt5-sip" +version = "12.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/31/5ef342de9faee0f3801088946ae103db9b9eaeba3d6a64fefd5ce74df244/pyqt5_sip-12.18.0.tar.gz", hash = "sha256:71c37db75a0664325de149f43e2a712ec5fa1f90429a21dafbca005cb6767f94", size = 104143, upload-time = "2026-01-13T15:53:19.576Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/3a/b46a0116b1aacbb6156b2957eb5cb928c94b49f4626eb2540ca8d16ee757/pyqt5_sip-12.18.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8372ec8704bfd5e09942d0d055a1657eb4f702f4b30847a5e59df0496f99d67f", size = 124594, upload-time = "2026-01-13T15:53:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/58/63/df3037f11391c25c5b0ab233d22e58b8f056cb1ce16d7ecadb844421ce75/pyqt5_sip-12.18.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdb45c7cd2af7eccd7370b994d432bfc7965079f845392760724f26771bb59dc", size = 339056, upload-time = "2026-01-13T15:53:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/4f96b84520b8f8b7502682fd43f68f63ca6572b5858f56e5f61c76a54fe2/pyqt5_sip-12.18.0-cp314-cp314-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:92abe984becbde768954d6d0951f56d80a9868d2fd9e738e61fc944f0ff83dd6", size = 282439, upload-time = "2026-01-13T15:53:14.856Z" }, + { url = "https://files.pythonhosted.org/packages/79/8e/ccdf20d373ceba83e1d1b7f818505c375208ffde4a96376dc7dbe592406c/pyqt5_sip-12.18.0-cp314-cp314-win32.whl", hash = "sha256:bd9e3c6f81346f1b08d6db02305cdee20c009b43aa083d44ee2de47a7da0e123", size = 50713, upload-time = "2026-01-13T15:53:18.634Z" }, + { url = "https://files.pythonhosted.org/packages/7f/21/8486ed45977be615ec5371b24b47298b1cb0e1a455b419eddd0215078dba/pyqt5_sip-12.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:6d948f1be619c645cd3bda54952bfdc1aef7c79242dccea6a6858748e61114b9", size = 59622, upload-time = "2026-01-13T15:53:17.714Z" }, +] + [[package]] name = "pytest" version = "9.0.2" @@ -410,6 +815,152 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyvista" +version = "0.47.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cyclopts" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "pooch" }, + { name = "scooby" }, + { name = "typing-extensions" }, + { name = "vtk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/36/512c05b1cd431150d47479d1397013915eaf5c6d3f728eada53a601871b8/pyvista-0.47.3.tar.gz", hash = "sha256:03ce3923b42053cf8c9c151ea385431474f11b286d31fe9513cf5b7bf29fe848", size = 2463344, upload-time = "2026-04-10T17:47:07.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/33/f2775b3c7ee908bdd96c665cb1d6658a02d123dea33b9ee861e7d56ad2ae/pyvista-0.47.3-py3-none-any.whl", hash = "sha256:8db0dd77c744d2673a1b34333694cb4e8828a9193bbe2c0a8b3ceb9bfc12dd0f", size = 2508590, upload-time = "2026-04-10T17:47:05.532Z" }, +] + +[[package]] +name = "requests" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rich-rst" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/6d/a506aaa4a9eaa945ed8ab2b7347859f53593864289853c5d6d62b77246e0/rich_rst-1.3.2.tar.gz", hash = "sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4", size = 14936, upload-time = "2025-10-14T16:49:45.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/2f/b4530fbf948867702d0a3f27de4a6aab1d156f406d72852ab902c4d04de9/rich_rst-1.3.2-py3-none-any.whl", hash = "sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a", size = 12567, upload-time = "2025-10-14T16:49:42.953Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, + { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, + { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, + { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, + { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, + { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, + { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, + { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, + { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, +] + +[[package]] +name = "scooby" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/06/9a8600207fd72a29ee965e9a4c61b750cc3fa106768f14a7b3ee3e36cb61/scooby-0.11.2.tar.gz", hash = "sha256:0575c73636ec4c2587bea1f8a038798ddcb249e02067fae897dac3bf4f4e444d", size = 242928, upload-time = "2026-04-22T23:13:12.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/bc/1173f502f1870e3bae81c148326c5cbcc19ec77df79a9aaf17a59911355c/scooby-0.11.2-py3-none-any.whl", hash = "sha256:f34c36bbee749b2c55816a080521f216d88304e635017e911c12249607d38c49", size = 20142, upload-time = "2026-04-22T23:13:10.705Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -433,6 +984,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "vtk" +version = "9.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/de/ad1ccb188681d51b5e5621f383afa0a1dd8711ff8f3dcba4ff950f758cbb/vtk-9.6.1-cp314-cp314-macosx_10_10_x86_64.whl", hash = "sha256:91257894723dfced8be264915d81ba418d08e5bbdb4873da0f12b02c1e21f244", size = 114382745, upload-time = "2026-03-27T13:58:30.592Z" }, + { url = "https://files.pythonhosted.org/packages/59/21/7bb2bd61b4ae05db79e2f40df452a6dbcd3bb66c259fd2043aaf60bbe5b7/vtk-9.6.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e119721774418fba34e95852efaefe5ac4156a4a270362fef06894cdc1377b6e", size = 106826433, upload-time = "2026-03-27T13:59:22.109Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/5317afdeaa4a66fe037e1fedcb6bde86b888b8227c89aba6c8ad2946e380/vtk-9.6.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98df48bcd630a4ffa71ac09d6aebb69c628925902920419e3db838dc7f7ce0ed", size = 145936133, upload-time = "2026-03-27T14:01:19.29Z" }, + { url = "https://files.pythonhosted.org/packages/67/7f/f1375aa3ef1835e39b4bea978da06d4985bc1407e3e91384dfaabf5e09d0/vtk-9.6.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:3ea3c3e466a4a9cd8fa7e5b64595215467a7936c9f0fd61ec3275954c122a79c", size = 135710278, upload-time = "2026-03-27T14:00:19.358Z" }, + { url = "https://files.pythonhosted.org/packages/91/25/7ff877a0d4f3e848d994d3a774d5a8e4495681ed26c32eb9dbb2a86b50e5/vtk-9.6.1-cp314-cp314-win_amd64.whl", hash = "sha256:a05e12ab8c82e81b225feee5ca08fda5fff814520a11c2941cc866335d990e03", size = 83197720, upload-time = "2026-03-27T14:01:53.313Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ae/f621aaed0a36c99ba3c1b2f2593386094222132a8396f21c616adffacaaf/vtk-9.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:043fb013a2669180180bd0ab667f318f2e1f14da69ae943192a7443f5ce3721a", size = 145557875, upload-time = "2026-03-27T14:03:45.531Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d5/41edd3f8b38ad45b8fb30d12ef35be3d62e1221e455722a5d7d103ca2f0d/vtk-9.6.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d08b3760cbd8bffdbb4551033c4c9d87afe30e9e9d4c0e5cad29cbe7107c9af7", size = 135524312, upload-time = "2026-03-27T14:02:46.035Z" }, +] + [[package]] name = "wcwidth" version = "0.6.0" From 6d4606014273e55641cd4be0aa06db1eea524c61 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 16:50:16 +0200 Subject: [PATCH 6/8] fix(ci): comment codecov, need access to organisation lihpc --- .github/workflows/tests.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dd2e296..47dec96 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -40,9 +40,10 @@ jobs: # On génère un rapport XML pour Codecov run: uv run pytest --cov=. --cov-report=xml - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./coverage.xml - fail_ci_if_error: true + # FIXME: need access to the organization + # - name: Upload coverage to Codecov + # uses: codecov/codecov-action@v4 + # with: + # token: ${{ secrets.CODECOV_TOKEN }} + # file: ./coverage.xml + # fail_ci_if_error: true From 7baec0223dbf9b849a8ea2116c8e6bf0b2cac671 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 16:57:02 +0200 Subject: [PATCH 7/8] fix(ferrispline): update main submodule --- ferrispline | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ferrispline b/ferrispline index f5611d2..38812ec 160000 --- a/ferrispline +++ b/ferrispline @@ -1 +1 @@ -Subproject commit f5611d292bec9fd946017a9d00b8bd36b311c864 +Subproject commit 38812ec3b97afacdfcee9360ca181729e135f4b9 From fb34f5b139b6193eb610567a78bf1b8f6ed7abf0 Mon Sep 17 00:00:00 2001 From: Ludofr3 Date: Tue, 28 Apr 2026 17:01:48 +0200 Subject: [PATCH 8/8] chore(ferrispline): update subproject reference --- ferrispline | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ferrispline b/ferrispline index 38812ec..d414f24 160000 --- a/ferrispline +++ b/ferrispline @@ -1 +1 @@ -Subproject commit 38812ec3b97afacdfcee9360ca181729e135f4b9 +Subproject commit d414f24f11d5b001e36813eb176a3e6a84d6dc7c