femkeblanco
Guide
femkeblanco
Guide
Activity
‎Mar 18, 2025
09:45 PM
For now i think can use Adobe Acrobat. First save the ai file in pdf. and open the pdf file on adobe acrobat then export to pptx
... View more
‎Mar 07, 2025
11:02 AM
Hi everyone, I work a lot with Adobe Illustrator myself and created a handy script that lets you easily batch-convert AI files into PDFs, including customizable PDF presets (web, print-quality, etc.). You can download the script directly for free here (no login required): 👉 https://zeilenhoehe.de/ai-to-pdf-batch-converter-adobe-illustrator-script/ If you’d like, you can also voluntarily sign up for updates, additional Illustrator tips, and more free tools. I’d be happy about your feedback and hope this makes your workflow easier!
... View more
‎Feb 21, 2025
02:18 PM
Is it possible to use a similar code for Photoshop? I want to change the names of multiple artboards using a .csv. Please and thank you!!
... View more
‎Feb 17, 2025
06:56 AM
2 Upvotes
Adding these my spreadsheet and next release of Ai Command Palette. Thanks as always @sttk3! Appreciate the clarification @Sergey Osokin and @krasnovpro!
... View more
‎Feb 14, 2025
08:47 PM
Hello there, is it possible for you to help me in a case like this? Make a design fit to any size object with scripts
... View more
‎Jan 29, 2025
06:25 AM
did you find the solution where it palce more then on number in bigger shape?
... View more
‎Jan 19, 2025
07:29 AM
Heart or heartbreaking or both, I wonder.
Hopefully, this tree will keep surviving.
... View more
‎Dec 20, 2024
08:27 AM
so nice! here the latest version with some nice updates 😉 added little options: - for scaling (sadly just for plain paths) - to have a bit margins between the artboards - named artboards after symbolnames with number indicator infront (for easy export with nice names ;)) // Initialize variables
var doc1 = null;
// Conversion functions - 1:1 since Illustrator uses 72ppi where 1pt = 1px
function pxToPt(px) { return px; }
function ptToPx(pt) { return pt; }
// Check if any document is open
if (app.documents.length > 0) {
doc1 = app.activeDocument;
}
// Create dialog window
var dialog = new Window("dialog", "Symbol Export Settings");
dialog.orientation = "column";
// Add file selection group
var fileGroup = dialog.add("panel", undefined, "Source File");
fileGroup.orientation = "column";
fileGroup.alignChildren = "left";
var useCurrentRb = fileGroup.add("radiobutton", undefined, "Use Current Document");
var chooseFileRb = fileGroup.add("radiobutton", undefined, "Choose AI File");
// Set initial state based on document availability
if (doc1 === null) {
useCurrentRb.enabled = false;
chooseFileRb.value = true;
} else {
useCurrentRb.value = true;
useCurrentRb.enabled = true;
}
var chooseGroup = fileGroup.add("group");
var filePathText = chooseGroup.add("edittext", undefined, "");
filePathText.preferredSize.width = 200;
var chooseBtn = chooseGroup.add("button", undefined, "Browse...");
// Set initial state of file selection controls
filePathText.enabled = (doc1 === null);
chooseBtn.enabled = (doc1 === null);
// Enable/disable file selection based on radio button
chooseFileRb.onClick = function() {
filePathText.enabled = chooseFileRb.value;
chooseBtn.enabled = chooseFileRb.value;
}
useCurrentRb.onClick = function() {
filePathText.enabled = false;
chooseBtn.enabled = false;
}
// Browse button functionality
chooseBtn.onClick = function() {
var file = File.openDialog("Select Illustrator File", "*.ai");
if (file) {
filePathText.text = file.fsName;
// Open file and update symbol list
try {
var tempDoc = app.open(file);
updateSymbolList(tempDoc);
tempDoc.close(SaveOptions.DONOTSAVECHANGES);
} catch(e) {
alert("Could not open file: " + e);
}
}
}
// Add symbol size input (now in pixels)
var sizeGroup = dialog.add("group");
sizeGroup.add("statictext", undefined, "Symbol Size (px):");
var symbolSizeInput = sizeGroup.add("edittext", undefined, "64"); // Default 64px instead of 50pt
symbolSizeInput.characters = 6;
var explainScale = dialog.add("group");
explainScale.add("statictext", undefined, "(!!! needs plain Paths, NO STROCK or EFFECT SCALEING !!!");
// Add margin input (now in pixels)
var marginGroup = dialog.add("group");
marginGroup.add("statictext", undefined, "Margin (px):");
var marginInput = marginGroup.add("edittext", undefined, "24"); // Default 24px instead of 20pt
marginInput.characters = 6;
// Add symbol selection list
var listGroup = dialog.add("group");
listGroup.orientation = "column";
listGroup.alignChildren = "fill";
listGroup.add("statictext", undefined, "Select Symbols to Export:");
// Create selection list
var symbolList = listGroup.add("listbox", undefined, [], {multiselect: true});
symbolList.preferredSize.width = 300;
symbolList.preferredSize.height = 200;
// Function to populate symbol list
function updateSymbolList(sourceDoc) {
symbolList.removeAll(); // Clear existing items
for (var i = 0; i < sourceDoc.symbols.length; i++) {
var item = symbolList.add("item", sourceDoc.symbols[i].name);
item.selected = true;
}
}
// Initialize list with current document symbols only if we have one
if (doc1 !== null) {
updateSymbolList(doc1);
}
// Add Select All/None buttons
var selectGroup = dialog.add("group");
var selectAll = selectGroup.add("button", undefined, "Select All");
var selectNone = selectGroup.add("button", undefined, "Select None");
selectAll.onClick = function() {
for (var i = 0; i < symbolList.items.length; i++) {
symbolList.items[i].selected = true;
}
}
selectNone.onClick = function() {
for (var i = 0; i < symbolList.items.length; i++) {
symbolList.items[i].selected = false;
}
}
// Add buttons
var buttons = dialog.add("group");
buttons.add("button", undefined, "OK");
buttons.add("button", undefined, "Cancel");
// Show dialog
if (dialog.show() == 1) { // OK was pressed
// Get the source document
var doc1;
if (chooseFileRb.value) {
if (filePathText.text) {
try {
doc1 = app.open(File(filePathText.text));
} catch(e) {
alert("Could not open file: " + e);
exit();
}
} else {
alert("Please select a file first!");
exit();
}
} else {
doc1 = app.activeDocument;
}
// Convert pixel values to points for Illustrator
var symbolSize = pxToPt(Number(symbolSizeInput.text));
var margin = pxToPt(Number(marginInput.text));
// Get selected symbols
var selectedSymbols = [];
for (var i = 0; i < symbolList.items.length; i++) {
if (symbolList.items[i].selected) {
selectedSymbols.push(doc1.symbols[i]);
}
}
// Layout only selected symbols (using point values internally)
var x = 0, y = 0, row = 1;
for (var i = 0; i < selectedSymbols.length; i++) {
symbolItem1 = doc1.symbolItems.add(selectedSymbols[i]);
// Get original dimensions
var originalBounds = symbolItem1.geometricBounds;
var originalWidth = originalBounds[2] - originalBounds[0];
var originalHeight = originalBounds[1] - originalBounds[3];
// Calculate scale percentage
var scalePercentage = (symbolSize / Math.max(originalWidth, originalHeight)) * 100;
// Position first, then scale
symbolItem1.left = x;
symbolItem1.top = y;
// Scale with stroke preservation
symbolItem1.selected = true;
app.executeMenuCommand('expandStyle'); // Expand appearance first
app.executeMenuCommand('expandStyle'); // Sometimes needs two passes
// Scale the expanded item
symbolItem1.resize(
scalePercentage, // x percentage
scalePercentage, // y percentage
true, // transform patterns
true, // transform gradients
true, // transform stroke patterns
true // transform linewidths
);
if (i < (10 * row) - 1) {
x += symbolSize + margin;
} else {
x = 0;
y -= symbolSize + margin;
row++;
}
}
// Copy to new document
app.copy();
// Create new document with same settings as source
var preset = new DocumentPreset();
preset.colorMode = doc1.documentColorSpace;
preset.units = doc1.rulerUnits;
preset.width = 800;
preset.height = 600;
var doc2 = app.documents.addDocument(doc1.documentColorSpace, preset);
// Remove default swatches and symbols (if any)
while(doc2.symbols.length > 0) {
doc2.symbols[0].remove();
}
app.paste();
// Create artboards from symbols and match names
for (var k = 0; k < doc2.symbolItems.length; k++){
var currentSymbolItem = doc2.symbolItems[k];
// Find matching symbol from selected symbols by comparing names
var matchingSymbol = null;
for (var s = 0; s < selectedSymbols.length; s++) {
if (currentSymbolItem.symbol.name === selectedSymbols[s].name) {
matchingSymbol = selectedSymbols[s];
break;
}
}
var newArtboard = doc2.artboards.add(currentSymbolItem.visibleBounds);
if (matchingSymbol) {
newArtboard.name = (k + 1) + "_" + matchingSymbol.name;
} else {
newArtboard.name = (k + 1) + "_unknown";
}
}
doc2.artboards[0].remove()
if (chooseFileRb.value) {
doc1.close(SaveOptions.DONOTSAVECHANGES);
}
} else {
// User cancelled
alert("Export cancelled");
}
... View more
‎Dec 17, 2024
01:51 AM
If you're willing to share your code and a sample file, I can help finish up the area function and implement the logic you mentioned. Feel free to check out foodmenuprice for related tools and updates.
... View more
‎Dec 13, 2024
06:54 PM
1 Upvote
If you're on a Mac and using Text Edit please make sure you have set the save format as Plain Text. The line shown indicates the file was saved as a Rich Text file.
... View more
‎Nov 19, 2024
10:38 AM
I'm using Astute Phantasm for this purpose exactly but i can't seem control the sapce between each dot... using the dot grain function, but sometimes it place the dots too close to each other so it will fall off once the metal panel is cut.... does that make sense?
... View more
‎Oct 23, 2024
09:29 AM
1 Upvote
You can add selection of multilpe objects to the graphics tab in the 3d Panel and they will all be individual symbols in the Symbols Panel.
... View more
‎Oct 03, 2024
02:36 PM
Yes that is bad. Don't expect that bug to be fixed though. Adobe is (I assume!) working hard on getting UXP scripting working for Illustrator which will give us much more modern access to the file system. I'm not convinced that the DOM object bugs will be automatically fixed in the UXP transition though so I still lodge and vote on DOM bugs.
... View more
‎Sep 27, 2024
10:56 PM
app.preferences.setBooleanPreference("ShowExternalJSXWarning", false);
var v_selection = app.activeDocument.selection;
Swap(v_selection);
function Swap(selection) {
var ob_keep = null;
for (var k = 0; k < selection.length; k++) {
var subSelelction = selection[k];
if (subSelelction.typename == 'PathItem') {
var c_fill = subSelelction.fillColor;
var c_stroke = subSelelction.strokeColor;
subSelelction.fillColor = c_stroke;
if(!subSelelction.stroked) {
subSelelction.stroked = true;
}
subSelelction.strokeColor = c_fill;
}
else {
if(ob_keep == null) {
ob_keep = new Array();
ob_keep.push(subSelelction);
} else {
ob_keep.push(subSelelction);
}
}
}
if (ob_keep != null) {
for (var n = 0; n < ob_keep.length; n++) {
if (ob_keep[n] && ob_keep[n].typename == 'GroupItem')
{
Swap(ob_keep[n].pageItems);
}
else if (ob_keep[n] && ob_keep[n].typename == 'CompoundPathItem') {
Swap(ob_keep[n].pathItems);
}
}
}
}
redraw();
... View more
‎Sep 17, 2024
10:47 PM
This is happening to me a couple of times now, luckily I was saving multiple copies of the file I was editing. You can't control Z out of it and double clicking not working. The file becomes corrupt and stuck in that state permanently. I wish I could take out the Isolate Group option in the right click menu because it is right next to Group which I use frequently....this is dangerous.
... View more
‎Sep 04, 2024
12:14 PM
It is very important to understand that Illustrator coordinate systems are not normal. You will get a 1346458189 PARM error if you have a set of bad coordinates, IE the one Illustrator wants to be negative or larger than the other is not. Please see this Stack Overflow answer for more details. https://stackoverflow.com/a/39417304
... View more
‎Aug 28, 2024
11:01 AM
This is one of the best script to rename the artobards and I am really so thankfull for it to @Sergey Osokin . with this post I am requesting it will be great if we can able to entered the specific range of artboards or comma seperated value as well. UI something like this below:
... View more
‎Aug 01, 2024
01:18 PM
just painstakingly confirmed this >_<
... View more
‎Jul 18, 2024
08:29 AM
1 Upvote
I've just been openly skeptical and critical of UXP's ground-up design approach from the very beginning and tentatively expecting that by the time Illustrator even gets UXP, that UXP itself will be as old as CEP was when Adobe decided to replace it.
By @Inventsable
bold prediction, love it
... View more
‎Jun 21, 2024
03:44 AM
Hi @CarlosCanto Is this possible ?
... View more
‎Jun 19, 2024
12:26 AM
I share your frustration.. and the feeling that there must be a way. Alas, I couldn't find it.
... View more
‎Jun 11, 2024
08:33 AM
1 Upvote
I don't have Gernouille's script but here's mine from @femkeblanco link
var idoc = app.activeDocument;
var sel = idoc.selection;
var selcount = sel.length;
var title = "Deselect Random Items";
var items = Number(prompt ("How many items to deselect?", 5, title));
var deselect = [];
for (i=0; i<items; i++) {
var anumber = randomXToY (0, selcount); //random number
//alert(anumber);
deselect.push(sel[anumber]);
}
for (j=0; j<deselect.length; j++) {
deselect[j].selected = false;
}
//function to get random number between values, by Roshan Bhattarai
function randomXToY(minVal,maxVal,floatVal)
{
var randVal = minVal+(Math.random()*(maxVal-minVal));
//alert(randVal);
return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal);
}
... View more
‎Jun 05, 2024
11:44 AM
@RobOctopus, yep this works but still leaves a hidden extra stroke in the appearance panel that bugs me. I was hoping for a native way to accomplish this but I'm beginning to think there isn't one. As for turning off the visibility in the actual appearance, it is something I have seen on occasion and something I do from time to time, especially with prebuilt styles. For example, in the attached image I have a prebuilt style for the name (top object), but I can easily turn off the pink accents and inner gradient to quickly achieve an alternate look without having to keep two separate styles in sync.   Thanks for thr suggestion!
... View more
‎Jun 05, 2024
05:04 AM
Thanks, I also ended up figuring out MenuCommand selectall.
... View more
‎Jun 04, 2024
06:20 AM
Thank you so much! This script is awesome.
... View more
‎May 17, 2024
12:04 PM
Thanks, it worked. I'll test it further in a day or two and let you know if there's anything. Happy Weekend 🙂 Could you please let me know where I'll find the name property: "textFrames don't have the name property set"
... View more
‎May 06, 2024
02:18 PM
Thanks, Kurt.
... View more
‎May 05, 2024
07:44 AM
Hello, I decided to write some code for aligning objects a few years ago, after some try and tesing, I encountered a problem with "Nested Objets" and "clip masked" objects that was a trouble. finally I decided to use Action and Scripts in combination! and result was acceptable. with a panel and some conrol buttons I manipulate the proper actions. this is my "Easy Align" panel for Adobe Illustrator:
... View more
‎May 02, 2024
11:17 AM
1 Upvote
Thank you so much for this @femkeblanco! Worked perfectly 🙂
... View more