[GastForen Programmierung/Entwicklung AppleScript Illustrator AppleScript in JavaScript?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

2. Dez 2013, 21:44
Beitrag # 1 von 18
Bewertung:
(5780 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo liebe Community,

ich habe folgendes AppleScript im Internet gefunden und würde es aber als JavaScript benötigen.

Weiß vielleicht jemand, wie man das umbauen könnte.

Das Skript löscht alle Objekte in einem Illustrator Dokument, die keine Füllung und Kontur haben und nicht als Schnittmaskenpfad eingesetzt werden.

Hier das Original:
Code
tell application "Illustrator CS" to activate 
deleteUnpainted(1)

on deleteUnpainted(doc)
tell application "Illustrator CS"
if class of doc is integer or class of doc is string then set doc to document doc
tell doc
try
set unpainted to (every path item whose clipping is false and filled is false and class of stroke color is no color info)
delete unpainted
end try
end tell
end tell
end deleteUnpainted


Viele Dank
LG fprince
X

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 22:44
Beitrag # 2 von 18
Beitrag ID: #520412
Bewertung:
(5762 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

herzlich willkommen im AppleScript-Forum! :-)

Welche Version von Illustrator benutzest Du? Die CS, welche im Script adressiert wird?
Oder eine neuere (CS2, CS3, CS4, CS5, CS6, CC)?

Unter Windows (weil JavaScript)? Oder doch Macintosh (aus einem anderen Grund)?

Ich werde aber erst morgen einen Versuch machen, das AppleScript in ein JavaScript zu verwandeln.
Vielleicht kommt mir ja jemand zuvor. ;-)

Gruss, Hans


als Antwort auf: [#520411]

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

2. Dez 2013, 22:56
Beitrag # 3 von 18
Beitrag ID: #520413
Bewertung:
(5750 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die schnelle Antwort.
Nein eigentlich sollte das Script unter CS5 laufen. Perfekt wäre es natürlich, wenn es eventuell auch in späteren Versionen funktioniert. Priorität hat aber CS5.

Es gibt zwei Gründe für mein Wahl zum JavaScript:
1. die schon angesprochene Plattformunabhängigkeit
2. will ich es in ein anderes JavaScript sauber implementieren

Vielen Dank im Voraus,
LG fprince


als Antwort auf: [#520412]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 09:37
Beitrag # 4 von 18
Beitrag ID: #520414
Bewertung:
(5689 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

hier ist schon mal eine erste Version (ich musste mich herantasten ...).

Code
//DeleteUnpainted.js 
//Das Skript löscht alle Objekte in einem Illustrator-Dokument,
//die keine Füllung und Kontur haben und nicht als Schnittmaskenpfad
//eingesetzt werden.

try {
if (documents.length == 0) {
throw new Error ("Bitte ein Dokument öffnen.");
}
// das aktive Dokument
var curDoc = app.activeDocument;
// prüfen, ob Objekte vorhanden sind
if (curDoc.pageItems.length == 0) {
throw new Error ("Das Dokument enthält keine Objekte.");
}
// die Objekte und deren Anzahl
var allObjects = curDoc.pageItems;
var nObjects = allObjects.length;
// eine Rückwärts-Schleife durch die Objekte
for (var n=nObjects-1; n>-1; n--) {
var curObj = allObjects[n];
if (curObj.fillColor == "[GrayColor]" && curObj.strokeColor == "[NoColor]") {
if (curObj.clipping == false) {
curObj.remove();
}
}
}
}
catch (e) {
alert (e.message, "Warnmeldung", true);
}

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();

Mit einem einfachen Dokument funktioniert es wie erwartet.

Gruss, Hans


als Antwort auf: [#520413]

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

3. Dez 2013, 10:05
Beitrag # 5 von 18
Beitrag ID: #520416
Bewertung:
(5677 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Wow. Fantastisch. Ich konnte es zwar bisher nur kurz prüfen, aber da hat es perfekt funktioniert. Danke!!!

Nur für mein Verständnis:
Warum muss man das ganze in so ein try-catch-Konstrukt einbauen?
Und warum gibt man in der vorletzten if-Abfrage, bei der die Füllfarbe abgefragt wird, "GrayColor" an? Das kommt für mich irgendwie unerwartet, denn es werden ja Rahmen ohne Füllung gelöscht.

Danke und LG
fprince


als Antwort auf: [#520414]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 10:33
Beitrag # 6 von 18
Beitrag ID: #520417
Bewertung:
(5670 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

bitte sehr.

Zu Deinen Fragen:
try-catch: Normalerweise würde man bei einem Problem die Meldung (eine verständlichere als jene, wenn ein Fehler nicht abgefangen wird) direkt zeigen und in der nächsten Zeile mit exit(); den Abbruch der Übung auslösen.

Letzteres scheint aber dem Illustrator nicht bekannt zu sein. Deshalb der try-catch-Wickel.

"[GrayColor]": Zuerst versuchte ich es auch bei der Füllfarbe mit "[NoColor]". Aber da wurde nichts entfernt. Dann liess ich mir in der Schleife die Farben anzeigen ...

Code
alert (curObj.fillColor + " / " + curObj.strokeColor + " / " + curObj.clipping); 

... und kam so auf "[GrayColor]".

Meine Erfahrung mit Illustrator-Scripten ist sehr gering. Deshalb weiss ich auch nicht mehr zu sagen. :-)

Gruss, Hans


als Antwort auf: [#520416]

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

3. Dez 2013, 12:15
Beitrag # 7 von 18
Beitrag ID: #520436
Bewertung:
(5643 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für die Antworten. Ich hab mich jetzt noch etwas damit beschäftigt und bin noch auf etwas gestoßen im Zusammenhang mit "GrayColor".

Wenn man im Illustrator eine Farbe im Farbe-Fenster von z.B. CMYK auf Graustufen umstellt, bekommt das Objekt eine "GrayColor". D.h. das Skript löscht das Objekt dann, obwohl es ja mit Grau gefüllt ist und somit nicht leer ist.

Ich hab das Skript dahingehend angepasst.
Anstatt
if (curObj.fillColor == "[GrayColor]" ...
habe ich nun
if (curObj.filled == false ...

Der Rest bleibt so wie er ist. In meinen ersten Tests hat das funktioniert. Was meinst du dazu?

Code
try {  
if (documents.length == 0) {
throw new Error ("Bitte ein Dokument öffnen.");
}
// das aktive Dokument
var curDoc = app.activeDocument;
// prüfen, ob Objekte vorhanden sind
if (curDoc.pageItems.length == 0) {
throw new Error ("Das Dokument enthält keine Objekte.");
}
// die Objekte und deren Anzahl
var allObjects = curDoc.pageItems;
var nObjects = allObjects.length;
// eine Rückwärts-Schleife durch die Objekte
for (var n=nObjects-1; n>-1; n--) {
var curObj = allObjects[n];
if (curObj.filled == false && curObj.strokeColor == "[NoColor]") {
if (curObj.clipping == false) {
curObj.remove();
}
}
}
}
catch (e) {
alert (e.message, "Warnmeldung", true);
}

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();


Danke. LG


als Antwort auf: [#520417]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 13:00
Beitrag # 8 von 18
Beitrag ID: #520441
Bewertung:
(5627 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

ja, mit der Prüfung von filled ist es bestimmt sicherer.

Doch das Rätsel bleibt, weshalb "Keine Füllfarbe" als "[GrayColor]" zurückgegeben wird.

Gruss, Hans


als Antwort auf: [#520436]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 13:17
Beitrag # 9 von 18
Beitrag ID: #520442
Bewertung:
(5619 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

einen hab' ich noch: Bei der Kontur könnte man den Test der Farbe durch stroked ersetzen:

Code
if (curObj.filled == false && curObj.stroked == false) { 

So passt es "schöner" zum Test der Füllung.

Gruss, Hans


als Antwort auf: [#520436]
(Dieser Beitrag wurde von Hans Haesler am 3. Dez 2013, 14:04 geändert)

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

3. Dez 2013, 14:16
Beitrag # 10 von 18
Beitrag ID: #520449
Bewertung:
(5583 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

vielen dank nochmals für die Mühe und den Input bzgl. "stroked", das werde ich noch ersetzen.

LG


als Antwort auf: [#520442]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 20:07
Beitrag # 11 von 18
Beitrag ID: #520477
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

zum Schluss noch zwei Erklärungen.

1. Im AppleScript-Code werden alle "Kandidaten" der Variablen 'unpainted' zugewiesen. Dank 'whose' in einer einzigen Aktion. Und anschliessend werden alle mit einem Befehl gelöscht.

Das ist mit JavaScript nicht so einfach möglich. Nur mit einer sehr komplizierten Funktion (siehe: http://forums.adobe.com/message/5109826#5109826).
Deshalb ziehe ich die Schleife vor, mit welcher die Objekte einzeln besucht werden.

2. Die Schleife muss rückwärts laufen. Sonst: Nachdem das erste Objekt gelöscht wurde, wäre die Anzahl der verbliebenen Objekte kleiner, als der Endwert der Schleife. Beim Versuch, das letzte Objekt zu prüfen, ist dieses nicht mehr da und die Fehlermeldung "No such object" wird gezeigt.

Nochmals die Definition der Schleife:

Code
for (var n=nObjects-1; n>-1; n--) { 

Die Variable 'n' wird als erstes initialisiert. Als Startwert wird ihr die Anzahl der Objekte zugewiesen. Minus 1, weil JavaScript bei Null zu zählen beginnt. Das letzte Element hat demnach den Index 'Anzahl aller Elemente minus 1'.

Als nächstes wird der Ausstiegswert definiert: 'n>-1;' Die Schleife dreht so lange als der Wert von 'n' grösser ist als minus eins. Somit wird das Element 0 (= das erste) zuletzt geprüft.

Die dritte Definition ist der Schrittwert, um welchen sich der Zähler ändern soll. Für einen Rückwärtslauf ist das logischerweise 'n--', das heisst, bei jedem Umgang wird der Wert um 1 verringert.

Die vorwärtslaufende Schleife würde so aussehen:

Code
for (var n=0; n<nObjects; n++) { 

Und weil wir hier im AppleScript-Forum sind, die beiden Definitionen in AppleScript-Speak. Vorwärts:

Code
repeat with n from 1 to nObjects 

Und rückwärts:

Code
repeat with n from nObjects to 1 by -1 

Gruss, Hans


als Antwort auf: [#520449]

Illustrator AppleScript in JavaScript?

fprince
Beiträge gesamt: 54

3. Dez 2013, 21:14
Beitrag # 12 von 18
Beitrag ID: #520484
Bewertung:
(5531 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die tolle Erklärung und für die Übersetzungen ins Apple-Script. Echt fein dieses Forum :)

An alle, die dieses Skript eventuell verwenden wollen:
Eine Sache habe ich noch ergänzt, auf die ich heute eher durch Zufall gestoßen bin. Und zwar soll das Skript ja alle Objekte löschen, die keine Füllung und Kontur haben. Schnittmaskenpfade werden nicht berücksichtigt, da diese eben keine Füllung oder Kontur haben. ABER auch Objekte, die man ausschließlich für Textverdrängungen benötigt (bspw. um unregelmäßige Einzüge zu realisieren), sind in der Regel ohne Füllung und Kontur und sollen aber natürlich auch nicht gelöscht werden. Daher sollte man in der if-Abfrage noch "curObj.wrapped == false" ergänzen.

Das ganze sieht dann so aus:

Code
try {  
if (documents.length == 0) {
throw new Error ("Bitte ein Dokument öffnen.");
}
// das aktive Dokument
var curDoc = app.activeDocument;
// prüfen, ob Objekte vorhanden sind
if (curDoc.pageItems.length == 0) {
throw new Error ("Das Dokument enthält keine Objekte.");
}
// die Objekte und deren Anzahl
var allObjects = curDoc.pageItems;
var nObjects = allObjects.length;
// eine Rückwärts-Schleife durch die Objekte
for (var n=nObjects-1; n>-1; n--) {
var curObj = allObjects[n];
if (curObj.filled == false && curObj.stroked == false && curObj.wrapped == false){
if (curObj.clipping == false) {
curObj.remove();
}
}
}
}
catch (e) {
alert (e.message, "Warnmeldung", true);
}

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();


LG fprince


als Antwort auf: [#520477]

Illustrator AppleScript in JavaScript?

Uwe Laubender
Beiträge gesamt: 5321

3. Dez 2013, 22:04
Beitrag # 13 von 18
Beitrag ID: #520486
Bewertung:
(5517 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat von Hans Das ist mit JavaScript nicht so einfach möglich. Nur mit einer sehr komplizierten Funktion


Jau. Ein Meilenstein für ExtendScript, würde ich mal sagen!

Mit Illustrator-Scripting (ExtendScript) stehe ich noch auf Kriegsfuß. Das DOM gibt einfach zu wenig her. Dein Beispiel mit dem nichtfunktionierenden "exit()" spricht irgendwie Bände.

Wenn ich mal irgendwann sehr viel Zeit habe, werde ich mich mal ausführlicher mit AppleScript beschäftigen. Scheint ja da und dort, ich untertreibe jetzt mal!, doch die bessere Wahl zu sein…

Ich lese jedenfalls hier im Unterforum gerne mit…


als Antwort auf: [#520477]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 22:48
Beitrag # 14 von 18
Beitrag ID: #520489
Bewertung:
(5502 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Uwe!

ist AppleScript die bessere Wahl? Also ... ich hatte nie begriffen, weshalb sich jemand (zum Beispiel ein Dave Saunders, um nur einen prominenten Namen zu nennen) ohne Not mit JavaScript abmüht, wenn er es mit AppleScript viel einfacher haben könnte (Droplets; Speichern von Werten; whose-Formulierung; testen, ob eine Liste einen gewissen Wert enthält; Event-Protokoll konsultieren usw.).

Ich musste mich jahrelang berufsbedingt (unter Windows) hauptsächlich mit JavaScript beschäftigen. Und das hat mich so geprägt, dass es mir heute noch viel leichter fällt, ein JavaScript zu entwickeln als ein AppleScript zusammenzuklauben ...

Gruss, Hans


als Antwort auf: [#520486]

Illustrator AppleScript in JavaScript?

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2013, 22:52
Beitrag # 15 von 18
Beitrag ID: #520490
Bewertung:
(5500 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo fprince,

na klar: Erst mit Real-Life-Dokumenten entdeckt man, was noch fehlt und was ergänzt werden muss.

Übrigens eins: Der 'clipped'-Test könnte mit '&&' (= and) an die drei anderen Tests gehängt werden. Ich hatte ihn ursprünglich in eine eigene Zeile gesetzt, damit das Fenster nicht zu breit wird.

[[ Warum nimmt ein einziger Tab den Platz von acht Zeichen ein? Zwei würden vollauf genügen. Links wird zudem ein unnötig breiter Abstand zum Anfang der Code-Zeilen eingefügt. ]]

Übrigens zwei: Das Verkünden des Aktions-Endes sollte innerhalb des try-Wickels verschoben werden. Anschliessend an die Schleife. Die neun Zeilen je mit einem Tab eingezogen, aliniert an 'for (var n=nObjects...)'.

Doch diese beiden Änderungen sind nicht zwingend notwendig.

Gruss, Hans


als Antwort auf: [#520484]
X

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
20.06.2024

Online
Donnerstag, 20. Juni 2024, 15.00 - 15.45 Uhr

Webinar

Etiketten-Workflows gehören zu den anspruchsvollsten in der grafischen Industrie. Ihre PDF-Dateien sind oft sehr komplex und erfordern eine spezielle Vorbereitung. pdfToolbox bietet viele Möglichkeiten, um diese Arbeit zu automatisieren. Nehmen Sie an unserem Webinar "pdfToolbox für den Etikettendruck" teil und lernen Sie einige der Funktionen kennen, die Ihren Etiketten-Workflow effizienter gestalten. Einige der Bereiche, die Sie kennenlernen werden, sind: Beschnitt erzeugen Beim Etikettendruck ist das Druckmotiv oft nicht rechteckig. Lernen Sie, wie Sie einen passenden Beschnitt für alle Arten von Formen hinzufügen können. Produktionsreife Dateien erstellen nutzen Sie bereits vorliegende Inhalte oder Seiteninformationen, um eine Weißform hinter dem Seiteninhalt hinzuzufügen, eine passgenaue Lackform für bestimmte Objekte zu erzeugen oder eine Stanzlinie mit korrektem Sonderfarbnamen zu erstellen. Ausschießen, Step & Repeat, N-Up Mit der Ausschieß-Engine von pdfToolbox lassen sich Seiten zu größeren Druckbögen zusammenfassen, wobei verschiedene Layouts und Komplexitäten unterstützt werden. Hochwertige Freigabe-Bögen Erstellen Sie automatisch Freigabe-Bögen mit Vorschaubildern Ihrer Produktionsdatei und Auftragsdaten aus dem MIS. Qualitätskontrolle pdfToolbox enthält Standard-Preflight-Profile, die die grundlegenden Anforderungen an PDF-Dateien in Etiketten-Workflows abdecken. Prüfen Sie ob Ihre Dokumente internationalen Standards wie ISO PDF/X oder GWG (Ghent Workgroup) Spezifikationen entspricht. Verpackungs- und etikettenspezifische Vorgaben, wie der ISO-Standard „Processing Steps“, werden ebenfalls unterstützt.

kostenlos

Ja

Organisator: callassoftware

https://www.impressed.de/schulung.php?c=sDetail&sid=322

pdfToolbox für den Ettikettendruck
Veranstaltungen
02.07.2024

Online
Dienstag, 02. Juli 2024, 10.00 - 10.30 Uhr

Webinar

In diesen beiden kostenlose Webinaren erfahren Sie, wie Sie mit Hilfe von Enfocus Griffin und dem Impressed Workflow Server Ihren LFP-Workflows optimieren können. 18.06.2024: So optimieren Sie Ihre Prozesse mit Enfocus Griffin 02.07.2024: So sparen Sie Zeit und Geld mit Impressed Workflow Server in der LFP-Edition Griffin: Griffin ist das leistungsstarke Kraftpaket für das automatische Nesting im Großformatdruck. Dank eines ausgeklügelten, KI-basierten Nesting-Algorithmus können Sie mit Griffin Vorlagen schnell und effizient vernutzen – und das klappt auch mit unregelmäßigen Formen perfekt. Das spart Ihnen unzählige Stunden, die Sie bisher mit dem manuellen Nesting und Ausschießen verbracht haben. Einige wichtige Funktionen ≡ Anlage von Beschnittzugaben ≡ Automatische Erzeugung der Schnittkontur ≡ Erstellung von Strichcodes, Textmarkierungen und Registrierungen IWS LFP Edition: Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Mit dem IWS LFP Edition automatisieren Sie Ihre Produktion von der Übernahme der Daten aus dem ERP-System bis zur Erzeugung der verschachtelten Druckform und der Übergabe an den RIP. Phoenix Core ist eine hochentwickelte KI-Technologie für die Planung und das Nesting von Druckerzeugnissen. Anders als herkömmliche Ausschießlösungen arbeitet Phoenix nicht auf Basis von Vorlagen, sondern erzeugt entsprechend der Maschinen- und Produktionsanforderungen druckfertige Layouts „on-the-fly“.

kostenlos

Ja

Organisator: Impressed GmbH

Kontaktinformation: E-Mailschulungen AT impressed DOT de

https://www.impressed.de/schulung.php?c=sDetail&sid=328

So optimieren Sie Ihren LFP-Workflow