Scripting Illustrator - Convierta un color de proceso plano en un gradiente coincidente

Todos estamos muy familiarizados con Adobe Illustrator y su interfaz de usuario. En nuestras tareas creativas diarias utilizamos muchas funciones, como: menú, palets, colores, complementos y herramientas. Usamos estas características en forma de una interfaz de usuario. Estas características de la interfaz de usuario se nos presentan a través de varios scripts y complementos.

De una manera más simple, podemos codificar scripts para automatizar tareas u obtener algún efecto en Illustrator. Siga a lo largo para aprender cómo hacerlo. En este tutorial, codificaremos en Javascript un script que convertirá un objeto lleno de proceso plano en su gradiente coincidente.

Vector Plus

¿Desea acceder a los archivos completos de Vector Source y las copias descargables de cada tutorial, incluido este? Únete a Vector Plus por solo 9 $ al mes.

Detalles del tutorial

  • Programa: Adobe Illustrator CS3 y el Kit de herramientas ExtendedScript
  • Dificultad: Intermedio.
  • Tiempo estimado de finalización: 3 a 4 horas

OBJETIVO de la secuencia de comandos

Queremos que este script realice una tarea muy simple. En Adobe Illustrator, cuando un usuario selecciona algunos objetos rellenados con un Color CMYK plano y ejecuta este Script; los objetos se convertirán en un relleno de gradiente CMYK coincidente. El gradiente de salida será algo similar a un efecto de superposición de gradiente visto en el modo de multiplicación. Esto se muestra en la imagen de abajo..

Por lo tanto, el objetivo de nuestro script es convertir un objeto plano lleno de CMYK en un gradiente de coincidencia de oscuro a claro. Esta es una acción simple que es un buen ejercicio para aprender a crear scripts para Illustrator.

Lógica y algoritmo

La lógica para convertir un color plano en un degradado oscuro a claro se puede entender en cinco sencillos pasos:

  • Paso 1: Elige el color del objeto actual. es decir, currentColor = color del objeto seleccionado actualmente.
  • Paso 2: Cree un nuevo color de degradado con dos rampstops: startColor y endColor.
  • Paso 3: startColor = currentColor - gShift es decir, aclarar el color original.
  • Etapa 4: endColor = currentColor + gShift es decir, oscurece el color original.
  • Paso 5: Aplique el nuevo degradado con startColor y endColor al objeto.

Dónde, gShift es la cantidad de cambio de gradiente que ingresará el usuario. El algoritmo anterior se puede entender fácilmente a partir de la representación pictórica que se muestra a continuación.

Aparte de la lógica central, implementaremos algunas validaciones y verificaciones para el correcto funcionamiento de este script. Estas validaciones se cubrirán en varias etapas de este tutorial. Antes de dirigirnos al tutorial real, vamos a familiarizarnos con algunos requisitos previos.

Introducción al scripting

Este tutorial requiere algunos conocimientos básicos de scripting y su entorno. Para familiarizarse con el entorno de scripting de Illustrator, puede echar un vistazo rápido a la documentación disponible en la carpeta de instalación de Illustrator, vaya a directorio de instalación \ Adobe \ Adobe Illustrator CS3 \ Scripting \ Documentation. Aquí encontrará los siguientes documentos para comenzar con JavaScript:

  • Introducción de Adobe a Scripting.pdf
  • Illustrator CS3 Scripting Guide.pdf
  • Illustrator CS3 JavaScript Reference.pdf
  • Guía de herramientas de JavaScript CS3.pdf

Tipos de scripts

Hay tres tipos de scripts que podemos escribir para Illustrator. Estos son: AppleScript, JavaScript y VBScript. Dado que JavaScript es compatible con Windows y Mac OS, codificaremos nuestra lógica en JavaScript. La sintaxis y las notaciones son muy similares a las de JavaScript estándar. La única diferencia es sobre la extensión. Para Illustrator, vamos a denotar todos los archivos JavaScript con una extensión .jsx en lugar de lo común .js extensión.

Herramientas requeridas

Aunque, puedes codificar todo el JavaScript en cualquiera de tus editores de texto favoritos; es recomendable utilizar el Kit de herramientas de Adobe ExtendedScript. Al usar esta aplicación, podemos ejecutar, depurar, probar y verificar nuestro código de manera sincrónica con Illustrator.

Nota: a lo largo de este tutorial, indicaremos el Kit de herramientas de ExtendedScript con una forma corta: ESTK.

Paso 1

Abra Adobe ExtendedScript Toolkit y cree un nuevo archivo de JavaScript. A continuación, seleccione Adobe Illustrator en la lista desplegable para la aplicación de destino. Esto le indica al ESTK que estamos escribiendo JavaScript para una aplicación en particular, es decir, Adobe Illustrator.

Paso 2 - Escribir un fragmento de código simple

En el área de edición de código, inserte las siguientes líneas de código:

if (app.documents.length> 0) alerta ("Los documentos están disponibles"); otra alerta ("No hay documentos disponibles");

En el código anterior, estamos comprobando si hay documentos abiertos actualmente en Illustrator. Esto se hace a través de

app.documents.length. es decir, el objeto de nivel superior en cualquier aplicación de Adobe DOM es el objeto de la aplicación. El siguiente es el objeto de documento, que contiene objetos como colores, capas, texto, páginas, etc. Guarde este archivo en su disco duro como "test.jsx".

Paso 2.1 - Ejecutando el Script

Hay dos formas de ejecutar el script:

1. Ejecutar desde ESTK

Si desea ejecutar su script a través de ESTK, presione el botón Reproducir como se muestra a continuación.

Esto iniciará automáticamente la aplicación Adobe Illustrator y generará el mensaje de alerta. Puede detener o detener la ejecución presionando los botones de pausa o parada respectivamente.

2. Ejecutar desde Illustrator

Para ejecutar esta secuencia de comandos desde Illustrator, vaya a Archivo> Secuencias de comandos> Otras secuencias de comandos (Comando + F12) y localice su archivo recién creado "test.jsx". Después de hacer clic en Abrir, el script se ejecutará.

Entonces, ¿qué viste? Un mensaje de alerta, "No hay documentos disponibles".

A continuación, cree un par de documentos nuevos en Illustrator y vuelva a ejecutar este script. Esta vez, verá una alerta, "Los documentos están disponibles".

Hasta este punto, hemos escrito y probado un pequeño fragmento de código. Esto se hizo como un ejercicio de calentamiento para familiarizarse con ESTK e Illustrator. En nuestros próximos pasos, vamos a trabajar en el script real..

Paso 3 - La Estructura del Código

Vuelva a ESTK y elimine el código de prueba que creamos en el Paso 2. A continuación, agregue las siguientes líneas de código en "test.jsx:"

 / * Para asegurarse de que haya al menos un documento disponible en Illustrator y al menos un objeto en ese documento para trabajar en * / if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) // To asegúrese de que el Modo de color del documento sea CMYK si (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToGrad (); // Llamar a la función real que contendrá toda la lógica else alert ("El Espacio de color del documento no es CMYK. Cambie el Modo de color del documento al Modo CMYK", "Se requiere el documento CMYK");  else else alert ("No hay ningún documento disponible o el documento está vacío");  function convertTograd () // Logic para convertir el color plano en degradado

En la estructura de código anterior, simplemente estamos creando una verificación de requisitos previos para nuestra función lógica principal: converToGrad (). es decir, la lógica principal debe ejecutarse solo si se cumplen las siguientes condiciones:

  1. Al menos un documento con un objeto existe para que podamos trabajar en él..
  2. El espacio de color del documento debe ser CMYK, ya que toda la lógica se basa en los colores CMYK.

Paso 3.1 - Entendiendo las Entidades DOM

app.documents.length Devuelve el número total de documentos abiertos en Illustrator..

Un documento activo objeto se refiere al documento actual (activo) en el que está trabajando.

artículos de ruta se refiere a una colección de todos los artículo de ruta objetos dentro de un documento de Illustrator. Cualquier elemento gráfico como rectángulo, elipse, polígono, línea, formas personalizadas, etc. se denota como artículo de ruta; y una colección de todos estos artículo de ruta se denotan como artículos de ruta. Por lo tanto, app.activeDocument.pathItems.length Devolverá el número de entidades gráficas contenidas en el documento actual..

los documentColorSpace El objeto define el modo de color del documento. Estamos realizando esta validación porque toda la lógica de este script se basará en el espacio de color CMYK.

La estructura básica del código está todo listo y hecho. A continuación, entraremos en convertToGrad () función.

Paso 4 - Comenzando con la lógica principal

El primer y principal requisito de nuestra lógica principal es obtener el número total de elementos seleccionados. Si no se seleccionan elementos, el script le notificará que seleccione al menos un objeto. Para esto, agrega las siguientes líneas de código en convertToGrad () función:

función convertToGrad () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // prosiga con la lógica principal else alert ("Seleccione al menos un objeto");  // finalizar convertToGrad

var items = selección crea una nueva variable artículos y le asigna toda la selección. En la linea siguiente, items.length devuelve el número total de elementos seleccionados, que se asignan a totalSeleccionado.

Paso 5 - Obtención de los datos del usuario

Para convertir un color plano en un degradado, solicitaremos al usuario que ingrese algunos valores para Gradient Shift y el Gradient Angle. Pero antes de eso, revisemos lo que son..

Cambio de gradiente: Este es un valor numérico que decide la cantidad de color que se agregará o eliminará del color original. Esta es la parte central de nuestra lógica para convertir un color plano en un degradado.

¿Cómo funciona un cambio de gradiente? Para entender cómo funciona, considere un ejemplo simple de un objeto lleno de valores CMYK: C = 50, M = 20, Y = 100 y K = 30 respectivamente.

A continuación, le pedimos al usuario que ingrese un valor para Gradient Shift. Denotemos este valor por gShift, y el usuario ha introducido 10 para gShift.

Una vez que tenemos el gShift Valor, crearemos dos paradas de gradiente para nuestro objeto. La primera parada, es decir, la más ligera; tendrá todos los valores CMYK disminuidos por gShift. Considerando que, la última parada, es decir, la más oscura, tendrá todos los valores CMYK incrementados por gShift.

De esta manera, se generará un degradado de oscuro a claro a partir del color de relleno real. También realizaremos algunas validaciones para restringir los valores CMYK dentro de 0 y 100, porque sumar o restar un gShift El valor puede mover los valores CMYK más allá de 0 o 100.

Ángulo de gradiente: Aunque no es parte de la lógica central, utilizaremos esta función para proporcionar cierta accesibilidad y libertad para elegir un ángulo personalizado para el gradiente resultante. El uso del ángulo de degradado se verá en la etapa posterior de este tutorial..

Volvamos al código y obtengamos los datos del usuario..

Paso 6

Para obtener los datos del usuario, ingrese las siguientes líneas de código en el if (totalSelected> 0) bloquear:

if (totalSelected> 0) var gShift = Math.round (prompt ("Introduzca un valor para Gradient shift", "10", "Gradient Shift")); if (gShift == null || gShift <=0) gShift=0; if(gShift >= 100) gShift = 100; var gradAngle = prompt ("Ángulo de vector para gradiente", "0.0", "Ángulo de gradiente") if (gradAngle == null) gradAngle = 0;  //terminara si

En las líneas de código anteriores, estamos solicitando al usuario que ingrese algún valor para el cambio de gradiente y el ángulo de gradiente. los Math.round () La función redondea el valor ingresado en un número entero. (Nota: puedes saltarte Math.round () Si desea tener valores decimales aceptados.) Los valores por defecto para gShift y gradAngle se establecen en "10" y "0.0" respectivamente.

Tenga en cuenta que también estamos validando los valores ingresados ​​para nulo y cero. Se encuentra un nulo cuando un usuario hace clic en el botón Cancelar. Además, estamos restringiendo la gShift valor dentro de 0 y 100.

Una vez que tengamos el gShift y gradAngle Valores, podemos proceder con el resto del código..

Paso 7 - Trabajando en los objetos seleccionados

Justo después de la gradAngle Declaración, ingrese las siguientes líneas de código:

 para (var j = 0; j < totalSelected; j++)  var currentObject = app.activeDocument.selection[j]; if(currentObject.typename != "CompoundPathItem" && currentObject.typename != "GroupItem")  if(currentObject.filled==true && currentObject.fillColor.typename != "GradientColor" && currentObject.fillColor.typename != "PatternColor" && currentObject.fillColor.typename != "SpotColor" &&) currentObject.fillColor.typename != "GrayColor"  //perform color conversion here  else  alert("Fill an object with CMYK color. Any objects containing\ngradients, patterns, spot colors or empty fills will be omitted."," Only CMYK Colors Allowed");   else  alert("This script only works with Non-Compound Objects or Isolated Group items.\nAny items with Groups or Compound Objects will be omitted.", "Ungroup or Isolate the Group Items");  //endfor

app.activeDocument.selection [j] devuelve el objeto seleccionado uno por uno para cada iteración de j.

Para cada objeto seleccionado, estamos haciendo algunas validaciones y comprobaciones. Estos controles son cruciales en esta etapa. La primera comprobación es determinar si el objeto es un elemento compuesto o un elemento de grupo. Dado que este script no funcionará directamente en grupos u objetos compuestos, esta verificación es obligatoria.

En el siguiente nivel, estamos comprobando si el objeto seleccionado ya es un degradado, un patrón o un color plano. Si es así, estos objetos serán omitidos..

Hay un cheque más para la especificación de graycolor. GrayColor es ligeramente diferente a la especificación de color CMYK.

Se trata de una técnica detallada para tratar objetos con la especificación de grayColor, que no estoy incluyendo en esta etapa del tutorial. Sin embargo, esta técnica se incluye en los archivos fuente para su interés..

Paso 8 - Elige y divide el color

De acuerdo con nuestra lógica y algoritmo, elegiremos el color para cada objeto seleccionado y dividiremos sus valores CMYK en cuatro variables diferentes, como se muestra a continuación:

 var currentColor = currentObject.fillColor; var currentCyan = Math.round (currentColor.cyan); var currentMagenta = Math.round (currentColor.magenta); var currentYellow = Math.round (currentColor.yellow); var currentBlack = Math.round (currentColor.black);

Nota: Todas estas líneas de código deben estar dentro del bloque "Realizar conversión de color", como se muestra en el Paso 7.

pathItem.fillColor devuelve el color de relleno de un elemento de ruta particular. En nuestro caso, el artículo de ruta es objeto actual. Estamos usando color.cyan, color.magenta, color amarillo y de color negro propiedades para recuperar los valores C, M, Y y K, respectivamente, en cuatro variables diferentes. Una vez que configuramos estos valores, podemos compensarlos fácilmente con gShift.

Paso 9 - Declare colores para gradientes de rampas

Nuestro gradiente resultante tendrá dos paradas de gradiente. Vamos a denotar con color de inicio y color final. La declaración de la variable para estos dos colores de rampstop será como se muestra a continuación:

var startColor = new CMYKColor (); var endColor = new CMYKColor ();

los CMYKColor es una especificación de color CMYK utilizada para objetos de color. Aquí el color de inicio y color final Se declaran como nuevos colores CMYK..

Paso 10 - Compensación de startColor y endColor

En esta etapa, tenemos todos los recursos necesarios para crear un nuevo gradiente. Tenemos color actual (con valores separados de CMYK), color de inicio, color final y gShift. Ahora podemos establecer los valores de color finales para color de inicio y color final utilizando la técnica de compensación.

Paso 10.1 - Configuración del color de inicio

los color de inicio Será la parte más ligera del gradiente. Por lo tanto, vamos a restar gShift de los valores C, M, Y y K de color actual, Resultando en color de inicio.

startColor.cyan = currentCyan - gShift; startColor.magenta = currentMagenta - gShift; startColor.yellow = currentYellow - gShift; startColor.black = currentBlack - gShift;

Esto es simple, pero tenemos que realizar algunas comprobaciones. Por ejemplo, ¿qué pasará si el corrienteCyan ya es menor que gShift? Decir, corrienteCyan es 10 y gShift es 20. El valor cian resultante para color de inicio se convertirá en 10-20 = (-) 10. Para solucionar este problema, modificaremos el conjunto de códigos anterior en las siguientes líneas de código:

 si (currentCyan < gShift) startColor.cyan= 0; else startColor.cyan= currentCyan - gShift; if(currentMagenta < gShift) startColor.magenta= 0; else startColor.magenta = currentMagenta - gShift; if(currentYellow < gShift) startColor.yellow= 0; else startColor.yellow= currentYellow - gShift; if(currentBlack < gShift) startColor.black= 0; else startColor.black = currentBlack - gShift;

Paso 10.2 - Configuración del color final

los color final Será la parte más oscura del gradiente. Por lo tanto, vamos a añadir gShift a los valores de C, M, Y y K o color actual respectivamente. Después de la simple adición, el código debe verse como sigue:

 endColor.cyan = currentCyan + gShift; endColor.magenta = currentMagenta + gShift; endColor.yellow = currentYellow + gShift; endColor.black = currentBlack + gShift;

Una vez más, todo se ve bien. Pero hay una complicación: ¿Qué pasará si la adición de gShift resulta en un valor mayor que 100? Por ejemplo, corrienteCyan es 95 y gShift es 20. Añadir estos dos resultará como endColor.cyan = 115; lo cual no es aceptable. Así lo compensaremos con algunas validaciones..

Vamos a crear una nueva variable gShiftEnd, que es igual a Cambio de 100 g. A continuación, verificaremos si el valor actual de C, M, Y o K es mayor que gShiftEnd. Si es así, estableceremos el valor C, M, Y o K del color final en 100; de lo contrario, estableceremos el valor C, M, Y o K de endColor agregando gShift a la actual C, M, Y o K. Esto se puede elaborar a partir del ejemplo que acabamos de ver arriba.

Tenemos currentCyan = 95 y gShift = 20. Por lo tanto, gShiftEnd = 100 - 20. es decir, 80. A continuación, currentCyan es mayor que gShiftEnd; por lo que vamos a configurar endColor.cyan a 100.

Siguiendo este principio, nuestro código se modificará a lo siguiente:

 gShiftEnd = 100-gShift; if (currentCyan> gShiftEnd) endColor.cyan = 100; else endColor.cyan = currentCyan + gShift; if (currentMagenta> gShiftEnd) endColor.magenta = 100; else endColor.magenta = currentMagenta + gShift; if (currentYellow> gShiftEnd) endColor.yellow = 100; else endColor.yellow = currentYellow + gShift; if (currentBlack> gShiftEnd) endColor.black = 100; else endColor.black = currentBlack + gShift;

Entonces, hasta este punto, el código completo se verá así:

if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToGrad ();  else alert ("El espacio de color del documento no es CMYK. Cambie el Modo de color del documento al Modo CMYK", "Se requiere el documento CMYK");  // end main main si alert "(O no hay ningún documento disponible o el documento está vacío");  función convertToGrad () var items = selection; var totalSelected = items.length; if (totalSelected> 0) var gShift = Math.round (prompt ("Introduzca un valor para Gradient shift", "10", "Gradient Shift")); if (gShift == null || gShift <=0) gShift=0; if(gShift >= 100) gShift = 100; var gradAngle = prompt ("Ángulo de vector para gradiente", "0.0", "Ángulo de gradiente") if (gradAngle == null) gradAngle = 0; para (var j = 0; j < totalSelected; j++)  var currentObject = app.activeDocument.selection[j]; if(currentObject.typename != "CompoundPathItem" && currentObject.typename != "GroupItem")  if(currentObject.filled==true && currentObject.fillColor.typename != "GradientColor" && currentObject.fillColor.typename != "PatternColor" && currentObject.fillColor.typename != "SpotColor" && currentObject.fillColor.typename != "GrayColor" )  var currentColor = currentObject.fillColor; var currentCyan = Math.round(currentColor.cyan); var currentMagenta = Math.round(currentColor.magenta); var currentYellow = Math.round(currentColor.yellow); var currentBlack = Math.round(currentColor.black); // Create a color for both ends of the gradient var startColor = new CMYKColor(); var endColor = new CMYKColor(); if(currentCyan < gShift) startColor.cyan = 0; else startColor.cyan = currentCyan - gShift; if(currentMagenta < gShift) startColor.magenta = 0; else startColor.magenta = currentMagenta - gShift; if(currentYellow < gShift) startColor.yellow = 0; else startColor.yellow = currentYellow - gShift; if(currentBlack < gShift) startColor.black= 0; else startColor.black = currentBlack - gShift; gShiftEnd = 100 - gShift; if(currentCyan > gShiftEnd) endColor.cyan = 100; else endColor.cyan = currentCyan + gShift; if (currentMagenta> gShiftEnd) endColor.magenta = 100; else endColor.magenta = currentMagenta + gShift; if (currentYellow> gShiftEnd) endColor.yellow = 100; else endColor.yellow = currentYellow + gShift; if (currentBlack> gShiftEnd) endColor.black = 100; else endColor.black = currentBlack + gShift; // Bloque de declaración de degradado // endif else alert ("Rellene un objeto con color CMYK. Cualquier objeto que contenga \ ngradientes, patrones, colores planos o rellenos vacíos se omitirá", "Sólo se permiten colores CMYK");  else else alert ("Este script solo funciona con objetos no compuestos o elementos de grupo aislados. \ nSe omitirá cualquier elemento con grupos u objetos compuestos", "Desagrupar o aislar los elementos de grupo");  // endfor // end selected else alert ("Seleccione al menos un objeto"); 

Paso 11 - Creando el Nuevo Gradiente

Ahora que hemos establecido el color de inicio y color final; Podemos proceder con la creación del nuevo gradiente..

Paso 11.1 - Declara el gradiente

Para agregar un nuevo gradiente, inserte las siguientes líneas de código en el "// Bloque de declaración de gradiente".

 var newGradient = app.activeDocument.gradients.add (); newGradient.type = GradientType.LINEAR;

Esto agregará un nuevo gradiente de tipo lineal en el documento activo actual.

Paso 11.2 - Configuración de las propiedades del degradado recién creado

Agregue las siguientes líneas de código justo después de la declaración de gradiente:

 // Modificar el primer gradiente detener newGradient.gradientStops [0] .rampPoint = 0; newGradient.gradientStops [0] .midPoint = 50; newGradient.gradientStops [0] .color = startColor; // Modificar el último gradiente detener newGradient.gradientStops [1] .rampPoint = 100; newGradient.gradientStops [1] .color = endColor;

gradientStop [0] Es la primera parada de gradiente, mientras que, gradientStop [1] Es la última parada de gradiente. Si desea tener más paradas de degradado, puede denotarlas como gradientStop [2], gradientStop [3] y así.

punto de rampa se utiliza para establecer la posición del punto de rampa del gradientStop asociado. Hemos establecido el primer y último punto de rampa como 0 y 100 respectivamente. punto medio se utiliza para establecer la posición del punto medio entre dos paradas de degradado. Hemos establecido esto en 50. Finalmente, hemos asignado los valores de color de inicio y color final a la primera y última gradientes paradas respectivamente.

Paso 12 - Crear un objeto de color degradado

Casi hemos terminado con la conversión de color y la formación de degradado. A continuación, debemos aplicar este degradado recién creado al objeto seleccionado actualmente. Para ello, crearemos un objeto de color degradado que se refiera al degradado recién creado..

Nota: No podemos aplicar el degradado recién creado directamente como un color de relleno al objeto. Para utilizar este degradado, tendremos que crear un nuevo objeto de Color degradado, como se muestra a continuación:

 // construye un objeto Illustrator.GradientColor refiriéndose al // gradiente recién creado var colorOfGradient = new GradientColor (); colorOfGradient.gradient = newGradient;

Paso 13 - Aplicar el gradiente

Finalmente, llenaremos el objeto actual con el colorOfGradient, Como se muestra abajo:

 // obtener el elemento de la ruta actual, aplicar un nuevo gradiente como su relleno currentObject.fillColor = colorOfGradient; currentObject.rotate (gradAngle, false, false, true, false, Transformation.CENTER);

Hemos aplicado una matriz de rotación al objeto actual. Esta matriz de rotación hace uso del ángulo de degradado para transformar el degradado. La sintaxis de rotación es:


girar
(ángulo
[, cambiar posiciones]
[, changeFillPatterns]
[, changeFillGradients]
[, changeStrokePattern]
[, rotateAbout])

Aquí, hemos establecido ChangeFillgradients a "verdadero" y el resto a "falso". Esta es una manera difícil de rotar el color del degradado en un ángulo particular. Gracias a John Wundes por sugerirme esta técnica inteligente..

Paso 14 - El guión final

El script final después de la codificación completa se muestra a continuación:

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToGrad ();  else alert ("El espacio de color del documento no es CMYK. Cambie el Modo de color del documento al Modo CMYK", "Se requiere el documento CMYK");  // end main main si alert "(O no hay ningún documento disponible o el documento está vacío");  función convertToGrad () var items = selection; var totalSelected = items.length; if (totalSelected> 0) var gShift = Math.round (prompt ("Introduzca un valor para Gradient shift", "10", "Gradient Shift")); if (gShift == null || gShift <=0) gShift=0; if(gShift >= 100) gShift = 100; var gradAngle = prompt ("Ángulo de vector para gradiente", "0.0", "Ángulo de gradiente") if (gradAngle == null) gradAngle = 0; para (var j = 0; j < totalSelected; j++)  var currentObject = app.activeDocument.selection[j]; if(currentObject.typename != "CompoundPathItem" && currentObject.typename != "GroupItem")  if(currentObject.filled==true && currentObject.fillColor.typename != "GradientColor" && currentObject.fillColor.typename != "PatternColor" && currentObject.fillColor.typename != "SpotColor" && currentObject.fillColor.typename != "GrayColor" )  var currentColor = currentObject.fillColor; var currentCyan = Math.round(currentColor.cyan); var currentMagenta = Math.round(currentColor.magenta); var currentYellow = Math.round(currentColor.yellow); var currentBlack = Math.round(currentColor.black); // Create a color for both ends of the gradient var startColor = new CMYKColor(); var endColor = new CMYKColor(); if(currentCyan < gShift) startColor.cyan= 0; else startColor.cyan = currentCyan - gShift; if(currentMagenta < gShift) startColor.magenta = 0; else startColor.magenta = currentMagenta - gShift; if(currentYellow < gShift) startColor.yellow = 0; else startColor.yellow = currentYellow - gShift; if(currentBlack < gShift) startColor.black = 0; else startColor.black = currentBlack - gShift; gShiftEnd = 100 - gShift; if(currentCyan > gShiftEnd) endColor.cyan = 100; else endColor.cyan = currentCyan + gShift; if (currentMagenta> gShiftEnd) endColor.magenta = 100; else endColor.magenta = currentMagenta + gShift; if (currentYellow> gShiftEnd) endColor.yellow = 100; else endColor.yellow = currentYellow + gShift; if (currentBlack> gShiftEnd) endColor.black = 100; else endColor.black = currentBlack + gShift; // Crear un nuevo gradiente // Un nuevo gradiente siempre tiene 2 paradas var newGradient = app.activeDocument.gradients.add (); newGradient.type = GradientType.LINEAR; // Modificar el primer gradiente detener newGradient.gradientStops [0] .rampPoint = 0; newGradient.gradientStops [0] .midPoint = 50; newGradient.gradientStops [0] .color = startColor; // Modificar el último gradiente detener newGradient.gradientStops [1] .rampPoint = 100; newGradient.gradientStops [1] .color = endColor; // construye un objeto Illustrator.GradientColor refiriéndose al // gradiente recién creado var colorOfGradient = new GradientColor (); colorOfGradient.gradient = newGradient; // obtener el elemento de la ruta actual, aplicar un nuevo gradiente como su relleno currentObject.fillColor = colorOfGradient; currentObject.rotate (gradAngle, false, false, true, false, Transformation.CENTER);  // endif else alert ("Rellene un objeto con color CMYK. Se omitirá cualquier objeto que contenga \ ngradientes, patrones, colores planos o rellenos vacíos", "Sólo se permiten colores CMYK");  else else alert ("Este script solo funciona con objetos no compuestos o elementos de grupo aislados. \ nSe omitirá cualquier elemento con grupos u objetos compuestos", "Desagrupar o aislar los elementos de grupo");  // en