Actions: Batch refuses Save and Close over data sets instead of saving each one over the open document

Data sets share one open document, so Save and Close saved every data set
over the same file and only the last one survived. action.batch now
returns an error for source datasets with destination saveAndClose before
it selects a data set or runs a step, and the Batch dialog offers None and
Folder for a Data Sets source, moving a Save and Close choice to Folder.
This commit is contained in:
dotCooCoo
2026-11-08 23:50:27 +07:00
committed by bflatastic
parent f118cf6aa6
commit 7fd287238f
31 changed files with 145 additions and 6 deletions
@@ -73,6 +73,10 @@ pub(super) fn action_batch(s: &mut Session, p: &Value) -> Result<Value> {
if !matches!(destination, "none" | "saveAndClose" | "folder") {
return Err(bad(C, "`destination` must be `none`, `saveAndClose` or `folder`"));
}
// Data sets share one open document, so Save and Close would write every row over one file.
if source == "datasets" && destination == "saveAndClose" {
return Err(bad(C, "Save and Close cannot batch data sets: choose Folder to save each data set to its own file"));
}
let dest_folder = str_param(p, "destinationFolder").map(absolute_path);
if destination == "folder" {
let Some(ref folder) = dest_folder else {
@@ -1292,6 +1296,78 @@ mod tests {
assert_eq!(file_names(&dest), ["Untitled_A-B-3.vectorcraft", "Untitled_a-b-2.vectorcraft", "Untitled_a-b.vectorcraft"], "{r}");
}
/// A saved document with a text object bound to `Name` and two data sets, `A` and `B`.
fn saved_with_two_data_sets(path: &std::path::Path) -> Session {
let mut s = Session::new();
s.execute("file.new", &json!({"width": 200, "height": 100})).unwrap();
let id = s.execute("text.create", &json!({"x": 10, "y": 40, "text": "A"})).unwrap()["id"].as_u64().unwrap();
s.execute("variable.define", &json!({"name": "Name", "kind": "text"})).unwrap();
s.execute("variable.bind", &json!({"variable": "Name", "ids": [id]})).unwrap();
s.execute("dataset.capture", &json!({"name": "A"})).unwrap();
s.execute("text.setText", &json!({"ids": [id], "text": "B"})).unwrap();
s.execute("dataset.capture", &json!({"name": "B"})).unwrap();
s.execute("document.save", &json!({"path": path.to_string_lossy()})).unwrap();
s
}
fn save_and_close_over_data_sets(s: &mut Session) -> Result<Value> {
s.execute(
"action.batch",
&json!({"source": "datasets", "destination": "saveAndClose", "commands": [{"command": "object.unlockAll", "params": {}}]}),
)
}
#[test]
fn batch_refuses_save_and_close_over_data_sets_before_writing() {
let path = tmp("save-close-sets").join("template.vectorcraft");
let mut s = saved_with_two_data_sets(&path);
let bytes = std::fs::read(&path).unwrap();
let (active, revision) = {
let st = s.doc().unwrap();
(st.doc.variables.active_dataset.clone(), st.revision)
};
let msg = save_and_close_over_data_sets(&mut s).unwrap_err().to_string();
assert!(msg.contains("choose Folder"), "{msg}");
assert_eq!(std::fs::read(&path).unwrap(), bytes, "the template is not written");
let st = s.doc().unwrap();
assert_eq!(st.doc.variables.active_dataset, active, "no data set is selected");
assert_eq!(st.revision, revision, "no step runs");
assert_eq!(st.path.as_deref(), Some(path.to_string_lossy().as_ref()), "the template stays open");
}
#[test]
fn batch_refuses_save_and_close_over_data_sets_of_an_unsaved_document() {
let mut s = with_data_sets(&["a", "b"]);
let (active, revision) = {
let st = s.doc().unwrap();
(st.doc.variables.active_dataset.clone(), st.revision)
};
let msg = save_and_close_over_data_sets(&mut s).unwrap_err().to_string();
assert!(msg.contains("choose Folder"), "{msg}");
let st = s.doc().unwrap();
assert_eq!(st.doc.variables.active_dataset, active, "no data set is selected");
assert_eq!(st.revision, revision, "no step runs");
assert!(st.path.is_none());
}
#[test]
fn batch_save_and_close_saves_and_closes_each_source_file() {
let src = tmp("save-close-src");
let a = write_svg(&src, "a.svg", "#f00");
let before = std::fs::read(&a).unwrap();
let mut s = Session::new();
let r = s
.execute(
"action.batch",
&json!({"folder": src.to_string_lossy(), "destination": "saveAndClose", "commands": [{"command": "object.unlockAll", "params": {}}]}),
)
.unwrap();
assert_eq!(r["failed"], 0, "{r}");
assert_ne!(std::fs::read(&a).unwrap(), before, "the source file is saved over");
assert_eq!(file_names(&src), ["a.svg"], "{r}");
assert!(s.doc().is_err(), "the source file is closed");
}
#[test]
fn batch_refuses_nesting_and_empty_commands() {
let mut s = Session::new();
+1 -1
View File
@@ -117,7 +117,7 @@ pub fn specs() -> Vec<CommandSpec> {
"Batch…",
[],
None,
"{commands: [{command, params}] (the action's steps), source?: folder (default) | datasets, folder? (required for folder: the source folder), includeSubdirs?: false, destination?: none (default: leave each file open) | saveAndClose (save over the source and close) | folder (save or export into destinationFolder and close), destinationFolder? (required when destination is folder; also the folder Override Save/Export write into), datasetFileNaming?: fileNumber | fileDataSetName (default) | dataSetName (used only for source datasets; ignored for folder), overrideOpen?: true (skip document.open / file.open steps: the batch opens each source file), overrideSave?: true (point document.save / file.save / file.saveAs at destinationFolder/{stem}.{ext}), overrideExport?: true (point document.export / document.exportForScreens / document.exportSelection the same way), stopOnError?: true, label?} play the commands on every readable file in folder (and its subfolders when includeSubdirs), or on every data set of the open document. Data set names use the document stem plus a three-digit ordinal, the document stem and an underscore plus the data set name, or the data set name alone. Invalid file name characters become `-`; a name already used in the batch or whose output already exists in a destination folder the batch may read and write gets the next free `-2`, `-3` suffix before the format-derived extension. Caps: 500 files or data sets, 8 folder levels, 256 steps. Batches cannot nest. → {processed: [{path|dataset, result|error}…], count, failed, stopped}",
"{commands: [{command, params}] (the action's steps), source?: folder (default) | datasets, folder? (required for folder: the source folder), includeSubdirs?: false, destination?: none (default: leave each file open) | saveAndClose (save over the source and close; refused for source datasets: use folder to save each data set to its own file) | folder (save or export into destinationFolder and close), destinationFolder? (required when destination is folder; also the folder Override Save/Export write into), datasetFileNaming?: fileNumber | fileDataSetName (default) | dataSetName (used only for source datasets; ignored for folder), overrideOpen?: true (skip document.open / file.open steps: the batch opens each source file), overrideSave?: true (point document.save / file.save / file.saveAs at destinationFolder/{stem}.{ext}), overrideExport?: true (point document.export / document.exportForScreens / document.exportSelection the same way), stopOnError?: true, label?} play the commands on every readable file in folder (and its subfolders when includeSubdirs), or on every data set of the open document. Data set names use the document stem plus a three-digit ordinal, the document stem and an underscore plus the data set name, or the data set name alone. Invalid file name characters become `-`; a name already used in the batch or whose output already exists in a destination folder the batch may read and write gets the next free `-2`, `-3` suffix before the format-derived extension. Caps: 500 files or data sets, 8 folder levels, 256 steps. Batches cannot nest. → {processed: [{path|dataset, result|error}…], count, failed, stopped}",
always,
action_batch::action_batch
),
+38 -4
View File
@@ -77,7 +77,12 @@ fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool {
}
ui.add_space(8.0);
form::choice(ui, d, "destination", "Destination:", (LABEL, 200.0), &[("none", "None"), ("saveAndClose", "Save and Close"), ("folder", "Folder")]);
let choices = destinations(&source);
let destination = d.str("destination");
if !choices.iter().any(|(value, _)| *value == destination) {
d.fields.insert("destination".into(), json!("folder"));
}
form::choice(ui, d, "destination", "Destination:", (LABEL, 200.0), choices);
if d.str("destination") == "folder" {
widgets::label_row(ui, tl!("Destination Folder:"), LABEL, |ui| {
form::text(ui, d, "destinationFolder", 200.0);
@@ -95,6 +100,16 @@ fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool {
false
}
/// The Destination choices for `source`. Data sets share one open document, so Save and Close is
/// offered for a Folder source only.
fn destinations(source: &str) -> &'static [(&'static str, &'static str)] {
if source == "datasets" {
&[("none", "None"), ("folder", "Folder")]
} else {
&[("none", "None"), ("saveAndClose", "Save and Close"), ("folder", "Folder")]
}
}
fn confirm(app: &mut VectorcraftApp, d: &Dialog) -> Result<Value, String> {
let set = d.fields.get("set").and_then(Value::as_u64).unwrap_or(0) as usize;
let action = d.fields.get("action").and_then(Value::as_u64).unwrap_or(0) as usize;
@@ -161,6 +176,13 @@ mod tests {
use vectorcraft_engine::Session;
fn shown(source: &str) -> Vec<String> {
let mut d = Dialog::new(KIND, initial_fields(0, 0, "Test"));
d.fields["source"] = json!(source);
render(&mut d)
}
/// Draws `d` once and returns the texts it shows.
fn render(d: &mut Dialog) -> Vec<String> {
fn collect(shape: &egui::Shape, out: &mut Vec<String>) {
match shape {
egui::Shape::Text(t) => out.push(t.galley.text().to_string()),
@@ -169,12 +191,10 @@ mod tests {
}
}
let mut app = VectorcraftApp::new(Session::new(), Default::default());
let mut d = Dialog::new(KIND, initial_fields(0, 0, "Test"));
d.fields["source"] = json!(source);
let ctx = egui::Context::default();
crate::theme::install_fonts(&ctx);
let mut frame = ctx.run_ui(Default::default(), |ui| {
body(&mut app, ui, &mut d);
body(&mut app, ui, d);
});
frame.textures_delta.clear();
let mut labels = vec![];
@@ -220,4 +240,18 @@ mod tests {
d.fields["source"] = json!("folder");
assert!(params(&d, "Test", vec![]).get("datasetFileNaming").is_none());
}
#[test]
fn data_sets_do_not_offer_save_and_close() {
assert!(!destinations("datasets").iter().any(|(value, _)| *value == "saveAndClose"));
assert!(destinations("folder").iter().any(|(value, _)| *value == "saveAndClose"));
let mut d = Dialog::new(KIND, initial_fields(0, 0, "Test"));
d.fields["destination"] = json!("saveAndClose");
assert!(render(&mut d).iter().any(|label| label == "Save and Close"));
d.fields["source"] = json!("datasets");
let labels = render(&mut d);
assert!(!labels.iter().any(|label| label == "Save and Close"), "{labels:?}");
assert!(labels.iter().any(|label| label == "Destination Folder:"), "{labels:?}");
assert_eq!(params(&d, "Test", vec![])["destination"], "folder");
}
}
+1
View File
@@ -6099,6 +6099,7 @@ breakText Glyphs Глифи
File + Data Set Name Файл + име на набора от данни
Data Set Name Име на набора от данни
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` трябва да е `fileNumber`, `fileDataSetName` или `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „Запазване и затваряне“ не може да обработва набори от данни: изберете „Папка“, за да запишете всеки набор от данни в отделен файл
@msg no free data set file name in destination folder Няма свободно име за файл на набор от данни в целевата папка
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6111,6 +6111,7 @@ shape Open Otvoren
File + Data Set Name Datoteka + naziv skupa podataka
Data Set Name Naziv skupa podataka
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` mora biti `fileNumber`, `fileDataSetName` ili `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „Sačuvaj i zatvori“ ne može obraditi skupove podataka: odaberite „Folder“ da biste svaki skup podataka sačuvali u zasebnu datoteku
@msg no free data set file name in destination folder Nema slobodnog naziva datoteke skupa podataka u odredišnoj mapi
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6255,6 +6255,7 @@ breakText Glyphs Glifs
File + Data Set Name Fitxer + nom del conjunt de dades
Data Set Name Nom del conjunt de dades
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` ha de ser `fileNumber`, `fileDataSetName` o `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file «Desa i tanca» no pot processar conjunts de dades: trieu «Carpeta» per desar cada conjunt de dades en un fitxer propi
@msg no free data set file name in destination folder No hi ha cap nom de fitxer de conjunt de dades lliure a la carpeta de destinació
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6274,6 +6274,7 @@ breakText Glyphs Glyfy
File + Data Set Name Soubor + název sady dat
Data Set Name Název sady dat
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` musí být `fileNumber`, `fileDataSetName` nebo `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „Uložit a zavřít“ nelze použít pro sady dat: zvolte „Složka“, aby se každá sada dat uložila do vlastního souboru
@msg no free data set file name in destination folder V cílové složce není volný název souboru sady dat
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6114,6 +6114,7 @@ breakText Glyphs Glyffer
File + Data Set Name Fil + datasætnavn
Data Set Name Datasætnavn
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` skal være `fileNumber`, `fileDataSetName` eller `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file "Gem og luk" kan ikke køre på datasæt: vælg "Mappe" for at gemme hvert datasæt i sin egen fil
@msg no free data set file name in destination folder Intet ledigt filnavn til datasættet i destinationsmappen
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -5859,6 +5859,7 @@ breakText Glyphs Glyphen
File + Data Set Name Datei + Datensatzname
Data Set Name Datensatzname
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` muss `fileNumber`, `fileDataSetName` oder `dataSetName` sein
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „Speichern und schließen“ kann nicht auf Datensätze angewendet werden: Wählen Sie „Ordner“, um jeden Datensatz in einer eigenen Datei zu speichern
@msg no free data set file name in destination folder Kein freier Dateiname für den Datensatz im Zielordner
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6225,6 +6225,7 @@ breakText Glyphs Γλύφοι
File + Data Set Name Αρχείο + όνομα συνόλου δεδομένων
Data Set Name Όνομα συνόλου δεδομένων
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` Το `datasetFileNaming` πρέπει να είναι `fileNumber`, `fileDataSetName` ή `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file Η «Αποθήκευση και κλείσιμο» δεν μπορεί να εφαρμοστεί σε σύνολα δεδομένων: επιλέξτε «Φάκελος» για να αποθηκευτεί κάθε σύνολο δεδομένων σε δικό του αρχείο
@msg no free data set file name in destination folder Δεν υπάρχει διαθέσιμο όνομα αρχείου συνόλου δεδομένων στον φάκελο προορισμού
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 168 and column 5.
+1
View File
@@ -6216,6 +6216,7 @@ breakText Glyphs Glifos
File + Data Set Name Archivo + nombre del conjunto de datos
Data Set Name Nombre del conjunto de datos
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` debe ser `fileNumber`, `fileDataSetName` o `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file «Guardar y cerrar» no puede procesar conjuntos de datos: elija «Carpeta» para guardar cada conjunto de datos en su propio archivo
@msg no free data set file name in destination folder No hay un nombre de archivo libre para el conjunto de datos en la carpeta de destino
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6304,6 +6304,7 @@ breakText Glyphs Merkit
File + Data Set Name Tiedosto + tietojoukon nimi
Data Set Name Tietojoukon nimi
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming`-arvon on oltava `fileNumber`, `fileDataSetName` tai `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file ”Tallenna ja sulje” ei voi käsitellä tietojoukkoja: valitse ”Kansio”, niin jokainen tietojoukko tallennetaan omaan tiedostoonsa
@msg no free data set file name in destination folder Kohdekansiossa ei ole vapaata tietojoukon tiedostonimeä
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6269,6 +6269,7 @@ breakText Glyphs Glyphes
File + Data Set Name Fichier + nom du jeu de données
Data Set Name Nom du jeu de données
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` doit être `fileNumber`, `fileDataSetName` ou `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file « Enregistrer et fermer » ne peut pas traiter les jeux de données : choisissez « Dossier » pour enregistrer chaque jeu de données dans son propre fichier
@msg no free data set file name in destination folder Aucun nom de fichier libre pour le jeu de données dans le dossier de destination
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6258,6 +6258,7 @@ breakText Glyphs Glifák
File + Data Set Name Fájl + adatkészlet neve
Data Set Name Adatkészlet neve
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` A `datasetFileNaming` értéke `fileNumber`, `fileDataSetName` vagy `dataSetName` lehet
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file A „Mentés és bezárás” nem dolgozhat fel adatkészleteket: válassza a „Mappa” lehetőséget, hogy minden adatkészlet külön fájlba kerüljön
@msg no free data set file name in destination folder Nincs szabad adatkészlet-fájlnév a célmappában
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6114,6 +6114,7 @@ breakText Glyphs Glif
File + Data Set Name File + nama set data
Data Set Name Nama set data
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` harus `fileNumber`, `fileDataSetName`, atau `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file "Simpan dan tutup" tidak dapat memproses set data: pilih "Folder" untuk menyimpan setiap set data ke file tersendiri
@msg no free data set file name in destination folder Tidak ada nama file set data yang tersedia di folder tujuan
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2260 and column 5.
+1
View File
@@ -5893,6 +5893,7 @@ breakText Glyphs Glifi
File + Data Set Name File + nome set di dati
Data Set Name Nome set di dati
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` deve essere `fileNumber`, `fileDataSetName` o `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file «Salva e chiudi» non può elaborare i set di dati: scegli «Cartella» per salvare ogni set di dati in un file a sé
@msg no free data set file name in destination folder Nessun nome file libero per il set di dati nella cartella di destinazione
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -5958,6 +5958,7 @@ breakText Glyphs 字形
File + Data Set Name ファイル名 + データセット名
Data Set Name データセット名
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` は `fileNumber`、`fileDataSetName`、`dataSetName` のいずれかである必要があります
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file 「保存して閉じる」ではデータセットをバッチ処理できません:各データセットを個別のファイルに保存するには「フォルダー」を選択してください
@msg no free data set file name in destination folder 保存先フォルダーに使用可能なデータセットのファイル名がありません
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6271,6 +6271,7 @@ breakText Glyphs გლიფები
File + Data Set Name ფაილი + მონაცემთა ნაკრების სახელი
Data Set Name მონაცემთა ნაკრების სახელი
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` უნდა იყოს `fileNumber`, `fileDataSetName` ან `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „შენახვა და დახურვა“ ვერ ამუშავებს მონაცემთა ნაკრებებს: აირჩიეთ „საქაღალდე“, რომ თითოეული მონაცემთა ნაკრები ცალკე ფაილში შეინახოთ
@msg no free data set file name in destination folder დანიშნულების საქაღალდეში მონაცემთა ნაკრებისთვის თავისუფალი ფაილის სახელი არ არის
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it is too large.
+1
View File
@@ -5854,6 +5854,7 @@ breakText Glyphs 글리프
File + Data Set Name 파일 + 데이터 세트 이름
Data Set Name 데이터 세트 이름
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming`은 `fileNumber`, `fileDataSetName` 또는 `dataSetName`이어야 합니다
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file '저장 후 닫기'로는 데이터 세트를 일괄 처리할 수 없습니다: 각 데이터 세트를 별도의 파일로 저장하려면 '폴더'를 선택하세요
@msg no free data set file name in destination folder 대상 폴더에 사용할 수 있는 데이터 세트 파일 이름이 없습니다
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6160,6 +6160,7 @@ breakText Glyphs Glyphs
File + Data Set Name Bestand + naam gegevensset
Data Set Name Naam gegevensset
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` moet `fileNumber`, `fileDataSetName` of `dataSetName` zijn
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file 'Opslaan en sluiten' kan geen gegevenssets verwerken: kies 'Map' om elke gegevensset in een eigen bestand op te slaan
@msg no free data set file name in destination folder Geen vrije bestandsnaam voor de gegevensset in de doelmap
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6128,6 +6128,7 @@ breakText Glyphs Glify
File + Data Set Name Plik + nazwa zestawu danych
Data Set Name Nazwa zestawu danych
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` musi mieć wartość `fileNumber`, `fileDataSetName` lub `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file „Zapisz i zamknij” nie może przetwarzać zestawów danych: wybierz „Folder”, aby zapisać każdy zestaw danych w osobnym pliku
@msg no free data set file name in destination folder Brak wolnej nazwy pliku zestawu danych w folderze docelowym
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6190,6 +6190,7 @@ breakText Glyphs Glifos
File + Data Set Name Arquivo + nome do conjunto de dados
Data Set Name Nome do conjunto de dados
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` deve ser `fileNumber`, `fileDataSetName` ou `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file "Salvar e fechar" não pode processar conjuntos de dados: escolha "Pasta" para salvar cada conjunto de dados em um arquivo próprio
@msg no free data set file name in destination folder Não há nome de arquivo livre para o conjunto de dados na pasta de destino
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -6251,6 +6251,7 @@ breakText Glyphs Глифы
File + Data Set Name Файл + имя набора данных
Data Set Name Имя набора данных
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` должно быть `fileNumber`, `fileDataSetName` или `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file «Сохранить и закрыть» не работает с наборами данных: выберите «Папка», чтобы сохранить каждый набор данных в отдельный файл
@msg no free data set file name in destination folder В папке назначения нет свободного имени файла для набора данных
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -6326,6 +6326,7 @@ breakText Glyphs Glyfer
File + Data Set Name Fil + datauppsättningens namn
Data Set Name Datauppsättningens namn
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` måste vara `fileNumber`, `fileDataSetName` eller `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file ”Spara och stäng” kan inte köras på datauppsättningar: välj ”Mapp” för att spara varje datauppsättning i en egen fil
@msg no free data set file name in destination folder Inget ledigt filnamn för datauppsättningen i målmappen
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 5 and column 25.
+1
View File
@@ -6231,6 +6231,7 @@ breakText Glyphs Glifler
File + Data Set Name Dosya + veri kümesi adı
Data Set Name Veri kümesi adı
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` değeri `fileNumber`, `fileDataSetName` veya `dataSetName` olmalıdır
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file "Kaydet ve Kapat" veri kümelerini toplu işleyemez: her veri kümesini ayrı bir dosyaya kaydetmek için "Klasör" seçeneğini seçin
@msg no free data set file name in destination folder Hedef klasörde veri kümesi için boş bir dosya adı yok
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 5 and column 25.
+1
View File
@@ -5873,6 +5873,7 @@ breakText Glyphs Гліфи
File + Data Set Name Файл + назва набору даних
Data Set Name Назва набору даних
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` має бути `fileNumber`, `fileDataSetName` або `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file «Зберегти й закрити» не працює з наборами даних: виберіть «Папка», щоб зберегти кожен набір даних в окремий файл
@msg no free data set file name in destination folder У папці призначення немає вільного імені файлу набору даних
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 182 and column 5.
+1
View File
@@ -5874,6 +5874,7 @@ breakText Glyphs Glyph
File + Data Set Name Tệp + tên tập dữ liệu
Data Set Name Tên tập dữ liệu
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` phải là `fileNumber`, `fileDataSetName` hoặc `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file "Lưu và đóng" không thể xử lý các tập dữ liệu: chọn "Thư mục" để lưu mỗi tập dữ liệu vào một tệp riêng
@msg no free data set file name in destination folder Không có tên tệp tập dữ liệu còn trống trong thư mục đích
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 204 and column 5.
+1
View File
@@ -6115,6 +6115,7 @@ breakText Glyphs 字形
File + Data Set Name 文件 + 数据集名称
Data Set Name 数据集名称
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` 必须是 `fileNumber`、`fileDataSetName` 或 `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file “存储并关闭”无法批处理数据集:请选择“文件夹”,将每个数据集存储为单独的文件
@msg no free data set file name in destination folder 目标文件夹中没有可用的数据集文件名
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 2 and column 73.
+1
View File
@@ -5911,6 +5911,7 @@ breakText Glyphs 字符
File + Data Set Name 檔案 + 資料集名稱
Data Set Name 資料集名稱
@msg `datasetFileNaming` must be `fileNumber`, `fileDataSetName` or `dataSetName` `datasetFileNaming` 必須是 `fileNumber`、`fileDataSetName` 或 `dataSetName`
@msg Save and Close cannot batch data sets: choose Folder to save each data set to its own file 「儲存並關閉」無法批次處理資料集:請選擇「資料夾」,將每個資料集儲存為個別檔案
@msg no free data set file name in destination folder 目的地資料夾中沒有可用的資料集檔案名稱
# Path Precision Tools add-on: Path Effects (Effect › Path Effects).
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3 -1
View File
@@ -3514,7 +3514,9 @@ Actions panel plays an action as a `command.batch`, omitting steps whose playbac
cleared. An action set saved as `.vcactions` keeps each excluded step with `excluded: true`; loading
an earlier version 1 set without that flag includes every step. The Actions panel menu's Batch… runs
`action.batch`: the same steps on every readable file in a folder (or every data set of the open document), with
destination `none` | `saveAndClose` | `folder` and Override Open / Save / Export. For a Data Sets source,
destination `none` | `saveAndClose` | `folder` and Override Open / Save / Export. A Data Sets source does not
take `saveAndClose`: `action.batch` refuses it before it selects a data set or runs a step, and the dialog offers
None and Folder only. For a Data Sets source,
`datasetFileNaming?: fileNumber | fileDataSetName | dataSetName` chooses File + Number (`source001`),
File + Data Set Name (`source_Alpha`), or Data Set Name (`Alpha`). An omitted parameter keeps File + Data Set Name
for existing callers; the dialog starts with File + Number. A folder source ignores this parameter. The folder
+1
View File
@@ -643,6 +643,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
- Actions panel: the panel menu's Duplicate copies the selected action, else the current action set with all its actions ([Actions panel overview](https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/automate-actions/actions-panel-overview.html); `ui.actionSet.duplicate`). VectorCraft's own rules, which the overview does not cover: the copy goes right after the original, is named after it with " copy" added and is selected.
- Batch… over data sets names each file after the document and the data set (`action.batch`). It writes `/`, `\`, `:`, `<`, `>`, `"`, `|`, `?`, `*` and control characters in the data set's name as `-`, and adds `-2`, `-3`… to a name an earlier data set used.
- Batch… offers File + Number, File + Data Set Name, and Data Set Name for a Data Sets source. The dialog defaults to File + Number; `action.batch` without `datasetFileNaming` keeps File + Data Set Name. An output already in a destination folder the batch may read and write gets the next free `-2`, `-3` suffix. [Batch options](https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/automate-actions/batch-options.html).
- Batch… over data sets offers None and Folder as the destination, and `action.batch` refuses Save and Close for a Data Sets source before it runs a step, so the batch does not save every data set over the open document's file. This is VectorCraft's own rule: [Play actions on a batch of files](https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/automate-actions/play-actions-on-a-batch-of-files.html) describes Save and Close as saving "the file in their current location" and does not say what it does over data sets.
- Export for Screens: the dialog's Example line shows the path of the file the export writes first, sub-folder included, named as the export names it, for the first chosen artboard, asset, layer or object (`document.exportForScreens`).
- Export presets: the Asset Export panel menu lists the export presets of Export for Screens, with Import Preset… and Export Preset…, which read and write `.vcexportpresets` files (`document.exportPresets.import`, `document.exportPresets.export`). An imported preset whose name is taken gets a number. In the panel, a preset applies to the shared export settings (`assets.settings.set {exportPreset}`), and Save Preset… saves them. With Create Sub-folders off, the panel's Export writes every file into the folder itself, mobile and density rows included.
- Export for Screens is laid out as the reference app's dialog: on the left the Artboards and Assets tabs (thumbnails with their checkboxes, number and name, in a grid or a list), Clear Selection and Prefix; on the right Select (All, Range, Include Bleed, Include Artboard Fill, Full Document), Export to, Open Location after Export, Create Sub-folders by Scale or by Format (on by default), Export PDFs As (Single File writes the chosen artboards as the pages of one PDF named after the document, `pdfs: "single"`), and the format rows with the iOS and Android buttons, the format presets (☰) and Format Settings; under them, how many items are selected and how many files the export writes. File name patterns, the Layers and Selection sources and per-item folders stay available through `document.exportForScreens` (scripts and MCP). Tests: `dialogs::tests_screens` (layout, iOS/Android, Clear Selection, sub-folders, Single File) and `fileio::tests_screens::single_file_pdfs_hold_every_chosen_artboard`.