Illustrator Script Ayuda a crear la función CAPA A GRUPO

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 ) .

ingrese la descripción de la imagen aquí

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!")
    }
Por favor, comparte lo que has probado.
hola scott, gracias por la recomendación. lo publiqué arriba.

Respuestas (1)

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 pageItemscolecció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.layerscolección; no se preocupe, ya que, a diferencia de los elementos de arte mencionados anteriormente, document.layersno 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.layerspropiedad.

Ahora, a diferencia de las cosas de arte a nivel de documento, cuando hace algo así, var neededGroups = doc.layers[0].groupItemsestá 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 movearte 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 typenamela propiedad de cada elemento para ver qué tipo de elemento es. (Hasta donde yo sé, el .typenameresultado es el mismo que el .constructor.namede la propiedad). El typenamede 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;
}
Hola, tonto, muchas gracias por la respuesta detallada y la muestra. La guía es excelente y fácil de seguir. He usado "executeMenuCommand" en los scripts más simples, pero el grupo uno nunca me llegó. Desafortunadamente, me temo que no me expliqué claramente arriba, así que edité la pregunta inicial y diseñé un esquema más claro de mi intención, creo, así que échale un vistazo. No quiero agarrar capas individuales y agruparlas, pero me gustaría poder agrupar TODAS las capas de segundo nivel con O sin hijos e ignorar las de primer y tercer nivel (hijos); NO debería agrupar a los hijos de las capas). Gracias
Oh, está bien, sí, el panel de capas de Illustrator lo hace ambiguo al mirar si se trata de grupos o capas, pero con su nueva captura de pantalla podemos ver claramente que son capas debido a los diferentes colores.
Pensé en crear alguna función para repetir capa por capa como "Seleccionar + Grupo"> "Seleccionar + Grupo"> ..., pero aún necesitaría excluir la capa principal y los niños de nivel 3, creo.
Pensé un poco más en una posible solución y ahora me pregunto si debería hacerlo mediante una acción masiva en lugar de secuencias de comandos. ¿qué opinas?