Hallo Werner,
BTW: es fehlen natürlich immer noch die Ovals, Polygons, Lines -> Das sind doch alles PageItems und müssten sich mit der gleichen Routine erledigen lassen, oder?
Genau, so hatte ich das auch vor, ist noch reine Fleißarbeit.
Einzelmodule werde ich nur dann machen, wenn man als eine Binärdatei exportieren kann. Weiß ich gerade nicht, später!
Zunächst, so begeistert ich bin von JSX, umso graupenhafter finde ich es von Adobe, dass sowas elementares wie die Anordnung übereinander, so schlecht zu ermitteln ist. Dein Beispiel mit dem index in den Bilder, funktioniert nur, weil diese von gleichen Typ sind. Der Index ist abhängig von Typ und Stapelreihenfolge.
Jetzt gibt es einen Workaround, indem man alle Pageitems dupliziert und zu einer Gruppe macht. Die Gruppen sind dann die neuen PageItems und deren index gibt eine zuverlässige Aussage zur Stapelhöhe. Zum Schluss muss man die Gruppen auflösen und die Duplikate wieder entfernen. Ich habe das bereits eingebaut, jedoch fliegt mir das Skript nun mit "einem ungültigen Parameter" um die Ohren. Sorry das ich das nicht genauer beschreibe, bin gerade ziemlich geflasht von den hunderten Versuchen heute.
Z.1996ff
Code: Alles auswählen
var pages = spread.pages;
var numberOfPages = pages.length;
for (var i = 0; i < numberOfPages; i++) {
var pageItems = pages[i].allPageItems;
var numberOfPageItems = pageItems.length;
//Duplizieren und Gruppieren aller PageItems, bei Abschluss folgt direkt der Ausstieg
for (var j = 0; j < numberOfPageItems; j++) {
var source = pageItems[j];
var duplicate = source.duplicate();
duplicate.label = "duplicate";
var duplicate_group = pages[i].groups.add ([duplicate, source]);
duplicate_group.label = "duplicate_group";
}
//Gruppen sind nun alle PageItems, ich gehe diese durch
var groupItems = pages[i].allPageItems;
var numberOfGroupItems = groupItems.length;
for (var k = 0; k < numberOfGroupItems; k++) {
if (obj_page == null) {
obj_page = {};
}
//Der Index ist dann die tatsächliche Stapelhöhe, da nur Groups vorkommen
var index = groupItems[k].index;
//Dann nehme ich mir das erstbeste Item aus der Gruppe...
var innerElements = groupItems[k].firstItem();
//und will es so verarbeiten wie Du es kennst, den Index hänge ich einfach als Parameter dran
if (innerElements.constructor.name instanceof Rectangle) {
if (!("rectangles" in obj_page)) {
obj_page.rectangles = new Array();
}
readProps(innerElements.getElements()[0], obj_page.rectangles, rectanglesProps2Read, innerElements, index);
}
if (innerElements.constructor.name instanceof TextFrame) {
if (!("textframes" in obj_page)) {
obj_page.textframes = new Array();
}
readProps(innerElements.getElements()[0], obj_page.textframes, textFramesProps2Read, innerElements, index);
}
//entfernen von Gruppe und Duplikat
pages[i].groupItems[k]('duplicate_group').ungroup();
pages[i].groupItems[k]('duplicate').remove();
}
Die Funktion readProps nimmt den zusätzlichen Index auf und leitet ihn weiter in das JSON-Array
Code: Alles auswählen
function readProps(o, result, jobs2Do, pageItem, index) {
try {
var props = null;
var numberOfJobsToDo = jobs2Do.length;
for (var i = 0; i < numberOfJobsToDo; i++) {
if (props == null)
props = {};
if (jobs2Do[i].name in o) {
try {
if ("callBack" in jobs2Do[i])
jobs2Do[i].callBack(o[jobs2Do[i].name], props);
else {
if ("jobs2Do" in jobs2Do[i]) {
var result = new Array();
readProps(o[jobs2Do[i].name], result, jobs2Do[i].jobs2Do);
if (result.length > 0)
props[jobs2Do[i].name] = result[0];
} else
props[jobs2Do[i].name] = o[jobs2Do[i].name];
}
} catch (error) {
props[jobs2Do[i].name] = {
error: "unknown"
};
}
}
}
props["verticalLayerAlign"] = index;
result.push(props);
} catch (error) {
alert(error);
}
return;
}
Wiedermal danke für Deine Hilfe.