[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

7. Dez 2017, 14:17
Beitrag # 1 von 20
Bewertung:
(4465 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
ich stehe gerade bei einem Script auf dem Schlauch und komme nicht weiter.

Innerhalb eines InDesign-Dokumentes sind mehrere InDesign Dateien als modulare Texte eingebunden. Da es diese Texte auf Deutsch und Englisch gibt, hat jede eingebundene Datei die Ebenen "DE" und "EN". Natürlich ist immer nur eine von den beiden Ebenen sichtbar.

Mit einem Script möchte ich jetzt die Sichtbarkeit dieser Ebenen umschalten. Also von Deutsch nach Englisch und entgegengesetzt. So zu sagen hin und her toggeln.

Bei meinem Script funktioniert das Einblenden der nicht sichtbaren Ebenen und auch das Ausblenden der sichtbaren. Allerdings nur, wenn ich nur eine Sache von beiden im Script aktiviere und die andere auskommentiere. Sind beide aktiv kommt es immer zu einem Fehler "Fehlernummer 30476 - Die angeforderte Aktion konnte nicht ausgeführt werden, da das Objekt nicht mehr existiert" Zeile 57.

Und genau hier komme ich nicht weiter.
Für Tipps und Hilfe bin ich sehr dankbar.

Grüße
Marcel

Hier das Script:


Code
Set myInDesign = CreateObject("InDesign.Application.cs6") 
Set myDocument = myInDesign.ActiveDocument

Layer_DE = false
Layer_EN = false

REDIM e(1)


Set Seiten = myDocument.pages
For i = 1 to Seiten.count 'Seiten durchlaufen
Set Seite = Seiten(i) 'Seite i im Dokument

Set Dateien = Seite.allGraphics 'Alle eingebundenen Dateien der Datei

For j = 1 to Dateien.count 'Eingebundene Dateien durchlaufen

Set Datei = Dateien(j)

Ebene_DE = false
Ebene_EN = false

Set Ebenen = Datei.graphicLayerOptions.graphicLayers

for k = 1 to Ebenen.count

'----- Prüfen, ob Ebenen vorhanden sind -------

if Ebenen.item(k).Name = "DE" then 'DE vorhanden
Ebene_DE = true
end if
if Ebenen.item(k).Name = "EN" then 'EN vorhanden
Ebene_EN = true
end if


'------------- Toggle Ebenen DE und EN ---------------------


if (Ebene_DE = true) AND (Ebene_EN = true) then

if ebenen.Item("DE").CurrentVisibility = false then
e(0) = "DE"
e(1) = "EN"
end if

if ebenen.Item("EN").CurrentVisibility = false then
e(0) = "EN" 'Ebene, die eingeblendet werden soll
e(1) = "DE" 'Ebene, die ausgeblendet werden soll
end if
end if

Next 'ENDE Ebenen durchlaufen

ebenen.Item(e(0)).CurrentVisibility = true
ebenen.Item(e(1)).CurrentVisibility = false

Next 'ENDE Dateien durchlaufen
Next 'ENDE Seiten durchlaufen

Hier Klicken X

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Henry
Beiträge gesamt: 774

7. Dez 2017, 18:16
Beitrag # 2 von 20
Beitrag ID: #561297
Bewertung:
(4437 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hab es mir nur grob(!) angesehen.
1.) Die "k"-Schleife muss doch sicherlich VOR dem Toggeln beendet sein/werden?!
2.) Das Toggeln würde ich mittels des Not-Operators lösen, der schaltet von True auf False und umgekehrt.
Code
Set myInDesign = CreateObject("InDesign.Application.cs6")  
Set myDocument = myInDesign.ActiveDocument

Layer_DE = false
Layer_EN = false

Set Seiten = myDocument.pages
For i = 1 to Seiten.count 'Seiten durchlaufen
Set Seite = Seiten(i) 'Seite i im Dokument

Set Dateien = Seite.allGraphics 'Alle eingebundenen Dateien der Datei

For j = 1 to Dateien.count 'Eingebundene Dateien durchlaufen

Set Datei = Dateien(j)

Ebene_DE = false
Ebene_EN = false

Set Ebenen = Datei.graphicLayerOptions.graphicLayers

for k = 1 to Ebenen.count
'----- Prüfen, ob Ebenen vorhanden sind -------
if Ebenen.item(k).Name = "DE" then 'DE vorhanden
Ebene_DE = true
end if
if Ebenen.item(k).Name = "EN" then 'EN vorhanden
Ebene_EN = true
end if
Next k

'------------- Toggle Ebenen DE und EN ---------------------
if (Ebene_DE = true) AND (Ebene_EN = true) then
ebenen.Item("DE").CurrentVisibility = Not(ebenen.Item("DE").CurrentVisibility)
ebenen.Item("EN").CurrentVisibility = Not(ebenen.Item("EN").CurrentVisibility)
end if

Next j 'ENDE Dateien durchlaufen
Next i 'ENDE Seiten durchlaufen



als Antwort auf: [#561295]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

7. Dez 2017, 21:05
Beitrag # 3 von 20
Beitrag ID: #561302
Bewertung:
(4407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Henry,

danke für die Hilfe.
Nicht schlecht die Idee mit dem Not-Operator.
Macht es auch etwas kürzer.
Allerdings läuft das Script genau so weit wie meins.

In dem Testdokument habe ich drei InDesign Dateien mit den "DE" und "EN" Ebenen eingebunden.

Beim Test sind die "DE" Ebenen sichtbar. Beim Ausführen des Scripts wird bei der Ersten Datei die "DE" Ebene ausgeblendet und dann kommt der Fehler "... da das Objekt nicht mehr existiert" Zeile 38.

Das ist dann in Deinem Script hier:
Code
ebenen.Item("EN").CurrentVisibility = Not(ebenen.Item("EN").CurrentVisibility) 


und bei mir ist das hier:
Code
ebenen.Item(e(1)).CurrentVisibility = false 


Der Fehler kommt, wenn innerhalb einer Datei die Sichtbarkeit der nächste Ebene umgeschaltet werden soll. Ich frage mich, welches Objekt in dem Moment nicht mehr existiert.
Die Ebene ist ja noch da.


als Antwort auf: [#561297]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

8. Dez 2017, 09:25
Beitrag # 4 von 20
Beitrag ID: #561313
Bewertung:
(4356 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kurzer Zwischenstand,
ich bin etwas weiter.

Durch rumtesten ist mir aufgefallen, dass das Script nur mit der letzten (untersten) Ebene einer eingebundenen Datei funktioniert.

Die Ebene "DE" befindet sich unterhalb der Ebene "EN".
DE geht, EN gibt den Fehler. Befinden sich oberhalb DE weitere Ebenen, so erscheint der Fehler sobald eine dieser Ebenen umgeschaltet werden sollen.


als Antwort auf: [#561302]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Henry
Beiträge gesamt: 774

8. Dez 2017, 09:26
Beitrag # 5 von 20
Beitrag ID: #561314
Bewertung:
(4356 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mmmh, da bin ICH als Nicht-Experte überfragt.

Du kannst dir Variablenwerte mit der MsgBox-Funktion ausgeben lassen, also z.B. eine solche Zeile hier einfügen:
Code
		'------------- Toggle Ebenen DE und EN ---------------------   
if (Ebene_DE = true) AND (Ebene_EN = true) then
MsgBox "Ebene DE visible? " & ebenen.Item("DE").CurrentVisibility & VbCr & "Ebene EN visible? " & ebenen.Item("EN").CurrentVisibility
ebenen.Item("DE").CurrentVisibility = Not(ebenen.Item("DE").CurrentVisibility)
ebenen.Item("EN").CurrentVisibility = Not(ebenen.Item("EN").CurrentVisibility)
end if



als Antwort auf: [#561302]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

8. Dez 2017, 09:53
Beitrag # 6 von 20
Beitrag ID: #561315
Bewertung:
(4346 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das habe ich bereits an allen möglichen Stellen gemacht.
Ansprechen kann man die anderen (oberen) Ebenen immer und alle möglichen Informationen abrufen/ausgeben.
Nur bei .CurrentVisibility geht es schief.

...


als Antwort auf: [#561314]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

pixxxelschubser
Beiträge gesamt: 1563

8. Dez 2017, 10:52
Beitrag # 7 von 20
Beitrag ID: #561317
Bewertung:
(4328 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
mit InDesign-Scripting habe ich mich schon lange nicht mehr beschäftigt. Und die VBS-Syntax beherrsche ich auch nicht.

Wenn ich allerdings von der Javascript-Syntax in Illustrator ausgehe, dann sollte doch eine Vorgehensweise in der folgenden Art zielführend sein:

stelle eine definierte Ausgangslage her
Prüfe ob Layer DE existiert
schalte Layer DE sichtbar
Prüfe ob Layer EN existiert
schalte Layer EN sichtbar

wähle den Layer der sichtbar bleiben soll
schalte den Layer (nochmals) sichtbar
schalte den anderen Layer unsichtbar

Der nachfolgende [JS] Code ist zwar für Illustrator aber vielleicht könnt ihr den selbst portieren.
Code
var aDoc = app.activeDocument; 
// prüfe ob Layer mit Namen DE existiert
try {
var layDE = aDoc.layers["DE"];
layDE.visible = true;
//active
}
catch (e) {
var layDE = aDoc.layers.add();
layDE.name = "DE";
}
// prüfe ob Layer mit Namen EN existiert
try {
var layEN = aDoc.layers["EN"];
layEN.visible = true;
//active
}
catch (e) {
var layEN = aDoc.layers.add();
layEN.name = "EN";
}

var x = prompt ("Ebene sichtbar schalten: (DE/EN)", "DE", "Ebenentoggle");

if (x && x == "DE") {
// set visibility Deutsch
layDE.visible = true;
layEN.visible = !layDE.visible;
} else {
if (x && x == "EN") {
// oder set visibility Englisch
layEN.visible = true;
layDE.visible = !layEN.visible;
} else {
alert ("kein gültiger Ebenenname");
}
}


Das ist nur ein sehr allgemein gehaltener Code. Er sollte aber zeigen, wie es auf jeden Fall funktionieren muss – unabhängig von der Scriptsprache oder Programm. Das man Teile des Codes weglassen, praktischer programmieren oder auch verfeinern kann ist selbstredend.

Wink
Viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton




als Antwort auf: [#561315]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Kai Rübsamen
Beiträge gesamt: 4563

8. Dez 2017, 12:14
Beitrag # 8 von 20
Beitrag ID: #561323
Bewertung:
(4310 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Auch nur JS, aber man sollte das adaptieren können. Das Problem ist, dass ein Objekt, dass in einer Variable liegt, nach dem Ändern einer Ebene nicht mehr vorhanden ist:

Code
var curDoc = app.activeDocument; 
var allLinks = curDoc.links;
var layernames = ["DE", "EN"];

for (var i = allLinks.length-1; i >= 0; i--) {
var curItem = allLinks[i].parent;
if (curItem.constructor.name == "ImportedPage") {
for (var k = 0; k < layernames.length; k++) {
var curLayer = curItem.graphicLayerOptions.graphicLayers.item(layernames[k]);
if (curLayer.isValid) {
curLayer.currentVisibility = !curLayer.currentVisibility;
}
}
}
}


Wenn ich beim zweiten Durchlauf "curItem" prüfe, gibt es das nicht mehr. Frage ich das Objekt jedes Mal erneut ab, geht es:

Code
var curDoc = app.activeDocument; 
var allLinks = curDoc.links;
var layernames = ["DE", "EN"];

for (var i = allLinks.length-1; i >= 0; i--) {
if (allLinks[i].parent.constructor.name == "ImportedPage") {
for (var k = 0; k < layernames.length; k++) {
var curLayer = allLinks[i].parent.graphicLayerOptions.graphicLayers.item(layernames[k]);
if (curLayer.isValid) {
curLayer.currentVisibility = !curLayer.currentVisibility;
}
}
}
}


Gruß Kai Rübsamen


als Antwort auf: [#561317]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Henry
Beiträge gesamt: 774

8. Dez 2017, 13:20
Beitrag # 9 von 20
Beitrag ID: #561328
Bewertung:
(4290 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: … Das Problem ist, dass ein Objekt, dass in einer Variable liegt, nach dem Ändern einer Ebene nicht mehr vorhanden ist…

Ah, das macht Sinn ;-)
…grrr, wer soll denn auf sowas kommen???

@Marcel, probier dann mal sowas
Code
		'------------- Toggle Ebenen DE und EN ---------------------   
if (Ebene_DE = true) AND (Ebene_EN = true) then
ebenen.Item("DE").CurrentVisibility = Not(ebenen.Item("DE").CurrentVisibility)
Set Ebenen = Datei.graphicLayerOptions.graphicLayers
ebenen.Item("EN").CurrentVisibility = Not(ebenen.Item("EN").CurrentVisibility)
end if

Also vor dem zweiten "Toggeln" (nur) das "Ebenen"-Objekt neu zuweisen.


als Antwort auf: [#561323]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

8. Dez 2017, 13:23
Beitrag # 10 von 20
Beitrag ID: #561329
Bewertung:
(4289 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe jetzt das Problem gefunden.
Ein Eintrag in einem anderen Forum hat mich auf die Spur gebracht.

Bei Indesign ist es so, das sich die ID einer eingebundenen Datei nach dem Ein-/Ausblenden einer Ebene ändert.
Die Datei ist danach zwar noch vorhanden, wegen der neuen ID aber plötzlich unbekannt.

Wie ich sehe, hat Kai das Problem auch schon erkannt.


als Antwort auf: [#561317]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Uwe Laubender
Beiträge gesamt: 4165

8. Dez 2017, 14:15
Beitrag # 11 von 20
Beitrag ID: #561332
Bewertung:
(4277 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Wortsalat,

wir hatten das Problem mit der sich ändernden ID auch schon hier diskutiert.
Allerdings im Hinblick auf platzierte AI-Dateien, die nach dem Platzieren geändert und dann upgedatet wurden. Ist ein paar Jahre her, denke ich…
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#561329]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

Wortsalat
Beiträge gesamt: 74

8. Dez 2017, 14:23
Beitrag # 12 von 20
Beitrag ID: #561333
Bewertung:
(4274 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

auf eine sich ändernde ID soll man auch mal kommen.
Da rechnet man ja eigentlich nicht mit. Wobei InDesign ja immer wieder für Überraschungen und Eigenheiten gut ist.

@Kai Rübsamen
Dein Script läuft so wie ich es mir gedacht habe. Danke
Ich sollte mich mehr mit JavaScript befassen. VB ist offensichtlich nicht so weit verbreitet und vielleicht auch veraltet". Scheinbar bietet JS auch mehr Möglichkeiten.

@Alle
Danke für die vielen Rückmeldungen.

Grüße
Marcel


als Antwort auf: [#561332]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

WernerPerplies
Beiträge gesamt: 2224

8. Dez 2017, 14:41
Beitrag # 13 von 20
Beitrag ID: #561334
Bewertung:
(4266 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

sich ändernde IDs sind das eine, eine veränderte Reihenfolge von Elementen in einer Collection sind ein weiteres Problem.

Deshalb macht es Sinn, bei identischer ID immer über die ID, bei eindeutigem Namen über den Namen zuzugreifen.

Für dieses Beispiel vielleicht so:

Code
main(); 

/*void*/function main()
{
try
{
/*Document*/var doc = app.activeDocument, /*Pages*/pages = doc.pages.everyItem().getElements(),
/*Graphics*/graphics = null,
/*Int*/l = pages.length, /*Int*/li = -1;
for (var i = 0; i < l; i++)
{
graphics = pages[i].allGraphics;
ll = graphics.length;
for (var ii = 0; ii < ll; ii++)
{
if ((app.activeDocument.layers.itemByName("DE").isValid) || (app.activeDocument.layers.itemByName("EN").isValid))
{
app.activeDocument.layers.itemByName("DE").visible = !(app.activeDocument.layers.itemByName("DE").visible);
app.activeDocument.layers.itemByName("EN").visible = !(app.activeDocument.layers.itemByName("EN").visible);
}
}
}
}
catch (error)
{
alert("Fehlermeldung: " + error.message + "\nin Datei: " + error.fileName + "\nin Zeile: " + error.line );
}
}


Wobei natürlich noch einige mögliche Fehlerbedingungen herauszuprüfen sind.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


als Antwort auf: [#561332]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

pixxxelschubser
Beiträge gesamt: 1563

8. Dez 2017, 14:51
Beitrag # 14 von 20
Beitrag ID: #561335
Bewertung:
(4264 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat … VB ist offensichtlich nicht so weit verbreitet und vielleicht auch veraltet". Scheinbar bietet JS auch mehr Möglichkeiten …


Nein. VBS ist nicht veraltet. Genausowenig wie Applescript. Und diese beiden plattformspezifischen Sprachen bieten genaugenommen sogar mehr Möglichkeiten als Javascript (genauer: Adobe Extendscript).

Der große Vorteil von Javascript ist einfach der: Diese Sprache ist plattformübergreifend und funktioniert im Großen und Ganzen (mit klitzekleinen Ausnahmen) sowohl unter Windows und MacOS

Wink
Viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton




als Antwort auf: [#561333]

Zustand der Sichtbarkeit bei Ebenen hin und her toggeln

WernerPerplies
Beiträge gesamt: 2224

8. Dez 2017, 15:12
Beitrag # 15 von 20
Beitrag ID: #561337
Bewertung:
(4258 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Der große Vorteil von Javascript ist einfach der: Diese Sprache ist plattformübergreifend und funktioniert im Großen und Ganzen (mit klitzekleinen Ausnahmen) sowohl unter Windows und MacOS

Und nicht zu vergessen, für praktisch jedes Anwendungsproblem gibt es irgendwo eine Library.
Deshalb entwickle ich ich heute fast ausschließlich mit JavaScript.
Und es ist zusatzlich auch noch die Skriptsprache für Browseranwendungen. -> Nodes, Electron u. ä.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


als Antwort auf: [#561335]
Hier Klicken X

Veranstaltungen

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen. pdf-icon Hier eine kleine Anleitung.

Veranstaltungen
25.10.2018

Hamburg
Donnerstag, 25. Okt. 2018, 10.39 Uhr

Seminar

Viele Funktionen, für die früher Illustrator benötigt wurde, finden sich heute auch in InDesign. Angefangen bei den Pfadwerkzeugen, mit denen sich Linien und Bezier-Pfade zeichnen lassen, über die regulären Zeichenwerkzeuge für Rahmen und Linien bis hin zum Pathfinder, der Vektorobjekte zerschneiden, verbinden und kombinieren kann: InDesign bietet eine Vielzahl von Vektorgrafik-Werkzeugen, mit denen sich auch komplexe Vektorgrafiken erstellen lassen.

München, Donnerstag, 25.10.2018, Seminargebühr 415,31 (inkl. 19% MwSt), 9.30 Uhr bis 17.30 Uhr

Ja

Organisator: Cleverprinting

Vektorgrafik mit Adobe InDesign und Illustrator
Veranstaltungen
25.10.2018

Schule für Gestaltung Zürich
Donnerstag, 25. Okt. 2018, 17.00 - 19.30 Uhr

Seminar

Folgenden Fragen gehe ich – gemeinsam mit Ihnen – während des Seminars auf den Grund: – Sind heutige Farbsysteme auf crossmediale Ausgaben ausgerichtet? – Wie definiert man Farben für den Einsatz in Office- und Direktmarketing-Softwaren? – Welche Farb-Definitionen muss ein heutiges, crossmediales Corporate-Design beinhalten? – Braucht es dazu neue Systeme und Workflows? – Existieren Hilfsmittel für den crossmedialen Datenaustausch (freieFarbe)? – Ist CMYK in heutigen digitalen Produktionen noch sinnvoll und von Vorteil? – Was ist qualitativ besser – verfahrensangepasst oder ausgabeneutral?

Donnerstag, 25. Oktober 2018, von 17.00 Uhr bis 19.30 Uhr
mit anschliessendem Apéro

viscom-Mitglied: Kostenlos
Nichtmitglied: CHF 250.00, zuzüglich MwSt.

Ja

Organisator: viscom

http://www.viscom.ch/?name=agenda&veranstaltungid=854&datum=25.10.2018&suche=1

Hier Klicken