From 18939e875a5e3779682e10cdc4c5361d61db0a7b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 22 Aug 2025 14:08:37 +0000 Subject: [PATCH] Improve symbol export, path cleanup, and point reduction scripts Co-authored-by: colorage503 --- export_symbols.jsx | 142 ++++++++++++++++++++++---------------- remove_dots.jsx | 7 +- remove_useless_points.jsx | 37 +++++++--- 3 files changed, 113 insertions(+), 73 deletions(-) diff --git a/export_symbols.jsx b/export_symbols.jsx index e235490..55dd0a8 100644 --- a/export_symbols.jsx +++ b/export_symbols.jsx @@ -3,72 +3,94 @@ var symbolCount = doc.symbols.length; if (symbolCount >= 1) { - if (confirm("Are all your layers hidden?")) { + if (confirm("Are all your layers hidden?")) { - // choose directory - var dest = Folder(doc.path).selectDlg(); - - if (dest) { - //run genration - generateScale (1); - generateScale (2); - generateScale (3); - } - - function generateScale (scaleFactor) { - //create subfolder path - var subdest = new Folder (dest + "/@" + scaleFactor + "x"); - - //create subfolder - if ( ! subdest.exists ) { - subdest.create() - } - - // create temp layer - doc.layers.add(); + // choose directory (fallback to Desktop if doc isn't saved) + var defaultFolder = (doc.path && Folder(doc.path)) || Folder.desktop; + var dest = defaultFolder.selectDlg(); + + if (dest) { + // run generation + generateScale(1); + generateScale(2); + generateScale(3); + } + + function generateScale (scaleFactor) { + // create subfolder path + var subdest = new Folder(dest + "/@" + scaleFactor + "x"); + + // create subfolder + if (!subdest.exists) { + subdest.create(); + } + + // create temp layer and keep a reference + var tempLayer = doc.layers.add(); + tempLayer.name = "__temp_export__"; - // loop through symbols - for (var i = 0; i < doc.symbols.length; i++) { - - // filter non _name symbols - if(doc.symbols[i].name[0] != "_");{ - - // place a symbol instance - temp - var symbol = doc.symbolItems.add(doc.symbols[i]); + // loop through symbols + for (var i = 0; i < doc.symbols.length; i++) { + var symbolDef = doc.symbols[i]; - //scale 1x - symbol.resize(scaleFactor * 100, scaleFactor * 100); + // skip symbols starting with underscore + if (symbolDef.name && symbolDef.name.charAt(0) === "_") { + continue; + } + + // place a symbol instance on the temp layer + var symbol = doc.symbolItems.add(symbolDef); + try { + // ensure on temp layer + symbol.move(tempLayer, ElementPlacement.PLACEATBEGINNING); + + // scale + symbol.resize(scaleFactor * 100, scaleFactor * 100); + + // build safe filename + var baseName = String(symbolDef.name || ("symbol_" + i)); + var filename = sanitizeFilename(baseName) + ".png"; + + // export symbol + savePNG(subdest, filename); + } finally { + // delete temp symbol instance regardless of export outcome + symbol.remove(); + } + } + + // remove temp layer + tempLayer.remove(); + } + } - // assign name - var filename = (doc.symbols[i].name) + function savePNG(dest, filename) { + // save options + var type = ExportType.PNG24; + var options = new ExportOptionsPNG24(); + options.transparency = true; + options.antiAliasing = true; + options.artBoardClipping = false; + options.horizontalScale = 100; + options.verticalScale = 100; - // export symbols - savePNG(subdest, filename); + // file + var file = new File(dest + "/" + filename); - // delete temp symbol instance - symbol.remove(); - } - } - - // remove temp layer - doc.layers[0].remove(); - } - - } - - function savePNG(dest, filename) { - // save options - var type = ExportType.PNG24; - var options = new ExportOptionsPNG24(); - options.transparency = true; - - // file - var file = new File(dest + "/" + filename); - - // export - doc.exportFile(file, type, options); - } + // export + doc.exportFile(file, type, options); + } } else { - alert("You don't have any symbols in this document"); + alert("You don't have any symbols in this document"); +} + +function sanitizeFilename(name) { + // replace illegal filename characters and trim + var cleaned = name.replace(/[\\\/:*?"<>|]/g, "_").replace(/\s+/g, " ").replace(/^\s+|\s+$/g, ""); + // avoid empty names + if (!cleaned) { + cleaned = "export"; + } + return cleaned; } diff --git a/remove_dots.jsx b/remove_dots.jsx index d617642..3f56f39 100644 --- a/remove_dots.jsx +++ b/remove_dots.jsx @@ -2,9 +2,10 @@ var myDoc = app.activeDocument; var length = myDoc.pathItems.length; var count = 0; for (var i=length-1; i>=0; i--){ - if (myDoc.pathItems[i].length == 0){ - myDoc.pathItems[i].remove(); + var pathItem = myDoc.pathItems[i]; + if (!pathItem.locked && !pathItem.hidden && pathItem.pathPoints.length == 0){ + pathItem.remove(); ++count; - } + } } alert(count + " paths were deleted"); diff --git a/remove_useless_points.jsx b/remove_useless_points.jsx index bacb769..d4ddf0b 100644 --- a/remove_useless_points.jsx +++ b/remove_useless_points.jsx @@ -2,9 +2,10 @@ var myDoc = app.activeDocument; var length = myDoc.pathItems.length; var count = 0; var fault_depth = 0.01; +var handle_tolerance = 0.01; for (var i=0; i