Design tab: sketch Offset takes the whole outline, not one segment

Offset worked on the single entity under the pointer. On an outline made
of many short entities (a text glyph, an imported shape) that is a
segment a few tenths of a millimetre long, and the starting distance was
a tenth of that: the ghost was too small to see, and a typed distance
moved one invisible segment. It read as "Offset does nothing, no
preview".

- The pick takes the chain the entity belongs to (connected_loop, same
  construction state), highlights all of it, and offsets it as one
  outline through offset_entities, which already joins and trims chains
  at their seams.
- The starting distance is a twentieth of the outline's size, so the
  preview is visible at once.
- The arrow reads its side off the ghost, since the engine may walk the
  picked entity backwards in the chain; it keeps pointing at the offset
  copy, flipped for a negative distance.
- A single entity still gets its Parallel/Concentric constraint. A chain's
  offset is placed as geometry, since its joined entities no longer map
  one to one onto the originals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QK4VgguuCAk2hZLWgcjJb9
This commit is contained in:
Claude
2026-09-30 08:34:33 +00:00
parent c664a24f4b
commit 4983796970
3 changed files with 57 additions and 8 deletions
+1 -1
View File
@@ -6283,7 +6283,7 @@ static wxString sketch_step_prompt(DesignSketchTool::Mode m, int step, int picks
: _L("Chamfer — drag the arrow, or click the number to type the setback · "
"Enter applies · Esc cancels");
case Mode::Offset:
return step == 0 ? _L("Offset — click the entity to offset")
return step == 0 ? _L("Offset — click a curve; its whole outline is offset")
: _L("Offset — drag the arrow to either side, or click the number to type "
"the distance · Enter applies · Esc cancels");
case Mode::Mirror: