Cómo comenzar a programar en Adobe Illustrator. Primera parte

Quiero advertirte de inmediato que esta serie de publicaciones no es para programadores experimentados, ni siquiera para programadores. Entiendo que esto suena extremadamente desafiante, dado el tema de TI del recurso, y aún me deja explicar ... Como audiencia, veo diseñadores comunes que desearían comenzar a programar en Adobe, pero por alguna razón (por temor a desconocido, la falta de confianza en sus capacidades o la falta de conocimiento del idioma) no pueden dar los primeros pasos en esta dirección. Veo mi modesta tarea al ayudarlos a comprender que "no son los dioses quienes queman las ollas" y cualquier persona suficientemente motivada puede aprender a escribir el código del programa de trabajo. Es posible que algunos de ellos se dejen llevar por este juego y decidan convertirse en verdaderos desarrolladores. ¿Qué código no está bromeando?


Esta publicación hablará sobre cómo escribir su propia herramienta pequeña (script en JavaScript) para crear su propia herramienta única en Adobe Illustrator, que no solo reducirá su tiempo, sino que también mejorará la interacción con este maravilloso editor de gráficos. Primero, formularé el problema, luego mostraré el código que lo resuelve y, luego, le contaré en detalle cómo se creó. No discutirá los conceptos básicos de Javascript, las características del modelo de objetos de Illustrator o varios editores para escribir / depurar código. Puede encontrar esta información usted mismo si lo desea. Lo principal, en mi opinión, es la comprensión de los principios básicos de los programas de escritura, que es el énfasis principal en este artículo. Si estás listo para saltar justo por encima de tu cabeza, ¡bienvenido al corte!


Adobe Illustrator tiene una herramienta de máscara de recorte que funciona con máscaras de recorte. La máscara de recorte contiene tres comandos: Crear, Liberar y Editar máscara. El primero crea una máscara, el segundo, analiza, el tercero, le permite editar. Estamos interesados ​​en el segundo comando, que divide el objeto Máscara de recorte en un contorno y el contenido de la máscara. Muy a menudo es necesario no solo desmontar la máscara, sino también deshacerse del contorno de la máscara, dejando solo el contenido. El comando Regular Release Clipping Mask no hace esto, por lo que después de aplicarlo, debe realizar tres pasos más:


  1. Eliminar selección de objetos
  2. Seleccionar solo contorno de máscara
  3. Eliminar contorno de máscara

Si tiene que realizar esta operación secuencial con bastante frecuencia durante el día, surge la pregunta: ¿es imposible reducir de alguna manera el número de estas acciones para obtener el mismo resultado? Y el punto aquí no es la pereza, sino la falta de la herramienta necesaria. Ahora imagine por un segundo que tiene esa herramienta.


Aquí te distraes brevemente del trabajo y te sumerges en pensamientos sobre lo genial que sería si el arsenal de Adobe Illustrator tuviera un equipo como Expand Clipping Mask que realizara todas estas acciones por ti. Buena idea! Necesitas escribir soporte técnico para Adobe, crees. El siguiente pensamiento: ¿de repente se ha escrito sobre esto muchas veces? Y si algún día y tal vez agreguen esa herramienta, ¿qué es esto para usted? ¡Se necesita este equipo aquí y ahora!

Y aquí llega el momento de la verdad: ¡puedes escribir un guión tú mismo!

Apenas dicho que hecho!


1 #target illustrator 2 if (app.documents.length > 0) { 3 var doc = app.activeDocument; 4 var sel = doc.selection; 5 var clipPath; 6 if (sel.length > 0) { 7 if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { 8 var clipGroup = sel[0].pageItems.length; 9 for (var i = 0; i < clipGroup; i++) { 10 if (sel[0].pageItems[i].typename == 'PathItem' && sel[0].pageItems[i].clipping == true) { 11 clipPath = sel[0].pageItems[i]; 12 break; 13 }; 14 }; 15 app.executeMenuCommand('releaseMask'); 16 clipPath.remove(); 17 } 18 else { 19 alert ('   -!'); 20 }; 21 } 22 else { 23 alert ('  !'); 24 }; 25 } 26 else { 27 alert ('  !'); 28 }; 

Aquí hay un código tan pequeño para ayudar a resolver este problema. En lugar de varios, ya en el orden de las acciones aburridas, solo necesita hacer una cosa: ejecutar el script Expandir máscara de recorte. Ahora tiene una herramienta útil para trabajar con máscaras, hecha por el mismo hágalo usted mismo.


Por supuesto, aquí estoy un poco falso. En primer lugar, el guión no fue escrito por usted y, en segundo lugar, no es tan universal como nos gustaría. Sin embargo, si está interesado en cómo funciona, y lo más importante, cómo aprender a escribir tales programas usted mismo, entonces me complacerá contarle sobre esto en orden y con comentarios detallados.


Para empezar, cualquier script (script / programa / código JavaScript) consta de varios bloques principales de código: declaraciones (inicialización) de variables, comprobaciones básicas (condiciones) y, por ejemplo, el "motor del programa": código que implementa la función funcional principal guión Por supuesto, esta división es muy arbitraria, ya que la parte funcional también tiene controles, pero el principio estructural es el siguiente. Naturalmente, cuanto más grande sea el programa, más difícil será dividirlo en bloques similares. Pero en nuestro caso, es posible. Las líneas 8 a 16 son el motor de script, las líneas restantes son declaraciones variables y varias comprobaciones básicas con su procesamiento. Si cuenta, resulta que el número de líneas en el bloque de verificación es mayor que el número de líneas en el bloque de funciones. ¿Son realmente importantes estos controles?


¿Por qué necesitamos cheques?


Los programadores serios me entenderán y será útil que los desarrolladores principiantes lo descubran. Se necesitan verificaciones para garantizar el funcionamiento normal de la parte funcional del programa. Si no los escribe, cualquier error durante la ejecución de la secuencia de comandos provocará un error de software. Y esto no es bueno.


Por supuesto, los camaradas serios mencionados anteriormente usan el constructo try / catch para tales propósitos, pero decidí que el típico if / else sería un constructo lacónico y más comprensible. Especialmente para guionistas novatos.


Examinemos en detalle lo que hacen estas líneas. La primera línea es responsable del hecho de que incluso si el script no se ejecuta desde Adobe Illustrator, se ejecutará en él. En consecuencia, si ejecuta el script desde Illustrator, esta línea puede omitirse.


 #target illustrator 

A continuación, busca documentos abiertos en Adobe Illustrator en el momento en que se ejecuta el script. Estas líneas deben leerse de la siguiente manera: si ( if ) en la aplicación ( app ) el número de documentos ( documents.length ) es mayor que cero (> 0), entonces el código encerrado en {...} debería ejecutarse. De else contrario ( else ), muestre el mensaje ( alert ) '¡No hay documentos abiertos!' y completa el guión.


 if (app.documents.length > 0) { ... ... } else { alert ('  !'); }; 

El siguiente bloque de código verifica la selección en el documento.


  if (sel.length > 0) { ... ... } else { alert ('  !'); }; 

Cabe señalar que si en los ejemplos anteriores usamos nombres reservados (como app o documents ), entonces aquí usamos la variable sel, que nosotros mismos determinamos en las líneas 3 y 4,


  var doc = app.activeDocument; var sel = doc.selection; 

donde doc es el enlace al documento activo de Illustrator, y sel es el enlace al objeto u objetos seleccionados en el documento activo.


Una referencia (o referencia) es un puntero a un objeto específico. Por supuesto, soy muy consciente de que la palabra rusa completamente inofensiva "puntero" es capaz de introducir en el estupor a cualquier persona que no esté familiarizada con OOP (programación orientada a objetos). Pero tome una palabra, todo no es tan complicado como parece. Los enlaces se almacenan en variables y se utilizan para acceder a objetos. En la variable doc guardamos (le asignamos un valor usando el operador de asignación = ) un puntero al documento activo (activeDocument) de la aplicación (aplicación), y en la variable sel guardamos el puntero a la selección (selección) en el documento activo (activeDocument) de la aplicación (aplicación). Solo para evitar volver a escribir app.activeDocument, usamos la variable doc , que ya contiene este código. Es por eso que el enlace se verá como sel = doc.selection . Espero haberlo explicado claramente.

Por lo tanto, en esta condición, if (sel.length > 0) se verifica si hay objetos seleccionados en el documento activo, y si no, se muestra el mensaje: '¡No hay objetos seleccionados!'


Las siguientes líneas verifican la veracidad, perdón por el juego de palabras, dos condiciones a la vez. El primero que el objeto seleccionado es un grupo ( GroupItem ) y (&&) el segundo que este grupo es realmente una máscara de recorte (la propiedad clipped de este objeto es true ).


  if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { ... ... } else { alert ('   -!'); }; 

Aquí necesitamos una pequeña explicación.


¿Qué es un objeto de máscara? Este es un grupo, pero no ordinario. Un grupo regular es una colección de diferentes objetos que está subordinada, por ejemplo, al objeto "principal" o "principal". En cuanto al objeto de máscara, este también es un grupo, pero a diferencia del habitual, consta de dos partes: el contorno de la máscara y su contenido. Entonces, para determinar a partir del script que frente a usted hay un grupo regular o un grupo de máscara, su propiedad clipped permite. Si el valor de la propiedad recortada es false (falso), entonces este es un grupo normal; si es true (verdadero), entonces este es un grupo de recorte.

Las mentes inquisitivas notarán que en lugar de la variable sel que definimos anteriormente, se usa la construcción sel[0] . Esto se explica por el hecho de que, desde el punto de vista del guión, una selección es una colección (colección) de elementos, y no un objeto específico (incluso si solo se selecciona un objeto). Y para verificar que el tipo ( typename tipo) de este objeto coincida con el tipo del elemento de colección seleccionado, se utiliza la construcción sel[0] , que se refiere al primer elemento [0] de la colección, es decir, en nuestro caso, el grupo seleccionado.


Como resultado, si el objeto seleccionado es tanto un grupo como una máscara, se ejecuta el código adicional, de lo contrario se muestra el mensaje: '¡La selección no es un objeto de máscara!'


Con cheques, eso es todo. Adelante


¿Cómo se creó el código principal?


En esta parte del artículo, intentaré no solo comentar cómo funciona el código, sino también describir el proceso de su creación. Si no es todo el proceso, al menos algunos puntos clave. ¡Empecemos!


Anteriormente, se describieron tres acciones que deben realizarse para resolver la tarea de "desarmar" la máscara de recorte con la posterior eliminación del contorno de la máscara. Se complementarán con otra acción (comando Release), desde la cual comenzará nuestro algoritmo. Los repetiré aquí para actualizar el contexto.


  1. Ejecute el comando Liberar máscara de recorte
  2. Eliminar selección de objetos
  3. Seleccionar solo contorno de máscara
  4. Eliminar contorno de máscara

Si implementa esta secuencia de acciones estrictamente de acuerdo con la lista, los primeros dos puntos se pueden resolver fácilmente llamando al método executeMenuCommand() . Pero luego, en el tercer punto, enfrentaremos un problema sin solución. ¿Cómo obtener un enlace al contorno de la máscara, si después de la primera acción (Liberar máscara de recorte) ya no hay máscara, pero solo hay un conjunto de objetos seleccionados? Sí, y estructuralmente no es el mismo que antes de realizar esta operación.


En general, la lógica sugiere que primero debe crear un enlace (referencia) al objeto de contorno de la máscara. Después de pensar en lo que PathItem contorno de PathItem máscara sea tan único en comparación con el contorno regular, encontraremos la propiedad de clipping de la clase PathItem . Ahora solo tenemos que PathItem sobre todos los objetos del grupo de máscaras en el bucle (for) y encontrar el PathItem con la propiedad clipping = true . Este será el circuito deseado. Como resultado de la ejecución de este código, obtendremos un enlace al objeto de contorno de la máscara y lo clipPath en la variable clipPath .


  for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PathItem' && sel[0].pageItems[i].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; 

Que sigue Volvamos al algoritmo y escriba el código para el elemento 1. Esta línea ejecuta el comando Release Clipping Mask, pero no a través de la interfaz de usuario, sino desde el script. Si, tan simple!


  app.executeMenuCommand('releaseMask'); 

Omitimos los pasos 2 y 3 (porque ya tenemos un contorno de máscara, o más bien un enlace al objeto clipPath) y vamos directamente al paso 4. Aquí llamamos al método remove() del objeto clipPath . Este método elimina el contorno de la máscara.


  clipPath.remove(); 

Eso es todo por ahora. Gracias por su atencion!


Espero que ahora entiendas que comenzar a programar en Adobe Illustrator no es tan difícil como parece a primera vista.


PD: Por supuesto, el guión resultante está lejos de ser ideal. No funciona con máscaras cuyos contornos están representados por TextFrame CompoundPath , CompoundShape o TextFrame . Lea cómo modificar el script para que se convierta en una herramienta verdaderamente completa en la segunda parte .

Source: https://habr.com/ru/post/452586/


All Articles