[ {"note": "Offset had one distance and one direction, so there was no way to offset both sides of a curve in one operation. The window gains a Direction row of icon buttons carrying One Side, Two Sides and Symmetric, in the words solid.extrude already uses. Symmetric applies one distance each way. Two Sides adds an independent Distance 2 the other way."}, {"start": "sketch.create"}, {"click": {"plane": "XY"}}, {"expect": {"sketching": true}}, {"start": "sketch.circle.center"}, {"click": {"sketch": [0, 0]}}, {"click": {"sketch": [10, 0]}}, {"key": "Escape"}, {"expect": {"sketch_curves": {"own": 1}, "errors": 0}}, {"note": "The window opens on One Side: Flip is offered, Distance 2 is not."}, {"start": "sketch.offset"}, {"click": {"sketch": [10, 0]}}, {"expect": {"dialog": "Offset", "shown_handles": ["dialog:Direction", "dialog:Distance", "dialog:Flip", "dialog:Chain"], "hidden_handles": ["dialog:Distance 2"]}}, {"note": "Symmetric offsets both sides, so Flip has no side left to swap and the row goes."}, {"click": {"handle": "dialog:Direction:Symmetric"}}, {"expect": {"dialog": "Offset", "shown_handles": ["dialog:Distance", "dialog:Chain"], "hidden_handles": ["dialog:Flip", "dialog:Distance 2"]}}, {"note": "A 10 mm circle offset symmetrically by a typed 3 mm becomes a 7 mm circle and a 13 mm one, both about the same centre."}, {"click": {"handle": "dialog:Distance"}}, {"key": "A", "cmd": true}, {"text": "3"}, {"key": "Enter"}, {"expect": {"dialog": null, "errors": 0, "sketch_curves": {"own": 3}}}, {"expect": {"query": {"command": "sketch.inspect", "path": ["curves", 1, "radius"], "value": 7}}}, {"expect": {"query": {"command": "sketch.inspect", "path": ["curves", 2, "radius"], "value": 13}}}, {"shot": "sketch_offset_symmetric_circle"}, {"start": "sketch.finish"}, {"note": "Two Sides asks for the second distance, and Flip comes back: it decides which side each distance lands on."}, {"start": "sketch.create"}, {"click": {"plane": "XZ"}}, {"start": "sketch.circle.center"}, {"click": {"sketch": [0, 0]}}, {"click": {"sketch": [10, 0]}}, {"key": "Escape"}, {"expect": {"sketch_curves": {"own": 1}, "errors": 0}}, {"start": "sketch.offset"}, {"click": {"sketch": [10, 0]}}, {"click": {"handle": "dialog:Direction:Two Sides"}}, {"expect": {"dialog": "Offset", "shown_handles": ["dialog:Distance", "dialog:Distance 2", "dialog:Flip", "dialog:Chain"]}}, {"note": "Distance 3 inward and Distance 2 of 5 outward on the same 10 mm circle: a 7 mm circle and a 15 mm one."}, {"click": {"handle": "dialog:Distance"}}, {"key": "A", "cmd": true}, {"text": "3"}, {"click": {"handle": "dialog:Distance 2"}}, {"key": "A", "cmd": true}, {"text": "5"}, {"key": "Enter"}, {"expect": {"dialog": null, "errors": 0, "sketch_curves": {"own": 3}}}, {"expect": {"query": {"command": "sketch.inspect", "path": ["curves", 1, "radius"], "value": 7}}}, {"expect": {"query": {"command": "sketch.inspect", "path": ["curves", 2, "radius"], "value": 15}}}, {"start": "sketch.finish"}, {"note": "A whole chain offsets both ways at once: one picked edge of a 40 by 30 rectangle, symmetric by 5, gives a 30 by 20 chain inside and a 50 by 40 chain outside, four curves each."}, {"start": "sketch.create"}, {"click": {"plane": "YZ"}}, {"start": "sketch.rectangle.two_point"}, {"click": {"sketch": [0, 0]}}, {"click": {"sketch": [40, 30]}}, {"key": "Escape"}, {"expect": {"sketch_curves": {"own": 4}, "errors": 0}}, {"start": "sketch.offset"}, {"click": {"sketch": [20, 0]}}, {"click": {"handle": "dialog:Direction:Symmetric"}}, {"click": {"handle": "dialog:Distance"}}, {"key": "A", "cmd": true}, {"text": "5"}, {"key": "Enter"}, {"expect": {"dialog": null, "errors": 0, "sketch_curves": {"own": 12}}}, {"shot": "sketch_offset_symmetric_chain"}, {"note": "Escape on a Two Sides window leaves the sketch exactly as it was."}, {"start": "sketch.offset"}, {"click": {"sketch": [20, 0]}}, {"click": {"handle": "dialog:Direction:Two Sides"}}, {"expect": {"dialog": "Offset"}}, {"key": "Escape"}, {"expect": {"dialog": null, "errors": 0, "sketch_curves": {"own": 12}}} ]