Skip to content

Cutting Tools: Banner Hems and Grommets marks a banner's hems and grommet holes - #7282

Merged
bflatastic merged 1 commit into
storytold:mainfrom
dotCooCoo:feat/banner-hems-grommets
Nov 13, 2026
Merged

bflatastic merged 1 commit into
storytold:mainfrom
dotCooCoo:feat/banner-hems-grommets

Conversation

@dotCooCoo

Copy link
Copy Markdown
Contributor

What and why

Adds Object › Plug-ins › Cutting Tools › Banner Hems and Grommets… (addon.cutting.banner), which marks where a printed banner is hemmed (hem) and where its grommets go (grommet). The ranges, defaults and rules are VectorCraft's own.

  • The banner is the bounds of the selected art, or each artboard when nothing is selected (allArtboards).
  • On each chosen side (top, right, bottom, left) the command draws a hem line hem inside the edge (72 pt, 1 in, by default; 0 leaves it out).
  • With grommets on, each chosen side gets grommet marks grommetInset inside the edge (36 pt by default): one at each end and the rest spread evenly, as few as keep them at most spacing apart (1728 pt, 24 in). A shared corner gets one grommet. Each mark is a circle (diameter, 27 pt) with a cross through its center.
  • The marks are stroked in swatch ([Registration] by default) with no fill, in one group named Banner Marks per banner, on top of the current layer (outside the outermost clip group while one is edited in isolation, as Weed Box and Lines does), selected, as one undo step.
  • The command refuses, with a message: every side off; no hem and no grommets; a hem or grommet inset that reaches the far edge when one of two opposite sides is chosen, or meets the opposite side's marks when both are; a grommet inset of more than half a chosen side's length; more than 100000 grommets; and bad params.
  • The dialog has Preview. Catalog rows are added in all 27 languages. The new Diameter rows also translate the Diameter field of the shape.flare command dialog, which had no rows.

Docs: docs/mcp.md (Cutting Tools add-on), docs/target-app-parity.md and ROADMAP.

How it was tested

Base 630ef6f549. Run on Linux:

  • cargo test -p vectorcraft-engine: 6992 passed, 3 ignored, in 21 test binaries, including the 11 tests in cmd::addons::cutting::banner::tests and command_sweep with banner rows added.
  • cargo test -p vectorcraft-ui-egui: 4519 passed, 2 ignored, in 7 test binaries, including banner_hems_and_grommets_previews_cancels_and_runs_on_ok (menu, dialog fields in English and German, Preview, Cancel, OK as one undo step).
  • cargo clippy -p vectorcraft-engine -p vectorcraft-ui-egui --all-targets -- -D warnings, cargo fmt --all -- --check and cargo xtask brands: clean.
  • The engine tests for the shared corner, the hem and grommet-inset limits, the spacing rounding and the clip-group placement were each shown failing with the check they cover removed.

Checklist

  • cargo xtask ci passes (fmt, clippy, tests, assets, brands, layers, wasm).
  • No panics in shipped code: no unwrap(), expect(), panic!, unreachable!, todo! or
    unimplemented! outside tests, and no unchecked indexing on data from files, parameters or
    messages. Errors are returned as Result and shown to the user
    (why and how).
  • Clean-room: nothing copied from Adobe products or GPL/AGPL code (AGENTS.md).
  • Every new asset has a row in ASSETS.md.

…mmet holes

Object › Plug-ins › Cutting Tools › Banner Hems and Grommets…
(`addon.cutting.banner`) marks where a printed banner is hemmed and where
its grommets go. The banner is the bounds of the selected art, or each
artboard when nothing is selected. On each chosen side the command adds a
hem line a set depth inside the edge (1 in by default) and grommet marks a
set inset inside it (0.5 in): one at each end of the side and the rest
spread evenly, as few as keep them at most a set spacing apart (24 in). A
corner that two chosen sides share gets one grommet. Each grommet mark is a
circle (27 pt by default) with a cross through its center. The marks are
stroked in a chosen swatch ([Registration] by default) with no fill, in one
group named Banner Marks per banner on top of the current layer, selected,
as one undo step. While a clip group is edited in isolation, the group goes
outside the outermost clip group, as Weed Box and Lines does.

The command refuses every side off, no hem and no grommets, and bad params
with a message. It also refuses a hem or inset that reaches the far edge of
the banner when one of two opposite sides is chosen, or that meets the marks
of the opposite side when both are chosen, an inset of more than half a
chosen side's length, and more than 100000 grommets. The dialog has Preview.

The grommets' distance from the edge is `grommetInset`, so the dialog shows
it as Grommet Inset with its own catalog rows. The new Diameter catalog
rows also translate the Diameter field of the `shape.flare` command dialog,
which had no rows.

Docs: docs/mcp.md (Cutting Tools add-on), docs/target-app-parity.md and
ROADMAP.
@coderabbitai

coderabbitai Bot commented Nov 13, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 5 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration

Commits

Reviewing files that changed from the base of the PR and between c9b2119 and 1eaf421.

Files ignored due to path filters: 27

  • crates/ui-egui/src/i18n/bg.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/bs.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ca.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/cs.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/da.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/de.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/el.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/es.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/fi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/fr.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/hi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/hu.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/id.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/it.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ja.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ka.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ko.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/nl.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/pl.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/pt-br.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ru.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/sv.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/tr.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/uk.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/vi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/zh-hans.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/zh-hant.tsv is excluded by !**/*.tsv
Files selected for processing: 12

  • ROADMAP.md
  • crates/engine/src/cmd/addons/cutting.rs
  • crates/engine/src/cmd/addons/cutting/banner.rs
  • crates/engine/src/cmd/addons/cutting/banner/tests.rs
  • crates/engine/src/cmd/addons/cutting/weed.rs
  • crates/engine/src/cmd/plugin_call/reviewed.rs
  • crates/engine/tests/command_sweep.rs
  • crates/ui-egui/src/addons/cutting.rs
  • crates/ui-egui/src/addons/cutting/tests.rs
  • crates/ui-egui/src/dialogs/command.rs
  • docs/mcp.md
  • docs/target-app-parity.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@bflatastic

Copy link
Copy Markdown
Member

Merged, thanks @dotCooCoo! It passed its CI checks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants