From 260cf5c9512fd48da85926a9da733228b5558942 Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Fri, 9 Oct 2026 13:31:17 +0200 Subject: [PATCH 1/8] feat(post): add a Perforation post-processor for Contour steps Cuts in dashes: the laser fires for a cut length and is off for a skip length along every contour, restarting with a full cut at the start of each contour. The gap centres are placed in millimetres along the workpiece's contours and handed to the existing tabs gap transform, so no new raygeo code is needed. Off by default in new and loaded Contour steps. Refs #525 --- .../laser_essentials/steps/contour_step.py | 5 + .../tests/steps/test_contour_step.py | 17 +- .../locale/de/LC_MESSAGES/post_processors.po | 36 ++++ .../locale/en/LC_MESSAGES/post_processors.po | 33 ++++ .../locale/es/LC_MESSAGES/post_processors.po | 35 ++++ .../locale/fr/LC_MESSAGES/post_processors.po | 35 ++++ .../locale/hi/LC_MESSAGES/post_processors.po | 33 ++++ .../locale/post_processors.pot | 33 ++++ .../locale/pt/LC_MESSAGES/post_processors.po | 35 ++++ .../locale/uk/LC_MESSAGES/post_processors.po | 34 ++++ .../zh_CN/LC_MESSAGES/post_processors.po | 33 ++++ .../post_processors/transformers/__init__.py | 2 + .../transformers/perforation_transformer.py | 139 +++++++++++++ .../post_processors/widgets/__init__.py | 3 + .../widgets/perforation_group.py | 69 +++++++ .../post_processors/worker.py | 4 + .../test_perforation_transformer.py | 185 ++++++++++++++++++ .../tests/ui_gtk/test_perforation_group.py | 56 ++++++ 18 files changed, 785 insertions(+), 2 deletions(-) create mode 100644 rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py create mode 100644 rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py create mode 100644 rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py create mode 100644 rayforge/builtin_addons/rayforge-addon-post/tests/ui_gtk/test_perforation_group.py diff --git a/rayforge/builtin_addons/rayforge-addon-laser/laser_essentials/steps/contour_step.py b/rayforge/builtin_addons/rayforge-addon-laser/laser_essentials/steps/contour_step.py index 9eddb44c2..4783fa67e 100644 --- a/rayforge/builtin_addons/rayforge-addon-laser/laser_essentials/steps/contour_step.py +++ b/rayforge/builtin_addons/rayforge-addon-laser/laser_essentials/steps/contour_step.py @@ -260,6 +260,9 @@ def get_default_transformers_dicts(cls) -> tuple[list, list]: Smooth = transformer_registry.get("Smooth") LeadInOutTransformer = transformer_registry.get("LeadInOutTransformer") TabOpsTransformer = transformer_registry.get("TabOpsTransformer") + PerforationTransformer = transformer_registry.get( + "PerforationTransformer" + ) CropTransformer = transformer_registry.get("CropTransformer") MergeLinesTransformer = transformer_registry.get( "MergeLinesTransformer" @@ -269,6 +272,7 @@ def get_default_transformers_dicts(cls) -> tuple[list, list]: assert Smooth is not None assert LeadInOutTransformer is not None assert TabOpsTransformer is not None + assert PerforationTransformer is not None assert CropTransformer is not None assert MergeLinesTransformer is not None assert Optimize is not None @@ -280,6 +284,7 @@ def get_default_transformers_dicts(cls) -> tuple[list, list]: enabled=False, lead_in_mm=0, lead_out_mm=0, auto=True ).to_dict(), TabOpsTransformer().to_dict(), + PerforationTransformer(enabled=False).to_dict(), CropTransformer(enabled=False).to_dict(), optimize_dict, ], [ diff --git a/rayforge/builtin_addons/rayforge-addon-laser/tests/steps/test_contour_step.py b/rayforge/builtin_addons/rayforge-addon-laser/tests/steps/test_contour_step.py index 1b104c01e..eb9cf3f8d 100644 --- a/rayforge/builtin_addons/rayforge-addon-laser/tests/steps/test_contour_step.py +++ b/rayforge/builtin_addons/rayforge-addon-laser/tests/steps/test_contour_step.py @@ -37,13 +37,25 @@ def test_create(self, mock_context): step = ContourStep.create(mock_context, name="Created") assert isinstance(step, ContourStep) assert step.name == "Created" - assert len(step.per_workpiece_transformers_dicts) == 5 + assert len(step.per_workpiece_transformers_dicts) == 6 assert len(step.per_step_transformers_dicts) == 3 assert step.selected_head_uid == "test-laser-uid" def test_create_without_optimize(self, mock_context): step = ContourStep.create(mock_context, optimize=False) - assert len(step.per_workpiece_transformers_dicts) == 4 + assert len(step.per_workpiece_transformers_dicts) == 5 + + def test_create_adds_disabled_perforation_after_tabs(self, mock_context): + step = ContourStep.create(mock_context) + names = [t["name"] for t in step.per_workpiece_transformers_dicts] + assert "PerforationTransformer" in names + assert names.index("PerforationTransformer") == ( + names.index("TabOpsTransformer") + 1 + ) + perforation = step.per_workpiece_transformers_dicts[ + names.index("PerforationTransformer") + ] + assert perforation["enabled"] is False def test_serialization_includes_step_type(self): step = ContourStep(name="Test") @@ -88,6 +100,7 @@ def test_from_dict_adds_new_transformers_from_old_project(self): t["name"] for t in restored.per_workpiece_transformers_dicts ] assert "TabOpsTransformer" in wp_names + assert "PerforationTransformer" in wp_names assert "Smooth" in wp_names assert "CropTransformer" in wp_names assert "Optimize" in wp_names diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po index d181b503b..12557fe31 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po @@ -298,3 +298,39 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Erstellt Haltestege durch Hinzufügen von Lücken oder Reduzierung der " "Leistung auf Schneidpfaden" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "Perforation" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" +"Schneidet gestrichelt: Der Laser schneidet über die Schnittlänge und lässt " +"die Auslasslänge aus" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "Schnittlänge" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "Strecke, die der Laser vor jeder Lücke schneidet" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "Auslasslänge" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "" +"Strecke, die zwischen den Schnitten mit ausgeschaltetem Laser gefahren wird" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "Perforations-Schnittlänge ändern" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "Perforations-Auslasslänge ändern" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po index 2b725acf4..36c33035a 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po @@ -283,3 +283,36 @@ msgstr "Tabs" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "Creates holding tabs by adding gaps or reducing power on cut paths" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po index cff26d78e..6274a9653 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po @@ -297,3 +297,38 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Crea pestañas de sujeción añadiendo huecos o reduciendo potencia en " "trayectorias de corte" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "Perforación" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" +"Corta en trazos: el láser dispara durante la longitud de corte y salta la " +"longitud de salto" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "Longitud de corte" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "Distancia que dispara el láser antes de cada hueco" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "Longitud de salto" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "Distancia recorrida con el láser apagado entre cortes" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "Cambiar longitud de corte de perforación" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "Cambiar longitud de salto de perforación" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po index 445349d76..dd5c2375b 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po @@ -302,3 +302,38 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Crée des languettes de maintien en ajoutant des espaces ou en réduisant la " "puissance sur les parcours de coupe" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "Perforation" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" +"Découpe en pointillés : le laser tire sur la longueur de coupe et saute la " +"longueur de saut" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "Longueur de coupe" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "Distance sur laquelle le laser tire avant chaque interruption" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "Longueur de saut" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "Distance parcourue laser éteint entre les coupes" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "Modifier la longueur de coupe de la perforation" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "Modifier la longueur de saut de la perforation" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po index db86626fb..431bcad31 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po @@ -285,3 +285,36 @@ msgstr "टैब" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "कट पाथ पर अंतराल जोड़कर या शक्ति घटाकर होल्डिंग टैब बनाता है" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "परफोरेशन" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "डैश में काटता है: लेज़र कट लंबाई तक चलता है और स्किप लंबाई छोड़ देता है" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "कट लंबाई" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "हर गैप से पहले लेज़र जितनी दूरी तक चलता है" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "स्किप लंबाई" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "कटों के बीच लेज़र बंद करके तय की गई दूरी" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "परफोरेशन कट लंबाई बदलें" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "परफोरेशन स्किप लंबाई बदलें" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot b/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot index 1c533abba..95b43fa9c 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot @@ -283,3 +283,36 @@ msgstr "" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po index 4148e83f2..a0dc872f4 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po @@ -295,3 +295,38 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Cria abas de fixação adicionando lacunas ou reduzindo a potência em caminhos " "de corte" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "Perfuração" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" +"Corta em traços: o laser dispara pelo comprimento de corte e pula o " +"comprimento de salto" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "Comprimento de corte" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "Distância em que o laser dispara antes de cada intervalo" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "Comprimento de salto" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "Distância percorrida com o laser desligado entre os cortes" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "Alterar comprimento de corte da perfuração" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "Alterar comprimento de salto da perfuração" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po index d9d336910..dfdf97cf2 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po @@ -295,3 +295,37 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Створює утримувальні закладки шляхом додавання проміжків або зменшення " "потужності на контурах різання" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "Перфорація" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "" +"Ріже пунктиром: лазер ріже на довжині різу й пропускає довжину пропуску" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "Довжина різу" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "Відстань, на якій лазер ріже перед кожним проміжком" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "Довжина пропуску" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "Відстань, яку лазер проходить вимкненим між різами" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "Змінити довжину різу перфорації" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "Змінити довжину пропуску перфорації" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po index 5012afa25..c76d73b95 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po @@ -282,3 +282,36 @@ msgstr "标签" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "通过添加间隙或降低切割路径上的功率来创建保持标签" + +#: post_processors/transformers/perforation_transformer.py +msgid "Perforation" +msgstr "穿孔" + +#: post_processors/transformers/perforation_transformer.py +msgid "" +"Cuts in dashes: the laser fires for the cut length and skips the skip length" +msgstr "虚线切割:激光在切割长度内出光,并跳过跳过长度" + +#: post_processors/widgets/perforation_group.py +msgid "Cut Length" +msgstr "切割长度" + +#: post_processors/widgets/perforation_group.py +msgid "Distance the laser fires before each gap" +msgstr "每个间隙前激光出光的距离" + +#: post_processors/widgets/perforation_group.py +msgid "Skip Length" +msgstr "跳过长度" + +#: post_processors/widgets/perforation_group.py +msgid "Distance travelled with the laser off between cuts" +msgstr "两段切割之间关闭激光移动的距离" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation cut length" +msgstr "更改穿孔切割长度" + +#: post_processors/widgets/perforation_group.py +msgid "Change perforation skip length" +msgstr "更改穿孔跳过长度" diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/__init__.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/__init__.py index 7583f8b03..9840ecb7c 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/__init__.py +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/__init__.py @@ -12,6 +12,7 @@ from .multipass_transformer import MultiPassTransformer from .optimize_transformer import Optimize from .overscan_transformer import OverscanTransformer +from .perforation_transformer import PerforationTransformer from .smooth_transformer import Smooth from .tabs_transformer import TabOpsTransformer @@ -23,6 +24,7 @@ "MultiPassTransformer", "Optimize", "OverscanTransformer", + "PerforationTransformer", "Smooth", "TabOpsTransformer", ] diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py new file mode 100644 index 000000000..5be0f4d66 --- /dev/null +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py @@ -0,0 +1,139 @@ +from __future__ import annotations + +from collections.abc import Sequence +from gettext import gettext as _ +from typing import TYPE_CHECKING, Any + +from raygeo.geo import Matrix +from raygeo.ops.transform.tabs import TabsSpec + +from rayforge.core.workpiece import WorkPiece +from rayforge.pipeline.transformer.base import OpsTransformer + +if TYPE_CHECKING: + from raygeo.geo import Geometry + + +MIN_LENGTH = 0.01 +EPSILON = 1e-4 + + +class PerforationTransformer(OpsTransformer): + """ + Turns cut paths into a dashed cut: the laser fires for + ``cut_length`` and is off for ``skip_length``, repeated along + every contour of the workpiece. + + The gaps are placed in millimetres along each contour of the + workpiece's boundaries, starting with a full cut at the start of + every contour, and handed to the tabs gap machinery, which cuts + them out of the nearest toolpath. + """ + + SPEC_NAME = "tabs" + DEFAULT_CUT_LENGTH = 2.0 + DEFAULT_SKIP_LENGTH = 1.0 + + def __init__( + self, + enabled: bool = True, + cut_length: float = DEFAULT_CUT_LENGTH, + skip_length: float = DEFAULT_SKIP_LENGTH, + ): + super().__init__(enabled=enabled) + self._cut_length = max(MIN_LENGTH, cut_length) + self._skip_length = max(MIN_LENGTH, skip_length) + + @property + def cut_length(self) -> float: + return self._cut_length + + @cut_length.setter + def cut_length(self, value: float) -> None: + self._cut_length = max(MIN_LENGTH, value) + self.changed.send(self) + + @property + def skip_length(self) -> float: + return self._skip_length + + @skip_length.setter + def skip_length(self, value: float) -> None: + self._skip_length = max(MIN_LENGTH, value) + self.changed.send(self) + + @property + def label(self) -> str: + return _("Perforation") + + @property + def description(self) -> str: + return _( + "Cuts in dashes: the laser fires for the cut length and " + "skips the skip length" + ) + + def _gap_centres(self, length: float) -> list[float]: + period = self._cut_length + self._skip_length + half_gap = self._skip_length / 2.0 + centres: list[float] = [] + centre = self._cut_length + half_gap + while centre + half_gap <= length + EPSILON: + centres.append(centre) + centre += period + return centres + + def _clips_for_contour( + self, contour: Geometry + ) -> list[tuple[float, float, float]]: + centres = self._gap_centres(contour.distance()) + if not centres: + return [] + positions = contour.get_positions_at_distances(centres) + return [ + (point[0], point[1], self._skip_length) + for _seg, _t, point in positions + ] + + def _generate_clips( + self, workpiece: WorkPiece + ) -> list[tuple[float, float, float]]: + boundaries = workpiece.boundaries + if boundaries is None or boundaries.is_empty(): + return [] + width, height = workpiece.size + scaled = boundaries.copy() + if width > 0 and height > 0: + scaled.transform(Matrix.scale(width, height)) + clips: list[tuple[float, float, float]] = [] + for contour in scaled.split_into_contours(): + clips.extend(self._clips_for_contour(contour)) + return clips + + def to_spec( + self, + workpiece: WorkPiece | None, + stock_geometries: Sequence[Geometry] | None, + settings: dict[str, Any] | None, + ) -> TabsSpec: + clips = self._generate_clips(workpiece) if workpiece else [] + return TabsSpec(tab_power=0.0, original_power=1.0, clips=clips) + + def to_dict(self) -> dict[str, Any]: + data = super().to_dict() + data["cut_length"] = self._cut_length + data["skip_length"] = self._skip_length + return data + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> PerforationTransformer: + if data.get("name") != cls.__name__: + raise ValueError( + f"Mismatched transformer name: expected {cls.__name__}," + f" got {data.get('name')}" + ) + return cls( + enabled=data.get("enabled", True), + cut_length=data.get("cut_length", cls.DEFAULT_CUT_LENGTH), + skip_length=data.get("skip_length", cls.DEFAULT_SKIP_LENGTH), + ) diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/__init__.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/__init__.py index d8facaa9a..b53c7479d 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/__init__.py +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/__init__.py @@ -9,6 +9,7 @@ MultiPassTransformer, Optimize, OverscanTransformer, + PerforationTransformer, Smooth, ) from .crop_group import CropSettingsGroup @@ -17,6 +18,7 @@ from .multipass_group import MultiPassSettingsGroup from .optimize_group import OptimizeSettingsGroup from .overscan_group import OverscanSettingsGroup +from .perforation_group import PerforationSettingsGroup from .smooth_group import SmoothSettingsGroup TRANSFORMER_WIDGETS = { @@ -26,5 +28,6 @@ MultiPassTransformer: MultiPassSettingsGroup, Optimize: OptimizeSettingsGroup, OverscanTransformer: OverscanSettingsGroup, + PerforationTransformer: PerforationSettingsGroup, Smooth: SmoothSettingsGroup, } diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py new file mode 100644 index 000000000..e5ecdf504 --- /dev/null +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py @@ -0,0 +1,69 @@ +from gettext import gettext as _ +from typing import TYPE_CHECKING + +from rayforge.shared.util.glib import DebounceMixin +from rayforge.ui_gtk.doceditor.post_processor.groups import ( + ExpanderHost, + TransformerSettingsGroup, +) +from rayforge.ui_gtk.shared.pref_rows import LengthSpinRow + +from ..transformers import PerforationTransformer + +if TYPE_CHECKING: + from rayforge.core.step import Step + + +class PerforationSettingsGroup(DebounceMixin, TransformerSettingsGroup): + """UI for configuring the PerforationTransformer.""" + + def __init__( + self, + title: str, + transformer: PerforationTransformer, + page: ExpanderHost, + *, + step: "Step | None" = None, + **kwargs, + ): + super().__init__(title, transformer, page, step=step, **kwargs) + + self.cut_row = LengthSpinRow( + _("Cut Length"), + _("Distance the laser fires before each gap"), + lower=0.01, + upper=1000.0, + value_in_base=transformer.cut_length, + ) + self.cut_row.value_changed.connect( + lambda r: self._debounce(self._on_cut_changed, r) + ) + self.add(self.cut_row) + + self.skip_row = LengthSpinRow( + _("Skip Length"), + _("Distance travelled with the laser off between cuts"), + lower=0.01, + upper=1000.0, + value_in_base=transformer.skip_length, + ) + self.skip_row.value_changed.connect( + lambda r: self._debounce(self._on_skip_changed, r) + ) + self.add(self.skip_row) + + def _on_cut_changed(self, row: LengthSpinRow) -> None: + self.param_changed.send( + self, + key="cut_length", + value=row.get_value_in_base_units(), + name=_("Change perforation cut length"), + ) + + def _on_skip_changed(self, row: LengthSpinRow) -> None: + self.param_changed.send( + self, + key="skip_length", + value=row.get_value_in_base_units(), + name=_("Change perforation skip length"), + ) diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/worker.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/worker.py index 691d01aab..3a976fc9e 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/post_processors/worker.py +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/worker.py @@ -14,6 +14,7 @@ MultiPassTransformer, Optimize, OverscanTransformer, + PerforationTransformer, Smooth, TabOpsTransformer, ) @@ -33,5 +34,8 @@ def register_transformers(transformer_registry): transformer_registry.register(MultiPassTransformer, addon_name=ADDON_NAME) transformer_registry.register(Optimize, addon_name=ADDON_NAME) transformer_registry.register(OverscanTransformer, addon_name=ADDON_NAME) + transformer_registry.register( + PerforationTransformer, addon_name=ADDON_NAME + ) transformer_registry.register(Smooth, addon_name=ADDON_NAME) transformer_registry.register(TabOpsTransformer, addon_name=ADDON_NAME) diff --git a/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py b/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py new file mode 100644 index 000000000..ea3b40a44 --- /dev/null +++ b/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py @@ -0,0 +1,185 @@ +from unittest.mock import MagicMock + +import pytest +from post_processors.transformers import PerforationTransformer +from raygeo.geo import Geometry +from raygeo.ops import Ops +from raygeo.ops.transform.tabs import TabsSpec +from raygeo.ops.types import CommandType, SectionType + +from rayforge.core.workpiece import WorkPiece + + +def _unit_square(x0=0.0, y0=0.0, x1=1.0, y1=1.0) -> Geometry: + geo = Geometry() + geo.move_to(x0, y0) + geo.line_to(x1, y0) + geo.line_to(x1, y1) + geo.line_to(x0, y1) + geo.close_path() + return geo + + +def _workpiece(boundaries, size=(20.0, 20.0)): + wp = MagicMock(spec=WorkPiece) + wp.boundaries = boundaries + wp.size = size + return wp + + +def _square_ops(x0, y0, x1, y1) -> Ops: + ops = Ops() + ops.set_power(1.0) + ops.ops_section_start( + section_type=SectionType.VECTOR_OUTLINE, workpiece_uid="wp" + ) + ops.move_to(x0, y0, 0.0) + ops.line_to(x1, y0, 0.0) + ops.line_to(x1, y1, 0.0) + ops.line_to(x0, y1, 0.0) + ops.line_to(x0, y0, 0.0) + ops.ops_section_end(section_type=SectionType.VECTOR_OUTLINE) + return ops + + +def _cut_runs(ops: Ops) -> int: + return sum( + 1 + for i in range(ops.len()) + if ops.command_type(i) == CommandType.MOVE_TO + ) + + +class TestPerforationConfig: + def test_defaults(self): + t = PerforationTransformer() + assert t.enabled is True + assert t.cut_length == pytest.approx(2.0) + assert t.skip_length == pytest.approx(1.0) + + def test_label_and_description(self): + t = PerforationTransformer() + assert t.label + assert t.description + + def test_lengths_are_clamped_to_a_minimum(self): + t = PerforationTransformer(cut_length=0.0, skip_length=-1.0) + assert t.cut_length >= 0.01 + assert t.skip_length >= 0.01 + + def test_setter_sends_changed(self): + t = PerforationTransformer() + received = [] + + def on_changed(sender): + received.append(sender) + + t.changed.connect(on_changed) + t.cut_length = 3.0 + t.skip_length = 0.5 + assert len(received) == 2 + assert t.cut_length == pytest.approx(3.0) + assert t.skip_length == pytest.approx(0.5) + + def test_dict_round_trip(self): + t = PerforationTransformer( + enabled=False, cut_length=1.5, skip_length=0.5 + ) + data = t.to_dict() + assert data["name"] == "PerforationTransformer" + restored = PerforationTransformer.from_dict(data) + assert restored.enabled is False + assert restored.cut_length == pytest.approx(1.5) + assert restored.skip_length == pytest.approx(0.5) + + def test_from_dict_defaults(self): + restored = PerforationTransformer.from_dict( + {"name": "PerforationTransformer"} + ) + assert restored.cut_length == pytest.approx(2.0) + assert restored.skip_length == pytest.approx(1.0) + + def test_from_dict_rejects_other_name(self): + with pytest.raises(ValueError): + PerforationTransformer.from_dict({"name": "Optimize"}) + + +class TestPerforationSpec: + def test_spec_is_gap_mode_tabs(self): + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(_unit_square()), None, None) + assert isinstance(spec, TabsSpec) + assert spec.tab_power == 0.0 + + def test_no_workpiece_gives_no_clips(self): + spec = PerforationTransformer().to_spec(None, None, None) + assert spec.clips == [] + + def test_empty_boundaries_give_no_clips(self): + wp = _workpiece(Geometry()) + spec = PerforationTransformer().to_spec(wp, None, None) + assert spec.clips == [] + + def test_square_gets_one_gap_per_period(self): + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(_unit_square()), None, None) + assert len(spec.clips) == 40 + assert all(w == pytest.approx(0.5) for _x, _y, w in spec.clips) + + def test_first_gap_follows_a_full_cut(self): + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(_unit_square()), None, None) + x, y, _w = spec.clips[0] + assert x == pytest.approx(1.75) + assert y == pytest.approx(0.0) + + def test_clips_are_in_millimetres(self): + t = PerforationTransformer(cut_length=4.0, skip_length=1.0) + wp = _workpiece(_unit_square(), size=(40.0, 10.0)) + spec = t.to_spec(wp, None, None) + xs = [x for x, _y, _w in spec.clips] + ys = [y for _x, y, _w in spec.clips] + assert max(xs) <= 40.0 + 1e-6 + assert max(ys) <= 10.0 + 1e-6 + assert len(spec.clips) == 20 + + def test_gap_never_wraps_past_the_contour_end(self): + t = PerforationTransformer(cut_length=3.0, skip_length=1.0) + spec = t.to_spec(_workpiece(_unit_square()), None, None) + assert len(spec.clips) == 20 + x, y, _w = spec.clips[-1] + assert (x, y) == (pytest.approx(0.0), pytest.approx(0.5)) + + def test_pattern_restarts_for_every_contour(self): + geo = _unit_square(0.0, 0.0, 0.25, 0.25) + geo.extend(_unit_square(0.5, 0.5, 0.75, 0.75)) + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(geo, size=(40.0, 40.0)), None, None) + assert len(spec.clips) == 40 + starts = [c for c in spec.clips if c[1] == pytest.approx(20.0)] + assert starts[0][0] == pytest.approx(21.75) + + def test_last_gap_survives_rounding_of_the_contour_length(self): + geo = Geometry() + geo.move_to(0.0, 0.0) + geo.line_to(1.0 - 1e-7, 0.0) + t = PerforationTransformer(cut_length=3.0, skip_length=1.5) + spec = t.to_spec(_workpiece(geo, size=(90.0, 1.0)), None, None) + assert len(spec.clips) == 20 + + def test_contour_shorter_than_a_period_is_left_whole(self): + geo = _unit_square(0.0, 0.0, 0.01, 0.01) + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(geo), None, None) + assert spec.clips == [] + + +class TestPerforationOnOps: + def test_cut_and_skip_lengths_on_square(self): + t = PerforationTransformer(cut_length=1.5, skip_length=0.5) + spec = t.to_spec(_workpiece(_unit_square()), None, None) + ops = _square_ops(0.0, 0.0, 20.0, 20.0) + Ops.apply_transformers(ops, [spec]) + ops.preload_state() + assert ops.cut_distance() == pytest.approx(60.0, abs=1e-6) + assert _cut_runs(ops) == 40 diff --git a/rayforge/builtin_addons/rayforge-addon-post/tests/ui_gtk/test_perforation_group.py b/rayforge/builtin_addons/rayforge-addon-post/tests/ui_gtk/test_perforation_group.py new file mode 100644 index 000000000..2006735d9 --- /dev/null +++ b/rayforge/builtin_addons/rayforge-addon-post/tests/ui_gtk/test_perforation_group.py @@ -0,0 +1,56 @@ +# flake8: noqa: E402 +"""UI tests: the Perforation settings group edits cut and skip lengths.""" + +import gi + +gi.require_version("Gtk", "4.0") +gi.require_version("Adw", "1") + +import pytest +from post_processors.transformers import PerforationTransformer +from post_processors.widgets import TRANSFORMER_WIDGETS +from post_processors.widgets.perforation_group import ( + PerforationSettingsGroup, +) + + +class _Page: + use_expanders = True + + +def _build_group(): + transformer = PerforationTransformer(cut_length=1.5, skip_length=0.5) + group = PerforationSettingsGroup("Perforation", transformer, _Page()) + return group, transformer + + +@pytest.mark.ui +def test_perforation_group_is_registered(ui_context): + assert TRANSFORMER_WIDGETS[PerforationTransformer] is ( + PerforationSettingsGroup + ) + + +@pytest.mark.ui +def test_perforation_group_shows_lengths(ui_context): + group, _transformer = _build_group() + assert group.cut_row.get_value_in_base_units() == pytest.approx(1.5) + assert group.skip_row.get_value_in_base_units() == pytest.approx(0.5) + + +@pytest.mark.ui +def test_perforation_group_reports_changes(ui_context): + group, _transformer = _build_group() + sent = [] + + def on_param(sender, key, value, name): + sent.append((key, value)) + + group.param_changed.connect(on_param) + group.cut_row.set_value_in_base_units(3.0) + group._on_cut_changed(group.cut_row) + group.skip_row.set_value_in_base_units(0.25) + group._on_skip_changed(group.skip_row) + + assert ("cut_length", pytest.approx(3.0)) in sent + assert ("skip_length", pytest.approx(0.25)) in sent From 22e916e2c6f35a30a8b1039d7ba00ee211c82568 Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Fri, 9 Oct 2026 13:31:17 +0200 Subject: [PATCH 2/8] docs: document the Perforation post-processor Refs #525 --- CHANGELOG.md | 4 ++ website/docs/features/operations/contour.md | 1 + website/docs/features/perforation.md | 43 ++++++++++++++++++ .../current/features/operations/contour.md | 2 + .../current/features/perforation.md | 45 +++++++++++++++++++ .../current/features/operations/contour.md | 2 + .../current/features/perforation.md | 44 ++++++++++++++++++ .../current/features/operations/contour.md | 2 + .../current/features/perforation.md | 45 +++++++++++++++++++ .../current/features/operations/contour.md | 1 + .../current/features/perforation.md | 41 +++++++++++++++++ .../current/features/operations/contour.md | 2 + .../current/features/perforation.md | 43 ++++++++++++++++++ .../current/features/operations/contour.md | 2 + .../current/features/perforation.md | 43 ++++++++++++++++++ .../current/features/operations/contour.md | 1 + .../current/features/perforation.md | 34 ++++++++++++++ website/sidebars.js | 1 + 18 files changed, 356 insertions(+) create mode 100644 website/docs/features/perforation.md create mode 100644 website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md create mode 100644 website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 618e33fde..425e740f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Duplicates (duplicate contours inside a workpiece and stacked copies of whole workpieces), and Break Apart (one workpiece per contour, holes and open paths included). Each is a single undo step (#516) +- Contour: Perforation post-processor for dashed cuts. The laser + fires for a Cut Length and is off for a Skip Length along every + contour, starting with a full cut at the start of each contour; off + by default (#525) - Sketcher: boolean operations. Union, Difference, Intersection and Exclude bake the selected closed regions into multi-ring polygons (outer contours counter-clockwise, hole contours clockwise), so diff --git a/website/docs/features/operations/contour.md b/website/docs/features/operations/contour.md index b6615b6fd..d3ed5e0ee 100644 --- a/website/docs/features/operations/contour.md +++ b/website/docs/features/operations/contour.md @@ -208,6 +208,7 @@ See [Kerf](../kerf.md) for detailed guide. Contour operations support several post-processing options: - **[Smooth Path](../smooth.md)** - Reduce jagged edges in cutting paths +- **[Perforation](../perforation.md)** - Cut dashed lines for folds, tear-off lines and stitch holes - **[Holding Tabs](../holding-tabs.md)** - Keep cut pieces attached to stock material - **[Crop to Stock](../crop-to-stock.md)** - Limit cuts to material boundary - **[Path Optimization](../path-optimization.md)** - Reduce travel distance between cuts diff --git a/website/docs/features/perforation.md b/website/docs/features/perforation.md new file mode 100644 index 000000000..4b3c58937 --- /dev/null +++ b/website/docs/features/perforation.md @@ -0,0 +1,43 @@ +--- +description: + "Cut dashed lines in Rayforge with the Perforation post-processor: set a cut length and a skip + length for fold lines, tear-off lines and stitch holes." +--- + +# Perforation + +The **Perforation** post-processor turns a continuous cut into a dashed one. The laser fires for the +**Cut Length**, then travels with the laser off for the **Skip Length**, and repeats this along +every contour of the workpiece. + +## When to Use It + +- Fold lines in card stock and corrugated cardboard +- Tear-off lines (tickets, coupons, packaging) +- Stitch holes in leather +- Dashed lines for decoration + +## Settings + +Perforation is available in the post-processing settings of **Contour** operations. It is off by +default. + +- **Cut Length**: the distance the laser fires before each gap. +- **Skip Length**: the distance travelled with the laser off between two cuts. + +The pattern is measured along each contour of the workpiece and starts again at the start of every +contour, beginning with a full cut. A contour shorter than one cut plus one skip is cut in full. + +## Tips + +- For a fold line that should not cut through, start with a skip length about as long as the cut + length and lower the power. +- Very short lengths (a few tenths of a millimetre) make the laser switch on and off rapidly, which + lowers the effective power. +- Perforation works together with [Holding Tabs](holding-tabs), [Lead-In/Out](lead-in-out) and + [Multi-Pass](multi-pass). + +## Related Pages + +- [Contour Cutting](operations/contour) - The cutting operation that uses perforation +- [Holding Tabs](holding-tabs) - Gaps placed by hand to keep parts attached diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/de/docusaurus-plugin-content-docs/current/features/operations/contour.md index 59338b9fd..92a329753 100644 --- a/website/i18n/de/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -211,6 +211,8 @@ Siehe [Schnittbreite](../kerf.md) für detaillierte Anleitung. Kontur-Operationen unterstützen mehrere Nachbearbeitungsoptionen: - **[Pfad-Glättung](../smooth.md)** - Gezackte Kanten in Schneidepfaden reduzieren +- **[Perforation](../perforation.md)** - Gestrichelte Schnitte für Falzlinien, Abreißlinien und + Nählöcher - **[Halte-Laschen](../holding-tabs.md)** - Geschnittene Teile am Rohmaterial befestigt halten - **[Auf Rohmaterial zuschneiden](../crop-to-stock.md)** - Schnitte auf Materialgrenze beschränken - **[Pfad-Optimierung](../path-optimization.md)** - Verfahrdistanz zwischen Schnitten reduzieren diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..dbeffde48 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,45 @@ +--- +description: + "Gestrichelte Schnitte in Rayforge mit dem Perforation-Nachbearbeitungsschritt: Schnittlänge und + Auslasslänge für Falzlinien, Abreißlinien und Nählöcher festlegen." +--- + +# Perforation + +Der Nachbearbeitungsschritt **Perforation** macht aus einem durchgehenden Schnitt einen +gestrichelten. Der Laser schneidet über die **Schnittlänge**, fährt dann mit ausgeschaltetem Laser +über die **Auslasslänge** und wiederholt das entlang jeder Kontur des Werkstücks. + +## Wann verwenden + +- Falzlinien in Karton und Wellpappe +- Abreißlinien (Tickets, Gutscheine, Verpackungen) +- Nählöcher in Leder +- Dekorative gestrichelte Linien + +## Einstellungen + +Perforation ist in den Nachbearbeitungseinstellungen von **Kontur**-Operationen verfügbar und +standardmäßig ausgeschaltet. + +- **Schnittlänge**: die Strecke, die der Laser vor jeder Lücke schneidet. +- **Auslasslänge**: die Strecke, die zwischen zwei Schnitten mit ausgeschaltetem Laser gefahren + wird. + +Das Muster wird entlang jeder Kontur des Werkstücks gemessen und beginnt am Anfang jeder Kontur neu, +immer mit einem vollen Schnitt. Eine Kontur, die kürzer ist als ein Schnitt plus eine Lücke, wird +vollständig geschnitten. + +## Tipps + +- Für eine Falzlinie, die nicht durchschneiden soll, mit etwa gleich langer Schnitt- und + Auslasslänge beginnen und die Leistung senken. +- Sehr kurze Längen (wenige Zehntelmillimeter) lassen den Laser schnell ein- und ausschalten, was + die effektive Leistung verringert. +- Perforation funktioniert zusammen mit [Halte-Laschen](holding-tabs), [Lead-In/Out](lead-in-out) + und [Mehrfachdurchgang](multi-pass). + +## Verwandte Seiten + +- [Konturschneiden](operations/contour) - Die Schneidoperation, die Perforation verwendet +- [Halte-Laschen](holding-tabs) - Von Hand gesetzte Lücken, die Teile festhalten diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/es/docusaurus-plugin-content-docs/current/features/operations/contour.md index b7a160a16..610a88b52 100644 --- a/website/i18n/es/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -205,6 +205,8 @@ Ver [Kerf](../kerf.md) para una guía detallada. Las operaciones de contorno soportan varias opciones de post-procesamiento: - **[Suavizar Trayectoria](../smooth.md)** - Reduce bordes irregulares en trayectorias de corte +- **[Perforación](../perforation.md)** - Cortes discontinuos para pliegues, líneas de rasgado y + agujeros de costura - **[Pestañas de Sujeción](../holding-tabs.md)** - Mantienen las piezas cortadas adjuntas al material base - **[Recortar al Material](../crop-to-stock.md)** - Limita los cortes al límite del material diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..42370afd9 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,44 @@ +--- +description: + "Corta líneas discontinuas en Rayforge con el posprocesador Perforación: define una longitud de + corte y una longitud de salto para pliegues, líneas de rasgado y agujeros de costura." +--- + +# Perforación + +El posprocesador **Perforación** convierte un corte continuo en uno discontinuo. El láser dispara +durante la **Longitud de corte**, luego se desplaza con el láser apagado durante la **Longitud de +salto**, y repite esto a lo largo de cada contorno de la pieza. + +## Cuándo usarlo + +- Líneas de pliegue en cartulina y cartón ondulado +- Líneas de rasgado (entradas, cupones, embalajes) +- Agujeros de costura en cuero +- Líneas discontinuas decorativas + +## Ajustes + +La perforación está disponible en los ajustes de posprocesado de las operaciones de **Contorno**. +Está desactivada por defecto. + +- **Longitud de corte**: la distancia que dispara el láser antes de cada hueco. +- **Longitud de salto**: la distancia recorrida con el láser apagado entre dos cortes. + +El patrón se mide a lo largo de cada contorno de la pieza y vuelve a empezar al inicio de cada +contorno, siempre con un corte completo. Un contorno más corto que un corte más un salto se corta +entero. + +## Consejos + +- Para una línea de pliegue que no debe atravesar el material, empieza con una longitud de salto + similar a la de corte y baja la potencia. +- Longitudes muy cortas (unas décimas de milímetro) hacen que el láser se encienda y apague + rápidamente, lo que reduce la potencia efectiva. +- La perforación funciona junto con [Pestañas de sujeción](holding-tabs), + [Entrada/Salida](lead-in-out) y [Multipasada](multi-pass). + +## Páginas relacionadas + +- [Corte de contorno](operations/contour) - La operación de corte que usa la perforación +- [Pestañas de sujeción](holding-tabs) - Huecos colocados a mano para mantener las piezas unidas diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/operations/contour.md index 768206b5a..d3af80318 100644 --- a/website/i18n/fr/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -210,6 +210,8 @@ Voir [Kerf](../kerf.md) pour un guide détaillé. Les opérations de contour supportent plusieurs options de post-traitement : - **[Lissage de Parcours](../smooth.md)** - Réduire les bords irréguliers dans les parcours de coupe +- **[Perforation](../perforation.md)** - Découpe en pointillés pour plis, lignes prédécoupées et + trous de couture - **[Ponts de Maintien](../holding-tabs.md)** - Maintenir les pièces coupées attachées au matériau de stock - **[Rognage au Stock](../crop-to-stock.md)** - Limiter les coupes à la limite du matériau diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..2933115d8 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,45 @@ +--- +description: + "Découpez des lignes en pointillés dans Rayforge avec le post-traitement Perforation : réglez une + longueur de coupe et une longueur de saut pour plis, lignes prédécoupées et trous de couture." +--- + +# Perforation + +Le post-traitement **Perforation** transforme une découpe continue en découpe en pointillés. Le +laser tire sur la **Longueur de coupe**, puis se déplace laser éteint sur la **Longueur de saut**, +et répète cela le long de chaque contour de la pièce. + +## Quand l'utiliser + +- Lignes de pliage dans le carton et le carton ondulé +- Lignes prédécoupées (billets, coupons, emballages) +- Trous de couture dans le cuir +- Pointillés décoratifs + +## Réglages + +La perforation est disponible dans les réglages de post-traitement des opérations **Contour**. Elle +est désactivée par défaut. + +- **Longueur de coupe** : la distance sur laquelle le laser tire avant chaque interruption. +- **Longueur de saut** : la distance parcourue laser éteint entre deux coupes. + +Le motif est mesuré le long de chaque contour de la pièce et recommence au début de chaque contour, +toujours par une coupe complète. Un contour plus court qu'une coupe plus un saut est découpé en +entier. + +## Conseils + +- Pour une ligne de pliage qui ne doit pas traverser, commencez avec une longueur de saut proche de + la longueur de coupe et baissez la puissance. +- Des longueurs très courtes (quelques dixièmes de millimètre) font s'allumer et s'éteindre le laser + rapidement, ce qui réduit la puissance effective. +- La perforation fonctionne avec les [Ponts de maintien](holding-tabs), + l'[Entrée/Sortie](lead-in-out) et les [Passes multiples](multi-pass). + +## Pages associées + +- [Découpe de contour](operations/contour) - L'opération de découpe qui utilise la perforation +- [Ponts de maintien](holding-tabs) - Interruptions placées à la main pour garder les pièces + attachées diff --git a/website/i18n/hi/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/operations/contour.md index 6b3031fdc..6875460cd 100644 --- a/website/i18n/hi/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -207,6 +207,7 @@ _Step Settings_ टैब का **कॉन्टूर सेटिंग् कॉन्टूर ऑपरेशन कई पोस्ट-प्रोसेसिंग विकल्प समर्थन करते हैं: - **[पाथ चिकना करें](../smooth.md)** - कटिंग पाथ में खुरदरे किनारे घटाएँ +- **[परफोरेशन](../perforation.md)** - मोड़, फाड़ने की लाइन और सिलाई के छेदों के लिए डैश वाली कटिंग - **[होल्डिंग टैब](../holding-tabs.md)** - कटे हुए पार्टों को स्टॉक सामग्री से बंधा रखें - **[स्टॉक पर क्रॉप करें](../crop-to-stock.md)** - कट सामग्री सीमा तक सीमित करें - **[पाथ अनुकूलन](../path-optimization.md)** - कटों के बीच ट्रैवल दूरी घटाएँ diff --git a/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..315e37c62 --- /dev/null +++ b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,41 @@ +--- +description: + "Rayforge में परफोरेशन पोस्ट-प्रोसेसर से डैश वाली लाइनें काटें: मोड़, फाड़ने की लाइन और सिलाई के + छेदों के लिए कट लंबाई और स्किप लंबाई सेट करें।" +--- + +# परफोरेशन + +**परफोरेशन** पोस्ट-प्रोसेसर लगातार कट को डैश वाले कट में बदल देता है। लेज़र **कट लंबाई** तक चलता है, +फिर **स्किप लंबाई** तक लेज़र बंद करके आगे बढ़ता है, और वर्कपीस के हर कंटूर पर यही दोहराता है। + +## कब उपयोग करें + +- कार्ड स्टॉक और नालीदार गत्ते में मोड़ की लाइनें +- फाड़ने की लाइनें (टिकट, कूपन, पैकेजिंग) +- चमड़े में सिलाई के छेद +- सजावटी डैश वाली लाइनें + +## सेटिंग्स + +परफोरेशन **कंटूर** ऑपरेशन की पोस्ट-प्रोसेसिंग सेटिंग्स में उपलब्ध है। यह डिफ़ॉल्ट रूप से बंद रहता +है। + +- **कट लंबाई**: हर गैप से पहले लेज़र जितनी दूरी तक चलता है। +- **स्किप लंबाई**: दो कट के बीच लेज़र बंद करके तय की गई दूरी। + +पैटर्न वर्कपीस के हर कंटूर के साथ मापा जाता है और हर कंटूर की शुरुआत में फिर से शुरू होता है, हमेशा +एक पूरे कट से। एक कट और एक स्किप से छोटा कंटूर पूरा काटा जाता है। + +## सुझाव + +- ऐसी मोड़ की लाइन के लिए जो आर-पार न कटे, कट लंबाई जितनी स्किप लंबाई से शुरू करें और पावर कम करें। +- बहुत छोटी लंबाइयाँ (मिलीमीटर के कुछ दसवें हिस्से) लेज़र को तेज़ी से चालू-बंद करती हैं, जिससे + प्रभावी पावर घटती है। +- परफोरेशन [होल्डिंग टैब](holding-tabs), [लीड-इन/आउट](lead-in-out) और [मल्टी-पास](multi-pass) के साथ + काम करता है। + +## संबंधित पेज + +- [कंटूर कटिंग](operations/contour) - वह कटिंग ऑपरेशन जो परफोरेशन का उपयोग करता है +- [होल्डिंग टैब](holding-tabs) - पार्टों को जोड़े रखने के लिए हाथ से लगाए गए गैप diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/operations/contour.md index ce07b0f9a..e8c42538b 100644 --- a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -207,6 +207,8 @@ Veja [Kerf](../kerf.md) para um guia detalhado. Operações de contorno suportam várias opções de pós-processamento: - **[Suavização de Caminho](../smooth.md)** - Reduz bordas irregulares em caminhos de corte +- **[Perfuração](../perforation.md)** - Cortes tracejados para dobras, linhas destacáveis e furos de + costura - **[Abas de Fixação](../holding-tabs.md)** - Mantém peças cortadas anexadas ao material de estoque - **[Cortar para Estoque](../crop-to-stock.md)** - Limita cortes ao limite do material - **[Otimização de Caminho](../path-optimization.md)** - Reduz distância de deslocamento entre diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..9a3d40046 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,43 @@ +--- +description: + "Corte linhas tracejadas no Rayforge com o pós-processador Perfuração: defina um comprimento de + corte e um comprimento de salto para dobras, linhas destacáveis e furos de costura." +--- + +# Perfuração + +O pós-processador **Perfuração** transforma um corte contínuo em um corte tracejado. O laser dispara +pelo **Comprimento de corte**, depois se desloca com o laser desligado pelo **Comprimento de +salto**, e repete isso ao longo de cada contorno da peça. + +## Quando usar + +- Linhas de dobra em cartolina e papelão ondulado +- Linhas destacáveis (ingressos, cupons, embalagens) +- Furos de costura em couro +- Linhas tracejadas decorativas + +## Configurações + +A perfuração está disponível nas configurações de pós-processamento das operações de **Contorno**. +Ela vem desativada por padrão. + +- **Comprimento de corte**: a distância em que o laser dispara antes de cada intervalo. +- **Comprimento de salto**: a distância percorrida com o laser desligado entre dois cortes. + +O padrão é medido ao longo de cada contorno da peça e recomeça no início de cada contorno, sempre +com um corte completo. Um contorno menor que um corte mais um salto é cortado inteiro. + +## Dicas + +- Para uma linha de dobra que não deve atravessar o material, comece com um comprimento de salto + parecido com o de corte e reduza a potência. +- Comprimentos muito curtos (alguns décimos de milímetro) fazem o laser ligar e desligar + rapidamente, o que reduz a potência efetiva. +- A perfuração funciona junto com [Abas de fixação](holding-tabs), [Entrada/Saída](lead-in-out) e + [Múltiplas passadas](multi-pass). + +## Páginas relacionadas + +- [Corte de contorno](operations/contour) - A operação de corte que usa a perfuração +- [Abas de fixação](holding-tabs) - Intervalos colocados à mão para manter as peças presas diff --git a/website/i18n/uk/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/operations/contour.md index ed5156b72..5e1803498 100644 --- a/website/i18n/uk/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -200,6 +200,8 @@ Операції контуру підтримують кілька опцій постобробки: - **[Згладжування шляху](../smooth.md)** - Зменшення зубчастих країв у шляхах різання +- **[Перфорація](../perforation.md)** - Пунктирне різання для ліній згину, відривних ліній і отворів + для шиття - **[Утримуючі лапки](../holding-tabs.md)** - Утримання вирізаних деталей прикріпленими до матеріалу заготовки - **[Обрізка до заготовки](../crop-to-stock.md)** - Обмеження різів до межі матеріалу diff --git a/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..b6d24300e --- /dev/null +++ b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,43 @@ +--- +description: + "Різання пунктирних ліній у Rayforge за допомогою постобробки Перфорація: задайте довжину різу й + довжину пропуску для ліній згину, відривних ліній і отворів для шиття." +--- + +# Перфорація + +Постобробка **Перфорація** перетворює суцільний різ на пунктирний. Лазер ріже на **Довжині різу**, +потім рухається з вимкненим лазером на **Довжині пропуску** і повторює це вздовж кожного контуру +заготовки. + +## Коли використовувати + +- Лінії згину в картоні та гофрокартоні +- Відривні лінії (квитки, купони, упаковка) +- Отвори для шиття в шкірі +- Декоративні пунктирні лінії + +## Налаштування + +Перфорація доступна в налаштуваннях постобробки операцій **Контур**. За замовчуванням вона вимкнена. + +- **Довжина різу**: відстань, на якій лазер ріже перед кожним проміжком. +- **Довжина пропуску**: відстань, яку лазер проходить вимкненим між двома різами. + +Візерунок вимірюється вздовж кожного контуру заготовки й починається заново на початку кожного +контуру, завжди з повного різу. Контур, коротший за один різ плюс один пропуск, вирізається +повністю. + +## Поради + +- Для лінії згину, яка не повинна прорізати наскрізь, почніть із довжиною пропуску, приблизно рівною + довжині різу, і зменште потужність. +- Дуже малі довжини (кілька десятих міліметра) змушують лазер швидко вмикатися й вимикатися, що + зменшує ефективну потужність. +- Перфорація працює разом з [Утримуючими лапками](holding-tabs), [Входом/виходом](lead-in-out) і + [Багатопрохідним різанням](multi-pass). + +## Пов'язані сторінки + +- [Контурне різання](operations/contour) - Операція різання, що використовує перфорацію +- [Утримуючі лапки](holding-tabs) - Проміжки, розставлені вручну, щоб деталі не випадали diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/operations/contour.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/operations/contour.md index a31f024a4..d7c62834c 100644 --- a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/operations/contour.md +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/operations/contour.md @@ -192,6 +192,7 @@ 轮廓操作支持多种后处理选项: - **[平滑路径](../smooth.md)** - 减少切割路径中的锯齿状边缘 +- **[穿孔](../perforation.md)** - 用于折线、撕线和缝线孔的虚线切割 - **[固定标签](../holding-tabs.md)** - 保持切割件与材料连接 - **[裁剪到材料](../crop-to-stock.md)** - 将切割限制在材料边界内 - **[路径优化](../path-optimization.md)** - 减少切割之间的行程距离 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md new file mode 100644 index 000000000..156ff706f --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md @@ -0,0 +1,34 @@ +--- +description: +--- + +# 穿孔 + +**穿孔**后处理会把连续切割变成虚线切割。激光在**切割长度**内出光,然后在**跳过长度**内关闭激光移动,并沿工件的每条轮廓重复。 + +## 何时使用 + +- 卡纸和瓦楞纸板的折线 +- 撕线(门票、优惠券、包装) +- 皮革上的缝线孔 +- 装饰性虚线 + +## 设置 + +穿孔位于**轮廓**操作的后处理设置中,默认关闭。 + +- **切割长度**:每个间隙前激光出光的距离。 +- **跳过长度**:两段切割之间关闭激光移动的距离。 + +图案沿工件的每条轮廓测量,并在每条轮廓的起点重新开始,总是以一段完整的切割开始。短于一段切割加一段跳过的轮廓会被完整切割。 + +## 提示 + +- 对于不应切穿的折线,可以先让跳过长度与切割长度大致相同,并降低功率。 +- 非常短的长度(零点几毫米)会让激光快速开关,从而降低有效功率。 +- 穿孔可与[固定标签](holding-tabs)、[引入/引出](lead-in-out)和[多次切割](multi-pass)一起使用。 + +## 相关页面 + +- [轮廓切割](operations/contour) - 使用穿孔的切割操作 +- [固定标签](holding-tabs) - 手动放置以固定零件的间隙 diff --git a/website/sidebars.js b/website/sidebars.js index a293e104e..e2c9793c8 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -78,6 +78,7 @@ module.exports = { 'features/crop-to-stock', 'features/overscan', 'features/holding-tabs', + 'features/perforation', 'features/merge-lines', 'features/lead-in-out', ], From 4ad1f89f03a96fdf2655c7b3bb1c624d04485451 Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Sun, 11 Oct 2026 17:26:13 +0200 Subject: [PATCH 3/8] docs(website): fill in the zh-CN description of the Perforation page An empty description makes the Docusaurus build fail with "description" must be a string, breaking the PR Preview step. --- .../current/features/perforation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md index 156ff706f..a67f3ad98 100644 --- a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md @@ -1,5 +1,5 @@ --- -description: +description: "使用穿孔后处理器在 Rayforge 中切割虚线:为折线、撕线和缝线孔设置切割长度和跳过长度。" --- # 穿孔 From 1bab19e6a2344a61670593db5ef4b3f6f7fe8265 Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Thu, 15 Oct 2026 05:40:38 +0200 Subject: [PATCH 4/8] chore: leave the translation catalogs to the release update The new strings stay wrapped in _(); the .po/.pot files are updated once before each release. --- .../locale/de/LC_MESSAGES/post_processors.po | 36 ------------------- .../locale/en/LC_MESSAGES/post_processors.po | 33 ----------------- .../locale/es/LC_MESSAGES/post_processors.po | 35 ------------------ .../locale/fr/LC_MESSAGES/post_processors.po | 35 ------------------ .../locale/hi/LC_MESSAGES/post_processors.po | 33 ----------------- .../locale/post_processors.pot | 33 ----------------- .../locale/pt/LC_MESSAGES/post_processors.po | 35 ------------------ .../locale/uk/LC_MESSAGES/post_processors.po | 34 ------------------ .../zh_CN/LC_MESSAGES/post_processors.po | 33 ----------------- 9 files changed, 307 deletions(-) diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po index 12557fe31..d181b503b 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/de/LC_MESSAGES/post_processors.po @@ -298,39 +298,3 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Erstellt Haltestege durch Hinzufügen von Lücken oder Reduzierung der " "Leistung auf Schneidpfaden" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "Perforation" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" -"Schneidet gestrichelt: Der Laser schneidet über die Schnittlänge und lässt " -"die Auslasslänge aus" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "Schnittlänge" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "Strecke, die der Laser vor jeder Lücke schneidet" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "Auslasslänge" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "" -"Strecke, die zwischen den Schnitten mit ausgeschaltetem Laser gefahren wird" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "Perforations-Schnittlänge ändern" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "Perforations-Auslasslänge ändern" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po index 36c33035a..2b725acf4 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/en/LC_MESSAGES/post_processors.po @@ -283,36 +283,3 @@ msgstr "Tabs" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "Creates holding tabs by adding gaps or reducing power on cut paths" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po index 6274a9653..cff26d78e 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/es/LC_MESSAGES/post_processors.po @@ -297,38 +297,3 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Crea pestañas de sujeción añadiendo huecos o reduciendo potencia en " "trayectorias de corte" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "Perforación" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" -"Corta en trazos: el láser dispara durante la longitud de corte y salta la " -"longitud de salto" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "Longitud de corte" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "Distancia que dispara el láser antes de cada hueco" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "Longitud de salto" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "Distancia recorrida con el láser apagado entre cortes" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "Cambiar longitud de corte de perforación" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "Cambiar longitud de salto de perforación" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po index dd5c2375b..445349d76 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/fr/LC_MESSAGES/post_processors.po @@ -302,38 +302,3 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Crée des languettes de maintien en ajoutant des espaces ou en réduisant la " "puissance sur les parcours de coupe" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "Perforation" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" -"Découpe en pointillés : le laser tire sur la longueur de coupe et saute la " -"longueur de saut" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "Longueur de coupe" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "Distance sur laquelle le laser tire avant chaque interruption" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "Longueur de saut" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "Distance parcourue laser éteint entre les coupes" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "Modifier la longueur de coupe de la perforation" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "Modifier la longueur de saut de la perforation" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po index 431bcad31..db86626fb 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/hi/LC_MESSAGES/post_processors.po @@ -285,36 +285,3 @@ msgstr "टैब" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "कट पाथ पर अंतराल जोड़कर या शक्ति घटाकर होल्डिंग टैब बनाता है" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "परफोरेशन" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "डैश में काटता है: लेज़र कट लंबाई तक चलता है और स्किप लंबाई छोड़ देता है" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "कट लंबाई" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "हर गैप से पहले लेज़र जितनी दूरी तक चलता है" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "स्किप लंबाई" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "कटों के बीच लेज़र बंद करके तय की गई दूरी" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "परफोरेशन कट लंबाई बदलें" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "परफोरेशन स्किप लंबाई बदलें" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot b/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot index 95b43fa9c..1c533abba 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/post_processors.pot @@ -283,36 +283,3 @@ msgstr "" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po index a0dc872f4..4148e83f2 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/pt/LC_MESSAGES/post_processors.po @@ -295,38 +295,3 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Cria abas de fixação adicionando lacunas ou reduzindo a potência em caminhos " "de corte" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "Perfuração" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" -"Corta em traços: o laser dispara pelo comprimento de corte e pula o " -"comprimento de salto" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "Comprimento de corte" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "Distância em que o laser dispara antes de cada intervalo" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "Comprimento de salto" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "Distância percorrida com o laser desligado entre os cortes" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "Alterar comprimento de corte da perfuração" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "Alterar comprimento de salto da perfuração" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po index dfdf97cf2..d9d336910 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/uk/LC_MESSAGES/post_processors.po @@ -295,37 +295,3 @@ msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "" "Створює утримувальні закладки шляхом додавання проміжків або зменшення " "потужності на контурах різання" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "Перфорація" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "" -"Ріже пунктиром: лазер ріже на довжині різу й пропускає довжину пропуску" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "Довжина різу" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "Відстань, на якій лазер ріже перед кожним проміжком" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "Довжина пропуску" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "Відстань, яку лазер проходить вимкненим між різами" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "Змінити довжину різу перфорації" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "Змінити довжину пропуску перфорації" diff --git a/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po b/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po index c76d73b95..5012afa25 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po +++ b/rayforge/builtin_addons/rayforge-addon-post/locale/zh_CN/LC_MESSAGES/post_processors.po @@ -282,36 +282,3 @@ msgstr "标签" #: post_processors/transformers/tabs_transformer.py msgid "Creates holding tabs by adding gaps or reducing power on cut paths" msgstr "通过添加间隙或降低切割路径上的功率来创建保持标签" - -#: post_processors/transformers/perforation_transformer.py -msgid "Perforation" -msgstr "穿孔" - -#: post_processors/transformers/perforation_transformer.py -msgid "" -"Cuts in dashes: the laser fires for the cut length and skips the skip length" -msgstr "虚线切割:激光在切割长度内出光,并跳过跳过长度" - -#: post_processors/widgets/perforation_group.py -msgid "Cut Length" -msgstr "切割长度" - -#: post_processors/widgets/perforation_group.py -msgid "Distance the laser fires before each gap" -msgstr "每个间隙前激光出光的距离" - -#: post_processors/widgets/perforation_group.py -msgid "Skip Length" -msgstr "跳过长度" - -#: post_processors/widgets/perforation_group.py -msgid "Distance travelled with the laser off between cuts" -msgstr "两段切割之间关闭激光移动的距离" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation cut length" -msgstr "更改穿孔切割长度" - -#: post_processors/widgets/perforation_group.py -msgid "Change perforation skip length" -msgstr "更改穿孔跳过长度" From be8c16ba3c2673434912cc8ffecd4bfb1e83c2b1 Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Thu, 15 Oct 2026 05:46:38 +0200 Subject: [PATCH 5/8] fix(post): keep the Tabs progress label for the tabs spec PerforationTransformer declared SPEC_NAME "tabs" and is registered before TabOpsTransformer, so the batch progress for every tabs spec was labelled "Perforation". Leave the spec name to the Tabs transformer. Refs #525 --- .../transformers/perforation_transformer.py | 1 - .../transformers/test_perforation_transformer.py | 14 +++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py index 5be0f4d66..e0a36a2a5 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/transformers/perforation_transformer.py @@ -30,7 +30,6 @@ class PerforationTransformer(OpsTransformer): them out of the nearest toolpath. """ - SPEC_NAME = "tabs" DEFAULT_CUT_LENGTH = 2.0 DEFAULT_SKIP_LENGTH = 1.0 diff --git a/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py b/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py index ea3b40a44..15191561c 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py +++ b/rayforge/builtin_addons/rayforge-addon-post/tests/transformers/test_perforation_transformer.py @@ -1,13 +1,17 @@ from unittest.mock import MagicMock import pytest -from post_processors.transformers import PerforationTransformer +from post_processors.transformers import ( + PerforationTransformer, + TabOpsTransformer, +) from raygeo.geo import Geometry from raygeo.ops import Ops from raygeo.ops.transform.tabs import TabsSpec from raygeo.ops.types import CommandType, SectionType from rayforge.core.workpiece import WorkPiece +from rayforge.pipeline.transformer.registry import TransformerRegistry def _unit_square(x0=0.0, y0=0.0, x1=1.0, y1=1.0) -> Geometry: @@ -183,3 +187,11 @@ def test_cut_and_skip_lengths_on_square(self): ops.preload_state() assert ops.cut_distance() == pytest.approx(60.0, abs=1e-6) assert _cut_runs(ops) == 40 + + +class TestPerforationProgressLabel: + def test_tabs_progress_keeps_the_tabs_label(self): + registry = TransformerRegistry() + registry.register(PerforationTransformer) + registry.register(TabOpsTransformer) + assert registry.progress_label("tabs") == TabOpsTransformer().label From e2e73efa8fb1a19d06164af49061b8172781bbbb Mon Sep 17 00:00:00 2001 From: Gert Pellin Date: Thu, 15 Oct 2026 05:47:12 +0200 Subject: [PATCH 6/8] refactor(post): bound the perforation rows by the transformer minimum Refs #525 --- .../post_processors/widgets/perforation_group.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py index e5ecdf504..5bd1135be 100644 --- a/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py +++ b/rayforge/builtin_addons/rayforge-addon-post/post_processors/widgets/perforation_group.py @@ -9,6 +9,7 @@ from rayforge.ui_gtk.shared.pref_rows import LengthSpinRow from ..transformers import PerforationTransformer +from ..transformers.perforation_transformer import MIN_LENGTH if TYPE_CHECKING: from rayforge.core.step import Step @@ -31,7 +32,7 @@ def __init__( self.cut_row = LengthSpinRow( _("Cut Length"), _("Distance the laser fires before each gap"), - lower=0.01, + lower=MIN_LENGTH, upper=1000.0, value_in_base=transformer.cut_length, ) @@ -43,7 +44,7 @@ def __init__( self.skip_row = LengthSpinRow( _("Skip Length"), _("Distance travelled with the laser off between cuts"), - lower=0.01, + lower=MIN_LENGTH, upper=1000.0, value_in_base=transformer.skip_length, ) From 6e25e14833229f3ea96579eb650cf09bf0da7dfc Mon Sep 17 00:00:00 2001 From: Samuel Abels Date: Thu, 15 Oct 2026 13:34:53 +0200 Subject: [PATCH 7/8] docs: screenshot the Perforation post-processor and its result Add two screenshot targets: operations:perforation loads a new perforation.ryp asset (a rectangle and a circle on a plywood stock, Perforation enabled at 1.0 mm cut / 0.5 mm skip) and captures a close-up of the dashed toolpath; step-settings:contour:post:perforation opens the post-processing page with the Perforation group enabled and expanded. Regenerate step-settings-contour-post.webp so it includes the new Perforation row. --- scripts/screenshot/cli.py | 2 + scripts/screenshot/perforation.py | 139 ++++++++++++++++++ .../screenshot/step_settings_perforation.py | 109 ++++++++++++++ tests/assets/perforation.ryp | Bin 0 -> 6101 bytes .../screenshots/operations-perforation.webp | Bin 0 -> 158598 bytes ...tep-settings-contour-post-perforation.webp | Bin 0 -> 25618 bytes .../step-settings-contour-post.webp | Bin 20586 -> 21710 bytes 7 files changed, 250 insertions(+) create mode 100644 scripts/screenshot/perforation.py create mode 100644 scripts/screenshot/step_settings_perforation.py create mode 100644 tests/assets/perforation.ryp create mode 100644 website/static/screenshots/operations-perforation.webp create mode 100644 website/static/screenshots/step-settings-contour-post-perforation.webp diff --git a/scripts/screenshot/cli.py b/scripts/screenshot/cli.py index 025ffbe68..2ead7f2b6 100755 --- a/scripts/screenshot/cli.py +++ b/scripts/screenshot/cli.py @@ -124,6 +124,7 @@ "addons:sketcher:array:circular": "sketcher_array", "addons:sketcher:array:curve-along": "sketcher_array", "material-test": "material_test", + "operations:perforation": "perforation", "operations:wavefront": "wavefront", "recipe-editor:general": "recipe_editor_general", "recipe-editor:applicability": "recipe_editor_applicability", @@ -135,6 +136,7 @@ "step-settings:contour:general": "step_settings", "step-settings:contour:laser": "step_settings", "step-settings:contour:post": "step_settings", + "step-settings:contour:post:perforation": "step_settings_perforation", "step-settings:engrave:general:constant_power": "step_settings", "step-settings:engrave:general:dither": "step_settings", "step-settings:engrave:general:multi_pass": "step_settings", diff --git a/scripts/screenshot/perforation.py b/scripts/screenshot/perforation.py new file mode 100644 index 000000000..43504ef99 --- /dev/null +++ b/scripts/screenshot/perforation.py @@ -0,0 +1,139 @@ +""" +Screenshot: Perforation post-processor applied to a contour. + +Usage: pixi run screenshot operations:perforation +""" + +import logging +import time + +from utils import ( + clear_window_subtitle, + load_project, + restore_config, + run_on_main_thread, + set_window_size, + take_region_screenshot, + wait_for_settled, +) + +from rayforge.core.workpiece import WorkPiece +from rayforge.uiscript import app, win + +logger = logging.getLogger(__name__) + +TARGET_PX_PER_MM = 26.0 +CROP_SIZE = (1200, 800) + + +def _content_boxes() -> list[tuple[float, float, float, float]]: + items = [ + item + for layer in win.doc_editor.doc.layers + for item in layer.children + if isinstance(item, WorkPiece) + ] + items.extend(win.doc_editor.doc.stock_items) + return [item.bbox for item in items if item.size != (0.0, 0.0)] + + +def frame_closeup() -> tuple[float, float] | None: + """Zoom in on the workpiece so the dash pattern is clearly visible. + + Centers the view on a point inside the workpiece and returns the + focused world position, or None when there is nothing to frame. + """ + + def _frame() -> tuple[float, float] | None: + boxes = _content_boxes() + if not boxes: + logger.warning("No content to frame") + return None + min_x = min(b[0] for b in boxes) + min_y = min(b[1] for b in boxes) + max_x = max(b[0] + b[2] for b in boxes) + max_y = max(b[1] + b[3] for b in boxes) + + work_boxes = [ + b + for layer in win.doc_editor.doc.layers + for b in [ + item.bbox + for item in layer.children + if isinstance(item, WorkPiece) + ] + ] + if work_boxes: + box = work_boxes[0] + else: + box = (min_x, min_y, max_x - min_x, max_y - min_y) + + focus_x = box[0] + 0.79 * box[2] + focus_y = box[1] + 0.5 * box[3] + + scale_x, scale_y = win.surface.get_view_scale() + px_per_mm = max((scale_x + scale_y) / 2.0, 1e-9) + zoom = win.surface.zoom_level * TARGET_PX_PER_MM / px_per_mm + win.surface.set_zoom(max(zoom, 0.01)) + + for _pass in range(2): + pos = win.surface.view_transform.transform_point(focus_x, focus_y) + dx = win.surface.get_width() / 2.0 - pos[0] + dy = win.surface.get_height() / 2.0 - pos[1] + scale_x, scale_y = win.surface.get_view_scale() + win.surface.set_pan( + win.surface.pan_x_mm - dx / scale_x, + win.surface.pan_y_mm + dy / scale_y, + ) + return focus_x, focus_y + + return run_on_main_thread(_frame) + + +def closeup_region(focus: tuple[float, float]) -> tuple[int, int, int, int]: + """Return the main-window region around the focused point.""" + + def _region() -> tuple[int, int, int, int]: + pos = win.surface.view_transform.transform_point(*focus) + ox, oy = win.surface.translate_coordinates(win, 0, 0) + cx, cy = ox + pos[0], oy + pos[1] + w, h = CROP_SIZE + return ( + int(cx - w / 2), + int(cy - h / 2), + int(cx + w / 2), + int(cy + h / 2), + ) + + return run_on_main_thread(_region) + + +@restore_config +def main(): + set_window_size(win, 2400, 1650) + + load_project(win, "perforation.ryp") + logger.info("Waiting for document to settle...") + if not wait_for_settled(win, timeout=30): + logger.error("Document did not settle in time") + app.quit_idle() + return + logger.info("Document settled") + + focus = frame_closeup() + if focus is None: + app.quit_idle() + return + time.sleep(0.5) + + clear_window_subtitle(win) + time.sleep(0.25) + + logger.info("Taking close-up screenshot: operations-perforation.webp") + take_region_screenshot(win, closeup_region(focus)) + + time.sleep(0.25) + app.quit_idle() + + +main() diff --git a/scripts/screenshot/step_settings_perforation.py b/scripts/screenshot/step_settings_perforation.py new file mode 100644 index 000000000..b5d557785 --- /dev/null +++ b/scripts/screenshot/step_settings_perforation.py @@ -0,0 +1,109 @@ +"""Screenshot: Contour post-processing page with Perforation expanded.""" + +import logging +import time + +from gi.repository import Adw +from utils import ( + find_step_by_type, + get_target, + load_project, + open_step_settings, + restore_config, + run_on_main_thread, + set_window_size, + take_screenshot, +) + +from rayforge.uiscript import app, win + +logger = logging.getLogger(__name__) + +TARGET = get_target("step-settings:contour:post:perforation") + +TRANSFORMER_NAME = "PerforationTransformer" + + +def find_expander_row(widget, title: str) -> Adw.ExpanderRow | None: + """Find the expander row with the given title in the widget tree.""" + if isinstance(widget, Adw.ExpanderRow) and widget.get_title() == title: + return widget + child = widget.get_first_child() + while child is not None: + found = find_expander_row(child, title) + if found is not None: + return found + child = child.get_next_sibling() + return None + + +def find_post_page(widget): + """Find the post-processing page in the widget tree.""" + if hasattr(widget, "_group_dicts"): + return widget + child = widget.get_first_child() + while child is not None: + found = find_post_page(child) + if found is not None: + return found + child = child.get_next_sibling() + return None + + +def stage_perforation_group(dialog) -> bool: + """Enable the Perforation transformer and expand its settings.""" + + def _stage() -> bool: + page = find_post_page(dialog) + if page is None: + return False + for group, t_dict in page._group_dicts.items(): + if t_dict.get("name") != TRANSFORMER_NAME: + continue + title = group.get_title() + group.enable_switch.set_active(True) + expander = find_expander_row(page, title) + if expander is not None: + expander.set_expanded(True) + return True + return False + + staged = run_on_main_thread(_stage) + if not staged: + logger.error(f"No {TRANSFORMER_NAME} found on the post page") + return staged + + +@restore_config +def main(): + set_window_size(win, 2400, 1650) + + load_project(win, "allsteps.ryp") + time.sleep(0.25) + + step_type, page, _mode = "contour", "post-processing", None + logger.info(f"Target: {TARGET} -> type={step_type}, page={page}") + + found = find_step_by_type(win, step_type) + if found is None or found[0] is None: + logger.error(f"No step found with type: {step_type}") + app.quit_idle() + return + + step, step_index = found + logger.info(f"Found step: {step.name} at index {step_index}") + + dialog = open_step_settings(win, step_index=step_index, page=page) + time.sleep(0.5) + + if not stage_perforation_group(dialog): + app.quit_idle() + return + time.sleep(0.5) + + take_screenshot() + time.sleep(0.25) + app.quit_idle() + + +main() diff --git a/tests/assets/perforation.ryp b/tests/assets/perforation.ryp new file mode 100644 index 0000000000000000000000000000000000000000..58ef01d2e3deaae6572e43013f0cdf652c52a06d GIT binary patch literal 6101 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 literal 0 HcmV?d00001 diff --git a/website/static/screenshots/operations-perforation.webp b/website/static/screenshots/operations-perforation.webp new file mode 100644 index 0000000000000000000000000000000000000000..2dc33170508d94e481843d36b214267d0c488931 GIT binary patch literal 158598 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 Nrs)5{wKVbH;oqfJ8Cn1U From 972370d0d924e9006d79a656da57fdb42efe24dc Mon Sep 17 00:00:00 2001 From: Samuel Abels Date: Thu, 15 Oct 2026 13:35:35 +0200 Subject: [PATCH 8/8] docs: rework the Perforation page prose and embed the screenshots Turn the bullet-heavy page into flowing prose in English and all translations, explain where the post-processor lives and how the pattern behaves, and show both the settings UI and the resulting dashed cut on the canvas. --- website/docs/features/perforation.md | 68 +++++++++++------ .../current/features/perforation.md | 74 ++++++++++++------- .../current/features/perforation.md | 74 +++++++++++++------ .../current/features/perforation.md | 74 +++++++++++++------ .../current/features/perforation.md | 64 ++++++++++------ .../current/features/perforation.md | 70 ++++++++++++------ .../current/features/perforation.md | 68 +++++++++++------ .../current/features/perforation.md | 43 +++++++---- 8 files changed, 357 insertions(+), 178 deletions(-) diff --git a/website/docs/features/perforation.md b/website/docs/features/perforation.md index 4b3c58937..14cdf970b 100644 --- a/website/docs/features/perforation.md +++ b/website/docs/features/perforation.md @@ -6,38 +6,60 @@ description: # Perforation -The **Perforation** post-processor turns a continuous cut into a dashed one. The laser fires for the -**Cut Length**, then travels with the laser off for the **Skip Length**, and repeats this along -every contour of the workpiece. +Not every cut is meant to free a part from the material. Some lines are there so the material can +fold along them, tear apart cleanly, or show where the needle goes. That is what the **Perforation** +post-processor is for: it turns a continuous cut into a dashed one. Instead of keeping the laser on +from start to finish, it fires for the **Cut Length**, travels the **Skip Length** with the laser +off, and repeats that rhythm along every contour of the workpiece. What remains is a line of small +cuts that holds the material together — until you want it to give way. -## When to Use It +![The Perforation settings on the post-processing page of a Contour step](/screenshots/step-settings-contour-post-perforation.webp) -- Fold lines in card stock and corrugated cardboard -- Tear-off lines (tickets, coupons, packaging) -- Stitch holes in leather -- Dashed lines for decoration +## Typical Uses -## Settings +Whenever a line should weaken the material without cutting it free, a perforation cut is worth +considering. The classics: -Perforation is available in the post-processing settings of **Contour** operations. It is off by -default. +- **Fold lines** in card stock and corrugated cardboard fold crisply along a dashed cut — think + boxes, cards and pop-up designs. +- **Tear-off lines** let tickets, coupons and packaging open without scissors. +- **Stitch holes** in leather mark the path of the needle before sewing. +- **Dashed outlines** are a decorative effect in their own right, on wood, paper and acrylic. -- **Cut Length**: the distance the laser fires before each gap. -- **Skip Length**: the distance travelled with the laser off between two cuts. +## Enabling Perforation -The pattern is measured along each contour of the workpiece and starts again at the start of every -contour, beginning with a full cut. A contour shorter than one cut plus one skip is cut in full. +Perforation lives on the **Post Processing** page of a [Contour](operations/contour) step's +settings, alongside the other post-processors. It is off by default — flip the switch and two values +appear: + +- **Cut Length** is how far the laser stays on before each gap. +- **Skip Length** is how far it travels with the laser off between two cuts. + +The pattern starts at the beginning of each contour with a full cut and restarts from there on every +contour, so all dashed lines on the workpiece begin the same way. A contour too short to fit even +one cut and one skip is simply cut in one piece. + +## The Result + +On the canvas, the dashed line replaces the solid cut outline — every gap in the toolpath is a gap +in the finished part. + +![A rectangle and a circle cut as dashed lines into a sheet of plywood](/screenshots/operations-perforation.webp) ## Tips -- For a fold line that should not cut through, start with a skip length about as long as the cut - length and lower the power. -- Very short lengths (a few tenths of a millimetre) make the laser switch on and off rapidly, which - lowers the effective power. -- Perforation works together with [Holding Tabs](holding-tabs), [Lead-In/Out](lead-in-out) and - [Multi-Pass](multi-pass). +For a fold line that must not cut through, start with a skip length about as long as the cut length +and lower the power — a shallow groove folds just as well as a deep dashed cut, and the underside +stays clean. + +Very short lengths (a few tenths of a millimetre) make the laser switch on and off in rapid +succession, which lowers the effective power and can leave uneven marks. If the pattern looks +inconsistent, try longer lengths. + +Perforation plays well with the rest of the post-processing stack: [Holding Tabs](holding-tabs), +[Lead-In/Out](lead-in-out) and [Multi-Pass](multi-pass) all keep working as usual. ## Related Pages -- [Contour Cutting](operations/contour) - The cutting operation that uses perforation -- [Holding Tabs](holding-tabs) - Gaps placed by hand to keep parts attached +- [Contour Cutting](operations/contour) — the cutting operation this post-processor belongs to +- [Holding Tabs](holding-tabs) — gaps placed by hand to keep parts attached diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md index dbeffde48..4405bc238 100644 --- a/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,40 +6,64 @@ description: # Perforation -Der Nachbearbeitungsschritt **Perforation** macht aus einem durchgehenden Schnitt einen -gestrichelten. Der Laser schneidet über die **Schnittlänge**, fährt dann mit ausgeschaltetem Laser -über die **Auslasslänge** und wiederholt das entlang jeder Kontur des Werkstücks. +Nicht jeder Schnitt soll ein Teil aus dem Material lösen. Manche Linien sind da, damit sich das +Material entlang ihnen falten lässt, sauber abreißt oder den Weg der Nadel vorgezeichnet. Dafür gibt +es den Nachbearbeitungsschritt **Perforation**: Er macht aus einem durchgehenden Schnitt einen +gestrichelten. Statt den Laser von Anfang bis Ende eingeschaltet zu lassen, feuert er über die +**Schnittlänge**, fährt die **Auslasslänge** mit ausgeschaltetem Laser zurück und wiederholt diesen +Rhythmus entlang jeder Kontur des Werkstücks. Übrig bleibt eine Reihe kleiner Schnitte, die das +Material zusammenhalten — bis es nachgeben soll. -## Wann verwenden +![Die Perforation-Einstellungen auf der Nachbearbeitung-Seite eines Kontur-Schritts](/screenshots/step-settings-contour-post-perforation.webp) -- Falzlinien in Karton und Wellpappe -- Abreißlinien (Tickets, Gutscheine, Verpackungen) -- Nählöcher in Leder -- Dekorative gestrichelte Linien +## Beispielhafte Anwendungsfälle -## Einstellungen +Überall dort, wo eine Linie das Material schwächen soll, ohne es zu durchtrennen, lohnt sich ein +perforierter Schnitt. Die klassischen Fälle: -Perforation ist in den Nachbearbeitungseinstellungen von **Kontur**-Operationen verfügbar und -standardmäßig ausgeschaltet. +- **Falzlinien** in Karton und Wellpappe brechen entlang einer gestrichelten Linie sauber — etwa bei + Schachteln, Karten und Pop-up-Designs. +- **Abreißlinien** öffnen Tickets, Gutscheine und Verpackungen ganz ohne Schere. +- **Nählöcher** in Leder markieren den Weg der Nadel, bevor genäht wird. +- **Gestrichelte Konturen** sind darüber hinaus ein dekorativer Effekt — auf Holz, Papier und Acryl. -- **Schnittlänge**: die Strecke, die der Laser vor jeder Lücke schneidet. -- **Auslasslänge**: die Strecke, die zwischen zwei Schnitten mit ausgeschaltetem Laser gefahren - wird. +## Perforation aktivieren -Das Muster wird entlang jeder Kontur des Werkstücks gemessen und beginnt am Anfang jeder Kontur neu, -immer mit einem vollen Schnitt. Eine Kontur, die kürzer ist als ein Schnitt plus eine Lücke, wird -vollständig geschnitten. +Perforation findet sich auf der Seite **Nachbearbeitung** der Einstellungen eines +[Kontur](operations/contour)-Schritts, neben den übrigen Nachbearbeitungsschritten. Sie ist +standardmäßig ausgeschaltet — sobald der Schalter umgelegt wird, erscheinen zwei Werte: + +- Die **Schnittlänge** gibt an, wie weit der Laser vor jeder Lücke eingeschaltet bleibt. +- Die **Auslasslänge** ist die Strecke, die zwischen zwei Schnitten mit ausgeschaltetem Laser + zurückgelegt wird. + +Das Muster beginnt am Anfang jeder Kontur mit einem vollen Schnitt und beginnt auf jeder Kontur neu, +sodass alle gestrichelten Linien des Werkstücks gleich ansetzen. Eine Kontur, zu klein für auch nur +einen Schnitt und eine Lücke, wird einfach am Stück geschnitten. + +## Das Ergebnis + +Auf der Arbeitsfläche ersetzt die gestrichelte Linie die durchgehende Schnittkontur — jede Lücke im +Werkzeugpfad ist auch eine Lücke im fertigen Teil. + +![Ein Rechteck und ein Kreis werden als gestrichelte Linien in eine Birkenplywood-Platte geschnitten](/screenshots/operations-perforation.webp) ## Tipps -- Für eine Falzlinie, die nicht durchschneiden soll, mit etwa gleich langer Schnitt- und - Auslasslänge beginnen und die Leistung senken. -- Sehr kurze Längen (wenige Zehntelmillimeter) lassen den Laser schnell ein- und ausschalten, was - die effektive Leistung verringert. -- Perforation funktioniert zusammen mit [Halte-Laschen](holding-tabs), [Lead-In/Out](lead-in-out) - und [Mehrfachdurchgang](multi-pass). +Für eine Falzlinie, die nicht durchtrennen soll, beginnt man am besten mit einer Auslasslänge von +etwa der Schnittlänge und senkt die Leistung — eine flache Rille faltet genauso gut wie ein tiefer +gestrichelter Schnitt, und die Unterseite bleibt sauber. + +Sehr kurze Längen (wenige Zehntelmillimeter) lassen den Laser in schneller Folge ein- und +ausschalten, was die effektive Leistung verringert und ungleichmäßige Spuren hinterlassen kann. +Wirkt das Muster uneinheitlich, helfen längere Werte. + +Perforation lässt sich gut mit dem Rest der Nachbearbeitung kombinieren: +[Halte-Laschen](holding-tabs), [Einlauf / Auslauf](lead-in-out) und [Mehrfach-Durchgang](multi-pass) +funktionieren wie gewohnt. ## Verwandte Seiten -- [Konturschneiden](operations/contour) - Die Schneidoperation, die Perforation verwendet -- [Halte-Laschen](holding-tabs) - Von Hand gesetzte Lücken, die Teile festhalten +- [Kontur-Schneiden](operations/contour) — die Schneidoperation, zu der dieser + Nachbearbeitungsschritt gehört +- [Halte-Laschen](holding-tabs) — von Hand gesetzte Lücken, die Teile festhalten diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md index 42370afd9..26e49563a 100644 --- a/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,39 +6,65 @@ description: # Perforación -El posprocesador **Perforación** convierte un corte continuo en uno discontinuo. El láser dispara -durante la **Longitud de corte**, luego se desplaza con el láser apagado durante la **Longitud de -salto**, y repite esto a lo largo de cada contorno de la pieza. +No todos los cortes sirven para separar una pieza del material. Hay líneas que existen para que el +material se pliegue sobre ellas, se rasgue limpiamente o marque el camino de la aguja. Para eso está +el posprocesador **Perforación**: convierte un corte continuo en uno discontinuo. En lugar de +mantener el láser encendido de principio a fin, dispara durante la **Longitud de corte**, recorre la +**Longitud de salto** con el láser apagado, y repite ese ritmo a lo largo de cada contorno de la +pieza. Lo que queda es una línea de cortes pequeños que mantiene unido el material — hasta que +quieras que ceda. -## Cuándo usarlo +![Los ajustes de Perforación en la página de posprocesado de un paso de Contorno](/screenshots/step-settings-contour-post-perforation.webp) -- Líneas de pliegue en cartulina y cartón ondulado -- Líneas de rasgado (entradas, cupones, embalajes) -- Agujeros de costura en cuero -- Líneas discontinuas decorativas +## Algunos usos típicos -## Ajustes +Allí donde una línea deba debilitar el material sin cortarlo por completo, vale la pena un corte +perforado. Los casos clásicos: -La perforación está disponible en los ajustes de posprocesado de las operaciones de **Contorno**. -Está desactivada por defecto. +- **Líneas de pliegue** en cartulina y cartón ondulado se pliegan con precisión sobre un corte + discontinuo: cajas, tarjetas y diseños pop-up, por ejemplo. +- **Líneas de rasgado** abren entradas, cupones y envases sin necesidad de tijeras. +- **Agujeros de costura** en cuero marcan el camino de la aguja antes de coser. +- **Contornos discontinuos** son además un efecto decorativo en sí mismos, sobre madera, papel o + acrílico. -- **Longitud de corte**: la distancia que dispara el láser antes de cada hueco. -- **Longitud de salto**: la distancia recorrida con el láser apagado entre dos cortes. +## Activar la perforación -El patrón se mide a lo largo de cada contorno de la pieza y vuelve a empezar al inicio de cada -contorno, siempre con un corte completo. Un contorno más corto que un corte más un salto se corta -entero. +La perforación se encuentra en la página **Posprocesado** de los ajustes de un paso de +[Contorno](operations/contour), junto a los demás posprocesadores. Viene desactivada por defecto; al +activar el interruptor aparecen dos valores: + +- La **Longitud de corte** es cuánto permanece encendido el láser antes de cada hueco. +- La **Longitud de salto** es la distancia recorrida con el láser apagado entre dos cortes. + +El patrón empieza al inicio de cada contorno con un corte completo y vuelve a empezar en cada +contorno, de modo que todas las líneas discontinuas de la pieza comienzan igual. Un contorno +demasiado corto para un solo corte y un salto simplemente se corta entero. + +## El resultado + +En el lienzo, la línea discontinua sustituye al contorno de corte sólido: cada hueco del trazado es +también un hueco en la pieza terminada. + +![Un rectángulo y un círculo se cortan como líneas discontinuas en una plancha de madera +contrachapada](/screenshots/operations-perforation.webp) ## Consejos -- Para una línea de pliegue que no debe atravesar el material, empieza con una longitud de salto - similar a la de corte y baja la potencia. -- Longitudes muy cortas (unas décimas de milímetro) hacen que el láser se encienda y apague - rápidamente, lo que reduce la potencia efectiva. -- La perforación funciona junto con [Pestañas de sujeción](holding-tabs), - [Entrada/Salida](lead-in-out) y [Multipasada](multi-pass). +Para una línea de pliegue que no debe atravesar el material, empieza con una longitud de salto +parecida a la de corte y baja la potencia: un surco poco profundo pliega igual de bien que un corte +discontinuo profundo, y el reverso queda limpio. + +Las longitudes muy cortas (unas décimas de milímetro) hacen que el láser se encienda y apague a toda +velocidad, lo que reduce la potencia efectiva y puede dejar marcas irregulares. Si el patrón se ve +desigual, prueba con longitudes mayores. + +La perforación se combina bien con el resto del posprocesado: las +[Pestañas de Sujeción](holding-tabs), la [Entrada / Salida](lead-in-out) y la +[Multi-Pasada](multi-pass) siguen funcionando como siempre. ## Páginas relacionadas -- [Corte de contorno](operations/contour) - La operación de corte que usa la perforación -- [Pestañas de sujeción](holding-tabs) - Huecos colocados a mano para mantener las piezas unidas +- [Corte de Contorno](operations/contour) — la operación de corte a la que pertenece este + posprocesador +- [Pestañas de Sujeción](holding-tabs) — huecos colocados a mano para mantener las piezas unidas diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md index 2933115d8..0ba276d24 100644 --- a/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,40 +6,66 @@ description: # Perforation -Le post-traitement **Perforation** transforme une découpe continue en découpe en pointillés. Le -laser tire sur la **Longueur de coupe**, puis se déplace laser éteint sur la **Longueur de saut**, -et répète cela le long de chaque contour de la pièce. +Tous les traits ne servent pas à détacher une pièce du matériau. Certains existent pour que le +matériau se plie le long d'eux, se déchire proprement, ou pour marquer le passage de l'aiguille. +C'est le rôle du post-traitement **Perforation** : il transforme une coupe continue en coupe en +pointillés. Au lieu de laisser le laser allumé du début à la fin, il tire sur la **Longueur de +coupe**, parcourt la **Longueur de saut** laser éteint, et répète ce rythme le long de chaque +contour de la pièce. Il reste une ligne de petites coupes qui maintient le matériau — jusqu'à ce que +vous décidiez de le plier ou de le déchirer. -## Quand l'utiliser +![Les réglages de la Perforation sur la page de post-traitement d'une étape de Contour](/screenshots/step-settings-contour-post-perforation.webp) -- Lignes de pliage dans le carton et le carton ondulé -- Lignes prédécoupées (billets, coupons, emballages) -- Trous de couture dans le cuir -- Pointillés décoratifs +## Quelques cas d'usage -## Réglages +Chaque fois qu'un trait doit affaiblir le matériau sans le couper, une coupe perforée a du sens. Les +grands classiques : -La perforation est disponible dans les réglages de post-traitement des opérations **Contour**. Elle -est désactivée par défaut. +- **Les lignes de pliage** dans le carton et le carton ondulé se plient net le long d'une coupe en + pointillés — boîtes, cartes et créations pop-up, par exemple. +- **Les lignes prédécoupées** ouvrent billets, bons et emballages sans ciseaux. +- **Les trous de couture** dans le cuir marquent le passage de l'aiguille avant la couture. +- **Les contours en pointillés** sont en eux-mêmes un effet décoratif, sur le bois, le papier ou + l'acrylique. -- **Longueur de coupe** : la distance sur laquelle le laser tire avant chaque interruption. -- **Longueur de saut** : la distance parcourue laser éteint entre deux coupes. +## Activer la perforation -Le motif est mesuré le long de chaque contour de la pièce et recommence au début de chaque contour, -toujours par une coupe complète. Un contour plus court qu'une coupe plus un saut est découpé en -entier. +La perforation se trouve sur la page **Post-traitement** des réglages d'une étape de +[Contour](operations/contour), aux côtés des autres post-traitements. Elle est désactivée par défaut +; dès que vous basculez l'interrupteur, deux valeurs apparaissent : + +- La **Longueur de coupe** est la distance pendant laquelle le laser reste allumé avant chaque + interruption. +- La **Longueur de saut** est la distance parcourue laser éteint entre deux coupes. + +Le motif recommence au début de chaque contour, toujours par une coupe complète, pour que toutes les +lignes en pointillés de la pièce démarrent de la même façon. Un contour trop court pour ne serait-ce +qu'une coupe et un saut est simplement découpé d'un seul tenant. + +## Le résultat + +Sur le canevas, la ligne en pointillés remplace le contour de coupe plein : chaque interruption du +tracé sera aussi une interruption dans la pièce finie. + +![Un rectangle et un cercle découpés en pointillés dans une planche de contreplaqué](/screenshots/operations-perforation.webp) ## Conseils -- Pour une ligne de pliage qui ne doit pas traverser, commencez avec une longueur de saut proche de - la longueur de coupe et baissez la puissance. -- Des longueurs très courtes (quelques dixièmes de millimètre) font s'allumer et s'éteindre le laser - rapidement, ce qui réduit la puissance effective. -- La perforation fonctionne avec les [Ponts de maintien](holding-tabs), - l'[Entrée/Sortie](lead-in-out) et les [Passes multiples](multi-pass). +Pour une ligne de pliage qui ne doit pas traverser le matériau, commencez avec une longueur de saut +proche de la longueur de coupe et baissez la puissance : une rainure peu profonde plie aussi bien +qu'une coupe pointillée profonde, et l'envers reste propre. + +Les longueurs très courtes (quelques dixièmes de millimètre) font allumer et éteindre le laser à +grande cadence, ce qui réduit la puissance effective et peut laisser des traces irrégulières. Si le +motif paraît inégal, essayez des valeurs plus longues. + +La perforation se combine bien avec le reste du post-traitement : les +[Ponts de Maintien](holding-tabs), l'[Approche / Sortie](lead-in-out) et la +[Passe Multiple](multi-pass) continuent de fonctionner comme d'habitude. ## Pages associées -- [Découpe de contour](operations/contour) - L'opération de découpe qui utilise la perforation -- [Ponts de maintien](holding-tabs) - Interruptions placées à la main pour garder les pièces +- [Coupe de Contour](operations/contour) — l'opération de coupe à laquelle appartient ce + post-traitement +- [Ponts de Maintien](holding-tabs) — interruptions placées à la main pour garder les pièces attachées diff --git a/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md index 315e37c62..7c5d4ec5a 100644 --- a/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/hi/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,36 +6,58 @@ description: # परफोरेशन -**परफोरेशन** पोस्ट-प्रोसेसर लगातार कट को डैश वाले कट में बदल देता है। लेज़र **कट लंबाई** तक चलता है, -फिर **स्किप लंबाई** तक लेज़र बंद करके आगे बढ़ता है, और वर्कपीस के हर कंटूर पर यही दोहराता है। +हर कट का मकसद मटेरियल से पार्ट अलग करना नहीं होता। कुछ लाइनें इसलिए होती हैं कि मटेरियल उन पर मुड़े, +साफ फटे, या सुई का रास्ता पहले से निशान हो। इसी काम के लिए **परफोरेशन** पोस्ट-प्रोसेसर है: यह लगातार +कट को डैश वाले कट में बदल देता है। लेज़र को शुरू से आखिर तक जलाए रखने के बजाय यह **कट लंबाई** तक +चलता है, फिर **स्किप लंबाई** तक लेज़र बंद करके आगे बढ़ता है, और वर्कपीस के हर कंटूर पर यही लय +दोहराता है। नतीजा छोटे-छोटे कटों की एक लाइन होती है जो मटेरियल को जोड़े रखती है — जब तक आप खुद उसे +मोड़ना या फाड़ना न चाहें। -## कब उपयोग करें +![कंटूर स्टेप की पोस्ट-प्रोसेसिंग पेज पर परफोरेशन की सेटिंग्स](/screenshots/step-settings-contour-post-perforation.webp) -- कार्ड स्टॉक और नालीदार गत्ते में मोड़ की लाइनें -- फाड़ने की लाइनें (टिकट, कूपन, पैकेजिंग) -- चमड़े में सिलाई के छेद -- सजावटी डैश वाली लाइनें +## कुछ सामान्य उपयोग -## सेटिंग्स +जहाँ भी कोई लाइन मटेरियल को काटे बिना कमज़ोर करना चाहती है, वहाँ परफोरेटेड कट काम आता है। कुछ प्रमुख +उदाहरण: -परफोरेशन **कंटूर** ऑपरेशन की पोस्ट-प्रोसेसिंग सेटिंग्स में उपलब्ध है। यह डिफ़ॉल्ट रूप से बंद रहता -है। +- कार्ड स्टॉक और नालीदार गत्ते में **मोड़ की लाइनें** डैश वाले कट पर बिल्कुल साफ मुड़ती हैं — जैसे + डिब्बे, कार्ड और पॉप-अप डिज़ाइन। +- **फाड़ने की लाइनें** टिकट, कूपन और पैकेजिंग बिना कैंची खोल देती हैं। +- चमड़े में **सिलाई के छेद** सिलाई से पहले सुई का रास्ता दिखा देते हैं। +- **डैश वाली कंटूरें** अपने आप में भी एक सजावटी अंदाज़ हैं — लकड़ी, कागज़ और ऐक्रेलिक पर। -- **कट लंबाई**: हर गैप से पहले लेज़र जितनी दूरी तक चलता है। -- **स्किप लंबाई**: दो कट के बीच लेज़र बंद करके तय की गई दूरी। +## परफोरेशन चालू करना -पैटर्न वर्कपीस के हर कंटूर के साथ मापा जाता है और हर कंटूर की शुरुआत में फिर से शुरू होता है, हमेशा -एक पूरे कट से। एक कट और एक स्किप से छोटा कंटूर पूरा काटा जाता है। +परफोरेशन [कंटूर](operations/contour) स्टेप की सेटिंग्स में **पोस्ट-प्रोसेसिंग** पेज पर मिलती है, +बाकी पोस्ट-प्रोसेसरों के साथ। यह डिफ़ॉल्ट रूप से बंद रहती है; स्विच चालू करते ही दो मान सामने आते +हैं: + +- **कट लंबाई**: हर गैप से पहले लेज़र जितनी दूरी तक जलता रहता है। +- **स्किप लंबाई**: दो कटों के बीच लेज़र बंद करके तय की गई दूरी। + +पैटर्न हर कंटूर की शुरुआत में एक पूरे कट के साथ शुरू होता है और हर कंटूर पर नए सिरे से शुरू होता है, +ताकि वर्कपीस की सारी डैश वाली लाइनें एक जैसे अंदाज़ में शुरू हों। जो कंटूर एक कट और एक स्किप के लिए +भी छोटा हो, उसे पूरा काट दिया जाता है। + +## नतीजा + +कैनवस पर डैश वाली लाइन सीधे कट की सॉलिड रूपरेखा की जगह ले लेती है — टूलपाथ का हर गैप तैयार पार्ट में +भी गैप ही होता है। + +![एक आयत और एक वृत्त को प्लाईवुड की चादर में डैश वाली लाइनों की तरह काटा गया](/screenshots/operations-perforation.webp) ## सुझाव -- ऐसी मोड़ की लाइन के लिए जो आर-पार न कटे, कट लंबाई जितनी स्किप लंबाई से शुरू करें और पावर कम करें। -- बहुत छोटी लंबाइयाँ (मिलीमीटर के कुछ दसवें हिस्से) लेज़र को तेज़ी से चालू-बंद करती हैं, जिससे - प्रभावी पावर घटती है। -- परफोरेशन [होल्डिंग टैब](holding-tabs), [लीड-इन/आउट](lead-in-out) और [मल्टी-पास](multi-pass) के साथ - काम करता है। +जिस मोड़ की लाइन को आर-पार नहीं काटना है, उसके लिए कट लंबाई जितनी स्किप लंबाई से शुरू करें और पावर +कम करें — उथली नाली गहरे डैश वाले कट जितनी ही अच्छी मुड़ती है, और पिछला हिस्सा साफ रहता है। + +बहुत छोटी लंबाइयाँ (मिलीमीटर के कुछ दसवें हिस्से) लेज़र को तेज़ी से चालू-बंद करवाती हैं, जिससे +प्रभावी पावर घटती है और असमान निशान पड़ सकते हैं। पैटर्न असमान लगे तो लंबी वैल्यू आज़माएँ। + +परफोरेशन बाकी पोस्ट-प्रोसेसिंग के साथ अच्छी तरह चलती है: [होल्डिंग टैब](holding-tabs), +[लीड-इन / लीड-आउट](lead-in-out) और [मल्टी-पास](multi-pass) पहले की तरह ही काम करते रहते हैं। ## संबंधित पेज -- [कंटूर कटिंग](operations/contour) - वह कटिंग ऑपरेशन जो परफोरेशन का उपयोग करता है -- [होल्डिंग टैब](holding-tabs) - पार्टों को जोड़े रखने के लिए हाथ से लगाए गए गैप +- [कॉन्टूर कटिंग](operations/contour) — वह कटिंग ऑपरेशन जिससे यह पोस्ट-प्रोसेसर जुड़ा है +- [होल्डिंग टैब](holding-tabs) — पार्टों को जोड़े रखने के लिए हाथ से लगाए गए गैप diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md index 9a3d40046..3235e9eff 100644 --- a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,38 +6,62 @@ description: # Perfuração -O pós-processador **Perfuração** transforma um corte contínuo em um corte tracejado. O laser dispara -pelo **Comprimento de corte**, depois se desloca com o laser desligado pelo **Comprimento de -salto**, e repete isso ao longo de cada contorno da peça. +Nem todo corte serve para soltar uma peça do material. Algumas linhas existem para que o material +dobre sobre elas, se rasgue com limpeza ou mostre por onde a agulha vai passar. É para isso que +serve o pós-processador **Perfuração**: ele transforma um corte contínuo em um corte tracejado. Em +vez de manter o laser aceso do começo ao fim, ele dispara pelo **Comprimento de corte**, percorre o +**Comprimento de salto** com o laser desligado e repete esse ritmo ao longo de cada contorno da +peça. O que sobra é uma linha de cortes pequenos que mantém o material unido — até que você decida +dobrá-lo ou rasgá-lo. -## Quando usar +![As configurações da Perfuração na página de pós-processamento de uma etapa de Contorno](/screenshots/step-settings-contour-post-perforation.webp) -- Linhas de dobra em cartolina e papelão ondulado -- Linhas destacáveis (ingressos, cupons, embalagens) -- Furos de costura em couro -- Linhas tracejadas decorativas +## Alguns usos típicos -## Configurações +Sempre que uma linha deve enfraquecer o material sem cortá-lo por completo, vale a pena um corte +perfurado. Os casos clássicos: -A perfuração está disponível nas configurações de pós-processamento das operações de **Contorno**. -Ela vem desativada por padrão. +- **Linhas de dobra** em cartolina e papelão ondulado dobram com precisão sobre um corte tracejado — + caixas, cartões e designs pop-up, por exemplo. +- **Linhas destacáveis** abrem ingressos, cupons e embalagens sem tesoura. +- **Furos de costura** em couro marcam o caminho da agulha antes de costurar. +- **Contornos tracejados** são, por si só, um efeito decorativo — em madeira, papel e acrílico. -- **Comprimento de corte**: a distância em que o laser dispara antes de cada intervalo. -- **Comprimento de salto**: a distância percorrida com o laser desligado entre dois cortes. +## Ativar a perfuração -O padrão é medido ao longo de cada contorno da peça e recomeça no início de cada contorno, sempre -com um corte completo. Um contorno menor que um corte mais um salto é cortado inteiro. +A perfuração fica na página **Pós-processamento** das configurações de uma etapa de +[Contorno](operations/contour), junto aos demais pós-processadores. Ela vem desativada por padrão; +ao ligar o interruptor, aparecem dois valores: + +- O **Comprimento de corte** é a distância em que o laser permanece aceso antes de cada intervalo. +- O **Comprimento de salto** é a distância percorrida com o laser desligado entre dois cortes. + +O padrão recomeça no início de cada contorno, sempre com um corte completo, para que todas as linhas +tracejadas da peça comecem da mesma forma. Um contorno curto demais para um único corte e um salto é +simplesmente cortado inteiro. + +## O resultado + +Na área de desenho, a linha tracejada substitui o contorno de corte sólido: cada intervalo do +caminho será também um intervalo na peça pronta. + +![Um retângulo e um círculo cortados como linhas tracejadas em uma chapa de compensado](/screenshots/operations-perforation.webp) ## Dicas -- Para uma linha de dobra que não deve atravessar o material, comece com um comprimento de salto - parecido com o de corte e reduza a potência. -- Comprimentos muito curtos (alguns décimos de milímetro) fazem o laser ligar e desligar - rapidamente, o que reduz a potência efetiva. -- A perfuração funciona junto com [Abas de fixação](holding-tabs), [Entrada/Saída](lead-in-out) e - [Múltiplas passadas](multi-pass). +Para uma linha de dobra que não deve atravessar o material, comece com um comprimento de salto +parecido com o de corte e reduza a potência: um sulco raso dobra tão bem quanto um corte tracejado +profundo, e o verso fica limpo. + +Comprimentos muito curtos (alguns décimos de milímetro) fazem o laser ligar e desligar em sequência +rápida, o que reduz a potência efetiva e pode deixar marcas irregulares. Se o padrão aparecer +desigual, experimente valores maiores. + +A perfuração convive bem com o resto do pós-processamento: as [Abas de Fixação](holding-tabs), o +[Aproximação / Saída](lead-in-out) e a [Multi-Passagem](multi-pass) continuam funcionando como +sempre. ## Páginas relacionadas -- [Corte de contorno](operations/contour) - A operação de corte que usa a perfuração -- [Abas de fixação](holding-tabs) - Intervalos colocados à mão para manter as peças presas +- [Corte de Contorno](operations/contour) — a operação de corte à qual este pós-processador pertence +- [Abas de Fixação](holding-tabs) — intervalos colocados à mão para manter as peças presas diff --git a/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md index b6d24300e..e04c31a1a 100644 --- a/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/uk/docusaurus-plugin-content-docs/current/features/perforation.md @@ -6,38 +6,60 @@ description: # Перфорація -Постобробка **Перфорація** перетворює суцільний різ на пунктирний. Лазер ріже на **Довжині різу**, -потім рухається з вимкненим лазером на **Довжині пропуску** і повторює це вздовж кожного контуру -заготовки. +Не кожен різ має відділити деталь від матеріалу. Деякі лінії потрібні, щоб матеріал згинався вздовж +них, чисто відривався чи показував, куди піде голка. Для цього існує постобробка **Перфорація**: +вона перетворює суцільний різ на пунктирний. Замість того щоб тримати лазер увімкненим від початку +до кінця, він різе на **Довжині різу**, проходить **Довжину пропуску** з вимкненим лазером і +повторює цей ритм уздовж кожного контуру заготовки. У результаті лишається лінія з дрібних різів, +яка тримає матеріал докупи — доти, доки ви не захочете його зігнути чи відрвати. -## Коли використовувати +![Налаштування Перфорації на сторінці постобробки кроку Контур](/screenshots/step-settings-contour-post-perforation.webp) -- Лінії згину в картоні та гофрокартоні -- Відривні лінії (квитки, купони, упаковка) -- Отвори для шиття в шкірі -- Декоративні пунктирні лінії +## Типові застосування -## Налаштування +Скрізь, де лінія має послабити матеріал, не розрізаючи його, варто спробувати перфорований різ. +Класичні приклади: -Перфорація доступна в налаштуваннях постобробки операцій **Контур**. За замовчуванням вона вимкнена. +- **Лінії згину** в картоні та гофрокартоні згинаються рівно вздовж пунктирного різу — коробки, + листівки та pop-up дизайни. +- **Відривні лінії** дають змогу відкривати квитки, купони та упаковку без ножиць. +- **Отвори для шиття** в шкірі позначають шлях голки ще до шиття. +- **Пунктирні контури** самі собою є декоративним ефектом — на дереві, папері та акрилі. -- **Довжина різу**: відстань, на якій лазер ріже перед кожним проміжком. -- **Довжина пропуску**: відстань, яку лазер проходить вимкненим між двома різами. +## Увімкнення перфорації -Візерунок вимірюється вздовж кожного контуру заготовки й починається заново на початку кожного -контуру, завжди з повного різу. Контур, коротший за один різ плюс один пропуск, вирізається -повністю. +Перфорація живе на сторінці **Постобробка** в налаштуваннях кроку [Контур](operations/contour), +поруч з іншими постобробками. Типово вона вимкнена; щойно ви перемикаєте тумблер, з'являються два +значення: + +- **Довжина різу** — як далеко лазер лишається увімкненим перед кожним проміжком. +- **Довжина пропуску** — відстань, яку лазер проходить вимкненим між двома різами. + +Візерунок починається на початку кожного контуру з повного різу й поновлюється на кожному контурі, +тож усі пунктирні лінії заготовки починаються однаково. Контур, замалий навіть для одного різу й +одного пропуску, просто вирізається цілим. + +## Результат + +На полотні пунктирна лінія замінює суцільний контур різу — кожен проміжок у траєкторії буде +проміжком і в готовій деталі. + +![Прямокутник і коло, вирізані пунктирними лініями в аркуші фанери](/screenshots/operations-perforation.webp) ## Поради -- Для лінії згину, яка не повинна прорізати наскрізь, почніть із довжиною пропуску, приблизно рівною - довжині різу, і зменште потужність. -- Дуже малі довжини (кілька десятих міліметра) змушують лазер швидко вмикатися й вимикатися, що - зменшує ефективну потужність. -- Перфорація працює разом з [Утримуючими лапками](holding-tabs), [Входом/виходом](lead-in-out) і - [Багатопрохідним різанням](multi-pass). +Для лінії згину, яка не повинна прорізати наскрізь, почніть із довжиною пропуску, приблизно рівною +довжині різу, і зменште потужність — мілка канавка згинається так само добре, як глибокий пунктирний +різ, а виворіт лишається чистим. + +Дуже малі довжини (кілька десятих міліметра) змушують лазер швидко вмикатися й вимикатися, що +зменшує ефективну потужність і може лишати нерівні сліди. Якщо візерунок виглядає нерівномірно, +спробуйте більші значення. + +Перфорація добре поєднується з рештою постобробки: [Утримуючі лапки](holding-tabs), +[Вхід / Вихід](lead-in-out) і [Багатопрохідність](multi-pass) працюють як завжди. ## Пов'язані сторінки -- [Контурне різання](operations/contour) - Операція різання, що використовує перфорацію -- [Утримуючі лапки](holding-tabs) - Проміжки, розставлені вручну, щоб деталі не випадали +- [Контурне різання](operations/contour) — операція різання, до якої належить ця постобробка +- [Утримуючі лапки](holding-tabs) — проміжки, розставлені вручну, щоб деталі не випадали diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md index a67f3ad98..58e32fb8a 100644 --- a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/features/perforation.md @@ -4,31 +4,44 @@ description: "使用穿孔后处理器在 Rayforge 中切割虚线:为折线 # 穿孔 -**穿孔**后处理会把连续切割变成虚线切割。激光在**切割长度**内出光,然后在**跳过长度**内关闭激光移动,并沿工件的每条轮廓重复。 +并不是每条切割线都是为了把零件从材料上取下来。有些线的意义在于让材料沿着它折叠、干净地撕开,或预先标出缝针的走向。**穿孔**后处理正是为此而生:它把连续切割变成虚线切割。激光不再从头到尾一直出光,而是按**切割长度**出光,再关闭激光走过**跳过长度**,并沿工件的每条轮廓重复这一节奏。留下的是一串小切割,它们把材料连在一起——直到你想让它折或撕开的那一刻。 -## 何时使用 +![轮廓步骤后处理页面中的穿孔设置](/screenshots/step-settings-contour-post-perforation.webp) -- 卡纸和瓦楞纸板的折线 -- 撕线(门票、优惠券、包装) -- 皮革上的缝线孔 -- 装饰性虚线 +## 典型用途 -## 设置 +凡是需要削弱材料而又不把它切开的场合,都值得考虑穿孔切割。常见的例子: -穿孔位于**轮廓**操作的后处理设置中,默认关闭。 +- 卡纸和瓦楞纸板上的**折线**沿虚线切口干净利落地折叠——比如盒子、卡片和立体弹出设计。 +- **撕线**让门票、优惠券和包装不需要剪刀就能打开。 +- 皮革上的**缝线孔**在缝纫前标出针的走向。 +- **虚线轮廓**本身就是一种装饰效果,适合木材、纸张和亚克力。 -- **切割长度**:每个间隙前激光出光的距离。 +## 启用穿孔 + +穿孔位于[轮廓](operations/contour)步骤设置中的**后处理**页面,与其他后处理并列。它默认关闭;打开开关后会出现两个数值: + +- **切割长度**:每个间隙前激光持续出光的距离。 - **跳过长度**:两段切割之间关闭激光移动的距离。 -图案沿工件的每条轮廓测量,并在每条轮廓的起点重新开始,总是以一段完整的切割开始。短于一段切割加一段跳过的轮廓会被完整切割。 +图案从每条轮廓的起点的一段完整切割开始,并在每条轮廓上重新开始,因此工件上所有虚线都以同样的方式起头。短到连一段切割加一段跳跃都放不下的轮廓会被完整切下。 + +## 效果 + +在画布上,虚线取代了实线切割轮廓——刀具路径上的每个间隙就是成品零件上的每个间隙。 + +![矩形和圆形以虚线形式切入桦木胶合板](/screenshots/operations-perforation.webp) ## 提示 -- 对于不应切穿的折线,可以先让跳过长度与切割长度大致相同,并降低功率。 -- 非常短的长度(零点几毫米)会让激光快速开关,从而降低有效功率。 -- 穿孔可与[固定标签](holding-tabs)、[引入/引出](lead-in-out)和[多次切割](multi-pass)一起使用。 +对于不应切穿的折线,可以先让跳过长度与切割长度大致相同,并降低功率——浅浅的压痕和深深的虚线切口一样容易折,而且背面保持整洁。 + +非常短的长度(零点几毫米)会让激光快速开关,降低有效功率,还可能留下不均匀的痕迹。如果图案看起来不一致,试试更长的数值。 + +穿孔与后处理的其他功能配合良好:[固定标签](holding-tabs)、[引入 / 引出](lead-in-out)和 +[多次遍](multi-pass)都照常工作。 ## 相关页面 -- [轮廓切割](operations/contour) - 使用穿孔的切割操作 -- [固定标签](holding-tabs) - 手动放置以固定零件的间隙 +- [轮廓切割](operations/contour) — 本后处理所属的切割操作 +- [固定标签](holding-tabs) — 手动放置以固定零件的间隙