[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:
(8430 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: 12670

30. Sep 2011, 17:25
Beitrag # 2 von 19
Beitrag ID: #481406
Bewertung:
(8426 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:
(8419 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: 12670

30. Sep 2011, 17:43
Beitrag # 4 von 19
Beitrag ID: #481414
Bewertung:
(8414 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:
(8409 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: 12670

30. Sep 2011, 19:11
Beitrag # 6 von 19
Beitrag ID: #481424
Bewertung:
(8382 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:
(8322 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: 12670

1. Okt 2011, 16:52
Beitrag # 8 von 19
Beitrag ID: #481462
Bewertung:
(8299 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: 2693

3. Okt 2011, 18:20
Beitrag # 9 von 19
Beitrag ID: #481522
Bewertung:
(8218 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:
(8185 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: 2693

5. Okt 2011, 08:09
Beitrag # 11 von 19
Beitrag ID: #481642
Bewertung:
(8114 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:
(8042 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: ||
(8027 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: 2693

7. Okt 2011, 08:25
Beitrag # 14 von 19
Beitrag ID: #481809
Bewertung:
(7992 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: 2693

7. Okt 2011, 08:30
Beitrag # 15 von 19
Beitrag ID: #481810
Bewertung:
(7992 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]
X

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/