So starten Sie die Programmierung in Adobe Illustrator. Teil zwei

Dieser Beitrag ist eine Fortsetzung des ersten Teils , in dem das Skript "Schnittmaske erweitern" vorgestellt und detailliert beschrieben wurde, was und wie es funktioniert, und dabei wurden die Grundprinzipien für die Erstellung solcher Programme als Ganzes berücksichtigt. In diesem Teil werde ich die Geschichte fortsetzen, wie man dem Programm neue Funktionen hinzufügt, um ein „fertiges Produkt“ aus dem „Werkstück“ zu erhalten. Hier kann man nicht auf ein tieferes Eintauchen in den Themenbereich verzichten, was eine der notwendigen Voraussetzungen für die Schaffung eines vollwertigen Produkts ist. Also, fang mit dem Tauchgang an!


Die folgenden grafischen Grundelemente können in Adobe Illustrator als Maskenumriss verwendet werden: ein einfacher Umriss (Pfad), ein zusammengesetzter Umriss (zusammengesetzter Pfad), eine zusammengesetzte Form (zusammengesetzte Form) und Textobjekte (Punkttext und Text auf dem Pfad). Im Moment arbeitet das Skript nur mit einfachen Konturen, wie aus dem folgenden Code PathItem ist, wobei PathItem ein Aufruf des Path-Elements ist.


  var clipGroup = sel[0].pageItems.length; 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; }; }; 

Vorher haben wir die Variable clipPath , ihr aber keinen Wert zugewiesen.


  var clipPath; 

Dies bedeutet, dass sein Wert noch nicht bestimmt wurde, d.h. es ist undefined . Wenn wir nun eine Maske auswählen, deren Umriss beispielsweise der zusammengesetzte Pfad ist, und das Skript ausführen, erzeugt das Programm einen Fehler in der letzten Zeile des Funktionsteils des Skripts.


  clipPath.remove(); 

Da die Bedingung in der Schleife nicht erfüllt ist, clipPath Variable clipPath undefined , und es ist unmöglich, die Methode remove() auf etwas clipPath anzuwenden. Um dies zu verhindern, gehen wir wie folgt vor: Setzen Sie clipPath auf null , was im Gegensatz zu undefined bereits etwas Spezifischeres ist, das Sie zumindest überprüfen können.


Lassen Sie uns darüber nachdenken, wie Sie feststellen können, ob ein zusammengesetzter Pfad der Umriss unserer Maske ist. Wenn ich sage: „Lass uns nachdenken“, bedeutet dies, dass ich vorschlage, in die Dokumentation zu schauen und die Immobilie zu finden, die wir brauchen. In Analogie zu PathItem suchen wir nach der clipping Eigenschaft. Es stellt sich heraus, dass das CompoundPathItem Objekt keine solche Eigenschaft hat, aber es gibt eine pathItems Eigenschaft, über die Sie zu einfachen PathItem Konturen mit der clipping Eigenschaft gelangen können.

Jetzt können wir unsere Gedanken / Suchen in Code umwandeln. Zunächst clipPath wir clipPath ob clipPath in der vorherigen Iteration nicht definiert wurde, kopieren dann den bereits geschriebenen Codeblock und nehmen kleine Änderungen daran vor.


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

Tatsächlich wirken sich die Änderungen nur auf eine Zeile aus. Wie wir hier sehen können, wurde 'PathItem' in 'CompoundPathItem' geändert, und eine neue Konstruktion wurde hinzugefügt, 'pathItems [0]', mit der wir auf das zusammengesetzte Pfadelement verweisen.


 if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { 

Das Folgende ist der Funktionscodeblock, der bisher erstellt wurde.


  var clipGroup = sel[0].pageItems.length; 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; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; }; 

Der nächste „Patient“ ist die zusammengesetzte Form. Hier wird es ganz interessant! In der Dokumentation finden wir ein solches Objekt überhaupt nicht. Was zu tun ist? Definieren wir zunächst, zu welcher Klasse von Objekten sie gehört. Um dies herauszufinden, schreiben wir einen kleinen Hilfscode, den wir dann wegwerfen. Wie im ersten Teil erwähnt , wird das Problem der zum Schreiben / Debuggen von Code verwendeten Tools nicht behandelt. Angenommen, dies ist eine separate Datei, die dann einfach in den Papierkorb verschoben wird. Der Code lautet wie folgt:


 var obj = app.activeDocument.selection[0]; alert(obj.typename); 

In der ersten Zeile erstellen wir einen Link zum ausgewählten Objekt, in der zweiten Zeile wird eine Meldung angezeigt, um welchen Typ es sich handelt. Wählen Sie den Umriss der Maske in Adobe Illustrator aus, d. H. das gleiche Compound Shape-Objekt und führen Sie das Skript aus. Im Meldungsfeld sehen wir, dass die zusammengesetzte Form ein PluginItem ist. Wir entfernen den Hilfscode und kehren erneut zur Dokumentation zurück, finden jedoch die Clipping-Eigenschaft oder pathItems in PluginItem nicht. Im Allgemeinen gibt es nichts, was uns helfen würde, eindeutig anzuzeigen, dass dieses Objekt der Umriss der Maske ist. Anhand des Skripts können Sie nicht einmal feststellen, um welche Art von Plugin es sich handelt. Ein externes Modul und fertig!


Das ist ein Hinterhalt! - Sie rufen in Ihren Herzen aus. Und das Gehirn arbeitet fieberhaft und hofft, ein unlösbares Problem zu lösen. Und nachdem Sie alle möglichen und unmöglichen Optionen durchlaufen haben, drücken Sie verzweifelt die Del Taste und löschen die verhasste zusammengesetzte Form. Und hier, aus dem Augenwinkel der Layers Palette, bemerken Sie, dass nach dieser Aktion der Maskencontainer, der Clip Group , nur noch Group . Was könnte es bedeuten? Und die Tatsache, dass die von true clipped Eigenschaft des clipped false . Hier ist es, eine Lösung, die funktionieren könnte! Natürlich ist dies im Großen und Ganzen ein Hack, aber welchen Unterschied macht es, wenn es hilft, die gewünschte Schaltung zu bestimmen.

Der Algorithmus zum Bestimmen der Maskenkontur, die durch das Compound Shape-Objekt dargestellt wird, lautet dann wie folgt: Durchlaufen Sie alle Maskenobjekte in einer Schleife. Wenn wir PluginItem finden, löschen Sie es und prüfen Sie, ob sich die clipped Eigenschaft des Maskencontainers geändert hat. Wenn es false , dann ist dies unsere Schaltung. Damit dieser Hack funktioniert, müssen Sie den DOM Illustrator nach dem Löschen des Objekts aktualisieren. Dies kann mit der Methode app.redraw() . Dann müssen Sie immer noch daran denken, das Remote-Objekt zurückzugeben, was mit der Methode app.undo() .


Unten ist der Code für den Pfad der zusammengesetzten Form:


  if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PluginItem') { sel[0].pageItems[i].remove(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; 

Von allen möglichen Optionen für den TextFrameItem , der der Umriss der Maske sein kann, TextFrameItem nur Text (oder TextFrameItem in der Terminologie von Illustrator- TextFrameItem ) TextFrameItem . Wir wenden uns immer wieder der Dokumentation zu und finden dort keine clipping Eigenschaften. Diesmal sorgen wir uns jedoch nicht mehr so ​​sehr darum und stellen ruhig fest, dass TextFrameItem eine kind Eigenschaft hat, die den Typ des TextType ( TextType ) bestimmt. Wir finden heraus, dass es drei Typen geben kann: AREATEXT, POINTTEXT und PATHTEXT. Der erste Typ ist für uns nicht interessant, da er nicht als Maskenumriss verwendet werden kann und die anderen beiden immer noch genauso interessant sind. Es bleibt nur ein Hack zu finden, der uns hilft, jetzt nicht den Umriss zu bestimmen, sondern das Textobjekt, das der Umriss der Maske ist. Und dieser Hack wird das Team Convert To Area Type sein, das POINTTEXT in AREATEXT konvertiert. Wie bei der zusammengesetzten Form tritt eine implizite Änderung der clipped Eigenschaft clipped .


Dementsprechend lautet der Code für ein TextFrameItem vom Typ POINTTEXT wie folgt:


  if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.POINTTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; 

Es blieb nur TextFrameItem Typ PATHTEXT übrig. Leider ändert sich die clipped Eigenschaft beim Konvertieren von PATHTEXT in AREATEXT nicht. Da dies jedoch der letzte mögliche Kandidat für den Titel "Maskenumriss" ist, ist es möglich, genau sein Verhalten zu verwenden. Das heißt, wir überprüfen, ob nach dem Ausführen des clipped Convert To Area Type die clipped Eigenschaft true bleibt. Unten finden Sie den Code für ein TextFrameItem vom Typ PATHTEXT.


  if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.PATHTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == true) { clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; 

Wenn wir also nacheinander geschriebene Codeteile zusammenstellen, einschließlich eines Überprüfungsblocks, erhalten wir einen solchen Code, dessen Ausführung, wie im ersten Teil des Beitrags angegeben, die Aktion des neuen Befehls "Schnittmaske erweitern" in Adobe Illustrator implementiert.


 #target illustrator if (app.documents.length > 0) { var doc = app.activeDocument; var sel = doc.selection; var clipPath = null; if (sel.length > 0) { if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { var clipGroup = sel[0].pageItems.length; 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; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PluginItem') { sel[0].pageItems[i].remove(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.POINTTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.PATHTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == true) { clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; app.executeMenuCommand('releaseMask'); clipPath.remove(); } else { alert ('   -!'); }; } else { alert ('  !'); }; } else { alert ('  !'); }; 

Hier können Sie Schluss machen. Nein, ein Semikolon ist besser.


Ich hoffe, dass ich Ihnen mit diesen Beiträgen geholfen habe, Ihrem Ziel ein Stück näher zu kommen - mit dem Programmieren in Adobe Illustrator zu beginnen. Vielen Dank für Ihre Aufmerksamkeit!

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


All Articles