hilfdirselbst.ch
Facebook Twitter gamper-media
"Funktioniert nicht" ist keine hinreichende Fehlerbeschreibung.
q3player
Beiträge: 65
7. Feb 2018, 10:32
Beitrag #1 von 3
Bewertung:
(2058 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Illustrator Skript: Ebenen ein- und ausblenden und Export


Hallo zusammen,

ich habe mir zu dem Thema schon einige Code-Schnipsel gesammelt, komme aber mit der Lösung meines Problems nicht weiter.

Hintergrund:
Wir erstellen für den Verpackungsbereich komplexe AI-Dateien (CS6, Mac). Hierbei kommt es vor, dass es von einer Verpackung mehrere Sorten gibt, die sich nur marginal unterscheiden. Beispiel Lacktischdecken: 4 Farbvarianten, unterscheiden sich nur in 1 Wort (Farbe xxx) und im Barcode.

Wir legen die 4 Sorten in einer AI an, wobei die Bereiche, die unterschiedlich sind, auf separaten Ebenen liegen (Sorte 1, Sorte 2, usw.), der Rest auf unterschiedlichen Ebenen, die aber für alle Sorten gleich sind (Stanze, RZ, Info usw.). Bei Korrekturen an allen Sorten muss man so die Änderungen nur 1x machen.

Für das Erstellen von Ansichts-PDFs zur Abstimmung mit dem Kunden ergibt sich dann immer der gleiche Arbeitsablauf:

Sorten-Ebene 1 ein, alle anderen Sorten aus, PDF erstellen und benennen mit "..._Sorte_1_...".
Sorten-Ebene 2 ein, alle anderen Sorten aus, PDF erstellen und benennen mit "..._Sorte_2_...".
Sorten-Ebene 3 ein, alle anderen Sorten aus, PDF erstellen und benennen mit "..._Sorte_3_...".
...

Und genau diesen Ablauf möchte ich per Skript automatisieren.

Ich habe das Skript "saveLayersToAI" von Rassadin Pavel als Grundlage nehmen wollen, aber da wird aus jeder einzelnen Ebene eine separate AI erstellt. Ich muss mir also vorher eine Abfrage einbauen, welche Ebenen fix sind bzw. welche Ebenen der Reihe nach ein- und ausgeblendet werden. Ausgabe als PDF ist dann wiederum einfach, allerdings muss ich auch von der derzeit aktiven Sorten-Ebene den Namen übernehmen und als Teil des Dateinamens verwenden.

Im Moment fehlt mir die richtige Idee für den Ansatz.

Von hinten aufgerollt:
- PDF Export ist einfach
- Speichern als AI ist einfach
- Namen ändern ist einfach
- Ebenen aus- und einblenden ist einfach
- Ebenen-Namen abfragen ist einfach
Aber wie wird da jetzt ein Schuh draus ...

Danke im voraus für Denkanstöße :-)

q3player
Top
 
X
q3player
Beiträge: 65
13. Feb 2018, 16:39
Beitrag #2 von 3
Beitrag ID: #562405
Bewertung:
(976 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Illustrator Skript: Ebenen ein- und ausblenden und Export


Ok, ich bin schon einen Schritt weiter:

Basierend auf einigen Vorgaben bzgl.
- Dateibenennung
- Ebenenbenennung
habe ich eine Lösung entwickelt, die auf dem Desktop einen neuen Ordner erstellt, in dem dann die einzelnen AI-Files abgelegt werden.

Die Hauptdatei mit den ein- und auszublendenen Ebenen muss das Schlüsselwor "MULTI" enthalten. Die einzelnen Sorten-Ebenen müssen mit dem Wort "Sorte" beginnen.

Der Ordername ergibt sich aus dem Dateinamen der Hauptdatei. Das Skript blendet erst alle Sorten-Ebenen aus und danach der Reihe nach ein und danch wieder aus. In diesem Loop wird auf Basis des Ursprungs-Namens und aus dem Ebenen-Namen der gerade sichtbaren Sorte ein individueller Dateiname generiert und die Datei im Ordner auf dem Desktop als AI gesichert.

Code
var doc = app.activeDocument; 
var splitfolder = "_SPLIT";

// Dateinamen auslesen, bereinigen
var arr = doc.name.split(".");
var extension = "";
if (arr.length>1) extension = "." + arr.pop();
var filename = arr.join(".");
var foldername = filename;
var foldername = foldername.replace(/RZ_/,""); // lösche RZ_ für Ordnernamen
var foldername = foldername.replace(/\s/g,"_"); // ersetze Blanks durch Unterstriche
var foldername = foldername.replace("ß","ss"); // ersetze ß durch ss
var foldername = foldername.replace("%","Pr"); // ersetze %-Zeichen durch Pr
var foldername = foldername.replace(/[^-a-zA-Z0-9._]/g,""); // ersetze sonstige Sonderzeichen und Umlaute

// Export-Ordner generieren
var export_folder = "~/Desktop/" + foldername + splitfolder;
var assets_folder = new Folder (export_folder);
assets_folder.create();

// Ebene ausblenden
function hide_layer (a) {
var docHide = app.activeDocument;
var myLayers1 = docHide.layers;
var hideName1 = a;
try {
hideLayer1 = myLayers1.getByName (hideName1);
hideLayer1.visible = false;
redraw();
}
catch (e) {}
}

// Ebene einblenden
function show_layer (a) {
var docShow = app.activeDocument;
var myLayers2 = docShow.layers;
var showName2 = a;
try {
showLayer2 = myLayers2.getByName (showName2);
showLayer2.visible = true;
redraw();
}
catch (e) {}
}

// Array bilden mit Namen aller Ebenen
var myLayers = [];
var layerCount = doc.layers.length;
for (var ii = layerCount - 1; ii >= 0; ii--) {
var currentLayer = doc.layers[ii];
myLayers.push (currentLayer);
}

// alle Ebenen namens "Sorte*" ausblenden
for (var ii = layerCount - 1; ii >= 0; ii--) {
var isSorte = (myLayers[ii].name).indexOf("Sorte");
if (isSorte >= 0) {
hide_layer (myLayers[ii].name);
}
}

// der Reihe nach Ebenen namens "Sorte*" einblenden und speichern mit neuem Namen
// basierend auf aktuell eingeblendeter Sorten-Ebene
for (var ii = layerCount - 1; ii >= 0; ii--) {
var isSorte = (myLayers[ii].name).indexOf("Sorte");
if (isSorte >= 0) {

show_layer (myLayers[ii].name); // Sorten-Ebene einblenden

// Name der aktuellen Sorten-Ebene ermitteln
// Wort "Sorte" aus dem Namen löschen
var actLayName = myLayers[ii].name;
actLayName = actLayName.replace (/Sorte/,"");

// Sorten-Dateiname generieren aus Ursprung
// Wort "_MULTI" aus dem Namen ersetzen durch Ebenen-Namen
var sortFileName = filename;
sortFileName = sortFileName.replace(/_MULTI/,actLayName);

var save_options = new IllustratorSaveOptions();
save_options.embedICCProfile = false;
save_options.pdfCompatible = false;
var packaged_file = File (export_folder + "/" + sortFileName);

doc.saveAs(packaged_file, save_options); // Datei speichern mit neuem Namen

hide_layer (myLayers[ii].name); // Sorten-Ebene ausblenden
}
}

doc.close (SaveOptions.DONOTSAVECHANGES);

als Antwort auf: [#562321] Top
 
q3player
Beiträge: 65
14. Feb 2018, 14:19
Beitrag #3 von 3
Beitrag ID: #562414
Bewertung:
(951 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Illustrator Skript: Ebenen ein- und ausblenden und Export


Finale Lösung:

Code
var doc = app.activeDocument; 
var splitfolder = "_SPLIT";

// Dateinamen auslesen, bereinigen
var arr = doc.name.split(".");
var extension = "";
if (arr.length>1) extension = "." + arr.pop();
var filename = arr.join(".");
var foldername = filename;
var foldername = foldername.replace(/RZ_/,""); // lösche RZ_ für Ordnernamen
var foldername = foldername.replace(/\s/g,"_"); // ersetze Blanks durch Unterstriche
var foldername = foldername.replace("ß","ss"); // ersetze ß durch ss
var foldername = foldername.replace("%","Pr"); // ersetze %-Zeichen durch Pr
var foldername = foldername.replace(/[^-a-zA-Z0-9._]/g,""); // ersetze sonstige Sonderzeichen und Umlaute

// Export-Ordner generieren
var export_folder = "~/Desktop/" + foldername + splitfolder;
var assets_folder = new Folder (export_folder);
assets_folder.create();

// Ebene ausblenden
function hide_layer (a) {
var docHide = app.activeDocument;
var myLayers1 = docHide.layers;
var hideName1 = a;
try {
hideLayer1 = myLayers1.getByName (hideName1);
hideLayer1.visible = false;
redraw();
}
catch (e) {}
}

// Ebene einblenden
function show_layer (a) {
var docShow = app.activeDocument;
var myLayers2 = docShow.layers;
var showName2 = a;
try {
showLayer2 = myLayers2.getByName (showName2);
showLayer2.visible = true;
redraw();
}
catch (e) {}
}

// Array bilden mit Namen aller Ebenen
var myLayers = [];
var layerCount = doc.layers.length;
for (var ii = layerCount - 1; ii >= 0; ii--) {
var currentLayer = doc.layers[ii];
myLayers.push (currentLayer);
}

// alle Ebenen namens "Sorte*" ausblenden
for (var ii = layerCount - 1; ii >= 0; ii--) {
var isSorte = (myLayers[ii].name).indexOf("Sorte");
if (isSorte >= 0) {
hide_layer (myLayers[ii].name);
}
}

// der Reihe nach Ebenen namens "Sorte*" einblenden und speichern mit neuem Namen
// basierend auf aktuell eingeblendeter Sorten-Ebene
for (var ii = layerCount - 1; ii >= 0; ii--) {
var isSorte = (myLayers[ii].name).indexOf("Sorte");
if (isSorte >= 0) {

show_layer (myLayers[ii].name); // Sorten-Ebene einblenden

// Name der aktuellen Sorten-Ebene ermitteln
// Wort "Sorte" aus dem Namen löschen
var actLayName = myLayers[ii].name;
actLayName = actLayName.replace (/Sorte/,"");

// Sorten-Dateiname generieren aus Ursprung
// Wort "_MULTI" aus dem Namen ersetzen durch Ebenen-Namen
var sortFileName = filename;
sortFileName = sortFileName.replace(/_MULTI/,actLayName);

var save_options = new IllustratorSaveOptions();
save_options.embedICCProfile = false;
save_options.pdfCompatible = false;
var packaged_file = File (export_folder + "/" + sortFileName);

doc.saveAs(packaged_file, save_options); // Datei speichern mit neuem Namen

hide_layer (myLayers[ii].name); // Sorten-Ebene ausblenden
}
}

doc.close (SaveOptions.DONOTSAVECHANGES);


Auf Basis des Dateinamens mit dem Schlüsselwort "MULTI" wird auf dem Desktop ein neuer Ordner erzeugt. Alle Ebenen mit dem Schlüsselwort "Sorte" im Namen werden ausgeblendet. Danach werden der Reihe nach
- die Ebenen mit "Sorte" erst einzeln eingeblendet
- neuer Dateiname aus Ebenen-Name generiert
- Datei mit neuem Namen gespeichert
- aktuelle Sorten-Ebene wieder ausgeblendet
- Datei ohne Änderung (!) geschlossen
und wieder von vorne.

Mit einem 2. separaten Skript erstelle ich dann aus allen .ai in einem Ordner PDFs für den Kunden:

Code
var dir = Folder.selectDialog("Ordner wählen mit .ai-Dateien"); 
var files = dir.getFiles("*.ai");

var pvoptions = new PDFSaveOptions();
pvoptions.pDFPreset = 'Ansichts-PDF 150dpi'; // Name der PDF-Settings für Ansichts-PDF

var varnish = "Lack"; // Name der Ebene für den Lack-Film
var white = "SF Weiss"; // Name der Ebene für den Weiß-Hinterleger


function hide_lack () {
var doclack = app.activeDocument;
var myLayers2 = doclack.layers;
var HideName2 = varnish;
try {
HideLayer2 = myLayers2.getByName (HideName2);
HideLayer2.visible = false;
redraw();
}
catch (e) {}
}

function hide_sfweiss () {
var docwht = app.activeDocument;
var myLayers1 = docwht.layers;
var HideName1 = white;
try {
HideLayer1 = myLayers1.getByName (HideName1);
HideLayer1.visible = false;
redraw();
}
catch (e) {}
}


for (var f = 0; f < files.length; f++) {
var doc = app.open(files[f]);
hide_lack ();
hide_sfweiss ();
var pdfFile = new File(app.activeDocument.fullName.toString().replace(".ai",".pdf"));
var saveOpts = new PDFSaveOptions();
saveOpts.pDFPreset = 'Ansichts-PDF 150dpi'; // Name der PDF-Settings für Ansichts-PDF
app.activeDocument.saveAs (pdfFile, saveOpts);
doc.close (SaveOptions.DONOTSAVECHANGES);
}

als Antwort auf: [#562405] Top