import sys from pathlib import Path from unittest.mock import MagicMock PROJECT_ROOT = Path(__file__).resolve().parent.parent sys.path.append(str(PROJECT_ROOT.parent)) class DummyNodeSocket: pass class DummyNode: pass class DummyObject: pass class DummyMesh: pass class DummyNodeSocketShader: pass class DummyNodeCustomGroup: pass class DummyNodeTree: pass class DummyOperator: pass class DummyMenu: pass class DummyPanel: pass class DummyPropertyGroup: pass mock_types = MagicMock() mock_types.NodeSocket = DummyNodeSocket mock_types.Node = DummyNode mock_types.Object = DummyObject mock_types.Mesh = DummyMesh mock_types.NodeSocketShader = DummyNodeSocketShader mock_types.NodeCustomGroup = DummyNodeCustomGroup mock_types.NodeTree = DummyNodeTree mock_types.Operator = DummyOperator mock_types.Menu = DummyMenu mock_types.Panel = DummyPanel mock_types.PropertyGroup = DummyPropertyGroup mock_bpy = MagicMock() mock_bpy.context.scene.unit_settings.scale_length = 0.001 mock_bpy.types = mock_types sys.modules['bpy'] = mock_bpy sys.modules['bpy.types'] = mock_types sys.modules['bpy.props'] = MagicMock() sys.modules['bpy.utils'] = MagicMock() sys.modules['bpy.utils.previews'] = MagicMock() sys.modules['bpy.app'] = MagicMock() sys.modules['bpy.app.handlers'] = MagicMock() import numpy as np import time from NodeSlicer.core.slice import SlicePaths n_layers = 100 paths_per_layer = 5 pts_per_path = 300 paths = [] np.random.seed(42) for z in np.linspace(0, 20, n_layers): for r in [5.0, 10.0, 15.0, 20.0, 25.0]: theta = np.linspace(0, 2*np.pi, pts_per_path) x = r * np.cos(theta) + np.random.normal(0, 0.005, pts_per_path) y = r * np.sin(theta) + np.random.normal(0, 0.005, pts_per_path) x[-1] = x[0] y[-1] = y[0] p = np.column_stack([x, y, np.full(pts_per_path, z)]) paths.append(p) sp = SlicePaths(paths) print(f"Total paths: {len(sp)}, Total points: {sum(len(p) for p in sp)}") t0 = time.perf_counter() res_shapely = sp.simplify(0.05, preserve_topology=True) t1 = time.perf_counter() print(f"Current Shapely simplify: {t1 - t0:.4f} s, output points: {sum(len(p) for p in res_shapely)}")