Vertikale Anordnung von Rahmen und mehrdimensionales Objekt

Indesign Automatisierung mit C# und JavaScript
Programme und Skripte, Libraries, Code Snippets und Basics
Anwenderforen für meine Programme und Skripte
wernerperplies
Beiträge: 235
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von wernerperplies » 11. Jul 2014, 09:06

Hallo Dominik,

was für eine Geburt!

Ich habe viel zu lange gebraucht, um die Ursache Deines Problems zu finden, obwohl Sie sehr banal ist.

Du darfst der JSON.stringify()-Methode kein InDesign-Object übergeben, weil dieser Datentyp nicht behandelt wird.

Oder besser:
die JSON.stringify()-Methode behandelt nur die JavaScript-Datentypen.

Schau mal an diese Stelle:

Code: Alles auswählen

for (var i = 0; i < numberOfParagraphs; i++) {
    obj_paragraphs[i] = {
        paragraphStyleName : paragraphStyles[i].name,
        appliedFont: paragraphStyles[i].appliedFont, <--------------
...}
Font ist ein InDesign-Object und wird nicht richtig behandelt.
Abhilfe:

Code: Alles auswählen

            for (var i = 0; i < numberOfParagraphs; i++) {
                obj_paragraphs[i] = {
                    paragraphStyleName : paragraphStyles[i].name,
                    appliedFont: nameOfObject(paragraphStyles[i].appliedFont),
...}

Code: Alles auswählen

    /*String*/function  nameOfObject(/*Object*/o)
    {
        if (typeof o == "object")
        {
            if ("name" in o)
                return o.name;
            throw new Error("JSON-Export: unhandled Objecttype");
        }
        return o;
     }
Du musst jetzt Deinen ganzen Code nach ähnlichen Problemen durchflöhen. :)

Eine Fassung mit der erweiterten Routine habe ich Dir angehängt.
Dateianhänge
WpsExport.zip
(4.85 KiB) 573-mal heruntergeladen
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

domi77
Beiträge: 7
Registriert: 10. Jul 2014, 07:31

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von domi77 » 11. Jul 2014, 09:51

Vielen Dank, das wars. Hab´s jetzt am laufen, dann mache ich mich an die Reihenfolge. Bis dann...

LG Dominik

domi77
Beiträge: 7
Registriert: 10. Jul 2014, 07:31

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von domi77 » 18. Jul 2014, 03:17

Moin bzw. N8 Werner,

ich habe meinen Exporter jetzt fertig und würde mich gerne an den PHP-Parser dazu machen, jedoch bleibt das Problem mit der "Stapelreihenfolge" ungelöst. Doch hier erstmal meine Errungenschaft:

Code: Alles auswählen

zu lang (s. Anhang)
BTW: es fehlen natürlich immer noch die Ovals, Polygons, Lines sowie eine vollständige Auflistung der inkompatiblen Objekte in der GUI bzw. eine anständige Unformung für diese im prepare-Bereich des Skripts. Egal.

Mir geht es um die Reihenfolge im Stapel der Objekte auf dem Druckbogen. Wir kennen die Ebenen und eine Reihenfolge innerhalb ein und derselben Ebene - dazu benötige ich die Indizies in der Form 0 (unten) bis x (oben). Wie ich bereits erwähnte, im IDML war das kein Problem, je später ein Objekt im XML auftauchte, desto höher war es angeordnet - man konnte einfach den Stapel durchlaufen und immer css -> "z-index = +1;" anwenden. Analog dazu wollte ich den Schleifenzähler bei

Code: Alles auswählen

var allPageItems = app.activeDocument.Spreads.pageItems;
for (i=0; i < allPageItems; i++) {
     [... z-index = i]
}
nutzen, doch Pustekuchen, bei Änderungen in der Ebenenreihenfolge ändert sich hier nix. Mein aktueller Ansatz ist folgende Zeile:

Code: Alles auswählen

props["verticalLayerAlign"] = pageItem.itemLayer.index + "_" + pageItem.index;
Also der Index der Ebene selbst getrennt durch "_" von dem Index des Items auf der Ebene. Man hätte dann so einen Baum:

Code: Alles auswählen

Ebene 1
   Item 1 = 1_1
   Item 2 = 1_2
   Item 3 = 1_3
Ebene 2
   Item 1 = 2_1
   Item 2 = 2_2
   Item 3 = 2_3
Leider liefert das auch kein brauchbares Ergebnis, habe das durch Änderungen in der Reihenfolge der Ebenen nachweisen können. Es muss doch möglich sein einen eindeutigen Zähler für die Höhe im Item-Stapel zu finden - am Liebsten noch ohne Berücksichtigung der Ebenen:

Code: Alles auswählen

Item 0 (unterstes Item)
Item 1
Item 2
Item 3
...
Item X (höchstes Item)
Danke und Gruss
Dominik
Dateianhänge
inddexp.jsx.zip
(12.29 KiB) 570-mal heruntergeladen

wernerperplies
Beiträge: 235
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von wernerperplies » 20. Jul 2014, 09:21

Hallo Domink,

entschuldige, dass ich Dir erst heute antworte, aber ich habe zur Zeit reichlich zu tun.

Zuerst einmal:

Wie wäre es, wenn Du Deinen, inzwischen recht umfangreichen Code in Einzelmodule (jeweils Funktionsgruppen zusammengefasst) aufteilst und in externe Dateien auslagerst?

Das macht die Sache dann gleich übersichtlicher und wir können uns hier auf das wesentliche konzentrieren.

Dann solltest Du mir auch wieder die passende InDesign-Datei zur Verfügung stellen, und alle Pfade so definieren, dass Sie ab einem Pfad (der InDesign-Datei!), relativ funktionieren.

Nur dann kann ich Deine Situation mit vertretbarem Aufwand nachstellen.
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?

Zu Deiner Frage Anordnung der Objekte auf dem Druckbogen könnte die Antwort hier stehen:
PageItem Stacking Order
Oder habe ich etwas falsch verstanden?

Meine Erkenntnis daraus:
yellowInFront.png
yellowInFront.png (8.11 KiB) 12359 mal betrachtet
app.selection[1].index
Ergebnis: 0
magentaInFront.png
magentaInFront.png (6.28 KiB) 12359 mal betrachtet
app.selection[1].index
Ergebnis: 1
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

domi77
Beiträge: 7
Registriert: 10. Jul 2014, 07:31

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von domi77 » 21. Jul 2014, 15:40

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.
Dateianhänge
testdok.zip
(357.63 KiB) 575-mal heruntergeladen
INDD-EXP.jsx.zip
(12.38 KiB) 575-mal heruntergeladen

wernerperplies
Beiträge: 235
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Vertikale Anordnung von Rahmen und mehrdimensionales Obj

Beitrag von wernerperplies » 22. Jul 2014, 10:00

Hallo Dominik,
Genau, so hatte ich das auch vor, ist noch reine Fleißarbeit.
Ohne aus Zeitgründen den Beweis antreten zu können, behaupte ich mal, Du machst Dir das Leben zu schwer.

Ich empfehle Dir nochmals das Studium meines Skriptes WpsCompareObjects,
sowie den Gebrauch der for-in-Schleife und den Include- und Excludelisten.

Doch zurück zum Thema Anordnung.

Ich habe den Verdacht, dass das Geheimnis im Array AllPageItems eines Objektes liegt und die Anordnung der einzelnen Objekte sich aus der Reihenfolge der Objekte im Array ergibt.

Eine Gruppierung oder gar Duplizierung ist meines Erachtens nach nicht nötig.

Sieh Dir einfach mal diese Beispiele an:

Das hierfür verwendete Skript:

Code: Alles auswählen

// Werner Perplies: This is an extract of my Desktop divUtilities for use in the Chartstock project from Peter Henrich
//  © 2013, 2014 by Werner Perplies, EDV-Anwendungsberatung, 
// https://www.weepee.de, email: werner.perplies@weepee.de 
// created: Tue Jul 22 2014 08:21:47 GMT+0200
#target indesign

// Fri May 09 2014 15:32:29 GMT+0200
// returns the inner constructor.name of object types which can more spacialized types, e. g. PageItems
// usage: innerConstructorName(object) -> specialized constructor name
/*String*/function innerConstructorName(/*Object*/o) 
{ 
    try
    {
        if (o == null) return null; 
        var constructorName = o.constructor.name; 
        if (typeof(o) != "object") 
            return constructorName; 
        if (!("getElements" in o)) 
            return constructorName; 
        while (constructorName != o.getElements()[0].constructor.name) 
        { 
            if (!("getElements" in o)) 
                break; 
            o = o.getElements()[0]; 
            constructorName = o.constructor.name; 
        }         
    }
    catch (error)
    {
        doErrorHandling( {idError: error, stack: $.stack, arguments: arguments});
        constructorName = null;
    } 
    return constructorName; 
} 
// select all pageitems at page
main();

/*void*/function main()
{
    try
    {
        var pItemsBeforeChangingOrder = app.activeDocument.pages[0].allPageItems
        var l = pItemsBeforeChangingOrder.length;
        if (l == 0)
            throw new Error("Keine Seitenobjekte");
        var gatheredInfos = "";
        for (var i = 0; i < l; i++)
        {
            gatheredInfos += innerConstructorName(pItemsBeforeChangingOrder[i]) + 
                " Index: " + i.toString()  + "\n";            
        }
        alert(gatheredInfos );
    }
    catch (error)
    {
        alert("Fehlernummer: " + error.number +"\nFehlermeldung:" +error.message);
    }
}

Anordnung :

Beispiel 1:
orderExampleOne.png
orderExampleOne.png (4.71 KiB) 12357 mal betrachtet
Ergebnis:
Rectangle Index: 0
Image Index: 1
TextFrame Index: 2
Oval Index: 3
Image Index: 4

Beispiel 2:
orderExampleTwo.png
orderExampleTwo.png (4.6 KiB) 12357 mal betrachtet
Ergebnis:
TextFrame Index: 0
Rectangle Index: 1
Image Index: 2
Oval Index: 3
Image Index: 4

Beispiel 3:
orderExampleThree.png
orderExampleThree.png (6.59 KiB) 12357 mal betrachtet
Ergebnis:
Oval Index: 0
Image Index: 1
TextFrame Index: 2
Rectangle Index: 3
Image Index: 4

Du musst das Ergebnis jetzt noch auf Allgemeingültigkeit überprüfen.

HTH
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Antworten

Zurück zu „Adobe® InDesign® Automatisierung“