[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt ID CS4 - Objekteigenschaften für Rahmen

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

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

31. Mär 2011, 08:10
Beitrag # 1 von 12
Bewertung:
(3521 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich möchte mir gerne ein Script zu basteln (blutiger Scripting-Anfänger) um einen Rahmen in InDesign zu erzeugen, der eine weiße Hintergrundfarbe und eine 3pt starke weiße Kontur nach außen hat.

Gibt es dazu eine Übersicht mit den ganzen Eigenschaften für ein Objekt?
Also welche Befehl ich für den weißen Hintergrund zuständig ist etc.
Kontur z. B. "neuerRahmen.strokeWeight = 3pt"

Das Grundgerüst für das Script habe ich.
Aber die ganzen Möglichkeiten um die Eingenschaften von Objekten zu definieren fehlt mir.

Sorry, bin leider absoluter Neuling und versuche mich jetzt ein wenig ins Scripten einzuarbeiten.

Danke schon mal für eure Hilfe.

Gruß,
Thomas
X

ID CS4 - Objekteigenschaften für Rahmen

Martin Fischer
  
Beiträge gesamt: 12691

31. Mär 2011, 08:32
Beitrag # 2 von 12
Beitrag ID: #468062
Bewertung:
(3516 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

im Extendscript Toolkit (Debugger für JavaScript für Adobe Anwendungen) gibt es einen Objektmodellbrowser, in dem Du die Klassen und Befehle nachschlagen kannst.

Ich empfehle Dir aber die CHM- oder die HTML-Objektübersicht von Jongware zum Nachschlagen: InDesign JavaScript Reference Guide.


als Antwort auf: [#468058]

ID CS4 - Objekteigenschaften für Rahmen

Kai Rübsamen
Beiträge gesamt: 4679

31. Mär 2011, 08:52
Beitrag # 3 von 12
Beitrag ID: #468064
Bewertung:
(3504 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: ich möchte mir gerne ein Script zu basteln (blutiger Scripting-Anfänger)

Willkommen im Club :)

Ich hab mal versucht, das ganze im OMV nachzustellen. Die Skriptprofis mögen mir verzeihen, wenns nicht ganz so sauber bzw. ideal ist. Screen Rahmen erstellen zeigt dann die Umsetzung im ESTK.

Hier hätte ich allerdings noch ein paar Anweisungen zusammenfassen können u. es fehlt jegliche Prüfung, z.B. ist das Dokument geöffnet, gibt es die Farben überhaupt usw.

Zu meinem Vorgehen:
Ich hab mir überlegt, was ich machen würde, wenn ich den Rahmen zu Fuß erstelle. D.h. du fängst mit dem Programm an, siehst ein Dokument, evtl. mit der ersten Seite, erstellst einen Rahmen ...
Im OMV suche ich dann immer erst die Mehrzahl, z.B. "Rectangles" und schaue dann was die Einzahl "Rectangle" für Eigenschaften hat (das klappt oft, aber nicht immer ;-))


als Antwort auf: [#468062]
(Dieser Beitrag wurde von Kai Rübsamen am 31. Mär 2011, 08:56 geändert)

Anhang:
Baum.png (203 KB)   RahmenErstellen.png (22.0 KB)

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

1. Apr 2011, 18:01
Beitrag # 4 von 12
Beitrag ID: #468219
Bewertung:
(3438 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin und Kai,

vielen Dank für die Infos.
Ich bin jetzt fast am Ziel :-)

So sieht das Script jetzt aus.
Nichts spektakuläres aber für mich eine Herausforderung:
Code
var dok = app.activeDocument; 


for ( var l=0; l<dok.pages.length; l++ ) {
var neuerRahmen = dok.pages[l].rectangles.add();
neuerRahmen.geometricBounds = [20,20,120,120];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
}


Den OMV kannte ich schon ein wenig, allerdings muss ich gestehen habe ich Probleme den zu verstehen bzw. zu lesen.
Ich finde zwar meistens die Sachen die mir helfen könnten.
Doch dann hapert es leider an der Schreibweise des Befehls.
Kurz: Ich steh dann auf dem Schlauf wie ich den Befehl einbauen muss.

Jetzt z. B. möchte ich noch die Kontur nach außen ausrichten.
Den Punkt im OMV hab ich gefunden:
Code
	StrokeAlignment.OUTSIDE_ALIGNMENT 


Aber ich bekomme diesen Befehl nicht zum Laufen...

Gruß,
Thomas


als Antwort auf: [#468064]

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

1. Apr 2011, 20:09
Beitrag # 5 von 12
Beitrag ID: #468223
Bewertung:
(3425 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo nochmal,

die Sache nimmt langsam Gestalt an.

So sieht das Script jetzt aus:
Code
var dok = app.activeDocument; 

for ( var l=0; l<dok.pages.length; l++ )
var neuerRahmen = dok.pages[l].rectangles.add();

var w = new Window("dialog");
w.alignChildren ="left";
var b1 = w.add("radiobutton", undefined, "Mit Lichtkante");
var b2 = w.add("radiobutton", undefined, "Ohne Lichtkante");
w.add("button", undefined, "OK");
w.show ();

if (b1.value == true) {
neuerRahmen.geometricBounds = [20,20,120,120];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
}
else
if (b2.value == true) {
neuerRahmen.geometricBounds = [20,20,120,120];
neuerRahmen.fillColor = "Paper";
}
else {
alert("Bitte Auswahl treffen");
}


D. h. ich kann per Radiobutton auswählen ob ein Rahmen mit oder ohne Lichtkante erstellt werden soll.
Das funktioniert auch soweit.

Jetzt müsste ich nur noch wieder auf das Dialogfeld zurückspringen, wenn nichts ausgewählt wurde und aber der OK-Button gedrückt wurde.
Ich habe mit Absicht keinen Default-Wert gesetzt.

Das mach ich ja dann über einen "goto"-Befehl, oder?
Aber wie definiere ich den...

Sorry für die anfängerhaften Fragen, ich kämpfe mich da erst so durch.

Gruß,
Thomas


als Antwort auf: [#468219]

ID CS4 - Objekteigenschaften für Rahmen

Hans Haesler
  
Beiträge gesamt: 5822

1. Apr 2011, 20:48
Beitrag # 6 von 12
Beitrag ID: #468225
Bewertung:
(3418 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

eine Möglichkeit: Eine while-Schleife verwenden. Diese wird solange ausgeführt bis der Wert der Variablen dem vorgegebenen entspricht.

Hier wird zu Beginn jeder Seite die Variable "okay" auf "false" gesetzt. Wenn der Anwender richtig gewählt hat, dann wird der Variablen "true" zugewiesen und die nächste Seite kann in Angriff genommen werden.

Code
var dok = app.activeDocument;  

for (var i=0; i<dok.pages.length; i++) {
var neuerRahmen = dok.pages[i].rectangles.add();

var okay = false;

while (okay == false) {
var w = new Window("dialog");
w.alignChildren = "left";
var b1 = w.add("radiobutton", undefined, "Mit Lichtkante");
var b2 = w.add("radiobutton", undefined, "Ohne Lichtkante");
w.add("button", undefined, "OK");
w.show ();

if (b1.value == true) {
neuerRahmen.geometricBounds = [20,20,120,120];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
okay = true;
}
else if (b2.value == true) {
neuerRahmen.geometricBounds = [20,20,120,120];
neuerRahmen.fillColor = "Paper";
okay = true;
}
else {
alert("Bitte Auswahl treffen");
okay = false;
}
}
}

Ein guter Rat ... Auch wenn Scripting-Cracks gerne sparsam damit umgehen: Es lohnt sich, alle Akkoladen ( = { } )zu tippen. Vor allem bei längeren Scripts, kann mit einem geeigneten Editor (z.B. BBEdit oder UltraEdit) leichter überprüft werden, welche Akkoladen-Paare zusammengehören. Und wo eine Akkolade fehlt.

Das obige Script ist entsprechend ergänzt. Und der "if/else if"-Test ist "begradigt".

Und noch etwas: Für den Namen der automatischen Zählervariablen besser "i" verwenden, statt "l", welches in Courier-Schrift aussieht wie eine Eins.

Gruss, Hans


als Antwort auf: [#468223]

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

1. Apr 2011, 21:20
Beitrag # 7 von 12
Beitrag ID: #468226
Bewertung:
(3412 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für deine Hilfe.
Jetzt verhält sich das Script so wie ich das wollte.
Läuft super!

Merci :-)

Gruß,
Thomas


als Antwort auf: [#468225]

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

3. Apr 2011, 16:18
Beitrag # 8 von 12
Beitrag ID: #468255
Bewertung:
(3355 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen.

Sorry, muss nochmal nerven.

Das Script an sich läuft wunderbar.
Jetzt hatte ich aber das Problem, dass sich das Script in einem Dokument mit mehreren Seiten nicht ausführen lässt.
Bzw. das größere Problem ist, dass sich das Script nicht mehr abbrechen lässt.

Ich habe versucht noch einen "Abbrechen" Button einzubauen.
Allerdings weiß ich jetzt nicht wie ich den sauber definieren muss, damit dieser die Schleife abbricht.

Das Script sieht so aus:
Code
// Prüfung: Ist ein Dokument geöffnet?  
if (app.documents.length == 0) {
alert ("Es ist kein Dokument geöffnet.", "Achtung");
exit();
}

var dok = app.activeDocument;

for (var i=0; i<dok.pages.length; i++) {
var neuerRahmen = dok.pages[i].rectangles.add();
var myWidth = 91.5; // Breite
var myHeight = 50; // Höhe

var okay = false;

//Schleife
while (okay == false) {
var w = new Window("dialog");
w.alignChildren = "left";
var b1 = w.add("radiobutton", undefined, "Mit Lichtkante");
var b2 = w.add("radiobutton", undefined, "Ohne Lichtkante");
w.add("button", undefined, "OK",{name: "OK"});
w.add("button", undefined, "Abbrechen",{name: "Cancel"});
w.show ();

//Button 1
if (b1.value == true) {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
neuerRahmen.strokeAlignment = 1936998735;
okay = true;
}
//Button2
else if (b2.value == true) {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.fillColor = "Paper";
okay = true;
}

//Meldung wenn keine Auswahl getroffen -> Schleife
else {
alert("Bitte Auswahl treffen");
okay = false;
}
}
}



Dann hätte ich eine super Basis für weitere "Projekte".

Danke und Gruß,
Thomas

P.S: ich kämpfe mich immer noch durch Javascript ;-)


als Antwort auf: [#468226]

ID CS4 - Objekteigenschaften für Rahmen

Hans Haesler
  
Beiträge gesamt: 5822

3. Apr 2011, 21:33
Beitrag # 9 von 12
Beitrag ID: #468269
Bewertung:
(3332 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

Zitat P.S: ich kämpfe mich immer noch durch Javascript ;-)

Zu Deiner "Beruhigung": Das tun die meisten von uns. :-)

Versuche es bitte mal damit:

Code
// Prüfung: Ist ein Dokument geöffnet? 
if (app.documents.length == 0) {
alert ("Es ist kein Dokument geöffnet.", "Achtung");
exit();
}

var dok = app.activeDocument;

for (var i=0; i<dok.pages.length; i++) {
var neuerRahmen = dok.pages[i].rectangles.add();
var myWidth = 91.5; // Breite
var myHeight = 50; // Höhe

var okay = false;

//Schleife
while (okay == false) {
var w = new Window("dialog", "Objekteigenschaften für Rahmen", [600, 400, 850, 500]);
var b1 = w.add("radiobutton", [70, 10, 360, 26], "Mit Lichtkante");
var b2 = w.add("radiobutton", [70, 32, 360, 48], "Ohne Lichtkante");
// der Abbrechen-Button
var ClBtn = w.add("button", [20, 60, 120, 80], "Abbrechen");
// der OK-Button
var OkBtn = w.add("button", [130, 60, 230, 80], "OK");

// wenn den Abbrechen-Button geklickt wurde
ClBtn.onClick = function () {
w.close();
okay = true;
}
w.show ();
if (okay == true) {
exit();
}

//Button 1
if (b1.value == true) {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
neuerRahmen.strokeAlignment = 1936998735;
okay = true;
}
//Button2
else if (b2.value == true) {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.fillColor = "Paper";
okay = true;
}

//Meldung wenn keine Auswahl getroffen -> Schleife
else {
alert("Bitte Auswahl treffen");
okay = false;
}
}
}

Gruss, Hans


als Antwort auf: [#468255]

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

4. Apr 2011, 11:47
Beitrag # 10 von 12
Beitrag ID: #468311
Bewertung:
(3305 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

erst mal vielen, vielen Dank für deine Mühe und Hilfe.

Das Script läuft super.
Allerdings ist mir jetzt noch etwas aufgefallen:
Wenn ich auf Abbrechen klicke bleibt der erzeugte Rahmen (in der Größe 3,5 x 3,5mm) links oben auf der Seite stehen.
Das ist nicht so toll, zumal der Rahmen ja eine weiße Fläche hat.

Ich habe versucht noch ein Script einzubauen, dass diesen Rahmen eigentlich nach dem Klick auf den Button Abbrechen wieder löschen soll.
Bin jedoch kläglich daran gescheitert...

Der einfachste Weg wäre jetzt natürlich, ich baue den Abbrechen Button wieder aus... Dann muss halt im Notfall ein Rahmen erzeugt und von Hand wieder gelöscht werden. Ist aber dann doch sicherer.

Das Script habe ich versucht so anzupassen:
Code
		// wenn den Abbrechen-Button geklickt wurde  
ClBtn.onClick = function () {
w.close();

dok.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN;
dok.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.MILLIMETERS;
dok.viewPreferences.verticalMeasurementUnits = MeasurementUnits.MILLIMETERS;
function removePageRectangles(page){
var Rahmen = page.rectangles;
for (var n = Rahmen.length-1; n >= 0 ; n--){
var gb = Rahmen[n].geometricBounds;
var w = gb[3]-gb[1];
var h = gb[2]-gb[0];
if (h > 3 && h < 4&& w > 3 && w < 4){
Rahmen[n].remove();
}
}
}
for(var i=0;i<dok.pages.length;i++){
removePageRectangles (page)(dok.pages[i]);
}
okay = true;
}


Für mich heißt das, dass auf der aktiven Seite nach einem Rahmen mit der Größe +-3mm geschaut werden soll und dieser dann gelöscht werden soll, oder?

Das Problem ist jetzt, dass ich im ESTK einen Stopp bekomme mit der Meldung, dass ein modales Fenster oder Warnhinweis geöffnet ist...
OK, ich bin raus...
Muss ich da in der Reihenfolge etwas beachten?


Mir geht's hier wie mit einer Fremdsprache.
Ich kann mir zwar, wenn ich etwas lese, grob ein Bild daraus machen und auch einigermaßen nachvollziehen, aber mit der Aussprache und Grammatik hapert es dann :-)

Vielleicht ist man Arbeitgeber ja so freundlich und schickt mich nochmal auf eine Schulung. Die letzte Javascript-Schulung war sehr, sehr oberflächlich.

Gruß,
Thomas


als Antwort auf: [#468269]

ID CS4 - Objekteigenschaften für Rahmen

Hans Haesler
  
Beiträge gesamt: 5822

4. Apr 2011, 12:22
Beitrag # 11 von 12
Beitrag ID: #468319
Bewertung:
(3297 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

bitteschön.

Das Problem kann einfach gelöst werden, indem ein paar Code-Zeilen verschoben werden. Dann wird der Rahmen erst erzeugt, nachdem sich der Anwender entschieden hat (= "Mañana-Prinzip" = nicht im voraus etwas tun, sondern erst wenn es gebraucht wird).

Somit muss nach dem Klick auf "Abbrechen" nichts aufgeräumt werden.

Code
// Prüfung: Ist ein Dokument geöffnet? 
if (app.documents.length == 0) {
alert ("Es ist kein Dokument geöffnet.", "Achtung");
exit();
}

var dok = app.activeDocument;
var myWidth = 91.5; // Breite
var myHeight = 50; // Höhe

for (var i=0; i<dok.pages.length; i++) {
var okay = false;

//Schleife
while (okay == false) {
var w = new Window("dialog", "Objekteigenschaften für Rahmen", [600, 400, 850, 500]);
var b1 = w.add("radiobutton", [70, 10, 360, 26], "Mit Lichtkante");
var b2 = w.add("radiobutton", [70, 32, 360, 48], "Ohne Lichtkante");
// der Abbrechen-Button
var ClBtn = w.add("button", [20, 60, 120, 80], "Abbrechen");
// der OK-Button
var OkBtn = w.add("button", [130, 60, 230, 80], "OK");

// wenn den Abbrechen-Button geklickt wurde
ClBtn.onClick = function () {
w.close();
okay = true;
}
w.show ();
if (okay == true) {
exit();
}

//Button 1 oder Button 2
if (b1.value || b2.value) {
okay = true;
}
//Meldung wenn keine Auswahl getroffen -> Schleife
else {
alert("Bitte Auswahl treffen");
okay = false;
}
}
var neuerRahmen = dok.pages[i].rectangles.add();
if (b1.value) {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.strokeColor = "Paper";
neuerRahmen.strokeWeight = 3;
neuerRahmen.fillColor = "Paper";
neuerRahmen.strokeAlignment = 1936998735;
}
else {
neuerRahmen.geometricBounds = [0,0, + myHeight, + myWidth];
neuerRahmen.fillColor = "Paper";
}
}

Die beiden Tests, die prüfen welcher Button geklickt wurde, sind nun in einer Zeile zusammengefasst, getrennt durch zwei "|"-Zeichen. Das bedeutet "oder". Das "== true" kann man weglassen.

Gruss, Hans


als Antwort auf: [#468311]

ID CS4 - Objekteigenschaften für Rahmen

Uncle Tsebe
Beiträge gesamt: 205

4. Apr 2011, 14:38
Beitrag # 12 von 12
Beitrag ID: #468337
Bewertung:
(3275 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

perfekt.
So hatte ich mir das vorgestellt.

Und gelernt habe ich dabei auch etwas :-)

Gruß,
Thomas


als Antwort auf: [#468319]
X