[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:
(9115 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: 12783

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

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

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

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

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

5. Okt 2011, 08:09
Beitrag # 11 von 19
Beitrag ID: #481642
Bewertung:
(8799 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:
(8727 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: ||
(8712 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: 2763

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

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

Aktuell

PDF / Print
pitstopPro_300

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
14.05.2024

Online
Dienstag, 14. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Prozessoptimierung ist ein Teamsport! Keine Software und keine Maschine allein kann Ihnen helfen, die Effizienzpotenziale Ihres Betriebes maximal auszuschöpfen. Von der Auftragsannahme über die Vorstufe und den Druck bis hin zur Weiterverarbeitung – alles muss optimal ineinandergreifen. Apropos Weiterverarbeitung – in vielen Druckbetrieben fristet sie in Sachen Prozessoptimierung immer noch ein Schattendasein. Dabei liegen hier mittlerweile die größten Einsparpotenziale! In einem Webinar von Horizon und Impressed erfahren Sie, wie Sie diese Einsparungen realisieren können. Horizon, bekannt für innovative Lösungen in der Druckweiterverarbeitung, bietet mit iCE LiNK eine Workflowlösung für die Weiterverarbeitung. iCE LiNK überwacht, visualisiert und analysiert Produktionsabläufe und unterstützt bei der Wartung – damit immer alles reibungslos läuft. Den gleichen Anspruch hat der von Impressed entwickelte Impressed Workflow Server – er ist die smarte PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt. Im Webinar zeigen Ihnen die Experten von Horizon und Impressed, wie beide Lösungen im Team die Effizienz und Produktivität Ihres Betriebes steigern können. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Ja

Organisator: Impressed / Horizon

https://www.impressed.de/schulung.php?c=sDetail&sid=327

Einsparpotenziale in der Weiterverarbeitung
Veranstaltungen
16.05.2024

Online
Donnerstag, 16. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Günther Business Solutions und Impressed treten in einem Webinar den Gegenbeweis an. Experten beider Unternehmen zeigen, wie Großformatdrucker vom Einsatz zweier bewährter Lösungen profitieren können: • von advanter print+sign von Günther Business Solutions, dem ERP-System für den Großformatdruck, dass alle Phasen der Wertschöpfung im Large Format Printing abdeckt • von Impressed Workflow Server, der smarten PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt Über die Kombination beider Lösungen können Großformatdrucker ihre Prozesse mit modernen Workflows Schritt für Schritt automatisieren – und so zügig deutliche Zeit- und Kosteneinsparungen realisieren. Das Webinar sollten Sie sich nicht entgehen lassen – damit Sie keine Effizienzpotenziale mehr liegen lassen. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Nein

Organisator: Impressed / Günther Business Solutions

https://www.impressed.de/schulung.php?c=sDetail&sid=326

Und es geht doch: Automatisierung im Großformatdruck!