Scripting Illustrator Del 2

Scripting Illustrator Del 2 - Hvordan Meld en Gradient inn en Flat Process Color

I del 1 av denne todelt opplæringen serien, lærte vi hvordan å kode et skript som konverterer en flat prosess farge inn sin tilpasning gradient. I denne opplæringen vil vi lære å kode et skript som konverterer en gradient fyll inn en flat prosessfarge. Vi vil smelte den tilgjengelige gradient farge i en flat prosessfarge, noe som vil være en blanding av alle fargene som er tilgjengelige i det gradient.

Hele denne oppgaven vil bli utført via Javascript i Illustrator. Opplæringen forutsetter at du er kjent med det grunnleggende scripting. For de som har direkte landet på denne opplæringen, har vi en liten know-how dekket om Illustrator er Javascripts i del 1 av denne serien. Så uten ytterligere forsinkelser, la oss komme i gang!



Vector Plus

Vil du ha tilgang til de fulle Vector kildefiler og nedlastbare kopier av hver tutorial, inkludert denne? Bli med Vector Plus for bare 9 $ i måneden

Tutorial Detaljer

Program:. Adobe Illustrator og ExtendedScript Toolkit

Version: CS3

Vanskelighetsgrad : Intermediate

Estimert Gjennomføring Tid: 3 til 4 timer

Formål med Script

Vi ønsker at dette skriptet til å utføre en svært enkel oppgave. I Adobe Illustrator, når en bruker velger noen objekter som er fylt med en CMYK Gradient Color, og utfører dette Script; objektene skal bli omgjort til en Flat CMYK fyll. Denne flat fill vil være en blanding av alle fargene som er tilgjengelige i det tidligere gradient. Se bildet nedenfor for avklaring.

Derfor er målet med våre skript for å konvertere en Gradient CMYK Fyll inn i en Flat CMYK Fill.

Logikk og Algoritmen

Logikken for smelting av fargene på en gradient i en enkelt farge er enkel og grei. Vi henter alle fargene fra gradient, finne sin gjennomsnitt og tilordne den til objektet som en ny farge. Vi kan forstå dette i fem trinn, som vist nedenfor:

Trinn 1:
Plukk fargen på det aktuelle objektet. dvs. current = fargen markerte objektet

Trinn 2:.
Tell antall gradient stopper gjeldende farge

Trinn 3:.
På hvert gradient stopp, plukke den tilhørende farge og dets CMYK-verdier

Trinn 4:..
Beregn gjennomsnittlig CMYK verdien for alle farger tilgjengelige på forskjellige stopper

Trinn 5: største nettstedene Tildele dette gjennomsnittet CMYK verdi som en ny farge til objektet.

kan Listen algoritme være lett å forstå fra billedlig fremstilling nedenfor.

Vi har sett en kort oversikt over logikken. La oss komme i gang med koding

Trinn 1 -. Fra og med kodestruktur

Åpne ExtendedScript Toolkit og opprette en ny Javascript-fil (Command + N). Deretter velger du Adobe Illustrator for målet søknaden

I koden redigeringsområdet, legg til følgende kode struktur for visse valideringer og forutsetning sjekker
if (app.documents.length >.. 0 & & app.activeDocument.pathItems.length > 0) {if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) {convertToFlat (); } Else {alert ("Konverter Objekter i CMYK først", "CMYK konvertering kreves"); }} //Avslutter hoved hvis else {alert ("Enten ingen dokumenter er tilgjengelig eller dokumentet er tom"); }

Vi sjekker dersom minst ett dokument med minst ett objekt eksisterer, slik at vi kan jobbe på det. Deretter blir vi sjekke om dokumentet fargemodus er CMYK eller ikke. Dette er et viktig skritt fordi all logikk for fargekonvertering i dette manuset er basert på CMYK-farger. convertToFlat () er den viktigste funksjonen som vil inneholde all logikk. Deretter lagre denne filen som test.jsx

Trinn 2

La oss nå begynne med det viktigste funksjon -. ConvertToFlat (). Vi skal sjekke om noen element er valgt eller ikke, fordi dette skriptet vil fungere på de utvalgte objektene bare. Derfor legge til følgende linjer med kode for å "test.jsx."
Funksjon convertToFlat () {var elementer = valg; Var totalSelected = items.length; if (totalSelected > 0) {//fortsette med hoved logikk} else {alert ("Vennligst velg minst én objekt"); }} //End convertToGrad
Trinn 3

Neste, vi vil starte en sløyfe inne i "if (totalSelected > 0)" block. Denne sløyfe vil inneholde fargekonvertering logikk, som gjentas for hver valgte element. Men like før fargekonvertering logikk, la oss legge til noen flere valideringer og sjekker inne som sløyfe
om. (TotalSelected > 0) {for (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 = "CMYKColor" & & currentObject.fillColor.typename = "PatternColor" &! &!. currentObject.fillColor.typename = "SpotColor") {//Color konvertering Block} //endif else {alert ("Fyll et objekt med CMYK eller gråtone Gradient Flat farger, mønstre, spotfarger og Tomme Fills er ikke tillatt "," Only gradienter tillatt. "); }} //Endif else {alert (".. Dette skriptet fungerer bare med ikke-sammensatte objekter eller isolert gruppe elementer \\ Nany elementer med grupper eller sammensatte objekter vil bli utelatt", "Del opp gruppe eller isolering av gruppeelementer"); }} //EndFor} //endif

For hvert valgte elementet, vi sjekker om det er en sammensatt bane eller en gruppe varen. I så fall skal skriptet ikke kjøre lenger og returnere en varselmelding. Videre er vi sjekke om fylle-type det valgte elementet er noe annet enn Gradient Fill. dvs. Hvis det er en spotfarge, flat CMYK farge eller et mønster; skriptet skal vende tilbake et varsel. Disse kontrollene utføres fordi skriptet vil bare fungere for graderings fylt ikke-sammensatt bane elementer.
Deretter vil vi endre fargekonverterings Block.

Trinn 4

På dette stadiet, vi trenger å trekke ut enkelte C, M, Y og K-verdier for fargene som er bosatt på forskjellige graderings stopper. For det, vil vi skape noen variabler som vil holde individuelle CMYK-verdier. Så legger du til følgende variabeldeklarasjoner rett innenfor Fargekonvertering blokk:
Var current = currentObject.fillColor; Var numOfStops = currentColor.gradient.gradientStops.length; Var ColorBox = []; Var cyanBox = []; Var magentaBox = []; Var yellowbox = []; Var Blackbox = []; Var grayBox = []; Var cyanTotal = 0; Var magentaTotal = 0; Var yellowTotal = 0; Var blackTotal = 0; Var grayTotal = 0;

Vi vil se hvilken rolle hver variabel én etter én:

current vil lagre fyllfargen (gradient) for det valgte objektet
<. li> numOfStops inneholder det totale antall gradient stopper tilgjengelig i øyeblikket valgte objektet. Dette vil bli brukt til å finne gjennomsnittet av fargeverdiene i senere faser.

  • ColorBox er en matrise som vil holde fill-fargeverdi for alle graderings stopper. dvs. hvis numOfStops er fire.

    ColorBox array vil inneholde fire farger.

    cyanBox er en matrise som inneholder cyan verdier for hver farge på forskjellige graderings stopper.

    På samme måte magentaBox , yellowbox og Selge Blackbox holde sine respektive fargeverdiene for hver farge på forskjellige graderings stopper.

    grayBox er en matrise som holder grå verdier for fargen på noen gradient stopp. Dette er viktig fordi den grå farge er en annen spesifikasjon enn CMYK-farge spesifikasjonen. I tilfelle, inneholder et objekt en grå gradient, vil vi håndtere situasjonen separat ved å gjøre bruk av denne variabelen.
  • Endelig har vi cyanTotal, magentaTotal, yellowTotal, blackTotal og grayTotal. Disse variablene inneholde summering av alle cyan, magenta, gul, svart eller grå verdiene henholdsvis.

    Trinn 5

    Vi har gjennomført de valideringer og sjekker. Vi har også laget nødvendige beholdere for å holde fargeverdiene. Deretter vil vi kjøre en løkke som leser hver gradient stopp en etter en. For at skape en loop, som vist nedenfor:
    for (var k = 0; k < numOfStops; k ++) {ColorBox [k] = currentColor.gradient.gradientStops [k] Color; if (ColorBox [k] .typename == "GrayColor") {//Pakk grå farge verdier} else {//Pakk CMYK fargeverdiene}} //end for k

    currentColor.gradient.gradientStops [k] Color returnerer fargen på en bestemt gradient stopp for hver iterasjon av k.

    For hver gradient stopp, vi sjekker om den tilgjengelige fargen er en GrayColor spesifikasjon eller en CMYKColor spesifikasjon. Avhengig av dette, vil vi implementere vår logikk

    Trinn 6 - Oppsummering av GrayColor Verdier

    Inne i "hvis block" for GrayColor spesifikasjon, legge til følgende linjer med kode.
    GrayBox [k] = Math.round (ColorBox [k] .gray); grayTotal = grayTotal + grayBox [k];

    Derfor vil grayBox [k] holde alle de grå verdier for hver farge på sine respektive gradient stopp
    Deretter vil grayTotal være summering av disse grå fargeverdier, som. vil bli brukt senere

    Trinn 7 - Oppsummering av CMYK Color verdier

    Inne i "annet block" for CMYKColor spesifikasjon, legge til følgende linjer med kode.
    cyanBox [k] = Math.round (ColorBox [k] .cyan); magentaBox [k] = Math.round (ColorBox [k] .magenta); yellowbox [k] = Math.round (ColorBox [k] .yellow); Blackbox [k] = Math.round (ColorBox [k] .Black); cyanTotal = cyanTotal + cyanBox [k]; magentaTotal = magentaTotal + magentaBox [k]; yellowTotal = yellowTotal + yellowbox [k]; blackTotal = blackTotal + Blackbox [k];

    For å forstå hva som blir utført her, vil vi ta et eksempel på Cyan farge. cyanBox [k] er lagring av cyan verdier for alle fargene som er bosatt på forskjellige graderings stopper. Deretter er cyanTotal summering av alle disse cyan verdiene som er lagret i cyanBox [k].

    En lignende operasjon utføres for magenta, gul og svart også. Når summering er gjort, kan vi komme ut av loopen og fortsett fremover for gjennomsnittlig

    Trinn 8 -. Midling fargeverdiene

    Vi har samlet den enkelte summering av grayColor og CMYKColor for alle gradienten stopper. Nå må vi gjennomsnittlig dem. For det, lukk "for k loop" og skriv inn følgende linjer med kode rett etter stengetid armbånd av "for k loop", som vist nedenfor:
    } //end for k sløyfe Var finalBlack = blackTotal + grayTotal; Var newCyan = Math.round (cyanTotal /numOfStops); Var newMagenta = Math.round (magentaTotal /numOfStops); Var newYellow = Math.round (yellowTotal /numOfStops); Var newBlack = Math.round (finalBlack /numOfStops);

    I de ovennevnte linjer med kode, er vi dele individuelle summeringer av C, M, Y og K ved numOfStops. dvs. Hvis det var fem graderings stopper, vil vi dele summering av individuell C, M, Y og K-verdier med fem. Dermed returnerer et gjennomsnitt på fem verdier. Disse gjennomsnittsverdier lagres som newCyan, newMagenta, newYellow og newBlack hhv.

    Legg merke til den vanskelige tilfelle av grått og svart her. Summering av K er ikke bare blackTotal. Snarere er det en sum av grayTotal og blackTotal.

    Hvorfor vi har gjort det?
    Det er tilfeller hvor en gradient fyll kan inneholde både GrayColor stopper og CMYK stopper. I så fall er de grå fargeverdiene overført til K-verdi på CMYK-farge. Gray kan ikke legges til cyan, magenta eller gul. Det vil falle i kategorien av bare K.

    Nå har vi alle de nye gjennomsnittsverdier for C, M, Y og K i hånden. I neste trinn, vil vi implementere disse verdiene som en ny CMYK farge på det aktuelle objektet

    Trinn 9 -. Implementering av den nye fargen

    For å implementere den nye fargen, vi vil skape en ny CMYKColor objekt og endre sin C, M, Y og K-verdier til de som vi bare beregnet i trinn 7. For å gjøre det, legge til følgende linjer med kode:
    Var newColor = new CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;

    Vi har laget en newColor objekt og tildelte verdiene av newCyan, newMagenta, newYellow og newBlack som sin C, M, Y og K-verdier på henholdsvis

    Neste, vi har tildelt. den newColor som en fillColor på det aktuelle objektet. Derfor vil vår endelige koden nå ser ut som den nedenfor:
    if (app.documents.length > 0 & & app.activeDocument.pathItems.length > 0) {if (app.activeDocument.documentColorSpace = = DocumentColorSpace.CMYK) {convertToFlat (); } Else {alert ("Konverter Objekter i CMYK først", "CMYK konvertering kreves"); }} //avslutter hoved ifelse {alert ("Enten ingen dokumenter er tilgjengelig eller dokumentet er tom");} funksjon convertToFlat () {var elementer = valg; Var totalSelected = items.length; if (totalSelected > 0) {for (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 = "CMYKColor" & & currentObject.fillColor.typename = "PatternColor" &! &! currentObject.fillColor.typename = "SpotColor") {var current = currentObject.fillColor; Var numOfStops = currentColor.gradient.gradientStops.length; Var ColorBox = []; Var cyanBox = []; Var magentaBox = []; Var yellowbox = []; Var Blackbox = []; Var grayBox = []; Var cyanTotal = 0; Var magentaTotal = 0; Var yellowTotal = 0; Var blackTotal = 0; Var grayTotal = 0; for (var k = 0; k < numOfStops; k ++) {ColorBox [k] = currentColor.gradient.gradientStops [k] Color; if (ColorBox [k] .typename == "GrayColor") {grayBox [k] = Math.round (ColorBox [k] .gray); grayTotal = grayTotal + grayBox [k]; } Else {cyanBox [k] = Math.round (ColorBox [k] .cyan); magentaBox [k] = Math.round (ColorBox [k] .magenta); yellowbox [k] = Math.round (ColorBox [k] .yellow); Blackbox [k] = Math.round (ColorBox [k] .Black); cyanTotal = cyanTotal + cyanBox [k]; magentaTotal = magentaTotal + magentaBox [k]; yellowTotal = yellowTotal + yellowbox [k]; blackTotal = blackTotal + Blackbox [k]; }} //End for k Var finalBlack = blackTotal + grayTotal; Var newCyan = Math.round (cyanTotal /numOfStops); Var newMagenta = Math.round (magentaTotal /numOfStops); Var newYellow = Math.round (yellowTotal /numOfStops); Var newBlack = Math.round (finalBlack /numOfStops); Var newColor = new CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor; } //Endif else {alert ("Fyll et objekt med CMYK eller gråtone Gradient flate farger, mønstre, Spotfarger og Tomme Fyller er ikke tillatt..", "Only gradienter tillatt"); }} //Endif else {alert (".. Dette skriptet fungerer bare med ikke-sammensatte objekter eller isolert gruppe elementer \\ Nany elementer med grupper eller sammensatte objekter vil bli utelatt", "Del opp gruppe eller isolering av gruppeelementer"); }} //End for j} //endif else {alert ("Vennligst velg minst én objekt"); }} //EndFunction
    Trinn 10 - Gjennomføring av Script

    Lagre dette scriptet som "test.jsx" og åpne Adobe Illustrator. Deretter lage noen objekter med fargerike gradert fyll. Nå for å teste dette skriptet, velger noen objekter og gå til Fil > Scripts > Andre Script (Command + F12) og finne dette skriptet

    Etter vellykket gjennomføring av skriptet, skal du se en smelte av stigninger.; noe som ligner på dette:

    Konklusjon og Scope

    I denne opplæringen, har vi sett hvordan å smelte en gradient i en flat farge fylle ved hjelp av skript. Dette skriptet kan bli funnet nyttig i tilfeller når du trenger å finne gjennomsnittet av to eller flere farger. Men frukten av denne opplæringen er å forstå det grunnleggende scripting og gjennomføringen med Illustrator.

    Det er et bredt omfang av vektor kreativitet og innovasjon gjennom scripting. Håper denne todelte tutorial serien vil inspirere lesere og forfattere i å bringe frem essensen av scripting. Takk for verdifull tid på å lese denne opplæringen.

    Abonner på Vectortuts + RSS-feed for å holde deg oppdatert med de nyeste vektor tutorials og artikler.