Skip to main content
Participating Frequently
October 19, 2021
Answered

Illustrator script embed selected art in selected layer

  • October 19, 2021
  • 2 replies
  • 2713 views

Hi there,

 

I have an Illustrator document with multiple layers and multiple layers with linked images/art in them. I would like to with a script select a specific layer and embed all images in the selecte layer only.

 

This is the script I have but as soon as I have multiple images in the layer it will only embed one of the images.

 

var i = 1
var doc = app.activeDocument;
var myLayers = doc.layers;

EmbedTestLayer();

function EmbedTestLayer()
{
//Layers visible and unlocked
for (a=0; a<myLayers.length; a++){
myLayer = myLayers[a];
myLayer.visible = true;
myLayer.locked = false;
}
}
try{
//Deselect all objects
app.activeDocument.selection = null;

//Embed objects in layer
myLayers.getByName ("Test Layer").hasSelectedArtwork = true;
placedArt = app.activeDocument.placedItems[i];
placedArt.embed("Test Layer");
}
catch (e) {}
 
Test Layer is the layer that I want to select as well as all elements/sublayers and then embed the Art.
 
Help will be greately appreciated.
Correct answer femkeblanco

Hi Femke,

 

I think I fixed it myself this way:

 

var doc = app.activeDocument;
var _placedItems;
var _name = doc.layers[""];
if (_name == "") {
_placedItems = doc.placedItems;
_embed()
} else {
try {
var targetLayer = doc.layers["Test Layer"];
targetLayer.visible = true;
targetLayer.locked = false;
_placedItems = [];
function recurse(items) {
for (var i = 0; i < items.length; i++) {
if (items[i].typename == "PlacedItem") {
_placedItems.push(items[i]);
} else if (items[i].typename == "GroupItem") {
recurse(items[i].pageItems);
}
}
}
recurse(targetLayer.pageItems);
_embed()
} catch(e) {}
}
function _embed() {
for (var i = _placedItems.length - 1; i > -1; i--) {
_placedItems[i].embed();
}
}
If you dont mind having a quick look, I will be forever greatfull!

Yes, that is fine. 

 

Edit:  Or you could use this:

var doc = app.activeDocument;
try {
    var targetLayer = doc.layers["Test Layer"];
    targetLayer.visible = true;
    targetLayer.locked = false;
    var _placedItems = [];
    function recurse(items) {
        for (var i = 0; i < items.length; i++) {
            if (items[i].typename == "PlacedItem") {
                _placedItems.push(items[i]);
            } else if (items[i].typename == "GroupItem") {
                recurse(items[i].pageItems);
            }
        }
    }
    recurse(targetLayer.pageItems);
    for (var i = _placedItems.length - 1; i > -1; i--) {
        _placedItems[i].embed();
    }
} catch(e) {}

2 replies

femkeblanco
Legend
October 19, 2021
var doc = app.activeDocument;
var myLayers = doc.layers;
EmbedTestLayer();
function EmbedTestLayer() {
    for (var a = 0; a < myLayers.length; a++){
        myLayer = myLayers[a];
        myLayer.visible = true;
        myLayer.locked = false;
    }
}
try {
    var targetLayer = myLayers["Test Layer"];
    var items = targetLayer.placedItems;
    for (var i = items.length - 1; i > -1; i--) {
        items[i].embed();
    }
}
catch (e) {}
ErazorAuthor
Participating Frequently
February 25, 2022

Hi there,

 

Sorry for asking again but I am running into another issue. 

Same script but then I need to not only in the picture embed all images in the "Test Layer" but also in all sub layers. So need to embed Images 1 through 4. 

 

This is the script that Femke helped with and it actually does embed Image 1 but nothing else.

 

Any help will be immensily appreciated.

 

Script:

 

var doc = app.activeDocument;
var layers = doc.layers;
var myLayers = doc.layers;
var placedImages = layers["Test Layer"];
var mayLayers = layers["Test Layer"];
myLayers.layers = true;

var myLayers = doc.layers;
for (a=0; a<myLayers.length; a++){
myLayer = myLayers[a];
myLayer.visible = true;
myLayer.locked = false;
}
//Embed Cloud Marks
try {
var targetLayer = myLayers.getByName("Test Layer");
var items = targetLayer.placedItems;
for (var i = 0, len = items.length; i < len; i--) {
items[i].embed();
}
}
catch (e) {}
 
ErazorAuthor
Participating Frequently
February 26, 2022

That's because the above snippet was intended to traverse nested layers, as per your request.  But <Group> is a groupItem and not a layer.  With scripting one has to be specific.  (It's also my fault for not looking at the screenshot).  This will traverse nested groups, embedding placedItems:

var doc = app.activeDocument;
var targetLayer = doc.layers["Test Layer"];
targetLayer.visible = true;
targetLayer.locked = false;
var _placedItems = [];
function recurse(items) {
    for (var i = 0; i < items.length; i++) {
        if (items[i].typename == "PlacedItem") {
            _placedItems.push(items[i]);
        } else if (items[i].typename == "GroupItem") {
            recurse(items[i].pageItems);
        }
    }
}
recurse(targetLayer.pageItems);
for (var i = _placedItems.length - 1; i > -1; i--) {
    _placedItems[i].embed();
}

Femke,

 

Seriously you are the best! Thank you soooooo much this works perfeclty!

ajabon grinsmith
Community Expert
Community Expert
October 19, 2021

The variable "i" has not changed its value to 1. So only one image is processed.