"""Toolpath-Thinning: ganze Schichten dicht, keine gesprenkelten Stichproben.""" from grotti.toolpath import TOOLPATH_VERSION, _thin_points, build_toolpath def _fake_points(layers=40, per_layer=800): points = [] breaks = [] seq = 0 for layer in range(layers): z = 0.2 + layer * 0.2 breaks.append(len(points)) for i in range(per_layer): extrude = 1 if i > 0 else 0 points.append([float(i), float(layer), z, extrude, seq]) seq += 1 return points, breaks def test_thin_keeps_consecutive_extrude_pairs(): points, breaks = _fake_points() kept, new_breaks = _thin_points(points, breaks, max_points=8_000) assert len(kept) <= 8_000 assert new_breaks consec = 0 for i in range(1, len(kept)): if kept[i][3] and kept[i][4] == kept[i - 1][4] + 1: consec += 1 assert consec > 500, "Thinning darf keine zeichnbaren Segmente übrig lassen" def test_thin_keeps_solid_layers(): points, breaks = _fake_points(layers=50, per_layer=600) kept, _ = _thin_points(points, breaks, max_points=10_000) # Pro behaltener Z-Höhe: hoher Anteil aufeinanderfolgender Extrusionen by_z = {} for i in range(1, len(kept)): if not (kept[i][3] and kept[i][4] == kept[i - 1][4] + 1): continue z = round(kept[i][2], 2) by_z[z] = by_z.get(z, 0) + 1 assert by_z, "keine Extrusionssegmente" assert max(by_z.values()) >= 40, "behaltene Schichten sollen dicht sein" def test_toolpath_version(): assert TOOLPATH_VERSION >= 8 def test_build_empty(tmp_path): path = tmp_path / "empty.gcode" path.write_text("; nix\n", encoding="utf-8") data = build_toolpath(path) assert data["points"] == [] assert data["version"] == TOOLPATH_VERSION