Files
OrcaSlicer/AGENTS.md

6.1 KiB

CLAUDE.md

OrcaSlicer — open-source C++17 3D slicer. wxWidgets GUI, CMake build system.

Build Commands

# macOS
cmake --build build/arm64 --config RelWithDebInfo --target all --

# Linux
cmake --build build --config RelWithDebInfo --target all --

# Windows (replace %build_type% with Debug/Release/RelWithDebInfo)
cmake --build . --config %build_type% --target ALL_BUILD -- -m

Testing

Catch2 framework. Tests in tests/; see tests/AGENTS.md for where a new test belongs and the conventions to follow.

cd build && ctest --output-on-failure           # all tests
ctest --test-dir ./tests/libslic3r              # individual suite
ctest --test-dir ./tests/fff_print

Code Style

  • C++17, selective C++20. PascalCase classes, snake_case functions/variables
  • #pragma once for headers. Smart pointers and RAII preferred
  • Parallelization via TBB — be mindful of shared state

Key Entry Points

  • App startup: src/OrcaSlicer.cpp
  • Slicing pipeline: src/libslic3r/Print.cpp
  • All print/printer/material settings: src/libslic3r/PrintConfig.cpp
  • GUI: src/slic3r/GUI/
  • Core algorithms: src/libslic3r/ (GCode/, Fill/, Support/, Geometry/, Format/, Arachne/)
  • Printer profiles: resources/profiles/[manufacturer].json

Critical Constraints

  • Backward compatibility required for .3mf project files and printer profiles
  • Cross-platform — all changes must work on Windows, macOS, and Linux
  • Profile/format changes need version migration handling
  • Dependencies built separately in deps/build/, then linked to main app

Code review focus areas

  • Changes must not cause regressions in existing functionality, defaults, profiles, or project compatibility.
  • Features gated by options must not affect existing behavior when those options are disabled.
  • Changes should follow the existing code style and architecture. Architectural changes should be justified in code comments and the PR description.
  • Add helper functions or utilities only when existing code cannot reasonably be reused. Avoid duplication.
  • Keep code concise and clear. Manually simplify AI generated bloated codes before review.
  • Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
  • For translation changes (localization/i18n/**/*.po), check that recurring terms match the Localization glossary for that language.

Localization & translations

Catalogs live in localization/i18n/<lang>/OrcaSlicer_<lang>.po; the template is OrcaSlicer.pot. See the Localization guide for the human-facing version of these principles.

Terminology

  • Use the Localization glossary as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
  • If a term's established translation changes, update both the affected .po files and the glossary (localization_glossary.tsv, then regenerate) so they stay in sync.
  • Translate the meaning, not the words. Check what the string actually controls before translating it — English reuses one word for different things. Flow ratio (multiplier), Flow Rate (throughput) and Flow Dynamics (pressure compensation) are three different terms; extruder may mean the toolhead, the feeder motor, or the nozzle depending on the string.
  • Reuse one template per recurring message shape (Failed to connect to …, Are you sure you want to …?), even where the English wording varies.

Editing rules

  • Only edit msgstrnever change msgid, and never "fix" wrong English in the translation alone. Report the source string instead.
  • Preserve exactly: placeholders (%s, %d, %1%, %zu, %%), every \n (count and position, including leading/trailing), leading/trailing spaces, HTML tags, , and the file's encoding and line endings.
  • Never reorder positional arguments in a c-format string. If the msgid is %d then %s, that order must hold — swapping them breaks at runtime.
  • msgctxt separates homonyms — always read it. Back/Camera View is the rear view of the 3D navigator, while Back/Navigation is the go-back button; Top exists in the Alignment, Layers and Camera View senses.
  • When a string needs disambiguating, add context in the source (_L_CONTEXT/_u8L_CONTEXT), don't work around it in the translation.
  • A literal % inside a string xgettext flagged possible-c-format will fail msgfmt. Fix it with a // xgettext:no-c-format, no-boost-format comment above the string in the source — do not mangle the translation or use %% in text that is never passed through printf.
  • Plural entries: read nplurals from the catalog's Plural-Forms header (it is not always 2 — ja/ko/zh/th/vi use 1, ru/cs/pl/lt use 3, uk uses 4). Each form must be genuinely inflected for its quantity; repeating one sentence across all forms is a bug in Slavic/Baltic languages, though it is correct for Turkish and Hungarian.
  • An entry whose msgstr equals its msgid is untranslated even though it is not empty; a plural entry with any empty form is likewise incomplete.
  • Mark machine-produced translations with an # AI Translated translator comment. Don't add it to a human translation you didn't actually rewrite.
  • Don't reflow or re-wrap unrelated entries — keep the diff limited to the strings you changed.

Verifying

  • scripts/run_gettext.bat --full (Windows) regenerates the template, merges every catalog and compiles the .mo files. It must exit 0.
  • Or check a single catalog with msgfmt --check-format -o <out>.mo localization/i18n/<lang>/OrcaSlicer_<lang>.po.
  • Fuzzy entries are not shown to users. If you correct one, clear its fuzzy flag, otherwise the fix never ships.