Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Position von ImageFrame bestimmen

Position von ImageFrame bestimmen

Udo Göpfert
Beiträge gesamt: 15

11. Dez 2011, 22:58
Bewertung:

gelesen: 5511

Beitrag als Lesezeichen
 Hallo

Ich wiil in Indesign eine Automatische Legende erstellen. Dabei ist es wichtig die genaue Position eines plazierten Bildes zu kennen. Nach langer Suche habe ich dieses Skript gefunden.

Code
// der Name des Bildes  
var imgName = "DCP_1163.tif";

// die Liste der Bilder aufstellen
var allImages = app.documents[0].links;
// die Verknüpfungen zählen
var nImages = allImages.length;

// eine Schleife durch die Bilderliste
var curImg, oldPc, newPc;
for (var p=0; p<nImages; p++) {
// ... wenn der Bildname der definierte ist, dann ...
if (allImages[p].name == imgName) {
// ... wird der Variablen "curImg" das aktuelle Bild zugewiesen
curImg = allImages[p].parent;

var Imagebox = curImg.geometricBounds;

// runde auf 2Stellen
alert (Math.round(Imagebox[1]*100)/100+"\n"+Math.round(Imagebox[0]*100)/100+"\n"+Math.round(Imagebox[3]*100)/100+"\n"+Math.round(Imagebox[2]*100)/100+"\n");

}
}




Ich erhalte hier die Position des Bildes.
Wie kann ich die Position des Rahmens der das Bild enthält auslesen?

Danke für Eure Hilfe.

Position von ImageFrame bestimmen

-hans-
Beiträge gesamt: 748

11. Dez 2011, 23:29
Bewertung:

gelesen: 5498

Beitrag als Lesezeichen
hi,

parent des Bildes ist natürlich der Rahmen. Deine Variablenbezeichnung ist da irreführend.

Teste:
Code
/Bild markieren und in die Javascriptkonsole schauen .../ 
$.writeln(app.selection[0].parent)


Lieben Gruß

Hans-Gerd Claßen
Lieben Gruß

Hans-Gerd Claßen

Position von ImageFrame bestimmen

Hans Haesler
  
Beiträge gesamt: 5826

12. Dez 2011, 17:22
Bewertung:

gelesen: 5444

Beitrag als Lesezeichen
Hallo Udo,

der Code kommt mir irgendwie bekannt vor. ;-)

Wie Hans-Gerd schon erklärt hat, ist der Rahmen, welcher das Bild enthält, dessen parent.

Alles was es braucht ist, in Deiner Zeile ein parent einzufügen:

Code
var Imagebox = curImg.parent.geometricBounds; 

Aber weil die Rahmen mit frame bezeichnet werden, ist es besser, diesen Ausdruck zu verwenden (statt box).

Es schadet nicht, das Anzeigen der Dialoge zu aktivieren. Und die Prüfung, ob ein Dokument geöffnet ist, habe ich auch wieder reingemacht.

Code
// der Name des Bildes 
var imgName = "DCP_1163.tif";

// vorsichtshalber die Dialoge einschalten
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// die Liste der Bilder aufstellen
var allImages = app.documents[0].links;
// die Verknüpfungen zählen
var nImages = allImages.length;
// eine Schleife durch die Bilderliste
for (var p=0; p<nImages; p++) {
// ... wenn der Bildname der definierte ist, dann ...
if (allImages[p].name == imgName) {
// ... wird der Variablen "curImg" das aktuelle Bild zugewiesen
curImg = allImages[p].parent;
// die Position des Rahmens
var gB = curImg.parent.geometricBounds;
alert (gB);
var y1 = Math.round(gB[0]*100)/100;
var x1 = Math.round(gB[1]*100)/100;
var y2 = Math.round(gB[2]*100)/100;
var x2 = Math.round(gB[3]*100)/100;
// die Position der Rahmen-Kanten anzeigen
alert (x1 +"\n" + y1 +"\n" + x2 +"\n" + y2);
break;
}
}

Nicht ganz klar ist der Ablauf. Willst Du für jedes Bild den Code editieren? Wäre es nicht besser, eine Liste der Bildnamen zu verwenden? Oder wenigstens einen Dialog, mit welchem der Name eingegeben werden kann.

Und definitif ist besser, die erhaltenen Werte an Variablen zu übergeben (wie hier gezeigt). Dann können sie zur Erzeugung des Bildunterschrift-Rahmens verwendet werden.

Gruss, Hans

Position von ImageFrame bestimmen

Udo Göpfert
Beiträge gesamt: 15

13. Dez 2011, 10:54
Bewertung:

gelesen: 5398

Beitrag als Lesezeichen
Hallo Hans

Danke für die Hilfe.

Mein Ziel ist es:
Die Verküpfungsliste auszulesen.
Die Liste in einem Dropdown-Menu anzuzeigen in der die Datei mit "Legende" im Namen vorausgewält ist.
Die Legende ist ein EPS mit den Standartelementen. Mein Skript soll nun die Sonderfarben in einer bestimmten Art und Weise über das EPS legen, so das eine komplette Legende mit Sonderfarben etc. entsteht.
Dazu brauche ich die genaue Position des platieren EPS.
Natürlich soll es auch eine User-Schnittstelle geben.

Gruß Udo

Position von ImageFrame bestimmen

Hans Haesler
  
Beiträge gesamt: 5826

13. Dez 2011, 14:23
Bewertung:

gelesen: 5377

Beitrag als Lesezeichen
Hallo Udo,

also ... ich komme da nicht ganz mit.

Ob nur *eine* Datei plaziert ist, welche "Legende" im Namen hat, oder mehrere: Das Script könnte diese doch selbständig aufspüren und die Sonderfarben darüberlegen.

Ich würde gerne helfen. Dazu sollte ich aber zwei Dokumente bekommen (vorher/nacher) und eine Schilderung des Ablaufs.

Gruss, Hans

Position von ImageFrame bestimmen

Udo Göpfert
Beiträge gesamt: 15

13. Dez 2011, 15:35
Bewertung:

gelesen: 5361

Beitrag als Lesezeichen
Hallo Hans

ich hab hier mal zwei screenshots auf den Server gelegt.
ftp://iftp_45611:RGhGZDw3@ftp.das-studio.de/Screenshots.zip

der erste Screenshot zeitgt eine leere Legende,die plazierten Bilder und die Farbpallette.

Hier kommt dann mein Script zum Zug.
Das Script soll die Bilderliste durchsuchen nach Dateien die das Wort Legende enthalten. Bei Mehrfachergebnis soll der User die richtige Datei auswähren.

Die Sonderfarben werden in einer Tabelle zur Auswahl gestellt da nur die Farben in der Legende erscheinen sollen die wirklich gedruckt werden.
Danach werden die Felder aus dem 2. Screenshot gezeichnet.


Danke für dein Angebot mir bei der Scripterei zu helfen.
Meine JavaScript-Kenntnisse sind noch sehr bescheiden.
Ich möchte es gern selbst versuchen und mich dann wieder hier in Forum melden wenn es mal wieder nicht weiter geht. Ich denke das steigert den Lerneffekt.

Über Vorschläge,Ideen und Tips würde ich mich trotzdem freuen.

Gruß Udo

Position von ImageFrame bestimmen

Hans Haesler
  
Beiträge gesamt: 5826

13. Dez 2011, 17:25
Bewertung:

gelesen: 5340

Beitrag als Lesezeichen
Hallo Udo,

okay. Hier dennoch ein "coup de pouce", ein Schubs mit dem Daumen (wie wir hier in Lausanne sagen): Der Anfang des Scripts. Die Namen der Bilder werden aufgelistet.

Der Alert, der die Namen einzeln anzeigt und dahinter den Index, dient nur zum Verständnis und muss entfernt werden, sobald alles klar ist.

Mit 'indexOf' wird die Position einer Textkette (hier "egende") innerhalb einer anderen Textkette (hier der Bildname) festgestellt. Wenn das Ergebnis -1 ist, dann ist die gesuchte Textkette nicht enthalten. Deshalb wird der Operator != (ist nicht) verwendet: Wenn das Ergebnis nicht minus eins ist, dann hänge den Namen an den Array.

Code
// vorsichtshalber die Dialoge einschalten 
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// die Liste der Bilder aufstellen
var allImages = app.documents[0].links;
// die Verknüpfungen zählen
var nImages = allImages.length;
var imgNames = new Array ();
var imgCtr = new Array ();
// eine Schleife durch die Bilderliste und die Namen auflisten
for (var p=0; p<nImages; p++) {
// der aktuelle Bildname
var curName = allImages[p].name;
// die folgende Zeile dient nur zur Demonstration
alert (curName + "\nder Index von \"egende\" ist: " + (curName.indexOf("egende")));
// wenn der Name die Textkette "egende" enthält ...
if (curName.indexOf("egende") != -1) {
// ... wird er an den Array angehängt
imgNames.push(curName);
// auch der Zähler wird gespeichert
imgCtr.push(p);
}
}
// wenn der Array mit den Namen mehr als ein Element enthält ...
var nNames = imgNames.length;
if (nNames == 0) {
alert ("Kein Legendenbild gefunden.", "Achtung");
}
else if (nNames == 1) {
// dieser Alert kann entfernt werden
alert ("Ein Legendenbild gefunden.", " ");
}
else if (nNames > 1) {
// diesen Alert durch den Dialog ersetzen, welcher die Liste zur Auswahl anbietet
alert (nNames + " Legendenbilder gefunden.", " ");
}

Es bleibt noch viel zu tun. Die nächste Etappe wird sein, einen Dialog zu zeigen, welcher die Liste der gefundenen Namen zur Auswahl anbietet.

Gruss, Hans

(Dieser Beitrag wurde von Hans Haesler am 13. Dez 2011, 17:27 geändert)