mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-16 15:32:09 +00:00
G-code post-processing is now a step of the slicing-pipeline plugin rather than a separate capability type. One capability class can transform slices at the geometry seams AND edit the final G-code, behind a single picker/option. - Add SlicingPipelineStepPlugin::psGCodePostProcess (bound as orca.slicing.Step.psGCodePostProcess). Unlike the geometry steps it fires from the GUI export path in PostProcessor.cpp, not from Print::process(): ctx.print/ctx.object are None and the plugin edits the file at ctx.gcode_path in place. It may run more than once per slice (file export and/or upload) and its output is not shown in the preview. - Extend SlicingPipelineContext with gcode_path/host/output_name and a C++-only full_config; config_value() falls back to it when there is no live Print. - PostProcessor.cpp dispatches SlicingPipelinePluginCapability at psGCodePostProcess, driven by the existing slicing_pipeline_plugin option. - The exported G-code lives outside data_dir(), so the plugin audit sandbox would block the write; the trampoline's audit setup grants ctx.gcode_path's folder as a scoped allowed root, gated on a non-empty gcode_path so the geometry-step hooks gain no extra filesystem access. BREAKING CHANGE: the separate G-code post-processing capability type is removed. - orca.gcode.GCodePluginCapabilityBase and orca.PluginType.PostProcessing are gone; post-processing plugins migrate to orca.slicing.SlicingPipelineCapabilityBase + Step.psGCodePostProcess (and gain ctx.params / ctx.config_value()). - The post_process_plugin config option is removed; use slicing_pipeline_plugin. Presets carrying the old key degrade to the standard unknown-key warning. - Manifest type = "post-processing" now maps to Unknown (advisory only; the loader dispatches on the C++ get_type()). Also repairs two latent build breaks the branch carried: stale Step enum value usages in test_slicing_pipeline_hook.cpp and a reference to the removed ConfigOptionDef::PluginType::None in Tab::on_value_change (now is_plugin_backed()). Adds the orca_gcode_stamp sample plugin and a psGCodePostProcess binding test.
75 lines
3.0 KiB
Python
75 lines
3.0 KiB
Python
# /// script
|
|
# requires-python = ">=3.12"
|
|
#
|
|
# [tool.orcaslicer.plugin]
|
|
# name = "G-code Stamp"
|
|
# description = "Stamps a comment line into the exported G-code at the post-process step (demo)."
|
|
# author = "OrcaSlicer"
|
|
# version = "0.01"
|
|
# type = "slicing-pipeline"
|
|
#
|
|
# [tool.orcaslicer.plugin.settings]
|
|
# stamp_text = "processed by the OrcaSlicer G-code Stamp plugin"
|
|
# ///
|
|
"""G-code Stamp -- the post-processing half of the slicing-pipeline plugin.
|
|
|
|
Post-processing is now a step of the slicing pipeline: Step.psGCodePostProcess.
|
|
It fires from the G-code export path AFTER the classic post_process scripts, on the
|
|
exported G-code file -- NOT from Print::process(). So unlike the geometry steps
|
|
(posSlice, posPerimeters, ...) there is no live slicing graph here: ctx.print and
|
|
ctx.object are None. Instead the context carries ctx.gcode_path (the working G-code
|
|
file on disk, edited IN PLACE), ctx.host ("File", "OctoPrint", ...) and
|
|
ctx.output_name (the final file name). ctx.params and ctx.config_value() still work.
|
|
|
|
This sample inserts a single comment line near the top of the file. Because the same
|
|
capability class can also implement the geometry steps, one plugin can transform slices
|
|
AND stamp the final G-code; a geometry-only plugin just returns success here.
|
|
|
|
The step may fire more than once per slice (file export and/or upload each run it on a
|
|
separate working copy), and its output is not reflected in the G-code preview -- the
|
|
viewer maps the pre-post-process file.
|
|
"""
|
|
import orca
|
|
|
|
_DEFAULT_STAMP = "processed by the OrcaSlicer G-code Stamp plugin"
|
|
|
|
|
|
def _stamp_text(ctx):
|
|
try:
|
|
text = dict(ctx.params).get("stamp_text", _DEFAULT_STAMP)
|
|
except (AttributeError, TypeError):
|
|
text = _DEFAULT_STAMP
|
|
return str(text).replace("\n", " ").strip() or _DEFAULT_STAMP
|
|
|
|
|
|
class GCodeStamp(orca.slicing.SlicingPipelineCapabilityBase):
|
|
def get_name(self):
|
|
return "G-code Stamp"
|
|
|
|
def execute(self, ctx):
|
|
# Only act at the post-process seam; at every geometry step this is a no-op.
|
|
if ctx.step != orca.slicing.Step.psGCodePostProcess:
|
|
return orca.ExecutionResult.success()
|
|
if not ctx.gcode_path:
|
|
return orca.ExecutionResult.success("G-code Stamp: no gcode_path, nothing to do")
|
|
|
|
comment = "; " + _stamp_text(ctx) + " (host=" + (ctx.host or "?") + ")\n"
|
|
|
|
# Edit the exported G-code in place: keep the original first line first (some flavors
|
|
# expect a specific leading line), then insert the stamp right after it.
|
|
with open(ctx.gcode_path, "r", encoding="utf-8", errors="replace") as f:
|
|
lines = f.readlines()
|
|
insert_at = 1 if lines else 0
|
|
lines.insert(insert_at, comment)
|
|
with open(ctx.gcode_path, "w", encoding="utf-8") as f:
|
|
f.writelines(lines)
|
|
|
|
return orca.ExecutionResult.success(
|
|
"G-code Stamp: stamped '" + (ctx.output_name or ctx.gcode_path) + "'")
|
|
|
|
|
|
@orca.plugin
|
|
class GCodeStampPackage(orca.base):
|
|
def register_capabilities(self):
|
|
orca.register_capability(GCodeStamp)
|