Scripting Illustrator Deel 2 - Hoe een gradiënt in een platte proceskleur te melden

In deel 1 van deze tweedelige instructiereeks hebben we geleerd hoe je een script codeert dat een platte proceskleur omzet in het bijbehorende verloop. In deze zelfstudie leren we een script coderen dat een verloopvulling omzet in een platte proceskleur. We smelten de beschikbare kleurverloop in een platte proceskleur, die een mengsel is van alle kleuren die beschikbaar zijn in dat verloop.

Deze hele taak wordt uitgevoerd via JavaScript-script voor Illustrator. De tutorial gaat ervan uit dat je bekend bent met de basisprincipes van scripting. Voor diegenen die direct zijn geland op deze tutorial, hebben we een klein beetje knowhow over Javascripts van Illustrator in deel 1 van deze serie. Dus zonder verdere vertragingen, laten we aan de slag gaan!

Vector Plus

Wil je toegang tot de volledige Vector Source-bestanden en downloadbare exemplaren van elke tutorial, inclusief deze? Word lid van Vector Plus voor slechts 9 $ per maand.

Zelfstudiedetails

  • Programma: Adobe Illustrator en ExtendedScript Toolkit
  • Versie: CS3
  • Moeilijkheidsgraad: gemiddeld
  • Geschatte voltooiingstijd: 3 tot 4 uur

Doel van het script

We willen dat dit script een heel eenvoudige taak uitvoert. In Adobe Illustrator, wanneer een gebruiker enkele objecten selecteert die zijn gevuld met een CMYK Gradient Color en dit script uitvoert; de objecten worden omgezet in een platte CMYK-vulling. Deze vlakke vulling is het mengsel van alle kleuren die beschikbaar zijn in het vorige verloop. Zie de afbeelding hieronder voor verduidelijking.

Daarom is het doel van ons script om een ​​CMYK-verloop met verloop uit te zetten in een platte CMYK-vulling.

Logica en algoritme

De logica voor het smelten van de kleuren van een verloop in een enkele kleur is eenvoudig en duidelijk. We kiezen alle kleuren uit het verloop, vinden hun gemiddelde en wijzen het toe aan het object als een nieuwe kleur. We begrijpen dit in vijf stappen, zoals hieronder getoond:

  • Stap 1: Kies de kleur van het huidige object. d.w.z. currentColor = kleur van het momenteel geselecteerde object.
  • Stap 2: Tel het aantal verloopstops in de huidige kleur.
  • Stap 3: Kies bij elke verloopstop de bijbehorende kleur en de bijbehorende CMYK-waarden.
  • Stap 4: Bereken de gemiddelde CMYK-waarde voor alle beschikbare kleuren bij verschillende stops.
  • Stap 5:
    Wijs deze gemiddelde CMYK-waarde toe als een nieuwe kleur aan het object.

Het bovenstaande algoritme kan gemakkelijk worden begrepen aan de hand van de onderstaande afbeeldingen.

We hebben een kort overzicht van de logica gezien. Laten we beginnen met de codering.

Stap 1 - Beginnend met de codestructuur

Open ExtendedScript Toolkit en maak een nieuw Javascript-bestand aan (Command + N). Selecteer vervolgens Adobe Illustrator voor de doeltoepassing.

Voeg in het codebewerkingsgebied de volgende codestructuur toe voor bepaalde validaties en controles vooraf.

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Converteer de objecten naar CMYK eerst", "CMYK-conversie vereist");  // end main if else alert ("Er is geen document beschikbaar of het document is leeg"); 

We controleren of er ten minste één document met ten minste één object bestaat, zodat we eraan kunnen werken. Vervolgens controleren we of de documentkleurenmodus CMYK is of niet. Dit is een essentiële stap omdat alle logica voor kleurconversie in dit script is gebaseerd op CMYK-kleuren. convertToFlat () is de hoofdfunctie die alle logica zal bevatten. Bewaar dit bestand vervolgens als test.jsx.

Stap 2

Laten we beginnen met de hoofdfunctie - convertToFlat (). We zullen controleren of een item is geselecteerd of niet, omdat dit script alleen op de geselecteerde objecten zal werken. Voeg daarom de volgende coderegels toe aan "test.jsx."

 function convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // ga verder met de hoofdlogica else alert ("Selecteer ten minste één object");  // end convertToGrad

Stap 3

Vervolgens beginnen we een lus in de "if (totalSelected> 0)"block. Deze loop bevat de logica voor kleurconversie, die wordt herhaald voor elk geselecteerd item. Maar net voor de logica voor kleurconversie voegen we nog een aantal validaties en controles toe binnen die lus.

 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")  // 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

Voor elk geselecteerd item controleren we of het een samengestelde pad of een groepsitem is. Als dit het geval is, wordt het script niet meer uitgevoerd en wordt een waarschuwingsbericht geretourneerd. Verder controleren we of het opvultype van het geselecteerde item iets anders is dan Gradient Fill. d.w.z. Als het een steunkleur, platte CMYK-kleur of een patroon is; het script geeft een waarschuwing terug. Deze controles worden uitgevoerd omdat ons script alleen werkt voor met verloop gevulde niet-samengestelde paditems.
Vervolgens zullen we het kleurconversieblok wijzigen.

Stap 4

In dit stadium moeten we afzonderlijke C-, M-, Y- en K-waarden extraheren voor de kleuren die zich op verschillende verloopstops bevinden. Hiervoor zullen we enkele variabelen maken die individuele CMYK-waarden bevatten. Voeg dus de volgende variabele declaraties toe net binnen het blok Kleurconversie:

 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;

We zullen de rol van elke variabele één voor één bekijken:

  • currentcolor zal de opvulkleur (gradient) van het momenteel geselecteerde object opslaan.
  • numOfStops bevat het totale aantal verloopstops dat beschikbaar is in het momenteel geselecteerde object. Dit wordt gebruikt om het gemiddelde van kleurwaarden in latere stadia te vinden.
  • Kleurdoos is een array die de opvulkleurwaarde voor alle verloopaanslagen houdt. dat wil zeggen als numOfStops is vier.
  • Kleurdoos array bevat vier kleuren.
  • cyanBox is een array die cyaanwaarden voor elke kleur op verschillende verloopstops bevat.
  • evenzo, magentaBox, yellowbox en
    zwarte doos Houd hun respectievelijke kleurwaarden voor elke kleur op verschillende verloopstops.
  • grayBox is een array met grijswaarden voor de kleur bij een verloopstop. Dit is essentieel omdat de grijze kleur een andere specificatie heeft dan de CMYK-kleurspecificatie. Als een object een grijs verloop bevat, zullen we de situatie afzonderlijk behandelen door gebruik te maken van deze variabele.
  • Eindelijk, we hebben cyanTotal, magentaTotal, yellowTotal, blackTotal en grayTotal. Deze variabelen bevatten de som van alle waarden voor cyaan, magenta, geel, zwart of grijs.

Stap 5

We hebben de validaties en controles uitgevoerd. We hebben ook de nodige containers gemaakt om kleurwaarden vast te houden. Vervolgens zullen we een lus uitvoeren die elke verloopstop één voor één leest. Maak daarvoor een lus, zoals hieronder getoond:

 voor (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] .Kleur retourneert de kleur van een bepaalde gradiëntstop voor elke iteratie van k.

Voor elke verloopstop controleren we of de beschikbare kleur een is Grijze kleur specificatie of een CMYKColor specificatie. Afhankelijk van dat, zullen we onze logica implementeren.

Stap 6 - Optelling van GrayColor-waarden

Binnen in de "als blok" voor Grijze kleur specificatie, voeg de volgende regels toe:

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

Vandaar, grayBox [k] bevat alle grijswaarden voor elke kleur op de respectieve verloopstops.
volgende, grayTotal is de som van deze grijswaarden, die later worden gebruikt.

Stap 7 - Optelling van CMYK-kleurwaarden

Binnen in de "anders blok" voor CMYKColor specificatie, voeg de volgende regels toe:

 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 + cyaanbox [k]; magentaTotal = magentaTotal + magentaBox [k]; yellowTotal = yellowTotal + yellowBox [k]; blackTotal = blackTotal + blackBox [k];

Om te begrijpen wat hier wordt uitgevoerd, nemen we een voorbeeld van Cyaan-kleur. cyanBox [k] is het opslaan van de cyaanwaarden voor alle kleuren die zich op verschillende gradiëntstops bevinden. volgende, cyanTotal is de optelling van al deze cyaanwaarden die zijn opgeslagen in cyanBox [k].

Een soortgelijke bewerking wordt ook uitgevoerd voor magenta, geel en zwart. Zodra de sommatie is voltooid, kunnen we uit de hand lopen en doorgaan met het gemiddelde.

Stap 8 - Middelen van de kleurwaarden

We hebben de individuele optelling van verzameld grijze kleur en CMYKColor voor alle verloop stopt. Nu moeten we ze gemiddeld maken. Sluit daarvoor de "voor k-lusen voer de volgende coderegels in net na de sluitingsarmband van "voor k-lus", zoals hieronder getoond:

  // end for k loop var finalBlack = blackTotal + grayTotal; var newCyan = Math.round (cyanTotal / numOfStops); var newMagenta = Math.round (magentaTotal / numOfStops); var newGeel = Math.round (yellowTotal / numOfStops); var newBlack = Math.round (finalBlack / numOfStops);

In de bovenstaande coderegels delen we individuele optellingen van C, M, Y en K door numOfStops. d.w.z. Als er vijf gradiëntstops waren, zullen we de optelling van individuele C-, M-, Y- en K-waarden verdelen met vijf. Daardoor worden gemiddeld vijf waarden geretourneerd. Deze gemiddelde waarden worden opgeslagen als newCyan, newMagenta, newYellow en nieuwBlack respectievelijk.

Let op het lastige geval van grijs en zwart hier. De optelling van K is niet alleen blackTotal. Integendeel, het is een som van grayTotal en blackTotal.

Waarom hebben we dat gedaan?? Er zijn gevallen waarin een verloopvulling zowel GrayColor-stops als CMYK-stops kan bevatten. In dat geval worden de grijze kleurwaarden toegevoegd aan de K-waarde van de CMYK-kleur. Grijs kan niet worden toegevoegd aan cyaan, magenta of geel. Het zal alleen in de categorie K vallen.

Nu hebben we alle nieuwe gemiddelde waarden voor C, M, Y en K in de hand. In de volgende stap zullen we deze waarden implementeren als een nieuwe CMYK-kleur op het huidige object.

Stap 9 - De nieuwe kleur implementeren

Om de nieuwe kleur te implementeren, zullen we een nieuwe maken CMYKColor object en wijzig de C-, M-, Y- en K-waarden ervan die we in stap 7 hebben berekend. Voeg daarvoor de volgende coderegels toe:

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

We hebben een gemaakt nieuwe kleur object en toegewezen de waarden van newCyan, newMagenta, newYellow en nieuwBlack als zijn C-, M-, Y- en K-waarden.

Vervolgens hebben we de nieuwe kleur als een opvulkleur naar het huidige object. Daarom zal onze definitieve code er nu als volgt uitzien:

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Converteer de objecten naar CMYK eerst", "CMYK-conversie vereist");  // end main if else alert ("Er is geen document beschikbaar of het document is leeg");  function convertToFlat () var items = selection; 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 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

Stap 10 - Het uitvoeren van het script

Sla dit script op als "test.jsx" en open Adobe Illustrator. Maak vervolgens enkele objecten met kleurrijke verloopvullingen. Om dit script te testen, selecteert u enkele objecten en gaat u naar Bestand> Scripts> Ander script (Command + F12) en lokaliseert u dit script.

Nadat het script met succes is uitgevoerd, ziet u een smeltkroes van de verlopen; zoiets als dit:

Conclusie en reikwijdte

In deze zelfstudie hebben we gezien hoe een verloop in een effen kleur kan worden gesmolten met behulp van scripts. Dit script kan handig zijn in gevallen waarin u het gemiddelde van twee of meer kleuren moet vinden. Maar de vrucht van deze tutorial is om de basisbeginselen van scripting en de implementatie ervan met Illustrator te begrijpen.

Er is een breed scala aan vector-creativiteit en -innovatie door middel van scripting. Ik hoop dat deze tweedelige tutorialserie lezers en auteurs zal inspireren om de essentie van scripting naar voren te brengen. Bedankt voor je waardevolle tijd bij het lezen van deze tutorial.

Abonneer u op de Vectortuts + RSS-feed om op de hoogte te blijven van de nieuwste vectorhandleidingen en -artikelen.