Smart Guides: Snap to Last Location puts a moved selection back where it began

Preferences > Smart Guides gets Snap to Last Location (`snapToLastLocation`,
off by default). With it and Smart Guides on, a selection moved by dragging
with the Selection, Group Selection or Direct Selection tool, Shift too, goes
back to where the move began while the move is within Snapping Tolerance,
labeled "last location". An Alt copy is not pulled back onto its original.

Source: https://helpx.adobe.com/illustrator/desktop/measure-and-align/grids-and-guides/smart-guides-options.html
The distance, the label and the copy rule are VectorCraft's own.
This commit is contained in:
dotCooCoo
2026-11-08 12:21:36 +07:00
committed by bflatastic
parent f42fdf900f
commit b093e53e77
38 changed files with 138 additions and 4 deletions
+1
View File
@@ -247,6 +247,7 @@ pub const PREF_SPECS: &[PrefSpec] = &[
p!("measurementLabels", "Smart Guides", "Display Options", "Measurement Labels", bool),
p!("spacingGuides", "Smart Guides", "Display Options", "Spacing Guides", bool),
p!("distanceGuides", "Smart Guides", "Display Options", "Invoke Distance Guides", bool),
p!("snapToLastLocation", "Smart Guides", "Display Options", "Snap to Last Location", bool),
p!("snappingTolerance", "Smart Guides", "", "Snapping Tolerance", num(0.0, 40.0, "pt")),
p!("snapTangent", "Smart Guides", "Geometric Guides", "Snap to Tangent", bool),
p!("snapPerpendicular", "Smart Guides", "Geometric Guides", "Snap to Perpendicular", bool),
+2
View File
@@ -115,6 +115,7 @@ pub struct Prefs {
pub measurement_labels: bool,
pub spacing_guides: bool,
pub distance_guides: bool,
pub snap_to_last_location: bool,
pub snapping_tolerance: f64,
pub snap_tangent: bool,
pub snap_perpendicular: bool,
@@ -410,6 +411,7 @@ impl Default for Prefs {
measurement_labels: true,
spacing_guides: true,
distance_guides: true,
snap_to_last_location: false,
snapping_tolerance: 4.0,
snap_tangent: true,
snap_perpendicular: true,
+31
View File
@@ -814,6 +814,37 @@ fn invoke_distance_guides_measures_the_selection_to_the_object_under_alt() {
assert!(shown(&mut s, v).is_empty(), "Invoke Distance Guides off");
}
/// Smart Guides › Snap to Last Location (off by default): on, a square dragged 6 pt right and 5 pt
/// down with a 10 px Snapping Tolerance goes back to where it was; dragged 12 pt away, or with the
/// option or View › Smart Guides off, it lands where it is dragged. A value that is not a boolean
/// is refused.
#[test]
fn snap_to_last_location_puts_a_dragged_square_back() {
use vectorcraft_tools::PointerKind::{Down, Drag, Up};
let mut s = new_doc();
// Its edges and center stay out of reach of the 400 pt artboard's.
let m = square(&mut s, 100.0, 250.0);
let v = ViewInfo::default();
s.select_tool("selection", v).unwrap();
let drag = |s: &mut Session, v: ViewInfo, to: (f64, f64)| {
gesture(s, v, &[(Down, 125.0, 275.0), (Drag, 140.0, 290.0), (Drag, to.0, to.1), (Up, to.0, to.1)]);
let at = top_left(s, m);
if at != (100.0, 250.0) {
s.execute("edit.undo", &json!({})).unwrap();
}
at
};
set_pref(&mut s, "snappingTolerance", json!(10));
assert_eq!(drag(&mut s, v, (131.0, 280.0)), (106.0, 255.0), "off by default");
set_pref(&mut s, "snapToLastLocation", json!(true));
assert_eq!(drag(&mut s, v, (131.0, 280.0)), (100.0, 250.0), "7.8 pt away: back where it was");
assert_eq!(drag(&mut s, v, (134.0, 283.0)), (109.0, 258.0), "12 pt away");
assert_eq!(drag(&mut s, ViewInfo { smart_guides: false, ..v }, (131.0, 280.0)), (106.0, 255.0), "View › Smart Guides off");
let refused = s.execute("prefs.set", &json!({"key": "snapToLastLocation", "value": "yes"}));
assert!(refused.is_err(), "{refused:?}");
assert_eq!(s.execute("prefs.get", &json!({"key": "snapToLastLocation"})).unwrap(), json!(true), "unchanged");
}
/// Preferences › Smart Guides (#394): Color, Alignment Guides, Anchor/Path Labels, Measurement
/// Labels, Transform Tools and Snapping Tolerance change what the Selection tool shows while a
/// square is dragged into line with another, and how far the pull reaches; a hidden guide still
+1
View File
@@ -339,6 +339,7 @@ impl Session {
transform_tools_guides: self.prefs.transform_tools_guides,
spacing_guides: self.prefs.spacing_guides,
distance_guides: self.prefs.distance_guides,
snap_to_last_location: self.prefs.snap_to_last_location,
snapping_tolerance: self.prefs.snapping_tolerance,
construction_angles: if self.prefs.construction_guides {
vectorcraft_tools::guides::construction_angles(&self.prefs.construction_angles)
+3
View File
@@ -242,6 +242,9 @@ pub struct ToolContext<'a> {
/// object shows how far the selection is from it, and over an empty part of an artboard how
/// far it is from the artboard's edges ([`guides::distance_guides`]).
pub distance_guides: bool,
/// Smart Guides → Snap to Last Location: a selection moved by dragging goes back to where the
/// move began while it is within Snapping Tolerance of it ([`guides::Targets::snap_back`]).
pub snap_to_last_location: bool,
/// Smart Guides → Snapping Tolerance (screen pixels): how near a smart guide target pulls the
/// pointer, a dragged edge or a drawn point.
pub snapping_tolerance: f64,
+16 -2
View File
@@ -57,6 +57,9 @@ pub struct Targets {
pub(super) perpendicular: bool,
/// How the guides these targets produce look.
pub(super) style: GuideStyle,
/// Smart Guides › Snap to Last Location: a move goes back to where it began when it comes near
/// ([`Self::snap_back`]). Set only for moving the selection itself ([`Self::for_move`]).
pub(super) last_location: bool,
}
/// How many anchors, and how many segments, the targets gather at most.
@@ -163,19 +166,30 @@ impl Targets {
/// Targets for moving the selection of `cx`: [`Self::collect`]'s but `exclude` (the selection,
/// or nothing for a copy, which leaves it behind), styled as `cx` asks, and with Smart Guides ›
/// Spacing Guides the objects it spaces itself evenly with ([`Self::snap_rect`]).
/// Spacing Guides the objects it spaces itself evenly with ([`Self::snap_rect`]). With Smart
/// Guides › Snap to Last Location, a move (not a copy, which has nothing in `exclude`) goes back
/// to where it began when it comes near ([`Self::snap_back`]).
pub fn for_move(cx: &ToolContext, exclude: &[NodeId]) -> Self {
let mut t = Self::collect(cx.doc, exclude, None).styled(cx);
if cx.spacing_guides {
t.boxes = object_boxes(cx.doc, &cx.selection.objects);
}
t.last_location = cx.snap_to_last_location && !exclude.is_empty();
t
}
/// Smart Guides › Snap to Last Location: a move by `d` that is no farther than `tol` from
/// where it began goes back there. Returns the guides for it, a "last location" label at the
/// center of `from` (the moved bounds when the move began), or None when the move stays where
/// it is: the option is off, the targets are for a copy, or `d` is longer than `tol`.
pub fn snap_back(&self, from: Option<Rect>, d: Vec2, tol: f64) -> Option<Vec<Overlay>> {
(self.last_location && d.hypot() <= tol).then(|| from.and_then(|r| self.label(r.center(), "last location")).into_iter().collect())
}
/// Targets for scaling the selection: the other art, styled as `cx` asks, and with Smart Guides ›
/// Spacing Guides the neighbours whose gaps the moving edge should match ([`Self::snap_scale`]).
pub fn for_scale(cx: &ToolContext) -> Self {
Self::for_move(cx, &cx.selection.objects)
Self { last_location: false, ..Self::for_move(cx, &cx.selection.objects) }
}
/// Targets for a drawn point: the art in `visible` (all of it for None) but `exclude`, its
+1
View File
@@ -532,6 +532,7 @@ pub(crate) mod testutil {
transform_tools_guides: true,
spacing_guides: true,
distance_guides: true,
snap_to_last_location: false,
snapping_tolerance: 4.0,
construction_angles: guides::construction_angles(guides::DEFAULT_CONSTRUCTION_ANGLES),
screen: None,
+10 -2
View File
@@ -231,9 +231,13 @@ impl MoveSnap {
}
/// The move (`copy`: the copy) by `d` of the selection grabbed at `start`, snapped, and its
/// guides.
/// guides. With Smart Guides › Snap to Last Location, a move within Snapping Tolerance of where
/// it began goes back there before anything else snaps ([`Targets::snap_back`]).
pub(crate) fn snap(&self, cx: &ToolContext, start: Point, mut d: Vec2, copy: bool) -> (Vec2, Vec<Overlay>) {
let (targets, points) = if copy { (&self.copy_targets, &self.copy_points) } else { (&self.targets, &self.points) };
if let Some(ov) = targets.as_ref().and_then(|t| t.snap_back(self.bounds, d, cx.snap_tol())) {
return (Vec2::ZERO, ov);
}
let mut guides = vec![];
if cx.snap_to_grid
&& let Some(b) = self.bounds
@@ -291,7 +295,8 @@ impl MoveSnap {
/// whole pixel on either axis (the one axis of a level or upright line). The bounds line up
/// with the other art ([`Targets::snap_rects_along`]) and the grabbed point lands where the line
/// passes an anchor or crosses a ruler guide ([`Targets::snap_point_along`]). A move of zero
/// length does not snap.
/// length does not snap, and Snap to Last Location goes back to where the move began first, as
/// in [`Self::snap`].
pub(crate) fn snap_along(&self, cx: &ToolContext, start: Point, mut d: Vec2, copy: bool) -> (Vec2, Vec<Overlay>) {
let len = d.hypot();
if !len.is_finite() || len <= 1e-9 {
@@ -309,6 +314,9 @@ impl MoveSnap {
.unwrap_or(0.0)
};
let (targets, points) = if copy { (&self.copy_targets, &self.copy_points) } else { (&self.targets, &self.points) };
if let Some(ov) = targets.as_ref().and_then(|t| t.snap_back(self.bounds, d, cx.snap_tol())) {
return (Vec2::ZERO, ov);
}
let mut guides = vec![];
if cx.snap_to_grid
&& let Some(b) = self.bounds
+41
View File
@@ -782,6 +782,47 @@ fn an_alt_copy_snaps_to_the_original_left_behind() {
assert_eq!(dx(&t.pointer(&c, &ev(PointerKind::Drag, 253.0, 150.0))), 103.0);
}
/// Smart Guides › Snap to Last Location: a move that comes within Snapping Tolerance of where it
/// began goes back there, labeled "last location", a Shift move too; farther out, with the option
/// or Smart Guides off, it stays where it is dragged, and an Alt copy snaps as it does with the
/// option off.
#[test]
fn snap_to_last_location_puts_a_move_back_where_it_began() {
let (mut d, id) = doc_with_rect();
// An artboard whose edges and center are out of reach.
d.artboards[0].rect = Rect::new(0.0, 0.0, 1000.0, 1000.0);
let mut s = Selection::default();
s.add(id);
let p = paint();
let on = ToolContext { snap_to_last_location: true, snapping_tolerance: 10.0, ..cx(&d, &s, &p) };
let moved = |c: &ToolContext, to: (f64, f64), m: Mods| {
let mut t = SelectionTool::default();
t.pointer(c, &ev(PointerKind::Down, 150.0, 150.0).with_mods(m));
let a = t.pointer(c, &ev(PointerKind::Drag, to.0, to.1).with_mods(m));
let Some(Action::Preview(_, v)) = a.last() else { panic!("{a:?}") };
let labels: Vec<String> =
t.overlays(c).into_iter().filter_map(|o| if let Overlay::Label { text, .. } = o { Some(text) } else { None }).collect();
(Vec2::new(v["matrix"][4].as_f64().unwrap(), v["matrix"][5].as_f64().unwrap()), labels)
};
let none = Mods::default();
let (back, labels) = moved(&on, (156.0, 155.0), none);
assert!(moved_by(back, (0.0, 0.0)), "{back:?}: 7.8 pt away, within 10");
assert_eq!(labels, ["last location"]);
let shift = Mods { shift: true, ..none };
assert!(moved_by(moved(&on, (157.0, 150.0), shift).0, (0.0, 0.0)), "a Shift move goes back too");
let (out, labels) = moved(&on, (159.0, 158.0), none);
assert!(moved_by(out, (9.0, 8.0)), "{out:?}: 12 pt away, out of reach");
assert!(labels.is_empty(), "{labels:?}");
let off = ToolContext { snap_to_last_location: false, ..on };
assert!(moved_by(moved(&off, (156.0, 155.0), none).0, (6.0, 5.0)), "the option off");
let no_guides = ToolContext { smart_guides: false, ..on };
assert!(moved_by(moved(&no_guides, (156.0, 155.0), none).0, (6.0, 5.0)), "Smart Guides off");
// An Alt copy lines up with the original it leaves behind, as it does with the option off.
let alt = Mods { alt: true, ..none };
let (copy, labels) = moved(&on, (156.0, 155.0), alt);
assert_eq!((copy, labels.contains(&"last location".to_string())), (moved(&off, (156.0, 155.0), alt).0, false), "{labels:?}");
}
/// A move shows the filled arrow, hollow while it snaps (here B's left side onto A's right
/// one); Alt, which leaves a copy behind, the double arrowhead.
#[test]
+1
View File
@@ -3166,6 +3166,7 @@ digits Malayalam Малаялам
Spaces Интервали
Spacing Guides Водачи за разстояние
Invoke Distance Guides Извикване на водачи за отстояния
Snap to Last Location Прилепване към последното местоположение
Spacing: Разстояние:
Spanish Испански
Specified Distance Упоменато разстояние
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3654,6 +3654,7 @@ theme Appearance Izgled
Snapping Tolerance Tolerancija hvatanja
Spacing Guides Vodilice razmaka
Invoke Distance Guides Pozovi vodiče udaljenosti
Snap to Last Location Prilijepi uz posljednju lokaciju
Spanish Španski
Subdivisions Podjele
Templates Folder Folder predložaka
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -2032,6 +2032,7 @@ digits Malayalam Malaiàlam
Invert Pie Inverteix el diagrama circular
Inverted Round Rodó invertit
Invoke Distance Guides Invoca les guies de distància
Snap to Last Location Ajusta a l’última ubicació
Isolate Aïlla
Isolate Blending Aïlla la fusió
Isolate Group Aïlla el grup
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3695,6 +3695,7 @@ theme Appearance Motiv
Snapping Tolerance Tolerance přichytávání
Spacing Guides Vodítka rozestupů
Invoke Distance Guides Vyvolat vodítka vzdálenosti
Snap to Last Location Přichytávat k poslednímu umístění
Spanish Španělština
Subdivisions Dělení
Templates Folder Složka šablon
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3423,6 +3423,7 @@ theme Appearance Udseende
Snapping Tolerance Snap-tolerance
Spacing Guides Afstandshjælpelinjer
Invoke Distance Guides Aktivér hjælpelinjer for afstandsmåling
Snap to Last Location Fastgør til sidste placering
Spanish Spansk
Subdivisions Underinddelinger
Templates Folder Skabelonmappe
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3211,6 +3211,7 @@ effect Points Punkte
Spaces Leerzeichen
Spacing Guides Abstandshilfslinien
Invoke Distance Guides Distanzhilfslinien aufrufen
Snap to Last Location An letzter Position ausrichten
Spacing: Abstand:
Spanish Spanisch
Specified Distance Festgelegter Abstand
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3634,6 +3634,7 @@ digits Malayalam Μαλαγιάλαμ
Spaces Διαστήματα
Spacing Guides Οδηγοί αποστάσεων
Invoke Distance Guides Εμφάνιση οδηγών μέτρησης απόστασης
Snap to Last Location Προσκόλληση στην τελευταία θέση
Spanish Ισπανικά
Specified Distance Καθορισμένη απόσταση
Specified Steps Καθορισμένα βήματα
Can't render this file because it contains an unexpected character in line 163 and column 5.
+1
View File
@@ -3250,6 +3250,7 @@ digits Malayalam Malayálam
Spaces Espacios
Spacing Guides Guías de espaciado
Invoke Distance Guides Invocar guías de distancia
Snap to Last Location Ajustar a última ubicación
Spacing: Espaciado:
Spanish Español
Specified Distance Distancia especificada
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3619,6 +3619,7 @@ theme Appearance Ulkoasu
Snapping Tolerance Tartuntatoleranssi
Spacing Guides Välistysapuviivat
Invoke Distance Guides Käytä etäisyysapuviivoja
Snap to Last Location Kohdista viimeiseen sijaintiin
Spanish Espanja
Subdivisions Jaot
Templates Folder Mallipohjakansio
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3242,6 +3242,7 @@ digits Malayalam Malayalam
Spaces Espaces
Spacing Guides Repères d’espacement
Invoke Distance Guides Appeler les repères de distance
Snap to Last Location Magnétisme du dernier emplacement
Spacing: Espacement :
Spanish Espagnol
Specified Distance Distance définie
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -2251,6 +2251,7 @@
Invert Pie पाई उलटें
Inverted Round उल्टे दौर
Invoke Distance Guides दूरी गाइड्स दिखाएँ
Snap to Last Location अंतिम स्थान पर स्नैप करें
Isolate पृथक
Isolate Blending ब्लेंडिंग अलग करें
Isolate Group अलग समूह
Can't render this file because it is too large.
+1
View File
@@ -3885,6 +3885,7 @@ mark-style Japanese Japán
Spacing Térköz
Spacing Guides Térköz-segédvonalak
Invoke Distance Guides Távolság-segédvonalak előhívása
Snap to Last Location Illesztés az utolsó helyre
Spacing: Térköz:
Spanish Spanyol
Spatter Fröcskölés
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3423,6 +3423,7 @@ theme Appearance Tampilan
Snapping Tolerance Toleransi kancing
Spacing Guides Panduan jarak
Invoke Distance Guides Panggil panduan pengukuran jarak
Snap to Last Location Snap ke lokasi terakhir
Spanish Spanyol
Subdivisions Subdivisi
Templates Folder Folder templat
Can't render this file because it contains an unexpected character in line 2243 and column 5.
+1
View File
@@ -3286,6 +3286,7 @@ digits Malayalam Malayalam
Spaces Spazi
Spacing Guides Guide di spaziatura
Invoke Distance Guides Richiama guide di distanza
Snap to Last Location Aggancia all'ultima posizione
Spacing: Spaziatura:
Spanish Spagnolo
Specified Distance Distanza specificata
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3068,6 +3068,7 @@ mark-style Japanese 日本式
Spaces スペース
Spacing Guides 間隔ガイド
Invoke Distance Guides 距離ガイドを呼び出す
Snap to Last Location 最後の位置にスナップ
Spacing: 間隔:
Spanish スペイン語
Specify: 指定:
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3240,6 +3240,7 @@ theme Appearance იერსახე
Snapping Tolerance მიბმის დაშვება
Spacing Guides შუალედის დამხმარე ხაზები
Invoke Distance Guides მანძილის დამხმარე ხაზების გამოძახება
Snap to Last Location ბოლო მდებარეობაზე მიბმა
Spanish ესპანური
Subdivisions ქვედანაყოფები
Templates Folder შაბლონების საქაღალდე
Can't render this file because it is too large.
+1
View File
@@ -3057,6 +3057,7 @@ mark-style Japanese 일본식
Spaces 공백
Spacing Guides 간격 안내선
Invoke Distance Guides 거리 안내선 호출
Snap to Last Location 마지막 위치에 스냅
Spacing: 간격:
Spanish Español
Specify: 지정:
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3437,6 +3437,7 @@ theme Appearance Vormgeving
Snapping Tolerance Snapping-tolerantie
Spacing Guides Hulplijnen voor tussenruimte
Invoke Distance Guides Afstandshulplijnen oproepen
Snap to Last Location Uitlijnen op laatste locatie
Spanish Spaans
Subdivisions Onderverdelingen
Templates Folder Sjablonenmap
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3558,6 +3558,7 @@ theme Appearance Wygląd
Snapping Tolerance Tolerancja przyciągania
Spacing Guides Linie odstępów
Invoke Distance Guides Wywołuj linie odległości
Snap to Last Location Przyciągaj do ostatniego położenia
Spanish Hiszpański
Subdivisions Podpodziały
Templates Folder Folder szablonów
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -2713,6 +2713,7 @@ digits Malayalam Malaiala
Spaces Espaços
Spacing Guides Guias de Espaçamento
Invoke Distance Guides Invocar Guias de Distância
Snap to Last Location Ajustar ao Último Local
Spacing: Espaçamento:
Spanish Espanhol
Specify: Especificar:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -3281,6 +3281,7 @@ digits Malayalam Малаялам
Spaces Пробелы
Spacing Guides Направляющие интервалов
Invoke Distance Guides Вызывать направляющие расстояний
Snap to Last Location Привязать к последнему положению
Spacing: Интервал:
Spanish Испанский
Specified Distance Заданное расстояние
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -3172,6 +3172,7 @@ digits Malayalam Malayalam
Spaces Blanksteg
Spacing Guides Avståndsstödlinjer
Invoke Distance Guides Anropa mätstödlinjer för avstånd
Snap to Last Location Fäst mot senaste plats
Spacing: Avstånd:
Spanish Spanska
Specified Distance Angivet avstånd
Can't render this file because it contains an unexpected character in line 5 and column 25.
+1
View File
@@ -3074,6 +3074,7 @@ digits Malayalam Malayalam
Spaces Alanlar
Spacing Guides Aralık Kılavuzları
Invoke Distance Guides Mesafe Kılavuzlarını Çağır
Snap to Last Location Son Konuma Yasla
Spacing: Aralık:
Spanish İspanyolca
Specified Distance Belirtilen Mesafe
Can't render this file because it contains an unexpected character in line 5 and column 25.
+1
View File
@@ -3279,6 +3279,7 @@ effect Points Точки
Spaces Пробіли
Spacing Guides Напрямні інтервалів
Invoke Distance Guides Викликати напрямні відстаней
Snap to Last Location Прив’язати до останнього розташування
Spacing: Інтервал:
Spanish Іспанська
Specified Distance Задана відстань
Can't render this file because it contains an unexpected character in line 177 and column 5.
+1
View File
@@ -3613,6 +3613,7 @@ mark-style Japanese Kiểu Nhật
Spacing Khoảng cách
Spacing Guides Đường căn khoảng cách
Invoke Distance Guides Gọi đường căn đo khoảng cách
Snap to Last Location Hút vào vị trí cuối cùng
Spacing: Khoảng cách:
Spanish Tiếng Tây Ban Nha
Spatter Bắn tung tóe
Can't render this file because it contains an unexpected character in line 199 and column 5.
+1
View File
@@ -3119,6 +3119,7 @@ digits Malayalam 马拉雅拉姆数字
Spaces 空格
Spacing Guides 间距参考线
Invoke Distance Guides 调用距离参考线
Snap to Last Location 对齐上一位置
Spacing: 间距:
Spanish 西班牙语
Specified Distance 指定距离
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -4148,6 +4148,7 @@ digits Malayalam 馬來亞拉姆數字
Spaces 空格
Spacing Guides 間距參考線
Invoke Distance Guides 叫用距離參考線
Snap to Last Location 靠齊上一個位置
Spacing: 間距:
Spanish 西班牙文
Specified Distance 指定距離
Can't render this file because it contains an unexpected character in line 6 and column 47.
+4
View File
@@ -3657,6 +3657,10 @@ Guides change where a snapped point lands:
object under the pointer (the gap between their facing edges on an axis on which they lie apart, else the offsets
of their two edges on it) or, over no object, to the left, right, top and bottom edges of the artboard under the
pointer: measured lines labelled in the General unit. Off, Alt-hovering shows none.
- `snapToLastLocation` (Snap to Last Location, off by default): with Smart Guides on, a selection moved by dragging
(Selection, Group Selection or Direct Selection tool / `pointer_gesture` with `selection`, Shift too) goes back to
where the move began while the move is no longer than `snappingTolerance`, labeled "last location"; farther, it
snaps as before. An Alt copy is not pulled back onto its original. A value that is not a boolean is refused.
The Snap to Glyph options (the desktop app's Character panel menu › Show Snap to Glyph Options; View › Snap to Glyph
is the desktop app's): `view.snapToGlyph.options {baseline?, xHeight?, bounds?, proximity?, angular?, anchors?}` (or
+1
View File
@@ -914,6 +914,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
- **Drawing aids:** Smart Guides and snapping (moving, with the Selection, Group Selection or Direct Selection tool, and resizing by the bounding-box handles with the Selection or Free Transform tool, Shift and Alt too: the dragged corner or side lands on the other objects' anchors and centres ("anchor", "center") or lines up with their edges and centres (a line and "align"); with Smart Guides › Spacing Guides, a moved selection that lines up with nothing along an axis lands as far from its neighbour as two other objects of its row or column are apart, or halfway between its two neighbours, the equal gaps marked; with View › Snap to Grid on, a moved selection lands on the grid instead, by whichever of its edges is nearest a gridline on each axis (the center does not snap), #740, #1816; the Rotate, Scale, Shear and Reflect tools drag from the anchor they grab and snap the pointer the same way, so a corner dragged onto another object's anchor scales exactly onto it, #482; anchors dragged with Direct Selection: the one pressed on lands on other anchors, its own path's that stay put among them, on path segments or in line with them, the others following, Shift keeps 45° steps, and with Smart Guides off Snap to Point pulls it onto anchors; the Artboard tool snaps artboards, and their bleed, to other artboards, bleeds and art, the grid or whole pixels while moving, copying and resizing them, and the Transform panel shows and edits the active artboard's X/Y/W/H; drawn points, #506: hovering shows where the press goes, the point lands on the other objects' anchors, centres and paths ("anchor", "center", "path") or lines up with their anchors, edges and centres ("align"), the Pen's on the path being drawn too, near a construction guide through the anchor before it on that guide (Preferences › Smart Guides › Construction Guides and Angles), and with Shift kept to its 45° step or a square's diagonal it slides along that way into line; the targets are gathered once per document state, from the art in the window, and the anchors, centres and lines near the pointer are found by bisection, so hovering never rescans the document), guides dragged out of the rulers (#451: they snap as moved guides do, Shift to the ruler's ticks; with the Artboard tool they are artboard guides, which run across their artboard only and move, copy and delete with it, `guide.add {artboard}`) that the Selection, Direct Selection and Group Selection tools then pick and drag (#414: the selected guides highlight and move together, Alt copies them, Shift snaps the dragged one to the ticks, otherwise it snaps to pixels, the grid or the edges, centres (so the sides' midpoints) and anchors of the art and the artboards, or with Smart Guides off Snap to Point pulls it onto anchors; Shift-clicked they join the selected art, and Shift-added art keeps them, so guides and art are selected together in either order, Delete then deleting both in one step; the arrow keys nudge them, Delete deletes them, dragging one back onto its ruler deletes it, Lock Guides and Hide Guides leave them alone; `guide.list`, `guide.select`, `guide.move` and `guide.remove` reach agents), a right-click on either ruler or the origin box to pick the document's units (the current one checked; `document.setUnits`, one undo step, #528), and Draw Normal / Behind / Inside modes. Smart Guides: a point drawn with the Pen or a shape tool, and an anchor dragged with Direct Selection, snaps to where paths and ruler guides cross, labelled "intersect" (#1658, part of #1602; a moved selection's own anchors don't).
A move that Shift keeps level, upright or diagonal stays on that line when it snaps, with the Selection, Group Selection or Direct Selection tool. It slides along the line until the selection lands on the grid or on whole pixels, lines up with the other objects or is spaced evenly with them, or until the line passes an anchor or crosses a ruler guide near the point the selection was grabbed by. A level or upright move snaps along its own axis only.
Distance Guides: with Smart Guides on (View › Smart Guides and Preferences › Smart Guides › Invoke Distance Guides, on by default), something selected and the Selection tool, holding Alt/Option over another object shows the distances between the selection's bounds and that object's: on an axis on which they lie apart, one line across the gap between their facing edges; on one on which they overlap, the offsets of their left and right (top and bottom) edges, each line running across the middle of where they overlap, with a dashed line out to the other object's edge when it passes beside it. Over an empty part of an artboard it shows the selection's distances from the artboard's left, right, top and bottom edges. Each line has ticks at its ends and its length in a pill of the smart guide colour, in the General unit; letting Alt go, pressing (a pan or zoom press too), moving off them, leaving the canvas or a floating panel, menu or dialog over the pointer takes them away, and with the pointer still they follow what lies under it as the view scrolls, zooms or turns, as the document, the tab or the selection changes, and when the Selection tool is switched to. Behaviour from the public [Use Distance Guides for accurate placement](https://helpx.adobe.com/illustrator/desktop/measure-and-align/grids-and-guides/use-distance-guides-for-accurate-placement.html) and [Smart Guides options](https://helpx.adobe.com/illustrator/desktop/measure-and-align/grids-and-guides/smart-guides-options.html) pages, which describe hovering only: nothing shows while moving or nudging. Tests: `select::tests::alt_over_*`, `select::tests::distance_guides_need_alt_a_selection_and_smart_guides`, `tests_prefs::invoke_distance_guides_measures_the_selection_to_the_object_under_alt`, `canvas::tests::alt_over_another_object_draws_the_distance_guide_label`, `canvas::tests::distance_guides_go_when_the_hover_ends`, `canvas::tests::distance_guides_follow_what_lies_under_a_still_pointer`.
Snap to Last Location: with Smart Guides on and Preferences › Smart Guides › Snap to Last Location on (off by default, VectorCraft's own choice), a selection moved by dragging with the Selection, Group Selection or Direct Selection tool, Shift too, goes back to where the move began while it is within Snapping Tolerance of it, labeled "last location"; an Alt copy is not pulled back onto its original (`prefs.set` key `snapToLastLocation`). The public [Smart Guides options](https://helpx.adobe.com/illustrator/desktop/measure-and-align/grids-and-guides/smart-guides-options.html) page lists the option as snapping objects back to their previous position; the distance, the label and the copy rule are VectorCraft's own. Tests: `select::tests::snap_to_last_location_puts_a_move_back_where_it_began`, `tests_prefs::snap_to_last_location_puts_a_dragged_square_back`.
A move pressed on a path's stroke, or within 6 px of its outline away from its anchors and center, is held by the nearest point of that path, with the Selection, Group Selection or Direct Selection tool, and a straight segment Direct Selection drags is held by its own nearest point. That point is what snaps, so the path lands exactly on a ruler guide (with "align") instead of the pressed spot landing there and the path a few pixels beside it, an offset that showed only zoomed far in (#3701). A press in the middle of a fill still snaps the pressed spot: the public [Align objects with guides](https://helpx.adobe.com/illustrator/desktop/measure-and-align/grids-and-guides/align-graphic-objects-with-guides.html) page has Snap to Point align the point under the pointer, which is placed exactly where the object should meet the guide.
A bounding-box handle dragged with the Selection or Free Transform tool snaps what it moves as a dragged point snaps (#2054). With View › Snap to Grid on, it snaps to the nearest gridline, and with Snap to Pixel on, it snaps to whole pixels. With Smart Guides off and Snap to Point on, it snaps to the other objects' anchors and the ruler guides within the Snap to Point distance. With Smart Guides and Snap to Point both on, it lines up with the ruler guides as well as the other objects. Shift still keeps the proportions, and Alt still scales about the center.
A user slice's edge or corner handle dragged with the Slice Selection tool snaps as the Slice tool's drag does. With View › Snap to Grid on, it snaps to the nearest gridline, and with Snap to Pixel on, it snaps to whole pixels. Otherwise, with Smart Guides on, it lands on or lines up with the anchors, centers and edges of the art and the artboards, and with Smart Guides off and Snap to Point on, it snaps to the art's anchors and the ruler guides within the Snap to Point distance. Then a ruler guide within 5 px, shown and unlocked, moves the side or corner onto it. Shift still keeps the proportions, and Alt still resizes about the center.