nodeslicer/scratch/benchmark_simplify.py
2026-10-09 17:18:23 +03:00

71 lines
2.1 KiB
Python

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)}")