[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

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

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

30. Sep 2011, 17:14
Beitrag # 1 von 19
Bewertung:
(8985 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi zusammen,

gleich noch eine Frage im Zusammenhang mit der Bibliothek.

Per Script wird aus dem aktuellen Seitenaufbau ein neues Element in der Bibliothek erzeugt.

Code
lib.store(spread.pageItems.everyItem().getElements()); 


Der Name dieses Elements setzt sich aus bestimmten Bestandteilen der Seite zusammen und wird dynamisch ermittelt.

Da ich für ein weiteres Script eindeutige Namen benötige muss ich prüfen, ob es bereits ein Element mit dem aktuellen Namen gibt.
Wenn ja, dann wird hinten am Ende des Namens eine laufende Nummer hochgezählt.

Aktuell habe ich zwar eine funktionsfähige, aber sehr langsame Lösung da bereits 700 Elemente in der Bibliothek gespeichert sind:


Code
             
//Templatename ohne laufende Nummer am Ende
var Templatename = images+"i "+vertical+"v "+horizontal+"h "+square+"s";

// Prüfen, ob ein Template mit diesem Namen in der ProduktionsBibliothek schon exisitert.
// Wenn nein, dann wird die laufende Nr. 1 vergeben
// Wenn es schon Templates mit gleicher Aufteilung gibt, dann wird die höchste laufende Nummer ermittelt und mit +1 vergeben.

counter=0;
var Templatename_full = Templatename;

do
{
counter+=1
Templatename_full = Templatename+" "+counter
var Templatename_vorhanden = lib_prod.assets.itemByName(Templatename_full).isValid
}
while (Templatename_vorhanden == true);


Ich schleife also jedesmal aufs neue durch die Bibliothek durch. Vielleicht hat jemand einen spontanen Einfall, wie man das besser/schneller lösen kann.

Viele Grüße
Jürgen
X

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

Martin Fischer
  
Beiträge gesamt: 12779

30. Sep 2011, 17:25
Beitrag # 2 von 19
Beitrag ID: #481406
Bewertung:
(8981 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Prüfe (ab CS4) mit isValid.
(returns true if the object specifier resolves to valid objects)

Code
var bibliotheksobjekt_vorhanden = lib.assets.itemByName('mein Name').isValid; 



als Antwort auf: [#481402]
(Dieser Beitrag wurde von Martin Fischer am 30. Sep 2011, 17:26 geändert)

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

30. Sep 2011, 17:35
Beitrag # 3 von 19
Beitrag ID: #481411
Bewertung:
(8974 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Prüfe (ab CS4) mit isValid.
(returns true if the object specifier resolves to valid objects)

Code
var bibliotheksobjekt_vorhanden = lib.assets.itemByName('mein Name').isValid; 



Ich sehe den Unterschied zu meiner Lösung gerade nicht.


als Antwort auf: [#481406]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

Martin Fischer
  
Beiträge gesamt: 12779

30. Sep 2011, 17:43
Beitrag # 4 von 19
Beitrag ID: #481414
Bewertung:
(8969 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vergiss meinen Hinweis.

War in Eile und mit der Antwort zu schnell.
Hatte dabei versäumt, Deinen Code aufmerksam zu lesen.

Jetzt bin ich weg ...


als Antwort auf: [#481411]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

30. Sep 2011, 17:45
Beitrag # 5 von 19
Beitrag ID: #481416
Bewertung:
(8964 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
trotzdem Danke:)


als Antwort auf: [#481414]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

Martin Fischer
  
Beiträge gesamt: 12779

30. Sep 2011, 19:11
Beitrag # 6 von 19
Beitrag ID: #481424
Bewertung:
(8937 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kurz zwischenrein als Idee:

Du könntest eine Liste mit Namen von Assets ermitteln (und ggf. zur späteren Verwendung extern oder in einem KeyLabel sichern) und mit einem regulären Ausdruck den angepeilten Namen mit all seinen möglicherweise vorhandenen Nummern ansprechen und darüber die höchste Nummer aussieben.

Käme auf einen Versuch an, ob das zu einer Beschleunigung führt.

Alternativ die Namen und ihre Nummern am Anfang des Skripts in einem assoziativen Array sichern und im Verlauf des Skripts darauf zurückgreifen.

Wichtig ist, dass Du von der Schleife, die permanent für die vielen Assets aufgerufen wird, wegkommst.


als Antwort auf: [#481416]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

1. Okt 2011, 11:47
Beitrag # 7 von 19
Beitrag ID: #481455
Bewertung:
(8877 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Kurz zwischenrein als Idee:

Du könntest eine Liste mit Namen von Assets ermitteln (und ggf. zur späteren Verwendung extern oder in einem KeyLabel sichern) und mit einem regulären Ausdruck den angepeilten Namen mit all seinen möglicherweise vorhandenen Nummern ansprechen und darüber die höchste Nummer aussieben.

Käme auf einen Versuch an, ob das zu einer Beschleunigung führt.

Alternativ die Namen und ihre Nummern am Anfang des Skripts in einem assoziativen Array sichern und im Verlauf des Skripts darauf zurückgreifen.

Wichtig ist, dass Du von der Schleife, die permanent für die vielen Assets aufgerufen wird, wegkommst.



Kann man bei der Abfrage der Bibliothek mit regulären Ausdrucken für den Namen des Assets arbeiten?

Also: Gibt mir alle Elemente der Bibliothek mit "01i 00v 00h 01s" anfangen und dahinter noch eine Zahl stehen haben?

Wenn ja, dann hätte ich mit einer Abfrage ein Array mit allen passenden Elementen und könnte über die Länge des Arrays die Anzahl und damit den höchten Wert ermitteln.


als Antwort auf: [#481424]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

Martin Fischer
  
Beiträge gesamt: 12779

1. Okt 2011, 16:52
Beitrag # 8 von 19
Beitrag ID: #481462
Bewertung:
(8854 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

eine Idee:

1. ermittle alle Namen der Bibliotheksobjekte und wandle diesen in einen String um;
2. definiere einen regulären Ausdruck, der die Zahlen hinter einem bestimmten String ermittelt (lookbehind);
3. wende diesen regulären Ausdruck über den match()-Befehl am String an – und schon sollten die Ziffern, die hinter dem Basisstring stecken, in einem Array zu greifen sein.

Etwa so:

Gegeben sind Bibliotheksobjekte mit folgenden Namen:
01i 00v 00h 01s 1
01i 00v 00h 01s 2
01i 00v 00h 01s 3
01i 00v 00h 01s 4
01i 00v 00h 01t 1
01i 00v 00h 01t 2
01i 00v 00h 01t 3
01i 00v 00h 01t 4


Code
const d = app.activeDocument; 
var lib = app.libraries.itemByName('Bibliothek.indl');
var asset_names = lib.assets.everyItem().name.join('\r'); // String mit allen Namen der Bibliotheksobjekte
var reg_exp = new RegExp('(?<=01i 00v 00h 01s )\\d+','g');
var numbers = asset_names.match(reg_exp);


Allerdings unterstützt JavaScript keine regexp lookbehind Syntax.

Deswegen musst Du Dir was konstruieren.
Nimm die Zeile
Code
var reg_exp = new RegExp('01i 00v 00h 01s \\d+','g'); 


Und lösche hinterher mit dem replace()-Befehl den Vorspan ('01i 00v 00h 01s ').

Muss leider schon wieder dringend weg, so dass ich das jetzt nicht weiter ausführen kann.


als Antwort auf: [#481455]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

3. Okt 2011, 18:20
Beitrag # 9 von 19
Beitrag ID: #481522
Bewertung:
(8773 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

hier gibt es meinen Vorschlag, ist etwas umfangreicher geworden, aber schneller:
http://www.weepee.de/...ic.php?f=11&t=25


als Antwort auf: [#481402]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

3. Okt 2011, 21:13
Beitrag # 10 von 19
Beitrag ID: #481523
Bewertung:
(8740 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ WernerPerplies ] Hallo Jürgen,

hier gibt es meinen Vorschlag, ist etwas umfangreicher geworden, aber schneller:
http://www.weepee.de/...ic.php?f=11&t=25


RESPEKT:)
Ich habe es noch nicht getestet, aber die Analyse war schonmal grandios.


als Antwort auf: [#481522]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

5. Okt 2011, 08:09
Beitrag # 11 von 19
Beitrag ID: #481642
Bewertung:
(8669 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

jetzt würde mich natürlich auch das Ergebnis Deines Tests interessieren.

Wäre diese Lösung für Dich so einsetzbar?

Auch bei 2600 Einträgen in der Lib liegt die Suchzeit mit meiner Methode bei mir unter einer Millisekunde, während ich die Suche mit Deiner Methode nach einigen Minuten abgebrochen habe.


als Antwort auf: [#481523]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

6. Okt 2011, 22:52
Beitrag # 12 von 19
Beitrag ID: #481802
Bewertung:
(8597 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe nun noch eine etwas andere Variante eingesetzt:

Code
    var lib = app.libraries.item("Templates.indl"); 
var prod_namen = lib.assets.everyItem().getElements();

Templatename = "04i 02v 01h 01s" //ohne lfd. Nummer

var item_name = Templatename;
var assets = new Array();

for (var n = 0; n < prod_namen.length; n++) {
if (prod_namen[n].name.search( item_name ) != -1) {
assets.push( prod_namen[n] );
}
}

var item_anzahl = assets.length;

counter=item_anzahl+1; //Dies ist meine laufende Nummer die ich anhängen muss.



als Antwort auf: [#481642]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

-hans-
Beiträge gesamt: 748

7. Okt 2011, 00:46
Beitrag # 13 von 19
Beitrag ID: #481806
Bewertung: ||
(8582 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

dann vllt. lieber match verwenden? So kannst Du die ganze Liste einfach in einen String umbimsen und mit RegEx durchforsten ... und musst nicht jedes ArrayObjekt einzeln abfragen.

Hab's nicht verglichen, aber vom Ablauf erscheint es mir schneller ...

In etwa so:
Code
var lib = app.libraries.item("contACt_bib.indl");  
var prod_namen = lib.assets.everyItem().getElements();
var assets = new Array();

for (var n = 0; n < prod_namen.length; n++) {

assets.push( prod_namen[n].name );
}

var Templatename = "3sp_hdl24"
var assets = assets.toString( );
var treffer = assets.match( Templatename + "([0-9]+),")
var Templatename = "3sp_hdl24" + (treffer.length + 1).toString()
alert(Templatename)


Lieben Gruß

Hans-Gerd Claßen


als Antwort auf: [#481802]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

7. Okt 2011, 08:25
Beitrag # 14 von 19
Beitrag ID: #481809
Bewertung:
(8547 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

meine Antwort gibt's hier:
http://www.weepee.de/...mp;t=25&p=32#p32


als Antwort auf: [#481802]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

7. Okt 2011, 08:30
Beitrag # 15 von 19
Beitrag ID: #481810
Bewertung:
(8547 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

Vergleich es mal ;-)

Ich denke, Dein Vorschlag muss langsamer sein:

1. reguläre Ausdrücke sind langsamer als der direkte Stringvergleich
2. Stringoperationen sind langsam, speziell Stringadditionen (concats)

Aber ich lasse mich gerne eines Besseren belehren.


als Antwort auf: [#481806]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

Martin Fischer
  
Beiträge gesamt: 12779

7. Okt 2011, 09:05
Beitrag # 16 von 19
Beitrag ID: #481814
Bewertung:
(1694 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: meine Antwort gibt's hier:


Muss das sein, dass die Antwort außerhalb des Forums, in dem die eigentliche inhaltliche Diskussion stattfindet, zu suchen ist?

Man stelle sich vor, alle Teilnehmenden einer Diskussion pflegten ihren eigenen Blog und würden hier im Diskussionsfaden lediglich auf die Antwort in ihrem Blog hinweisen.

Wäre es nicht einfacher und lesefreundlicher, im persönlichen Blog auf die Diskussion hinzuweisen und die Diskussion intern an einem Strang fortzuführen, anstatt durch wiederholte Umleitungen zu zerhacken?
Man könnte am Ende das Ergebnis bzw. die erhaltenswerten ausgearbeiteten Lösungen aus der Diskussion immer noch in seinem Blog zu Archivzwecken zusammenfassen.

Wer die Diskussion grundsätzlich lieber an einem anderen Ort führen möchte, der möge dies tun, aber dann auch konsequenterweise dort verbleiben. Der ständige Wechsel erschwert es für die übrigen Teilnehmenden und Leser, den Überblick zu behalten.

Außerdem finde ich's hier gemütlicher. ;-)


als Antwort auf: [#481809]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

7. Okt 2011, 09:13
Beitrag # 17 von 19
Beitrag ID: #481815
Bewertung:
(1689 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

Antworten gebe ich hier, Abhandlungen über Techniken gebe ich bei mir, wenn das nicht gewünscht ist, lasse ich es.

Zitat Außerdem finde ich's hier gemütlicher. ;-)



Das ist sicherlich Geschmackssache.

Ich ziehe bei mir die größere Gestaltungsfreiheit (z. B. die direkte Einbindung von Screenshots) und die kostenlose Uploadmöglichkeit vor.

Aber das muss jeder Teilnehmer für sich entscheiden.


als Antwort auf: [#481814]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

JuMayr
Beiträge gesamt: 96

7. Okt 2011, 09:41
Beitrag # 18 von 19
Beitrag ID: #481820
Bewertung:
(1678 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Herzlichen Dank für die konstruktiven Gedanken.
Der Unterschied zwischen sortiertem und unsortiertem Array (bei mir ca. 1000 Einträge) bewegt sich im niedrigen Millisekundenbereich und ist somit zu vernachlässigen.

Bzgl. der Antwort im externen Blog:
Als Fragestellender habe ich damit kein Problem bzw. finde es durch die Verdeutlichung mit Screenshots sogar gut.
Wichtig ist natürlich, dass die externen Links auch in Zukunft erhalten bleiben und nicht irgendwann im Nirwana enden. just my 2 cent


als Antwort auf: [#481815]

Bibliothek (library) - Prüfen, ob es ein bestimmtes Element schon gibt.

WernerPerplies
Beiträge gesamt: 2760

7. Okt 2011, 09:45
Beitrag # 19 von 19
Beitrag ID: #481821
Bewertung:
(1677 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

Zitat Der Unterschied zwischen sortiertem und unsortiertem Array (bei mir ca. 1000 Einträge) bewegt sich im niedrigen Millisekundenbereich und ist somit zu vernachlässigen.



;-)
Ja, das meinte ich:
Zitat Dies dürfte aber bei der geringen Anzahl der Elemente, die vernünftigerweise in einer Library vorhanden sind (auch einige tausend sind wenige!) keine große Rolle spielen.


Zitat finde es durch die Verdeutlichung mit Screenshots sogar gut.

Finde ich auch!;-)

Zitat Wichtig ist natürlich, dass die externen Links auch in Zukunft erhalten bleiben und nicht irgendwann im Nirwana enden. just my 2 cent

Ich werde mir da alle Mühe geben, versprochen!


als Antwort auf: [#481820]
X