mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-10 09:59:47 -06:00
Merge main into feat/native-save-precision
EPS saves, new on main, name `precision` in their warnings as SVG, PDF and .ai saves do.
This commit is contained in:
+174
-38
@@ -416,7 +416,7 @@ objects' fills or strokes differ (`fillMixed` / `strokeMixed`, drawn as a "?" pr
|
||||
| `draw_path` | `{points \| d, closed?, fill?, stroke?, strokeWidth?, dash?, cap?, join?, opacity?, name?, effects?}` | `points` is `[[x,y],…]` or `[{x,y,in?,out?,smooth?},…]`. `d` is SVG path data. The options are below. |
|
||||
| `draw_shape` | `{shape, …geometry, fill?, stroke?, strokeWidth?, dash?, cap?, join?, opacity?, name?, effects?}` | `rectangle`/`ellipse`: `x,y,width,height` (plus `radius` for corners). `polygon`: `cx,cy,radius,sides`. `star`: `cx,cy,radius1,radius2,points`. `line`: `x1,y1,x2,y2`. |
|
||||
| `set_paint` | `{fill?, stroke?, strokeWidth?, ids?}` | Applies to the selection (or `ids`) and becomes the default for new art. Returns `{applied, objects}`: `objects` is the number of objects painted, as the `objects` of the `paint.setFill`, `paint.setStroke` and `stroke.set` replies (the largest of them): a selected group counts the objects inside it. When it is 0, a `note` says that only the paint for new art changed. |
|
||||
| `press_key` | `{key, mods?}` | Remote: a real key event. Headless: runs the command or tool bound to that shortcut, or sends the key to the busy tool (digits too: `5` while dragging with the Perspective Selection tool; `e` while dragging a Selection or Group Selection marquee). |
|
||||
| `press_key` | `{key, mods?}` | Remote: a real key event. Headless: runs the command or tool bound to that shortcut, or sends the key to the busy tool (digits too: `5` while dragging with the Perspective Selection tool; `e` while dragging a Selection or Group Selection marquee; `c` and `f` while dragging out an arc). |
|
||||
| `type_text` | `{text}` | Remote only. |
|
||||
| `answer_dialog` | `{set?: [{field, value?}], action?}` | Remote only. Sets fields of the app's open dialog in the order given with one `ui.dialog.set {fields}` (a missing `value` is `null`). The app stores all of them or none. When the app refuses the `ui.dialog.set`, for example because no dialog is open, the call is an error and `action` is not sent. Then `action` `confirm` (OK, `ui.dialog.confirm`) or `cancel` (`ui.dialog.cancel`). Give `set`, `action` or both; `set` holds at most 256 fields. `inspect_ui` shows the open dialog and its fields as `ui.dialog`. Returns `{dialog, result}`: the dialog after the fields were set (or `null`) and the reply to `confirm` or `cancel` (or `null`). After `invoke_menu` `app.quit`, `file.close` or `file.closeAll` replies `{"pending": "saveChanges"}`, `{action: "confirm"}` saves, `{set: [{field: "discard", value: true}], action: "confirm"}` closes without saving and `{action: "cancel"}` cancels the close or quit. |
|
||||
| `invoke_menu` | `{command, params?}` | Invokes a menu item by command id. Includes UI commands such as `view.*` and `window.*` in remote mode. |
|
||||
@@ -431,7 +431,7 @@ objects' fills or strokes differ (`fillMixed` / `strokeMixed`, drawn as a "?" pr
|
||||
| `transform` | `{ids?, dx?, dy?, rotate?, scale?, scaleX?, scaleY?, reflect?, shear?, origin?, copy?}` | Runs move, rotate, scale, reflect, shear in that order. With `copy`, the first step duplicates. |
|
||||
| `create_graph` | `{type?, x, y, width, height, csv? \| series?, categories?, rows?}` | The nine Illustrator graph types: column, stacked column, bar, stacked bar, line, area, scatter, pie and radar. An empty CSV cell or a `null` in `rows` is a blank value; a number in straight quotes is a label. Edit later with `graph.setData` / `graph.setType` via `run_command`. `graph.column {design, columnType: vertical\|uniform\|repeating\|sliding, each, fractions: chop\|scale}` draws the columns or bars of the series picked with Group Selection (or `seriesIndexes`, or all of them) with a graph design saved by `graph.design`; with no `design` it returns the series' current design and options. Type in the design that holds a `%` followed by two digits shows each column's value, with at least the first digit's places before the decimal point and the second digit's places after it. |
|
||||
| `text_wrap` | `{ids?, offset?, invert?, release?}` | Area type below the objects (same layer) flows around them. |
|
||||
| `undo` / `redo` | `{}` | Many calls that change nothing record no undo step, for example `object.align` with nothing to move, `object.move` by 0 without `copy` and `object.showAll` with nothing hidden. `undo` (`edit.undo`) after such a call undoes the step before it. `inspect_document` lists the undo steps as `history`. `run_command` with `edit.clearHistory` removes every undo and redo step of the active document and returns `{cleared}`, the number of steps removed; the document stays as it is, and the command records no undo step. |
|
||||
| `undo` / `redo` | `{}` | Many calls that change nothing record no undo step, for example `object.align` with nothing to move, `object.move` by 0 without `copy` and `object.showAll` with nothing hidden. `undo` (`edit.undo`) after such a call undoes the step before it. `inspect_document` lists the undo steps as `history`. `run_command` with `edit.clearHistory` removes every undo and redo step of the active document and returns `{cleared}`, the number of steps removed; the document stays as it is, and the command records no undo step. While the Type tool edits type, `undo` and `redo` put its caret, with no characters selected, at the end of the text the step changed: after the text it puts back or retypes, or where the text it takes out was. A step that changes no characters, such as a formatting change, leaves the caret and the selection where they are. |
|
||||
|
||||
For example, create editable Japanese area type with the engine's vertical writing mode:
|
||||
|
||||
@@ -470,8 +470,19 @@ mode. To press the key during a drag, end one
|
||||
{"name":"pointer_gesture","arguments":{"tool":"selection","events":[{"kind":"drag","x":230,"y":170},{"kind":"up","x":230,"y":170}]}}
|
||||
```
|
||||
|
||||
`press_key {key: "Escape"}` between two `pointer_gesture` calls of a Selection tool drag (a move or an Alt-drag copy, a
|
||||
bounding-box scale or rotation, a marquee, a corner widget, pie widget or bracket drag) cancels it: the art goes back,
|
||||
no copy is left, no undo step is added, and the `up` event that follows does nothing.
|
||||
|
||||
With nothing being dragged, `e` chooses the tool bound to E.
|
||||
|
||||
While an arc is being dragged out with the Arc tool, `press_key {key: "c"}` switches it between an open and a closed
|
||||
path, `{key: "f"}` switches its base between the X and Y axes in the same box, and `{key: "up"}` and `{key: "down"}`
|
||||
raise and lower its slope by 10, within −100…100. Each press switches once. The arc drawn on release uses these
|
||||
values, and they stay as the Arc tool's `closed`, `baseAlong` and `slope` options for the next arc. With nothing being
|
||||
dragged, `c` chooses the tool bound to C, and `f` runs the shortcut bound to F in remote mode (headless has no
|
||||
binding for it).
|
||||
|
||||
Appearance stacks: an object can carry several fills and strokes (`appearance.addFill`, `appearance.addStroke`), indexed
|
||||
in paint order (0 is painted first, the bottom row of the Appearance panel). Cmd+/ runs `appearance.addFill` and
|
||||
Cmd+Alt+/ runs `appearance.addStroke` (`press_key {key: "/", mods: {cmd: true, alt: true}}`). `paint.setFill`, `paint.setStroke`,
|
||||
@@ -493,7 +504,8 @@ Errors (unknown tool, bad arguments, a disabled or failing command) come back as
|
||||
|
||||
Swatches go through `run_command`: `swatch.list` lists every swatch with its colour group, kind and colour;
|
||||
`swatch.edit {name, newName?, color?, mode?, global?, spot?}` edits one (fills, strokes and text linked to a
|
||||
global or spot swatch follow its colour and name, as one undo step); `swatch.delete {names, unlink?}` deletes
|
||||
global or spot swatch follow its colour and name, as one undo step, in the art, opacity masks, symbols, graph
|
||||
designs, pattern tiles, graphic styles and the art of brushes); `swatch.delete {names, unlink?}` deletes
|
||||
swatches and colour groups in one undo step (art using a deleted global swatch keeps its colour, unlinked).
|
||||
`swatch.new {color?, mode?, spot?, global?, group?}` saves a colour (into a colour group with `group`), gradient
|
||||
or pattern; `swatch.newGroup {fromArtwork: true, toGlobal?, includeTints?}` makes a colour group of the selected
|
||||
@@ -578,12 +590,16 @@ come back without a path), `file.newFromTemplate {path}`, `file.revert` and `fil
|
||||
with the values a save would use). Without a path the save commands return `{dataBase64, name, folder?, warnings}`. A document saved as SVG or PDF
|
||||
remembers its options, so the next save reuses them. A PDF opened with `pages`, `cropTo` or `password` is only part
|
||||
of the file, so Save asks for a new name instead of writing it back.
|
||||
`file.documentColorMode {mode, convert?, intent?, grays?}` switches the document colour mode, converting the colours of
|
||||
the art, symbols, pattern tiles and swatches through the colour settings (`object.convertDocumentColorMode` is an
|
||||
alias kept for older scripts). Gray colours stay Gray and print on the black plate only. RGB greys are colours like any
|
||||
`file.documentColorMode {mode, convert?, intent?, grays?}` switches the document color mode, converting the colors of
|
||||
the art (opacity masks included), symbols, graph designs, pattern tiles (with the tile that pattern editing's Cancel
|
||||
puts back), graphic styles, brushes (their art and a Hue Shift key color) and swatches through the color settings, in
|
||||
one undo step (`object.convertDocumentColorMode` is an alias kept for older scripts). Gray colors stay Gray and print
|
||||
on the black plate only. RGB grays are colors like any
|
||||
other: to CMYK they separate through the profile into four-colour greys and a rich black, as Illustrator converts
|
||||
them. `grays: "black"` puts RGB greys with R = G = B on the black plate instead, K = their grey value (the inks Edit Colors ›
|
||||
Convert to Grayscale before the switch would give); other colours convert as usual.
|
||||
Convert to Grayscale before the switch would give); other colors convert as usual. The reply's `changed` counts the
|
||||
colors that changed in the art, symbols, graph designs and pattern tiles; it does not count the colors of graphic
|
||||
styles and brushes.
|
||||
|
||||
SVG import keeps what the canvas edits live. `<pattern>` becomes a pattern swatch. A `<symbol>` with `<use>` becomes a
|
||||
symbol (named after its `data-name`, else its id) with an instance per `<use>`; a `<use>` that shows it differently
|
||||
@@ -643,9 +659,13 @@ SVG writes one file per artboard of a `range`); `useArtboards: false` exports th
|
||||
its effects paint, the effects of groups, type and images included. `artboard.fitToArt` measures the art the same
|
||||
way.
|
||||
|
||||
Raster exports take more options in `options`: `ppi` (72, 150, 300…; stored in the file), `background`
|
||||
(`transparent`, `white`, `black` or `"#rrggbb"`), `antiAlias` (`none`, `art`, `type`: text snapped to pixels) and,
|
||||
for PNG, `interlaced`.
|
||||
Raster exports take more options in `options`: `ppi` (72, 150, 300…; stored in the file, except in GIF, WebP and
|
||||
Targa), `background` (`transparent`, `white`, `black` or `"#rrggbb"`), `antiAlias` (`none`, `art`, `type`: text
|
||||
snapped to pixels) and, for PNG, `interlaced`. `width` or `height` sets the size of each file in pixels: each artboard
|
||||
(with `useArtboards`, each file), `rect` or art bounds gets the scale that makes it that wide or high, within 0.01–64
|
||||
pixels per point, and the file stores the resolution that results, as with `ppi`. `width` wins over `height`, and
|
||||
either one wins over `ppi` and `scale`. A value that is not a positive number is refused. Export for Screens rows keep
|
||||
their own size (`scale: "512w"`).
|
||||
|
||||
Long-tail commands:
|
||||
|
||||
@@ -1088,7 +1108,7 @@ The transform, Align, Object Properties and Live Shape Properties commands refus
|
||||
that is not true or false with `` `strokes` must be true or false ``, naming the key, and leave the document and its
|
||||
undo history as they were: the options `copy`, `strokes`, `corners`, `patterns`, `objects` and `typeAreas` in
|
||||
`object.transform`, `object.move`, `object.nudge`, `object.rotate`, `object.scale`, `object.reflect`, `object.shear`,
|
||||
`object.transformAgain` and `object.setBounds`; `anchors` in `object.transform`; `big` in `object.nudge`;
|
||||
`object.transformAgain` and `object.setBounds`; `anchors` and `releaseOutside` in `object.transform`; `big` in `object.nudge`;
|
||||
`absolute` in `object.rotate`; `proportional` in `object.setBounds`; `patterns` in `object.align`, `object.distribute`
|
||||
and `object.distributeSpacing`; `visible`, `locked`, `isolate` and `knockoutShape` in `object.setProps`; and
|
||||
`invertPie`, `makeSidesEqual` and `relativeRadii` in `object.setLiveShape`. A null is read as a key left out.
|
||||
@@ -1133,7 +1153,8 @@ and `radial` in `shape.polarGrid`; `size` and the `width`, `height` and `fitMinP
|
||||
`end` in `type.step`; `by` in `type.size.increase` and `type.size.decrease`; `size` in `type.ruby`; `width`, `height`
|
||||
and `fitMinPercent` in `text.areaOptions`; `x` and `y` in `symbol.place`; `radius`, `density` and `scale` in
|
||||
`symbol.spray`; `radius` and `intensity` in `symbol.adjust`; `to` in `swatch.move`; `weight` and `opacity` in
|
||||
`appearance.setItem`; `angle` in `paint.editGradient` and in the `gradient` of a command that takes a paint; `t` in
|
||||
`appearance.setItem`; `r`, `g`, `b`, `c`, `m`, `y`, `k`, `gray` and `tint` in `edit.colors.adjustBalance`; `steps`
|
||||
and `amount` in `color.harmony`; `angle` in `paint.editGradient` and in the `gradient` of a command that takes a paint; `t` in
|
||||
`paint.freeform.splitLine`; `tolerance` and `gap` in `shapeBuilder.merge`; `gap` in `shapeBuilder.regions`; and
|
||||
`width` and `tolerance` in `livePaint.strokeEdge`. A null is read as a key left out. A gradient stop that names a
|
||||
swatch refuses a `tint` that is not a number with `` stop 0: `tint` must be a number ``.
|
||||
@@ -1250,6 +1271,12 @@ then composite against the art below it). SVG has no non-isolated groups, so the
|
||||
mask is edited; called again it shows the artwork, still editing. It is view state of the open document: the canvas
|
||||
(and `ui.screenshot`) shows it, exports never do, and it ends when mask editing ends.
|
||||
|
||||
Isolation mode and mask editing exclude each other. In isolation mode `transparency.editOpacityMask` and
|
||||
`transparency.viewOpacityMask` are off, and `transparency.makeOpacityMask` refuses one target, an object or a layer,
|
||||
which it would take into mask editing; a call returns an error that ends "exit isolation mode first". While a mask is edited,
|
||||
`object.isolate` and `perspective.editText` are off, and a call returns an error that ends "stop editing the opacity
|
||||
mask first". Pattern editing mode does not count as isolation mode here.
|
||||
|
||||
`view.transparencyGrid {on?}` (View → Show Transparency Grid; default: toggle) is view state of each open document,
|
||||
like the mask view: the grid shows behind the artboards of the documents that turn it on, on the canvas and in
|
||||
`ui.screenshot`, never in exports. It returns `{on}`, isn't undoable and doesn't mark the document changed.
|
||||
@@ -1333,11 +1360,27 @@ that were already hidden or locked. The key object is cleared when it is one of
|
||||
them again with the key object. When the call changes nothing, it records no undo step and still deselects them.
|
||||
Other `object.setProps` calls leave the selection unchanged.
|
||||
|
||||
`object.unlockAll` and `object.showAll` unlock or show every locked or hidden object in the document and select
|
||||
them → `{count}`. With `scope: "group"` they take only the objects inside the groups that hold the selected objects:
|
||||
for each selected object, the group nearest above it, or the object itself when it is a group. The objects of a
|
||||
group inside another such group are counted once. With no selected object in a group, the call returns the error
|
||||
"nothing selected is in a group" and changes nothing. `scope: "document"` is the default, and any other value is
|
||||
refused. Object › Unlock All and Object › Show All clicked in the in-window menu bar with Shift+Alt (Shift+Option)
|
||||
held run with `scope: "group"`.
|
||||
|
||||
`layer.move`, `node.move`, `layer.merge`, `layer.flatten`, `layer.collectInNew`, `dataset.select`, `dataset.next`
|
||||
and `dataset.prev` also deselect every selected object that is hidden or locked after the call, such as objects
|
||||
moved into a hidden or locked layer or group, or objects that a data set hides. The key object is cleared when it
|
||||
is one of them, and `edit.undo` selects them again with the key object.
|
||||
|
||||
`object.hide.unselected` (Object › Hide › Unselected Artwork, Cmd+Alt+Shift+3) hides, in one undo step, every
|
||||
object that `select.all` takes and that is neither selected nor holds a selected object, and returns `{count}`. In a
|
||||
group that holds a selected object it hides the group's other members one by one; a clip group, a compound path or
|
||||
another object that holds a selected object stays as it is with its members. While Lock Guides is on it leaves the
|
||||
guide paths as they are. The selection stays as it is, and `object.showAll` shows the objects again. With nothing to
|
||||
hide it records no undo step. In isolation mode the menu item is disabled, and the command returns the error "exit
|
||||
isolation mode first" and changes nothing.
|
||||
|
||||
These Select menu commands select only the objects that `select.all` selects and the objects inside them: every
|
||||
`select.same.*` and `select.object.*` command except `select.object.slices`, `select.nextAbove`, `select.nextBelow`
|
||||
and `select.recall`. They leave out hidden and locked objects with the objects inside them, the objects on hidden,
|
||||
@@ -1350,6 +1393,19 @@ everything in it, and `select.all`, `select.allOnArtboard` and `select.inverse`
|
||||
among the objects beside it in its group or layer, passing over hidden and locked objects and sublayers. When there
|
||||
is no such object, the selection stays as it is.
|
||||
|
||||
## Shaper Groups
|
||||
|
||||
`shaper.releaseSource {source, group?}` takes the original shape `source` out of its Shaper Group: the shape becomes a
|
||||
path just above the group with its own fill and stroke, and is selected. The group's result is computed again from the
|
||||
original shapes left, and a group left with none is removed. When `group` is given, it must be the Shaper Group that
|
||||
holds `source`. A source that is not an original shape of an editable Shaper Group is an error, and the document and its
|
||||
undo history stay as they were. The command returns `{id}`, the shape's id, and records one undo step, Remove from Shaper
|
||||
Group. Construction mode ends when the group was in it.
|
||||
|
||||
`object.transform` with `releaseOutside: true` does the same for each moved original shape whose bounds end wholly
|
||||
outside the bounds the group's original shapes had before the move, in the move's undo step. A shape whose bounds still
|
||||
overlap them only moves. The Selection tool sends it at the end of a move in Construction mode.
|
||||
|
||||
## Global Edit
|
||||
|
||||
Select › Start Global Edit is `select.globalEdit {appearance?, size?, artboards?, includeCanvas?}`. With one path,
|
||||
@@ -1476,7 +1532,11 @@ already walks Image Trace. Short agent entry points:
|
||||
`brush.new` refuses a longer one, counting the number it adds to a taken name, and `brush.options` refuses a
|
||||
longer `newName`. `brush.duplicate` does not check the length. A bristle brush that already has a longer name
|
||||
keeps it, and `brush.options` without a new name, or with a `newName` that only trims the white space around the
|
||||
name, does not refuse. Other brush types take a name of any length.
|
||||
name, does not refuse. Other brush types take a name of any length. A pattern brush's `outer_source` and `inner_source` set
|
||||
what that kind of corner draws when the brush has no `outer_corner` or `inner_corner` art for it: `none` draws no
|
||||
corner tile, and `autoCentered`, `autoBetween`, `autoSliced` and `autoOverlap` make one from the side tile. Without
|
||||
a source, the corner draws the other kind of corner's art. `brush.options {params: {outer_corner: null}}` removes
|
||||
the art.
|
||||
- Variables: `variable.list`, `variable.define {name, kind: text|visibility|image|graph}`, `variable.bind {variable, ids?}`,
|
||||
`variable.makeTextDynamic`, `variable.makeVisibilityDynamic`, `variable.makeImageDynamic`, `variable.makeGraphDynamic`,
|
||||
`variable.unbind`, `variable.rename`, `variable.delete`, `variable.highlight` (image values are file paths, graph
|
||||
@@ -1540,7 +1600,14 @@ already walks Image Trace. Short agent entry points:
|
||||
highlight color, `#rrggbb` or a layer color's name; `#ff2a2a`) and `width` (the highlight's width, 1 to 20 screen
|
||||
pixels; 4). With `selectStrokes` off, Alt-click selects the face under the pointer as a click does; with
|
||||
`selectFills` off, a click selects the edge nearest the pointer as Alt-click does; with both off, a click selects
|
||||
no face or edge.
|
||||
no face or edge. A drag of 3 screen pixels or more draws a marquee, and the release runs `select.set {ids}` with
|
||||
the faces and edges it touches (a face or edge partly inside counts, and so does a face that holds the whole
|
||||
marquee), or `select.none` when it touches none. With Shift held at the press, the release runs
|
||||
`select.toggle {ids}` with the faces and edges it touches, each of which leaves the selection or joins it, and runs
|
||||
nothing when it touches none. `selectFills` off leaves the faces out, and `selectStrokes` off leaves the edges out. A click and a marquee run their command on the
|
||||
release, and Escape between the press and the release removes the marquee so that the release runs nothing. The
|
||||
tool does not highlight or select the faces and edges of a Live Paint group that is locked, on a locked layer or on
|
||||
a locked artboard, or in isolation mode outside the isolated art.
|
||||
`livePaint.merge` keeps the bottom Live Paint group's id, name, lock, visibility, transparency, appearance, opacity
|
||||
mask and graphic style link. With a Live Paint group among the objects, `livePaint.make` adds the others to it as
|
||||
`livePaint.merge` does, and so does `livePaint.fill {ids}` when `point` is outside that group's faces.
|
||||
@@ -1720,7 +1787,9 @@ the scope and what differs from the public documentation.
|
||||
fills, strokes, text, gradient stops, gradient-mesh points, embedded images (a recoloured copy of the image; linked
|
||||
images are left alone) and the tiles of pattern fills and strokes (a recoloured copy saved as a new pattern swatch,
|
||||
e.g. "Dots 2"; the original pattern is untouched). `includeImages: false` / `includePatterns: false` leave images or
|
||||
patterns out. The Blend commands also grade gradient meshes, which keep their shading.
|
||||
patterns out. The Blend commands also grade gradient meshes, which keep their shading. `edit.colors.saturate` needs
|
||||
`intensity`, a number from -100 to 100 (a number outside the range counts as its nearest end). Without one, or with a
|
||||
value that is not a number, it answers `` missing number `intensity` `` and changes nothing.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"recolor.colors","params":{}}}
|
||||
@@ -2111,7 +2180,8 @@ and `layerRows`, the rows highlighted in the panel.
|
||||
set|add|toggle}` is Shift-click (a range) and Ctrl/Cmd-click (toggle). Selecting art makes its layer current.
|
||||
Without `ids`, the panel commands below act on the highlighted rows, else on the current layer.
|
||||
- **Selection column**: `layer.selectAll {id, add?}` selects a row's visible, unlocked art (a layer's sublayers'
|
||||
too); `add` (Shift) adds it, or removes it when it's all selected.
|
||||
too); `add` (Shift) adds it, or removes it when it's all selected. Alt-click on a layer's or sublayer's name runs
|
||||
`layer.selectAll {id}` and then `layer.setCurrent {id}`.
|
||||
- **Eye and lock**: `layer.setProps {ids?, visible?, locked?, name?}` for any rows, plus Layer Options for layers:
|
||||
`template` (also locks the layer and dims its images to 50% unless given), `printable`, `preview` (off: the layer
|
||||
draws and is clicked in outline, Ctrl/Cmd-click its eye), `dimImages` (0–100, or false) and `color` (an index 0–26,
|
||||
@@ -2122,10 +2192,12 @@ and `layerRows`, the rows highlighted in the panel.
|
||||
inside it); a row never goes into itself or a row inside it, and a locked layer or group takes nothing. Dragging the
|
||||
selected-art square is `layer.move` with the selected objects. `node.move {id, parent?, index}` is the low-level
|
||||
form with the same nesting rules; unlike `layer.move`, it also moves a row into a locked layer or group.
|
||||
- **Buttons**: `layer.new {name?, top?, …options}` (above the current layer at its level; `top` with Ctrl/Cmd),
|
||||
`layer.newSublayer {parent?, name?, …options}` (on top of the parent's contents), `layer.delete {ids?}` (rows with
|
||||
what they hold; the last layer stays), `layer.locate {id?}` (highlights the selected object's row; the panel opens
|
||||
the rows around it) and `layer.clippingMask.toggle`.
|
||||
- **Buttons**: `layer.new {name?, top?, below?, …options}` (above the current layer at its level; `top` with
|
||||
Ctrl/Cmd; `below`, directly below the current layer at its level, with Ctrl/Cmd+Alt),
|
||||
`layer.newSublayer {parent?, bottom?, name?, …options}` (on top of the parent's contents; `bottom`, under them but
|
||||
above a clipping layer's clipping path, with Ctrl/Cmd+Alt), `layer.delete {ids?}` (rows with what they hold; the
|
||||
last layer stays), `layer.locate {id?}` (highlights the selected object's row; the panel opens the rows around it)
|
||||
and `layer.clippingMask.toggle`.
|
||||
- **Panel menu**: `layer.duplicate {ids?}`, `layer.merge {ids?}` (into the layer highlighted last, keeping the
|
||||
stacking order), `layer.flatten {id?}` (every other visible layer's art into one layer; hidden layers are deleted,
|
||||
templates stay), `layer.collectInNew {ids?}`, `layer.releaseToLayers {id?, build?}` and
|
||||
@@ -2148,6 +2220,11 @@ and `layerRows`, the rows highlighted in the panel.
|
||||
opens no rows for it and scrolls as with the option off. A change made with the panel's own rows, buttons or menu is
|
||||
not located, and a change made during a drag is located when the drag ends.
|
||||
A document opens with only its top-level layers open; the open rows are saved in the native file and reopen that way.
|
||||
- **Lock and Hide in isolation mode**: in isolation mode, Object › Lock's and Object › Hide's items (`object.lock`,
|
||||
`object.lock.above`, `object.lock.otherLayers`, `object.hide`, `object.hide.above`, `object.hide.otherLayers`),
|
||||
`object.unlockAll` and `object.showAll` are off, and a call returns the error "command `object.hide` is not
|
||||
available right now: exit isolation mode first", with the command's own id. Pattern editing mode and opacity mask
|
||||
editing do not count as isolation mode for these commands.
|
||||
- **Search and filter** (control channel and the app's MCP): the Search All field keeps the rows whose names hold the
|
||||
text typed, and `ui.layersFilter {objects?, layers?}` sets the choices of the Filter button beside it. `objects` (By
|
||||
Object) takes `paths` (paths and compound paths), `shapes` (live rectangles, ellipses, polygons and lines), `text`,
|
||||
@@ -2158,6 +2235,12 @@ and `layerRows`, the rows highlighted in the panel.
|
||||
stays. A key left out keeps its list. The filter lasts the session and does not change the document, its open rows
|
||||
or the selection. `ui.layersFilter` answers `{objects, layers}`.
|
||||
|
||||
These Layers panel commands refuse a string, a number or another value that is not true or false with
|
||||
`` `copy` must be true or false ``, naming the key, and leave the document, the selection, the highlighted rows and
|
||||
the undo history as they were: `top` in `layer.new` and `layer.newSublayer`, `add` in `layer.selectAll` and
|
||||
`layer.target`, `copy` in `layer.move`, `on` in `layer.template` and `layer.pasteRemembersLayers`, and `build` in
|
||||
`layer.releaseToLayers`. A null is read as a key left out.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"layer.newSublayer","params":{"name":"Shadows"}}}
|
||||
{"name":"run_command","arguments":{"command":"layer.move","params":{"ids":[12,15],"target":7,"place":"inside"}}}
|
||||
@@ -2425,7 +2508,8 @@ so `path.moveAnchors {dx, dy}` (or a Direct Selection drag) pulls the path apart
|
||||
Selected End Points) joins the ends again; `path.join {ids: [a, b], ends: ["last", "first"]}` joins the ends asked for
|
||||
(the Pen's join, #776: drawing on from one open path, a click on another's end makes them one path). `path.convertAnchor {id, subpath?, anchor, to, x?, y?}` and
|
||||
`path.split {id, subpath?, anchor}` do the same to one anchor (the Anchor Point and Scissors tools); the Pen with Alt
|
||||
held over a selected path's handle, anchor or segment works as the Anchor Point tool. `path.reshapeSegment {id,
|
||||
held over a selected path's handle, anchor or segment works as the Anchor Point tool. `press_key` Escape between two
|
||||
`pointer_gesture` calls of an Anchor Point drag cancels it: the path goes back and no undo step is added. `path.reshapeSegment {id,
|
||||
subpath?, segment, t, dx, dy, perpendicular?}` (a segment dragged with Direct Selection or the Anchor Point tool) moves the segment's
|
||||
point at `t` by `dx`, `dy`: a smooth anchor at either end stays smooth, its other handle turning with the moved one.
|
||||
With `perpendicular: true` (Shift held during the drag) both of the segment's handles stand at right angles to the
|
||||
@@ -2446,8 +2530,8 @@ These commands refuse a string or another value that is not a number with `` `dy
|
||||
naming the key; the document does not change and no undo step is recorded: `t`, `dx` and `dy` in
|
||||
`path.reshapeSegment` and `object.blend.spine.reshapeSegment`; `x`, `y` and `t` in `path.curvatureEdit`; `x` and `y`
|
||||
in `path.convertAnchor`; `t` in `path.insertAnchor`; `fidelity` and the `within` of `redraw` in `path.freehand` (and in
|
||||
`brush.freehand`, which runs it); `size`, `angle` and `roundness` in `path.eraseRegion`; `size` in `path.blob`;
|
||||
`width` in `path.eraseSegments`;
|
||||
`brush.freehand`, which runs it); `size`, `angle` and `roundness` in `path.eraseRegion`;
|
||||
`size` and `fidelity` in `path.blob`; `width` in `path.eraseSegments`;
|
||||
`radius` and `fidelity` in `path.smoothRegion`; `tolerance` in `path.joinScrub`; `dx` and `dy` in `path.moveAnchors`;
|
||||
and `dx`, `dy`, `tol` and `radius` in `path.reshape`. A null is read as a key left out. `path.convertAnchor` refuses
|
||||
an `x` without a `y`, or a `y` without an `x`, with "x and y must be given together". `path.freehand`,
|
||||
@@ -2511,6 +2595,23 @@ dialog `simplifySlider` with field `level`) at the Auto-Simplify level for the s
|
||||
opens the Simplify dialog at the slider's tolerance. When OK confirms the dialog with `retain` ticked, the menu item opens
|
||||
the dialog on those settings next time.
|
||||
|
||||
## Smooth
|
||||
|
||||
`object.path.smooth` smooths the selected paths (or the objects in `ids`), compound path members included, as one undo
|
||||
step. `level` is the Smooth slider's, a whole number from 0 (minimum smoothing: the path stays within 0.1% of its longer
|
||||
side) to 100 (maximum smoothing); `auto: true` (Auto-Smooth) uses level 50, the default. Each path is refitted with
|
||||
curves within 0.1% to 2.5% of its longer side, keeping a corner only where it turns back on itself, so jags and kinks
|
||||
become curves; a refit never has more anchor points than the path had, so a shape whose corners the tolerance can't
|
||||
round, such as a rectangle, stays as it is. Closed paths stay closed and open paths keep their end points. The reply has the anchor counts `before` and `after` and the `level` used:
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"object.path.smooth","params":{"level":80}}}
|
||||
```
|
||||
|
||||
In the desktop app, Object › Path › Smooth opens the slider (`ui.menuDialog {command: "object.path.smooth"}`, dialog
|
||||
`smoothSlider` with field `level`) at the Auto-Smooth level and previews the result until `ui.dialog.confirm`;
|
||||
`ui.smoothAuto` moves the open slider back to the Auto-Smooth level.
|
||||
|
||||
## Editing a path with the Curvature tool
|
||||
|
||||
The Curvature tool edits any selected path, whatever drew it, keeping its shape except where edited (#798). Each edit
|
||||
@@ -2599,8 +2700,10 @@ changes size, and type keeps its character strokes' weight. With Scale Corners o
|
||||
size. The journal entry of a scaling command records the `strokes` and `corners` it used, so actions replay alike.
|
||||
`object.transformAgain` applies the last transform's matrix with the `copy`, `strokes`, `corners`, `patterns` and
|
||||
`typeAreas` values that transform used, and a true or false value given in its own params takes precedence. After a
|
||||
drag of art without a pattern, `patterns` follows the preference `transformPatternTiles`. Its journal entry records
|
||||
the `strokes`, `corners` and `patterns` it used, as a transform's does.
|
||||
drag of art without a pattern, `patterns` follows the preference `transformPatternTiles`. After a Direct Selection or
|
||||
Group Selection drag that moved direct-selected anchors (`path.moveAnchors`), it moves the selected anchors and the
|
||||
objects selected whole by the same distance. Its journal entry records the `strokes`, `corners` and `patterns` it
|
||||
used, as a transform's does.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"object.scale","params":{"sx":200,"strokes":true}}}
|
||||
@@ -2708,6 +2811,12 @@ the Align To choice, and while there is a key object or a key guide they send th
|
||||
`spacing`. Edit › Keyboard Shortcuts lists them under Align, with no default shortcut, and
|
||||
`shortcuts.set {id, shortcut}` gives one a shortcut.
|
||||
|
||||
Edit › Keyboard Shortcuts and `shortcuts.list` leave out a command with a menu path and no default shortcut when its
|
||||
params doc has a required field (one with no `?` and no `=` default), no item of the menu bar runs it without params,
|
||||
and it opens no dialog when run without them, such as `document.setUnits {units}` (File › Document Setup › Units).
|
||||
They list such a command while the user has changed its shortcut (`overridden: true` in `shortcuts.list`), and
|
||||
`shortcuts.set` can change or clear it.
|
||||
|
||||
The desktop app adds its active artboard, the one the Artboards panel highlights, to the `object.align`,
|
||||
`object.distribute`, `object.distributeSpacing` and `select.allOnArtboard` calls it runs without `artboard`, as it does
|
||||
for `edit.pasteInPlace`, `edit.pasteInFront` and `edit.pasteInBack`, and to each `command.batch`. A batch passes its
|
||||
@@ -2816,7 +2925,8 @@ The Selection & Anchor Display and General preferences apply to `pointer_gesture
|
||||
Transform Patterns) and of the same param on the commands that move or duplicate art with an artboard (`artboard.move`
|
||||
and the Artboard tool, `artboard.duplicate`, `artboard.rearrange`, `artboard.setProps`): pattern fills and strokes
|
||||
move with the art. `object.nudge` (the arrow keys) and `path.moveAnchors` (a Direct Selection drag of selected
|
||||
anchors) take the same param, with the same default, for the objects they move whole.
|
||||
anchors, and a Direct Selection or Group Selection drag from an object while anchors are selected) take the same
|
||||
param, with the same default, for the objects they move whole.
|
||||
- `selectSameTintPercent` (off by default): `select.same.fillColor`, `strokeColor` and `fillAndStroke` take every tint
|
||||
of a global or spot swatch; on, only the same tint.
|
||||
|
||||
@@ -2991,14 +3101,17 @@ for a uniform stroke). `stroke.widthPoint.remove {id, index | indices}` deletes
|
||||
points}` replaces them all, as dragging several Shift-selected points with the Width tool does in one undo step.
|
||||
With the Width tool, `press_key` Delete or Backspace removes the selected width points (`handledBy: "tool"`); with none
|
||||
selected the key clears the selected objects as usual (`edit.clear`). The Puppet Warp tool's selected pins go the
|
||||
same way.
|
||||
same way. With the Width tool, `press_key` Escape deselects the selected width points (`handledBy: "tool"`) and
|
||||
leaves the document and its undo history as they were.
|
||||
A compound path's stroke is the compound's: width point commands given one of its members edit the compound's
|
||||
profile, which runs along every subpath (the Width tool shows each subpath's points).
|
||||
|
||||
`object.puppetWarp {ids?, pins, moved, angles?, expand?}` warps art as rigidly as possible so that each pin (a point
|
||||
on the art) lands on its `moved` point. `angles` (degrees, or null for a free pin; as long as `pins`) holds the turn
|
||||
the art takes around a pin, as Alt-dragging near a selected pin with the Puppet Warp tool does: one pin with
|
||||
`angles: [90]` turns the art a quarter turn around it.
|
||||
`angles: [90]` turns the art a quarter turn around it. `press_key` Escape between two `pointer_gesture` calls of a
|
||||
pin drag or a turn cancels it: the art, its pins and the selected pins go back to how the press found them, and no
|
||||
undo step is added.
|
||||
|
||||
The Puppet Warp tool's pins live in the document while the same art stays selected (never saved; Undo and Redo take
|
||||
them back with the art). `object.puppetWarp.pins {ids?}` reads them: `pins` (where each sits on the shape the pins
|
||||
@@ -3062,6 +3175,9 @@ three: General (rulers, positions and sizes, the Info panel, dialog distances, c
|
||||
(`document.inspect` → `units`): `document.setUnits {units}` (Document Setup) sets it for that document, and
|
||||
`prefs.set {key: "unitsGeneral", value}` sets it for the active document too (one undo step) and is the units
|
||||
`file.new` starts in when it gets no `units`. Stroke and Type are the preferences `unitsStroke` and `unitsType`.
|
||||
`document.switchUnits` (Cmd/Ctrl+Alt+Shift+U) sets the active document's units to the next unit in the order a
|
||||
right-click on a ruler lists them (Points, Picas, Inches, Millimeters, Centimeters, Pixels, Feet & Inches, Meters,
|
||||
Yards, Feet, then Points again), in one undo step, and replies `{units}`.
|
||||
`numbersWithoutUnitsArePoints` (on by default) makes the desktop app's length fields in picas read a number typed
|
||||
with no unit in points (`12` is 12 pt, `2p6` and `1p` stay picas, `12 mm` millimetres); off, it is in picas. Fields in
|
||||
other units read it in their unit either way, and the Preferences dialog dims the option unless a unit is Picas.
|
||||
@@ -3191,11 +3307,16 @@ Every artboard command that takes an `index` fails with `no such artboard` when
|
||||
clipboard stay as they were.
|
||||
These artboard commands refuse a string, a number or another value that is not true or false with
|
||||
`` `art` must be true or false ``, naming the key, and leave the document, its undo history and the clipboard as they
|
||||
were: `moveArt`, `scaleArt`, `strokes`, `corners`, `patterns`, `lockedAndHidden` and an artboard's `locked` in
|
||||
`artboard.setProps`; `moveArt`, `copy` and `patterns` in `artboard.move`; `art` and `patterns` in `artboard.duplicate`;
|
||||
were: `moveArt`, `scaleArt`, `strokes`, `corners`, `patterns`, `lockedAndHidden` and an artboard's `locked`,
|
||||
`showCenterMark`, `showCrossHairs` and `showVideoSafeAreas` in `artboard.setProps`; `showCenterMark`, `showCrossHairs`
|
||||
and `showVideoSafeAreas` in `artboard.new`; `moveArt`, `copy` and `patterns` in `artboard.move`; `art` and `patterns` in `artboard.duplicate`;
|
||||
and `art` in `artboard.copy` and `artboard.cut`. `artboard.setProps` refuses an artboard's `x`, `y`, `width` or
|
||||
`height` that is not a number, and `artboard.move` refuses such a `dx` or `dy`, with
|
||||
`` `dx` must be a number, not "10" ``. A null is read as a key left out.
|
||||
`artboard.new` refuses an `x`, `y`, `width` or `height` that is not a number with the same message, and
|
||||
`artboard.new` and `artboard.setProps` refuse a `name` that is not a string, such as 5, with
|
||||
`` `name` must be a string ``. Both leave the artboards and the undo history as they were, and read a null as the
|
||||
key left out.
|
||||
|
||||
Scale Artwork with Artboard (#602): `artboard.setProps {index, x?, y?, width?, height?, scaleArt: true}` resizes an
|
||||
artboard and scales the art fully inside it, and its artboard guides, from the old rectangle onto the new one, each side
|
||||
@@ -3696,7 +3817,8 @@ slice ids and the ids of objects with an object slice.
|
||||
## Export for Screens
|
||||
|
||||
`document.exportForScreens` writes every chosen artboard (`range`, `artboards`; default all) in every format row
|
||||
into `folder`, or returns the files as `dataBase64` without one; `zip: true` packs them into one store-only `.zip`.
|
||||
into `folder`, or returns the files as `dataBase64` without one; `zip: true` packs them into one `.zip`,
|
||||
each file deflated, or stored when deflating does not make it smaller.
|
||||
A row is `{format, scale?}` where `scale` is a factor (`2`, `"2x"`), a pixel width (`"100w"` or `width: 100`), a
|
||||
height (`"100h"`) or a resolution (`"72ppi"`); raster rows name their files `@2x`, `@100w`… unless `suffix` says
|
||||
otherwise. `fullDocument` writes one file per row instead (a PDF of every artboard, other formats the bounds of all
|
||||
@@ -4958,7 +5080,9 @@ active the active artboard (the navigator's and the Artboards panel's).
|
||||
`tool.options {tool}` opens what double-clicking the tool's button opens (its params doc lists every tool), in the
|
||||
desktop app. The Flare tool's are its Flare Tool Options (dialog `flareOptions`): `diameter` and `pathLength` (pt),
|
||||
`opacity`, `brightness`, `growth`, `fuzziness`, `longest`, `rayFuzziness` and `largest` (%), `rays`, `rings`,
|
||||
`direction` (°), and `raysOn` and `ringsOn` (the Rays and Rings checkboxes; off, the flare has none). OK keeps them
|
||||
`direction` (°), and `raysOn` and `ringsOn` (the Rays and Rings checkboxes; off, the flare has none). While Alt
|
||||
(Option on macOS) is held, the dialog's Cancel button reads Reset. Reset puts every option back to the tool's default,
|
||||
leaves a click's `x` and `y` unchanged and keeps the dialog open; `ui.dialogReset` does the same. OK keeps the options
|
||||
(`tool.setOption {tool: "flare", values}`) and the next flare dragged out uses them; a click with the tool opens the
|
||||
same dialog, and its OK also draws a flare there. The Artboard tool's are the active artboard's Artboard Options
|
||||
(dialog `artboardOptions`; the Artboard tool's active artboard while it is in use, else the window's; its `x` and `y`
|
||||
@@ -4971,6 +5095,7 @@ for a new artboard, with `new: true` and the name, position and size that `artbo
|
||||
`artboard.new` with the fields and makes the new artboard the active one, and Cancel adds no artboard.
|
||||
`artboard.new` and `artboard.setProps` trim the white space around `name`, and a blank name gives the artboard its
|
||||
default name, "Artboard N" for the Nth artboard.
|
||||
A canvas-click dialog also has `preview` (initially on): tentative settings draw at the remembered click, Reset refreshes that preview, and Cancel discards it without persisting settings. OK accepts one flare as one Undo step. Toolbar-only options draw no artwork.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"tool.setOption","params":{"tool":"flare","values":{"rays":24,"ringsOn":false}}}}
|
||||
@@ -5017,6 +5142,8 @@ under the opposite corner, else of the front-most selected object. A Shift-click
|
||||
as a click does, so with `clickStrokeSplitsPath` on, a Shift-click on a stroke splits it. A marquee splits no stroke,
|
||||
however little the pointer moves: the tool sends no `splitStroke` with `rect`, and `shapeBuilder.merge` does not split
|
||||
a stroke when it has `rect`. With both `rect` and `points`, the command also touches what the points touch.
|
||||
`press_key` Escape during a Shape Builder drag, a marquee included, cancels it: the release sends no
|
||||
`shapeBuilder.merge`.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"shapeBuilder.merge","params":{"rect":[50,50,200,200]}}}
|
||||
@@ -5068,7 +5195,8 @@ horizon; with Lock Station Point the other one swings), the horizon, the third v
|
||||
and right ground-level points (24 px from the origin along each wall's ground line: they move the whole grid; Shift
|
||||
keeps one axis), the left and right extents (separate: `extent` and `extentRight`; Alt drags both, Shift goes by
|
||||
whole cells), the vertical extent and the cell size widget (on the line where the planes meet, a cell up, or more
|
||||
cells while they're small) reshape the grid; Lock Grid stops them. The Plane Switching Widget stays put in a corner
|
||||
cells while they're small) reshape the grid; Lock Grid stops them. `press_key` Escape during a drag of one of them,
|
||||
or of a plane widget, cancels it and puts the grid back. The Plane Switching Widget stays put in a corner
|
||||
of the document window (headless: the first artboard's top-left corner); a press on it picks the plane with any tool
|
||||
while the grid shows (choosing a perspective tool shows it, and `perspective.grid.show` hides it again with the tool
|
||||
still chosen), and the keys 1–4 (`key` with `"1"`…`"4"`) pick the left, horizontal, right and no plane.
|
||||
@@ -5088,7 +5216,10 @@ the options, `editing`), or with no envelope selected the options new envelopes
|
||||
the current shape) switch its kind and keep its content. `object.envelope.options` sets `fidelity` and the options
|
||||
(`antiAlias`, `preserveShape`: clippingMask or transparency, `distortAppearance`, `distortLinearGradients`,
|
||||
`distortPatternFills`; the last two need `distortAppearance`); with no envelope selected it sets them for new
|
||||
envelopes. New envelopes start with Distort Appearance on, as in the reference app; envelopes saved before these
|
||||
envelopes. With `antiAlias` false, the envelope's distorted images are drawn without smoothing, SVG export writes
|
||||
them with `image-rendering: pixelated` and PDF export writes them without `/Interpolate`. With `preserveShape`
|
||||
`transparency`, each piece of a distorted image is the image with a white opacity mask in the piece's shape instead
|
||||
of a clip group, after Expand too. New envelopes start with Distort Appearance on, as in the reference app; envelopes saved before these
|
||||
options existed keep their old look (appearance applied after the distortion).
|
||||
|
||||
`object.envelope.release` gives back the content and the envelope's shape (a grey gradient mesh for warp and mesh
|
||||
@@ -5121,7 +5252,8 @@ Brush Dimensions shared by the seven tools (`width`, `height` in pt, `angle`, `i
|
||||
`showBrush`) and the tool's own: `detail` (1..10); `simplify` (0..100) with `simplifyOn` (Warp, Twirl, Pucker,
|
||||
Bloat); `rate` (Twirl, -180..180°); `complexity` (0..15) and `affectAnchors`, `affectIn`, `affectOut` (Scallop,
|
||||
Crystallize, Wrinkle: what the brush moves); `horizontal`, `vertical` (Wrinkle, 0..1). Alt-drag sizes the brush from
|
||||
its current size (with Shift too it keeps its proportions). With Use Pressure Pen on, each `pointer_gesture` event's
|
||||
its current size (with Shift too it keeps its proportions). `press_key` Escape during a stroke cancels it and adds no
|
||||
undo step; during an Alt-drag it puts the brush size back. With Use Pressure Pen on, each `pointer_gesture` event's
|
||||
`pressure` (0..1) is the intensity there, and `object.liquify` takes points as `[x, y, pressure]`.
|
||||
|
||||
```json
|
||||
@@ -5161,7 +5293,8 @@ distance along the plane's normal), so copies, duplicates and pastes stay attach
|
||||
`perspectiveSelection` tool, a drag moves the selection within its plane (`perspective.move`; Alt copies), the
|
||||
bounding-box handles scale it in plane space (`perspective.transform`; Shift keeps proportions, Alt scales about the
|
||||
centre), and `press_key` `5` during a drag switches the move to perpendicular to the plane (press again to switch
|
||||
back). The arrow keys nudge a selection in perspective by the keyboard increment (`perspective.nudge`; Shift ×10, Alt
|
||||
back). `press_key` Escape during a move, a resize or a plane widget drag cancels it and puts the objects and the
|
||||
grid back. The arrow keys nudge a selection in perspective by the keyboard increment (`perspective.nudge`; Shift ×10, Alt
|
||||
copies). Object › Transform › Transform Again repeats the last perspective move or scale in plane space.
|
||||
|
||||
```json
|
||||
@@ -5215,7 +5348,9 @@ shows, and so do the click-to-size dialogs (`perspective.draw` with `at`: the cl
|
||||
`object.blend.make` blends the selected objects (or `ids`) into a live blend. Spacing and orientation default to
|
||||
what `object.blend.options` set with no blend selected (`object.blend.info` reads them: `target: "defaults"`),
|
||||
else Smooth Color and Align to Page. `starts` gives, per object, the anchor of its first subpath the blend starts
|
||||
from (as the Blend tool's clicks on anchor points do; an open path's last anchor runs it the other way). A blend
|
||||
from (as the Blend tool's clicks on anchor points do; an open path's last anchor runs it the other way). With the
|
||||
Blend tool, `press_key` Escape drops the object clicked first and stops the next click adding to the blend
|
||||
just made; the document and the selection stay as they are. A blend
|
||||
among the objects takes the others in as more key objects, keeping its options, name and transparency:
|
||||
|
||||
```json
|
||||
@@ -5307,7 +5442,8 @@ right/left/down/up; none stored means the smooth mesh through the points, as old
|
||||
`object.envelope.setMeshPoint {id, index, x, y, handle?}` and `object.mesh.movePoint`, `object.mesh.addLine` and
|
||||
`object.mesh.deletePoint` edit them like a gradient mesh's (one undo step each). On the canvas a selected envelope
|
||||
shows its mesh; the Mesh tool and Direct Selection drag its points and the clicked point's handles, and the Mesh tool
|
||||
adds a row and a column where it clicks inside. The Control bar shows Edit Envelope / Edit Contents, the warp's
|
||||
adds a row and a column where it clicks inside. `press_key` Escape during a drag of a point or handle of a mesh
|
||||
envelope or a gradient mesh cancels it: the point goes back and no undo step is added. The Control bar shows Edit Envelope / Edit Contents, the warp's
|
||||
style, orientation, bend and distortions (or the mesh's rows and columns), Reset (an unbent warp, a flat mesh) and
|
||||
Envelope Options.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user