With art selected, the Edit tab shows a Prominent Colors bar under the
wheel: a part for each row in its new color, as wide as the row's share
of the art, the largest first. Dragging the edge between two parts moves
width from one to the other; when the drag ends, the rows' current
colors move toward the new widths and the art previews the result. OK
keeps the recolor as one undo step.
- recolor.weigh {map, weights?, ids?} returns each row's share of the
uses of the art's colors and, with weights, the rows with their
current colors moved: one color at a time between rows that have a
new color, while a move brings the shares nearer the weights, the
color nearest in Lab to the row it goes to first. A row keeps its
first color, the tints of one global swatch move together, colors
that stay keep their order, and the command changes nothing. A use
counts for the row recolor.apply recolors it with, and the work is
bounded at 50,000,000 color-by-row comparisons.
- The New Color Group menu beside the link button has Save All Colors
(the new colors in row order) and Save Prominent Colors (the bar's
colors in its order); each saves a color group as its own undo step.
- The dialog's weights field drives the bar from ui.dialog.set. A new
Colors count drops it.
The Actions panel menu has Insert Select Path, after Insert Menu Item.
With one whole path or compound path selected, it inserts a Select
Path step into the action being recorded, or after the selected action
or step. Playing the step selects that path again.
- New engine command `select.storedPath {id, fingerprint}`. The step
stores the path's object id and a fingerprint of its geometry and
fill rule ("v1:" and 16 lowercase hex digits, FNV-1a 64). Playback
selects the path only while it exists unchanged and can be selected;
otherwise the step fails and the selection stays as it was. A path
on a locked artboard is refused in isolation mode too.
- Capture refuses an empty selection, several objects, selected
anchors or segments alone, groups, type, guides, a path selected
together with ruler guides, a member of a compound path, and hidden,
locked or template art.
- New UI command `ui.action.insertSelectPath {set?, action?, step?}`.
Step rows show "Select Path".
- `.vcactions` files that hold a Select Path step are written as
version 4. Reading accepts versions 1 to 4 and refuses a Select Path
step with invalid params.
- Rows for the new labels and messages in every catalog.
Docs: docs/mcp.md, docs/target-app-parity.md.
The Color Theme Picker button beside the Assign and Edit tabs turns on
picking from the canvas. A click takes the color palette of the object a
Selection tool click takes there, a drag takes the palette of the art
inside its marquee, and Shift adds more picks. The rows that are not
excluded take the palette as their new colors and the art previews them;
OK keeps the recolor as one undo step.
- recolor.pickTheme {picks, colors?} returns the palette of the art
picked: visible fills and strokes, gradient stops, text, mesh points,
pattern tiles, symbol art, colorize colors and image pixels. Clip
groups, clipping opacity masks and isolation mode limit it to what
shows, and it changes nothing.
- Each object read weighs the same; similar colors merge (k-means in Lab)
into at most `colors`, most used first. Image reads are bounded (65,536
pixels a pick, 1,048,576 pixels and 64 images in all), and past 4,096
distinct colors, close colors merge before clustering.
- The dialog's themePicker and themePicks fields drive it from
ui.dialog.set. A new Colors count keeps the picks.
The Actions panel menu gets Select Object…, which opens Set Selection with a Note field and
Case Sensitive and Whole Word. The step it inserts runs the new select.byNote command, which
replaces the selection with every object that can be selected whose note matches. When none
matches, the selection, its Puppet Warp pins and the active Appearance item stay as they were,
and playback stops with an error. Action set files that hold the step are saved as version 4.
The Materials tab of the 3D and Materials panel lists the document's
graphics (symbols). Add as Single Graphic keeps the selected art as a
new symbol (threeD.addGraphic), and clicking a thumbnail maps it onto
the front of each selected object's 3D effect (threeD.mapGraphic) in
one undo step. The tab lists the mapped graphics with Face, X, Y, Scale
and Rotation and Remove Graphic, and a handle on the artboard drags a
graphic over its face.
The graphics are the new `graphics` parameter of threeD.extrude and
threeD.rotate: drawn on Extrude & Bevel's front and back caps and on
the Plane type, turned, foreshortened, twisted and tapered with the
face, shaded with its light and clipped to it. Symbol renames follow
into the graphics, and Select All Unused counts a symbol a graphic uses.
Docs: docs/mcp.md, docs/three-d.md, docs/effects-parity.md.
With the Artboard tool chosen, the Align panel's Align Objects,
Distribute Objects and Distribute Spacing buttons, their UI commands and
the Control bar's Align and Distribute buttons act on the artboards the
tool has selected, as the public page describes:
https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/align-and-distribute-artboards.html
- artboard.align, artboard.distribute and artboard.distributeSpacing
move whole artboards with their guides, and with the art inside them
when Move Artwork with Artboard is on, in one undo step. No undo step
is recorded when no artboard moves.
- Align To offers Align to Selection and Align to Artboard. Align to
Artboard keeps the active artboard in place, and the Distribute
buttons then send the Distribute Spacing value. A locked artboard
stays where it is. These rules are VectorCraft's own.
- The Control bar shows the Align buttons, the Align To menu and the
Distribute buttons after the artboard controls while it has room.
Docs: docs/mcp.md, docs/ui-parity.md.
object.objectsOnPath.selectMember and object.objectsOnPath.moveMember
change only the document and its selection, as the other Objects on
Path commands do, so both join the commands a plug-in may call when its
manifest lists them.
Object › Plug-ins › Image Tools gains Color Mask… (`addon.image.colorMask`),
Remove Color Mask and Apply Color Mask. Color Mask hides colors of the
selected images without changing their pixels. It matches colors as Remove
Background does: the edge color, the corner color or picked colors, with
Contiguous, Match, Tolerance and Softness. The mask is kept with the image
object and saved with the document: its settings, and a PNG of the image's
pixels with the hidden colors made clear, at the source's depth with its
color profile and resolution. It is a VectorCraft addition.
- The canvas (clip groups and white-shape opacity masks included),
printing and separations, PDF (soft masks of CMYK images included), SVG,
EPS, the raster formats, the legacy .ai and .ai editing data, EMF/WMF,
DXF and the flattener draw the masked pixels. A linked image stays
linked, and an output that would refer to its file writes the masked
pixels instead.
- Copy and paste, placing a document and placed documents carry the masked
pixels with the image, under the names they are given there.
- The dialog opens on the selected image's mask settings, with a Preview.
Without settings, the command returns them and changes nothing.
- Setting, removing and applying a mask are each one undo step, and no
step is added when nothing changes. Apply makes the masked pixels the
image's own and embeds a linked image. A mask that hides nothing is only
taken off, and the image keeps its pixels and its link.
- When an image's own pixels are replaced (Update Link, Relink, Crop
Image, a recolor, a linked file read again on open), its mask is made
again for the new pixels, in every art tree and in opacity-mask art.
Crop Image cuts the image's own pixels. When the new pixels can't be
masked, the mask keeps its settings and hides nothing.
- Objects in `ids` that are not images, CMYK images, linked images that
show their preview, images past the decode allowance, masks that would
hide every pixel, and grayscale images colorized with a process color
are refused. The Eyedropper, Object Mosaic, Create Gradient Mesh, Crop
Image's trim and Image Trace read the image's own pixels.
- An image is selected by a click anywhere in its frame, as before.
Remove Background now also refuses a grayscale image colorized with a
process color. Its result has an alpha channel, and a process color is
refused on a grayscale image with transparency.
Docs: docs/mcp.md (Image Tools add-on › Color Mask),
docs/target-app-parity.md.
With one whole blend selected, the Selection and Blend tools show two
widgets at the halfway point of its spine. Dragging the upper widget
along the spine sets the color shift (-100 to 100), and dragging the
lower one sets the easing strength (0 to 100). The lower widget shows
only when the steps follow a spine (a replaced spine or Align to Path),
the rule the step placement uses; a blend made without a spine shows
neither. When the boxes of three or more other visible objects hold a
widget's spot, the widget moves out in 16 px steps, up to 144 px, and
its line to the halfway point grows with it. While a widget is held,
the arrow keys step its value by 1 (Shift: by 10), and Escape or a
switch to another tool cancels the drag. A drag is one undo step; a
click or a drag that ends where it started records none.
- object.blend.setEasing sets easingType, ramp and colorShift on one
blend, refuses a hidden or locked blend and easing on a blend without
a spine, and records no undo step when nothing changes.
- BlendSpec::eases_along_spine holds the rule the step placement and
the widget share.
- While a tool is busy, an arrow it claims arrives with the press's
Shift and Alt; before, it always arrived plain.
Docs: docs/mcp.md, docs/target-app-parity.md.
A Cutting Tools add-on command (Object › Plug-ins › Cutting Tools › Weed Box
and Lines…, `addon.cutting.weed`) for vinyl cutting: around the selected art
it adds a weed box, a rectangle at a margin outside the art's bounds, and
weeding lines across the box, horizontal, vertical or both, by count or by
spacing. Each line runs from one side of the box to the other and is left out
over the art and within a gap of its outlines, so it stops at the art and the
waste lifts off in pieces. The lines and the box are straight paths stroked
in a chosen color swatch ([Registration] by default) with no fill, in one
group named Weeding on top of the current layer, selected, as one undo step.
While a clip group, or a group inside one, is edited in isolation, the
group goes on top of the container that holds the outermost clip group
around it.
The art is measured by the outlines a cutter cuts: closed paths by their fill
rule (the hole of an even-odd compound path gets lines too), open paths as
lines, type by its glyph outlines, images by their frames, placed files by
the art they show (by their boxes when the file can't be read), symbol
instances by their art, and blends and other live objects by the art they
draw. A clip group, and an object selected inside one, is measured by what
shows inside the region its clipping paths clip to, and a clipping path
selected on its own as its clip group. Art in a hidden group or layer is
left out. The command refuses an empty selection, art with no outlines, bad
params, and art or lines too complex to measure, with a message.
The dialog has Preview; a Spacing above 0 is used instead of the Count.
Docs: docs/mcp.md (Cutting Tools add-on) and docs/target-app-parity.md.
Object › Plug-ins › Cutting Tools › Stencil Bridges… (`addon.cutting.bridges`)
cuts strips of a set width out of the selected art so that a stencil cut
from it holds together: every island (the inside of an O, A or 8, a hole in
a shape) stays joined to the sheet, directly or through another island.
Bridges take the shortest crossings that fit first, then spread around each
island up to the count asked for, at least two widths apart. They run
vertically, horizontally or along the shortest crossing among 12
directions 15° apart.
- The art is measured by the area its outlines enclose, whatever their
paint, with hidden objects left out; type by its glyph outlines, without
converting the type. The result is one compound path with the strips cut
out, painted as the topmost selected shape with outlines, in the place of
the topmost selected object with outlines. Selected objects with no
outlines in the art stay where they are.
- Keep Original (on by default) moves the selected objects that make up the
art to a new hidden layer, Stencil Original; off replaces them.
- Art with no islands, or none a bridge of the width fits, is left as it is
with a message and no undo step. Islands the cut result still encloses
are counted in `unbridged`, with a message. Otherwise the run is one undo
step.
- Curves are followed within a twentieth of the width (0.002 to 0.25 pt).
Art that reaches more than 10000000 pt from the origin or has more than
200000 anchors is refused before it is combined. Art is also refused when
its combined area has more than 4000 outlines, when its outlines need
more than 200000 straight segments, or when placing the outlines or
joining every island takes more work than a fixed budget allows; when
the budget runs out while extra bridges are added, the bridges found so
far are kept.
Tests in vectorcraft-pathops, vectorcraft-engine and vectorcraft-ui-egui,
command_sweep cases, catalog rows in all 27 languages, docs/mcp.md, the
evidence list in docs/target-app-parity.md and the ROADMAP progress log.
Art Alt-dragged (Option-dragged on macOS) from the canvas onto a
scatter, art or pattern brush in the Brushes panel becomes its art
(brush.replaceArt). When strokes use the brush, the app checks the art
first, then a dialog offers Apply to Strokes, which redraws them with
the new art, Leave Strokes, which keeps the brush and its strokes as
they were and adds "<name> copy" with the new art as the current brush,
and Cancel. Each change is one undo step.
A pattern brush takes back the tile groups brush.placeArt places, frames
included, and takes other art as its side tile. Calligraphic and
bristle brushes, an empty selection and art with no width are refused.
Art Alt-dragged off the canvas now reaches the panels as the art the
drag started with. Before, the panels got the ids of the copy the drag
previews, which no longer exist once the release over a panel ends the
move.
brush.new now also measures a symbol instance in the selected art by its
symbol's art when it checks that the art has width.
Docs: docs/mcp.md, docs/target-app-parity.md.
A scatter, art or pattern brush dragged from the Brushes panel onto an
empty part of the canvas places a copy of its art there to edit,
centered where it is dropped (brush.placeArt). Dropped on a path, a
brush is still applied to it. A pattern brush is placed as its tiles in
a row, 10 pt apart, each in a group named for its tile, with an
unpainted rectangle at the back of a tile that has a repeat frame.
Calligraphic and bristle brushes have no art and are refused. A symbol
instance in the art is measured by its symbol's art.
Docs: docs/mcp.md, docs/target-app-parity.md.
The Stroke panel menu's Edit Arrowheads… (stroke.arrowheads.edit) opens
Arrowheads.vectorcraft next to the preferences, creating it with one
example head when it is missing. Each symbol in the file is one head,
listed by name after the built-in heads in both arrowhead menus: it
points right, its registration point is the tip, and its height is drawn
as wide as the built-in heads. The file is read at startup and again
each time VectorCraft saves it; stroke.arrowheads.reload and
stroke.arrowheads.list read and list it.
Arrowhead gets a Custom variant, appended after the built-in names, that
carries the head's name and outline, so a document that uses one draws,
saves, reopens and exports it without the arrowheads file. stroke.set
takes {"custom": name} or the {"Custom": {name, path}} form that
document.inspect reports.
Part of #5421.
The Blend panel gets a Create Spine menu (Auto, Always, Never) under Make,
and object.blend.createSpine {mode?} sets or reads it. It is kept with the
preferences, is not an undo step and leaves blends already made as they are.
object.blend.make takes createSpine to choose for one new blend.
Auto and Always give every new blend a straight spine, as before. Never
makes a blend without one: its steps sit where a straight spine puts them,
object.blend.info reports hasSpine: false, easing is refused and dimmed,
Reverse Spine and the spine point commands refuse it, Release gives back
no spine path, and Replace Spine gives it a spine. A blend taking more keys
keeps whether it has a spine. Native files save noSpine; older files open
with their spines.
Builds on #5177 by adambelis.
A new built-in add-on, Image Tools (Object › Plug-ins › Image Tools),
adds Remove Background… (`addon.image.removeBackground`). It makes the
background of the selected images transparent by lowering the alpha of
their own pixels, in one undo step, with no service or model. The
background is the most common color along the image's edges, the
average of the image's corners, or colors the user picks. Contiguous
(on by default) clears it only where it reaches in from an edge; off,
it is cleared wherever it is. Tolerance and Softness (0 to 100, 10 by
default) set how near a color must be to be cleared and the band over
which pixels fade out. Match measures that nearness as the RGB
distance or as the largest difference on one channel. It is a
VectorCraft addition.
- The image stays an image: an embedded PNG with alpha, the source's
ICC profile and resolution, and 16 bits or gray when the source is.
A linked image is embedded and keeps its Placement Options.
- When the edges hold at least as many clear pixels as pixels of their
most common color, edge mode clears nothing, so a second run leaves
the subject alone. Corner mode leaves clear corners out of the
average and clears nothing when all four are clear.
- With Match set to Each Channel, a tolerance of t / 255 × 100 clears
the colors within t 8-bit steps on every channel.
- A CMYK image, a linked image that shows its preview, an image that
would need more than the decode allowance (checked from its header)
and a result with no pixel left are refused, and the document stays
as it was. When no pixel changes, no undo step is added. The result
reports `cleared`, the pixels made fully clear.
- Picked colors are hex colors, with or without `#`, or black, white,
red, green or blue.
- The dialog opens with Preview off; with Preview on, the canvas shows
the result, and Cancel puts the image back. While the dialog
previews, the session keeps the images' decoded pixels (at most
128 MiB, 32 MiB in the web app) so each preview step does not decode
them again, and releases them when the dialog closes with OK or
Cancel. A run that is not a preview step keeps nothing.
Docs: docs/mcp.md (Image Tools add-on), docs/target-app-parity.md.