Scripting Illustrator Del 2 - Slik melder du en gradvis inn i en flat prosessfarge

I del 1 av denne todelte opplæringsserien lærte vi å kode et skript som konverterer en flat prosessfarge til den tilsvarende gradienten. I denne opplæringen lærer vi å kode et skript som konverterer en gradientfylling til en flat prosessfarge. Vi vil smelte den tilgjengelige gradientfargen til en flat prosessfarge, som vil være en blanding av alle fargene som er tilgjengelige i den gradienten.

Hele oppgaven vil bli utført via JavaScript-skript for Illustrator. Opplæringen tar utgangspunkt i at du er kjent med grunnleggende om skripting. For de som har landet direkte på denne opplæringen, har vi litt kunnskap om Illustrators Javascripts i Del 1 i denne serien. Så uten ytterligere forsinkelser, la oss komme i gang!

Vector Plus

Ønsker du tilgang til hele Vector Source-filene og nedlastbare kopier av hver opplæring, inkludert denne? Bli med Vector Plus for bare 9 $ i måneden.

Opplæringsdetaljer

  • Program: Adobe Illustrator og ExtendedScript Toolkit
  • Versjon: CS3
  • Vanskelighetsgrad: Mellomliggende
  • Anslått sluttid: 3 til 4 timer

Formålet med skriptet

Vi vil at dette skriptet skal utføre en veldig enkel oppgave. I Adobe Illustrator, når en bruker velger noen objekter fylt med en CMYK Gradient Color, og utfører dette Script; gjenstandene skal konverteres til en flat CMYK-fylling. Denne flate fyllingen vil være en blanding av alle fargene som er tilgjengelige i den tidligere gradienten. Se bildet nedenfor for avklaring.

Derfor er målet med skriptet vårt å konvertere en gradient CMYK-utfylling til en flat CMYK-fylling.

Logikk og algoritme

Logikken for å smelte fargene til en gradient i en enkelt farge er enkel og rettferdig. Vi velger alle fargene fra gradienten, finner gjennomsnittet og tildeler objektet som en ny farge. Vi kan forstå dette i fem trinn, som vist nedenfor:

  • Trinn 1: Velg fargen på det nåværende objektet. dvs. currentColor = farge på det valgte objektet.
  • Steg 2: Count antall gradientstopp i den aktuelle fargen.
  • Trinn 3: Ved hvert gradientstopp velger du den tilhørende fargen og dens CMYK-verdier.
  • Trinn 4: Beregn gjennomsnittlig CMYK-verdi for alle farger som er tilgjengelige ved forskjellige stopp.
  • Trinn 5:
    Tilordne denne gjennomsnittlige CMYK-verdien som en ny farge til objektet.

Ovennevnte algoritme kan lett forstås fra bildetillatelsen nedenfor.

Vi har sett en kort oversikt over logikken. La oss begynne med kodingen.

Trinn 1 - Begynn med kodestrukturen

Åpne ExtendedScript Toolkit og opprett en ny Javascript-fil (Command + N). Velg deretter Adobe Illustrator for målprogrammet.

I kodedigeringsområdet legger du til følgende kodestruktur for visse valideringer og forutgående kontroller.

 hvis (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Konverter objekter til CMYK først", "CMYK-konvertering kreves");  // avslutte hoved hvis ellers alert ("Ingen av dokumentene er tilgjengelige eller dokumentet er tomt"); 

Vi kontrollerer om minst ett dokument med minst én objekt eksisterer, slik at vi kan jobbe med det. Deretter sjekker vi om dokumentfargemodus er CMYK eller ikke. Dette er et viktig skritt fordi all logikken for fargekonvertering i dette skriptet er basert på CMYK-farger. convertToFlat () er hovedfunksjonen som vil inneholde all logikken. Lagre denne filen som test.jsx.

Steg 2

La oss nå begynne med hovedfunksjonen - convertToFlat (). Vi kontrollerer om noe er valgt eller ikke, fordi dette skriptet bare vil fungere på de valgte objektene. Følg deretter følgende kodelinjer til "test.jsx."

 funksjon convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // fortsett med hovedlogikken annet alert ("Vennligst velg minst ett objekt");  // end convertToGrad

Trinn 3

Deretter vil vi starte en løkke inne i "hvis (totalt valgt> 0)"blokk. Denne sløyfen vil inneholde fargekonverteringlogikken, som gjentas for hvert valgt element. Men like før fargekonverteringslogikken, la oss legge til noen flere valideringer og sjekker i den kretsen.

 hvis (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 conversion Block  //endif else  alert("Fill an object with CMYK or Grayscale Gradient. Flat Colors, Patterns, Spot Colors and Empty Fills are not allowed."," Only Gradients Allowed");   //endif 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 // endif

For hvert valgt element sjekker vi om det er en sammensatt sti eller et gruppepunkt. I så fall skal skriptet ikke utføres lenger og returnere en varselmelding. Videre kontrollerer vi om fyltypen til det valgte elementet er noe annet enn Gradient Fill. d.v.s. Hvis det er en spotfarge, flat CMYK-farge eller et mønster; Skriptet skal returnere et varsel. Disse kontrollene utføres fordi vårt skript bare vil fungere for gradientfylte, ikke-sammensatte baneelementer.
Deretter vil vi endre fargekonverteringsblokken.

Trinn 4

På dette stadiet må vi trekke ut individuelle C-, M-, Y- og K-verdier for fargene som ligger i forskjellige gradientstopp. For det vil vi opprette noen variabler som vil holde individuelle CMYK-verdier. Så legg til følgende variabeldeklarasjoner like innenfor Fargekonvertering blokk:

 var currentColor = 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 gulTotal = 0; var blackTotal = 0; var gråTotal = 0;

Vi vil se rollen til hver variabel en-for-en:

  • current vil lagre fyllfarge (gradient) for det valgte objektet.
  • numOfStops inneholder det totale antall gradientstopp som er tilgjengelig i det valgte objektet. Dette vil bli brukt til å finne gjennomsnittet av fargeverdier i senere stadier.
  • fargeboks er en matrise som vil holde fyllefargeverdien for alle gradientstoppene. dvs. hvis numOfStops er fire.
  • fargeboks array vil inneholde fire farger.
  • cyanBox er en matrise som holder cyanverdier for hver farge på forskjellige gradientstopp.
  • på samme måte, magentaBox, yellowbox og
    svart boks Hold respektive fargeverdier for hver farge på forskjellige gradientstopp.
  • grayBox er en matrise som har grå verdier for fargen på en gradientstopp. Dette er viktig fordi den grå fargen er en annen spesifikasjon enn CMYK-fargespesifikasjon. Hvis et objekt inneholder en grå gradient, håndterer vi situasjonen separat ved å benytte seg av denne variabelen.
  • Endelig har vi cyanTotal, magentaTotal, yellowTotal, blackTotal og grayTotal. Disse variablene inneholder summasjonen av henholdsvis cyan, magenta, gul, svart eller grå.

Trinn 5

Vi har utført valideringer og sjekker. Vi har også opprettet nødvendige beholdere for å holde fargeverdier. Deretter løper vi en sløyfe som leser hver gradientstopp en-for-en. For det, opprett en løkke, som vist nedenfor:

 for (var k = 0; k < numOfStops; k++)  colorBox[k] = currentColor.gradient.gradientStops[k].color; if(colorBox[k].typename == "GrayColor")  // Extract Gray Color values  else  // Extract CMYK Color values  //end for k

currentColor.gradient.gradientStops [k] Color returnerer fargen til et bestemt gradientstopp for hver iterasjon av k.

For hver gradientstopp kontrollerer vi om tilgjengelig farge er en GrayColor spesifikasjon eller a CMYKColor spesifikasjonen. Avhengig av det, vil vi implementere vår logikk.

Trinn 6 - Summering av GrayColor-verdier

Inne i "hvis blokk"for GrayColor spesifikasjon, legg til følgende linjer med kode:

 grayBox [k] = Math.round (colorBox [k] .gray); grayTotal = grayTotal + grayBox [k];

derav, grayBox [k] vil holde alle de grå verdiene for hver farge ved de respektive gradientstoppene.
neste, grayTotal vil være summasjonen av disse gråfargeverdiene, som vil bli brukt senere.

Trinn 7 - Summering av CMYK-fargeverdier

Inne i "ellers blokkere"for CMYKColor spesifikasjon, legg 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]; gulTotal = gulTotal + gulBox [k]; blackTotal = blackTotal + blackBox [k];

For å forstå hva som blir utført her, tar vi et eksempel på Cyan farge. cyanBox [k] lagrer cyanverdiene for alle fargene som ligger i forskjellige gradientstopp. neste, cyanTotal er summen av alle disse cyanverdiene som er lagret i cyanBox [k].

En lignende operasjon utføres for magenta, gul og svart også. Når summeringen er ferdig, kan vi komme ut av løkken og fortsette fremover for gjennomsnittet.

Trinn 8 - Gjennomsnittlig fargeverdier

Vi har samlet den enkelte summeringen av grayColor og CMYKColor for hele graden stopper. Nå må vi gjennomsnittlig dem. For det, lukk "for k loop"og skriv inn følgende kodelinjer like etter avslutningsarmbåndet til"for k loop", som vist under:

  // end for k loop 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 kodelinjene deler vi individuelle summeringer av C, M, Y og K ved numOfStops. dvs. hvis det var fem gradientstopp, vil vi dele summasjonen av individuelle C-, M-, Y- og K-verdier med fem. Deretter returnerer et gjennomsnitt på fem verdier. Disse gjennomsnittlige verdiene lagres som newCyan, newMagenta, newYellow og newBlack henholdsvis.

Legg merke til det vanskelige tilfellet av grå og svart her. Summen av K er ikke bare blackTotal. Snarere er det en sum av grayTotal og blackTotal.

Hvorfor har vi gjort det? Det er tilfeller der en gradientfylling kan inneholde begge GrayColor-stopp og CMYK stopper. I så fall legges de grå fargeverdiene til K-verdien av CMYK-fargene. Grå kan ikke legges til cyan, magenta eller gul. Det vil bare falle i kategorien K.

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

Trinn 9 - Implementere den nye fargen

For å implementere den nye fargen, vil vi opprette en ny CMYKColor objekt og endre sine C, M, Y og K-verdier til de som vi nettopp har beregnet i trinn 7. For å gjøre det, legg til følgende linjer med kode:

 var newColor = ny CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;

Vi har opprettet en newColor objekt og tilordne verdiene for newCyan, newMagenta, newYellow og newBlack som henholdsvis C, M, Y og K.

Deretter har vi tildelt newColor som en Fyll farge til det nåværende objektet. Derfor vil vår siste kode nå se ut som den nedenfor:

 hvis (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Konverter objekter til CMYK først", "CMYK-konvertering kreves");  // avslutte hoved hvis ellers alert ("Ingen av dokumentene er tilgjengelige eller dokumentet er tomt");  funksjon convertToFlat () var items = selection; var totalSelected = items.length; hvis (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 currentColor = 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("Fill an object with CMYK or Grayscale Gradient. Flat Colors, Patterns, Spot Colors and Empty Fills are not allowed."," Only Gradients Allowed");  // endif 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");  //end for j // endif else  alert("Please select atleast one object");  //endFunction

Trinn 10 - Utfør skriptet

Lagre dette skriptet som "test.jsx" og åpne Adobe Illustrator. Deretter lager du noen objekter med fargerike gradientfyll. Nå for å teste dette skriptet, velg noen objekter og gå til File> Scripts> Other Script (Command + F12) og finn dette skriptet.

Etter vellykket utførelse av manuset, bør du se en smelte av gradienter; noe som ligner på dette:

Konklusjon og omfang

I denne opplæringen har vi sett hvordan man smelter en gradient til en flat fargefylling ved hjelp av skript. Dette skriptet kan bli funnet nyttig i tilfeller der du må finne gjennomsnittet av to eller flere farger. Men frukten av denne opplæringen er å forstå grunnleggende om skripting og deres implementering med Illustrator.

Det er et bredt spekter av vektorkreativitet og innovasjon gjennom skripting. Håper denne todelte opplæringsserien vil inspirere lesere og forfattere til å frembringe essensen av skripting. Takk for din verdifulle tid i å lese denne opplæringen.

Abonner på Vectortuts + RSS-feed for å holde deg oppdatert med de nyeste vektoropplæringene og artiklene.