Soy un poco nuevo en esto y estoy tratando de encontrar una solución para "Agrupar" todas las capas en GRUPOS INDIVIDUALES/SEPARADOS.
No he tenido éxito en la primera etapa de mi secuencia de comandos para trabajar agrupando cada capa individualmente por separado porque en la segunda etapa necesito decirle a la secuencia de comandos que no agrupe las capas de nivel superior o las capas de tercer subnivel.
La intención es ignorar la "Escena 1" y la "Escena 2" como nivel superior, así como los subobjetos del tercer nivel. Solo se deben agrupar los "a agrupar" como 2do nivel.
Editar: he diseñado un nuevo esquema que refleja lo que tengo y lo que necesito para terminar (Agrupe TODAS las capas de segundo nivel con O sin niños e ignore los de 1er + 3er nivel - NO agrupe los niños de las capas ) .
Pensé que sería simple de implementar, pero estoy teniendo dificultades para descubrir cómo "trabajar selecciones/acciones individuales" y excluir el primer y tercer nivel.
Hice algunos intentos más desde que comencé esta publicación y esto es lo que tengo actualmente. Estaba tratando de transformar cada capa en su propio grupo. No funciona.
everythingSelected = activeDocument.selection;
if (everythingSelected.length>0){
var doc = app.activeDocument; //current document
var s = doc.selection; //current slection
var sl = s.length; //number of selected objects
var m = app.activeDocument.groupItems; //group items
for(var i = 0 ; i < sl; i++) s[i].transform(m); //transform each to group
app.redraw();
}else{
alert("Nothing selected!")
}
Parece que está intentando agrupar los elementos inmediatamente dentro de las capas de nivel superior que no son grupos. Para llegar rápidamente al problema, su enfoque aquí necesita una revisión instrumental que hará que su trabajo futuro sea más fácil y posible.
En Illustrator, hay una pageItems
colección de documentos, así como otras colecciones de 'elementos' como groupItems
. La cuestión es que, cuando pasa al nivel del documento, le brinda todos los elementos en todos los niveles de anidamiento, por lo que sus elementos de grupo le brindarán los grupos que desea, pero también los grupos que no desea.
Lo que quiere hacer es buscar cosas en contenedores específicos si quiere agrupar. En su caso, desea pasar por todas las capas superiores y agrupar elementos anidados inmediatamente que aún no son grupos.
Para hacer referencia a una capa de nivel superior, puede usar la Document.layers
colección; no se preocupe, ya que, a diferencia de los elementos de arte mencionados anteriormente, document.layers
no devuelve capas anidadas. Solo como nota, las capas de Illustrator tienen la capacidad de tener subcapas anidadas y también se accede a ellas a través de la layer.layers
propiedad.
Ahora, a diferencia de las cosas de arte a nivel de documento, cuando hace algo así, var neededGroups = doc.layers[0].groupItems
está apuntando con su secuencia de comandos solo a los grupos de nivel superior en la primera capa.
En el pasado, solía tener que crear nuevos elementos de grupo y move
arte en ellos para agrupar arte con código. En las versiones posteriores, nos permitieron usar app.executeMenuCommand()
para facilitar un poco la agrupación, pero tiene que depender de la selección actual del documento. Por lo tanto, primero debemos asegurarnos de que no haya nada seleccionado en el documento.
var doc = app.activeDocument;
doc.selection = null;
Deberá pasar por las capas de su documento en un bucle externo:
var thisLayer;
for(var i = 0; i < doc.layers.length; i++){
thisLayer = doc.layers[i];
}
Durante eso, deberá pasar por el arte de la capa actual en un bucle interno (observe que el contador 'i' se cambia al contador 'j' para asegurarse de que el bucle anidado no rompa el bucle principal):
var thisPageItem;
for(var j = 0; j < thisLayer.pageItems.length; j++){
thisPageItem = thisLayer.pageItems[j];
}
Luego deberá verificar typename
la propiedad de cada elemento para ver qué tipo de elemento es. (Hasta donde yo sé, el .typename
resultado es el mismo que el .constructor.name
de la propiedad). El typename
de un grupo será la cadena "GroupItem"
. Si es un grupo, lo evitaremos, pero para todos los demás, los seleccionaremos.
if(thisPageItem.typename != "GroupItem"){
thisPageItem.selected = true;
}
Ahora que todos los elementos que no pertenecen al grupo están seleccionados en la parte inferior del ciclo principal, use la función de comando de menú. Puede ser bueno asegurarse de que también haya una selección con una declaración condicional: if(doc.selection.length){ app.executeMenuCommand("group"); }
Y después de que se haya agrupado, anule la selección del documento para la próxima ronda:
doc.selection = null;
Aquí está todo junto:
var doc = app.activeDocument;
doc.selection = null;
var thisLayer;
for(var i = 0; i < doc.layers.length; i++){
thisLayer = doc.layers[i];
var thisPageItem;
for(var j = 0; j < thisLayer.pageItems.length; j++){
thisPageItem = thisLayer.pageItems[j];
if(thisPageItem.typename != "GroupItem"){
thisPageItem.selected = true;
}
}
if(doc.selection.length){
app.executeMenuCommand("group");
}
doc.selection = null;
}
scott
gráfico.ninja