• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Möglichkeit gesucht: Ebenen-Objekt umbenennen per Skript

pixelanstalt

New member
Hallo Community,

kaum registriert, schon die erste Frage, die es möglicherweise schon in sich hat. Ich habe jedenfalls noch nichts dazu gefunden…
Eines vorweg: Ich bin KEIN Programmierer, aber so den einen oder anderen Zusammenhang in Code kann ich schon verstehen und ggf. zusammenstückeln. ;)

Folgende Situation:
Für einen Templating-Job in Indesign habe ich sehr viel mit benannten Objekten auf unterschiedlichen Ebenen zu tun (Textrahmen, Grafikrahmen und auch nicht zugewiesene Inhalte). Diese haben alle bestimmte Präfixe in ihrer Benennung (Bsp. 002P_1_R01_14_blablabla) und müssen meistens nochmal umbenannt werden, wenn sich im Projekt etwas ändert (z.B. in 004L_2_R00_00_blablabla).

Wenn ich ein Objekt auf einer Ebene umbenennen möchte, klappt das leider nicht per Doppelklick, sondern ich muss draufklicken, kurz warten, bis der Name editierbar ist und dann kann ich umbenennen. Bei teilweise bis zu 80 Objekten kostet das mächtig Zeit und Nerven...

Per Javascript lassen sich Ebenen-Namen global umbenennen. Allerdings auch NUR die Ebenen-Namen, nicht Elemente, die sich auf der Ebene befinden und einen bestimmten Namen haben. Dazu habe ich folgendes Skript gefunden:
Code:
main(); 
 
function main() 
{ 
    var doc = app.documents.firstItem(), 
        _search = '', _replace = '', tg_name = '', reg_exp = null; 
        _error = []; 
     
    var input = get_input(); 
     
    reg_exp = new RegExp (input.search, 'g');; 
    for (var i = 0; i < doc.layers.length; i++) 
    { 
         
        tg_name = doc.layers.item(i).name.replace(reg_exp,  input.replace); 
        if (!doc.layers.itemByName(tg_name).isValid) 
        { 
            try 
            { 
                doc.layers.item(i).name = tg_name; 
            } 
            catch(e) 
            { 
                _error.push(doc.layers.item(i).name + '\t' + tg_name + '\t' + e.message) 
            } 
        } 
    } 
    if (_error.length > 0) 
        alert('Achtung!\n' + _error.join('\n')); 
         
    function get_input() 
    { 
        var win = null, search_field= null, replace_field = null, gs = null, gr = null, btn_gr = null, 
        search_text = '', replace_text = '';         
         
        win = new Window ('dialog', 'Ersetzen in Ebenennamen'); 
        win.alignChildren = ['left', 'top']; 
         
        gs = win.add("group"); 
        gs.add("statictext {text: 'Suchen: ' , characters: 8}"); 
        search_field = gs.add ("edittext {text: 'Ebene ', characters: 8, active: true}"); 
         
        gr = win.add("group"); 
        gr.add("statictext {text: 'Ersetzen: ' , characters: 8}"); 
        replace_field = gr.add ("edittext {text: 'xx-', characters: 8}"); 
 
        btn_gr = win.add ("group"); 
        btn_gr.alignment = "right"; 
        btn_gr.add ("button", undefined, "Cancel"); 
        btn_gr.add ("button", undefined, "OK"); 
 
        if (win.show () == 1) 
        { 
            search_text = search_field.text; 
            replace_text = replace_field.text; 
            return {search: search_text, replace: replace_text}; 
        } 
        else 
            exit (); 
    } 
}


Findet sich hier: Ebenen umbenennen mit Suchen + Ersetzen - Adobe InDesign Skriptwerkstatt - HilfDirSelbst.ch - Forum
Das funktioniert soweit auch super.

Außerdem habe ich herausgefunden, dass ich mir mit folgendem Code-Schnipsel den Namen eines ausgewählten Elements auf einer Ebene ausgeben lassen kann.:
Code:
var meinObjekt = app.selection[0].name;
alert(meinObjekt);

Was mir jetzt fehlt, ist den Inhalt(die Variable) des Code-Schnipsels in das o.g. Skript so einzuarbeiten, damit ich ebenfalls über das gesamte Dokument alle Elemente einfach umbenennen kann.

Kann mir dabei vielleicht jemand hier unter die Arme greifen? Das würde mir wirklich enorm helfen.

Vielen Dank schonmal vorab
Ralf
 
Also manchmal… Bäume und Wald und so… Der Codeschnipsel war für mein Vorhaben überflüssig…

Danke @Dormlich für den Hinweis auf den Scripting Guide. Ich hatte zwar schonmal da reingeschaut, aber wahrscheinlich noch nicht mit einem konkreten Ziel bzw. falscher Syntax-Vorstellung.

Nach viel rumprobieren hats dann doch geklappt. Es müssen im ersten Skript einfach nur alle Vorkommen von doc.layers.irgendwas in doc.pageItems.irgendwas umgeschrieben werden. Damit lassen sich dann gezielt NUR die Ebenenobjekte ansprechen. Mal sehen, ob ichs irgendwie noch gewuppt bekomme, beide Skripte in eins zusammen zu fassen…

Cheers
R
 
Mir ist nicht ganz klar, was du genau machen willst. Willst du jetzt alle Elemente nach einem bestimmten Schema umbenennen (was ja das erste Skript macht, wenn du doc.layers durch doc.pageItems ersetzt - oder willst du sowohl Ebenen als auch Elemente umbenennen?) oder willst du irgendwas mit dem aktuell markierten Element machen?
 
Also ich habe jetzt quasi zwei Skripte. Eins zum Suchen/Ersetzen in Ebenen-Namen und das zweite jetzt für ein Suchen/Ersetzen in benannten Elementen, die sich auf unterschiedlichen Ebenen befinden. Im konkreten Fall 'Templating' ein wichtiger Faktor, da hier gezielte Elementnamen mit eingefügten Variablen-Namen angesprochen werden.

Eine ideale Lösung wäre natürlich die, beim Aufruf ggf. noch zu entscheiden, ob nur Ebenen, nur Elemente oder gar beides verarbeitet werden soll. Aber mit dem aktuellen Stand spart das schon mächtig Zeit, da nutzlose Wartezeiten, bis man dazu kommt, ein Element zu benennen, komplett wegfallen.
 
Ist dein Problem damit jetzt gelöst? Wenn ja: zeig' doch bitte noch die fertigen Skripte, dann haben kommende Sucher auch was davon.

Eine ideale Lösung wäre natürlich die, beim Aufruf ggf. noch zu entscheiden, ob nur Ebenen, nur Elemente oder gar beides verarbeitet werden soll. Aber mit dem aktuellen Stand spart das schon mächtig Zeit, da nutzlose Wartezeiten, bis man dazu kommt, ein Element zu benennen, komplett wegfallen.
Dazu müsste man sowas wie ein Checkbox in das Abfragefenster einbauen und dessen Wert beim Schließen abfragen (wahrscheinlich so ähnlich wie die Werte der Eingabefelder). Wie das genau geht, muss du in dem Guide nachschlagen.
 
So… Also die Skripte funktionieren soweit schonmal recht ordentlich und erleichtern doch eine Menge an Arbeit.

Für alle, die es interessiert…

-> Ebenen-Objekt umbenennen (nach etwas Rumfragereit sogar mit Übernahme des bisherigen Namens):
Code:
#target InDesign

main();

function main() {
    
    var input = get_input();
    
    app.selection[0].name = input.oname;
    
    function get_input() {
        var win = null, oname_field= null, oname = null, btn = null, oname_text = '';
        
        item_name = app.selection[0].name;
        
        win = new Window ('dialog', 'Objekt benennen');
        win.alignChildren = ['left', 'top'];
        
        oname = win.add("group"); 
        oname.add ("statictext {text: 'Name: ' , characters: 8}"); 
        oname_field = oname.add ("edittext {text: '" + item_name + "', characters: 30, active: true}");
        
        btn = win.add ("group");
        btn.alignment = "right";
        btn.add ("button", undefined, "Cancel");
        btn.add ("button", undefined, "OK");
        
        if (win.show () == 1) {
            oname_text = oname_field.text;
            return {oname: oname_text};
            }
        else
        exit ();
        }
}

-> Suchen/Ersetzen in Ebenenobjekt-Namen:
Code:
#target InDesign

main(); 

function main() {
    var doc = app.documents.firstItem(), _search = '', _replace = '', tg_name = '', reg_exp = null;
    _error = [];
    
    var input = get_input();
    
    reg_exp = new RegExp (input.search, 'g');
    for (var i = 0; i < doc.pageItems.length; i++) {
        tg_name = doc.pageItems.item(i).name.replace(reg_exp,  input.replace);
        if (!doc.pageItems.itemByName(tg_name).isValid) {
            try {
                doc.pageItems.item(i).name = tg_name;
                }
            catch(e) {
                _error.push(doc.pageItems.item(i).name + '\t' + tg_name + '\t' + e.message)
                }
            }
        }
    if (_error.length > 0)
    alert('Achtung!\n' + _error.join('\n'));
    
    function get_input() {
        var win = null, search_field= null, replace_field = null, gs = null, gr = null, btn_gr = null, search_text = '', replace_text = '';
        
        win = new Window ('dialog', 'Suchen/Ersetzen in Objektnamen');
        win.alignChildren = ['left', 'top'];
        
        gs = win.add("group");
        gs.add("statictext {text: 'Suchen: ' , characters: 8}");
        search_field = gs.add ("edittext {text: 'ObjectName', characters: 30, active: true}");
        
        gr = win.add("group");
        gr.add("statictext {text: 'Ersetzen: ' , characters: 8}");
        replace_field = gr.add ("edittext {text: 'NewName', characters: 30}");
        
        btn_gr = win.add ("group");
        btn_gr.alignment = "right";
        btn_gr.add ("button", undefined, "Cancel");
        btn_gr.add ("button", undefined, "OK");
        
        if (win.show () == 1) {
            search_text = search_field.text;
            replace_text = replace_field.text;
            return {search: search_text, replace: replace_text};
            }
        else
        exit ();
        }
    }

und zum Schluss das ursprünglich gefundene Skript für
-> Suchen/Ersetzen in Ebenen-Namen:
Code:
#target InDesign

main(); 

function main() {
    var doc = app.documents.firstItem(), _search = '', _replace = '', tg_name = '', reg_exp = null;
    _error = [];
    
    var input = get_input();
    
    reg_exp = new RegExp (input.search, 'g');
    for (var i = 0; i < doc.layers.length; i++) {
        tg_name = doc.layers.item(i).name.replace(reg_exp,  input.replace);
        if (!doc.layers.itemByName(tg_name).isValid) {
            try {
                doc.layers.item(i).name = tg_name;
                }
            catch(e) {
                _error.push(doc.layers.item(i).name + '\t' + tg_name + '\t' + e.message)
                }
            }
        }
    if (_error.length > 0)
    alert('Achtung!\n' + _error.join('\n'));
    
    function get_input() {
        var win = null, search_field= null, replace_field = null, gs = null, gr = null, btn_gr = null, search_text = '', replace_text = '';
        
        win = new Window ('dialog', 'Suchen/Ersetzen in Ebenennamen');
        win.alignChildren = ['left', 'top'];
        
        gs = win.add("group");
        gs.add("statictext {text: 'Suchen: ' , characters: 8}");
        search_field = gs.add ("edittext {text: 'LayerName', characters: 30, active: true}");
        
        gr = win.add("group");
        gr.add("statictext {text: 'Ersetzen: ' , characters: 8}");
        replace_field = gr.add ("edittext {text: 'NewName', characters: 30}");
        
        btn_gr = win.add ("group");
        btn_gr.alignment = "right";
        btn_gr.add ("button", undefined, "Cancel");
        btn_gr.add ("button", undefined, "OK");
        
        if (win.show () == 1) {
            search_text = search_field.text;
            replace_text = replace_field.text;
            return {search: search_text, replace: replace_text};
            }
        else
        exit ();
        }
    }

Hier nochmal der Link dazu: Ebenen umbenennen mit Suchen + Ersetzen - Adobe InDesign Skriptwerkstatt - HilfDirSelbst.ch - Forum

Vielleicht kann der eine oder andere ja auch was damit anfangen. Gerne auch noch ein wenig voran treiben…

Cheers
Ralf
 
Danke für die Scripte und den Link.

Bin sicher früher oder später, wird sich jemand darüber freuen.
 
Zurück
Oben