ich bin mal wieder am Verzweifeln. Mir gelingt es nicht 2 Arrays miteinander zu vergleichen.
Mein Ziel: Wähle alle Objekte mit dem Objektformat "streichung" aus, wenn über diesem Objekt ein anderes Objekt mit Bild darüber liegt dann gruppiere die beiden und weise dem Skriptetikett der Gruppe den Inhalt des jeweiligen Objekts "streichung" zu.
Ich habe versucht mit Hilfe des Mittelpunktes des Bildes herauszufinden ob das Bild-Objekt über dem "streichung"-Objekt liegt, aber ich weiß nicht wie ich den Mittelpunkt des Bil-Objektes mit dem "streichung"-objekt abgleiche.
Es müssen doch hierbei 2 Arrays durchlaufen werden und abgeglichen werden und hier stehe ich an.
Mein Code bisher:
Im Anhang sende ich auch noch eine idml zur besseren Veranschaulichung.
Gibt es einen besseren Weg herauszufinden ob ein Objekt (sichtbar)über dem anderen liegt als zu fragen ober der Mittelpunkt des oberen Objektes innerhalb der geometricbounds des anderen Objektes liegt?
Wie kann ich diese dann gruppieren?
Ps. Vielleicht muss ich die Textcontainer gar nicht über die stories angreifen und könnte mir so eine Schleife sparen?
Ich will dich ja nicht desillusionieren, aber eine 15cm lange, horizontale Linie kann ein 7cm breites Objekt komplett überdecken, ohne dass der Linienmittelpunkt innerhalb des Objekts liegt.
... in Sachen Arrays kann ich dir erst recht nicht helfen ;-)
danke für deine nochmalige Antwort. Aber deinen Code verstehe ich leider gar nicht.
Ich möchte ja nicht Objekte von Hand selektieren und dann vergleichen sondern das soll automatisch geschehen. Ich hatte dafür ja auch schon die For-Schleifen in denen alle Objekte besucht werden.
Mir ging es darum alle Objekte die das Objektformat "streichung" haben mit den Objekten Wischer bzw. die Position der Wischer mit denen der Objekte "streichung" abzugleichen.
Sprich: Wenn der Mittelpunkt des aktuellen Objektes "Wischer" innerhalb der geometricBounds des aktuellen Objektes "streichung" liegt, (also optisch darüber liegt) dann sollen diese beiden Objekte gruppiert werden und der Inhalt des Skriptetiketts der Streichung in das Skriptetikett der erstellten Gruppe kopiert werden.
Und dieses Verhalten müsste doch mit 3 for-Schleifen zu bewältigen sein oder sehe ich das falsch?
Warum rundest du die geometricBounds und warum multiplizierst du alle mit 1000?? Außerdem werden bei deinem Skript Objekte gelöscht.
Tut mir leid aber da blicke ich nicht durch.
Ich wollte ja den Fehler in meinem Skript finden und nicht ein neues für mich nicht nachvollziehbares Skript bekommen.
Ich hoffe du bist nicht sauer da du dir soviel Mühe gegeben hast mit deinem Skript, aber leider hilft mir das mit meinem Skript nicht weiter.
Danke trotzdem für deine Hilfe und nicht böse sein. :-)
Lg faxinger
Auswahl und Gruppierung von übereinanderliegenden Objekten
Ja, es kann generell vorkommen dass das darüberliegende Objekt aufgrund der Größe seinen Mittelpunkt nicht innerhalb der geometricBounds des darunterliegenden Objektes hat. Aber nicht in meinem Fall. Hier ist es IMMER so dass das darüberliegende Objekt "Wischer" mehr oder weniger die selbe Größe wie das darunterliegende Objekt"streichung" hat. Daher auch mein Ansatz. In meiner angehängten idml ist das auch ersichtlich.
Lg faxinger
Auswahl und Gruppierung von übereinanderliegenden Objekten
1. Du erzeugst eine neue Datei, 2. Du erzeugst manuell zwei PageItems, von denen eins innerhalb der Umrisse des anderen liegt. 3. Du kopierst meinen Code in das ESTK und führst das Skript im Einzelschrittverfahren aus. Breakpoint auf Funktion main
Dann siehst Du folgendes:
1. Das Skript speichert die GeometricBounds des ersten Rechtecks nach gBFirst, die GeometricBounds des zweiten Rechtecks nach gBSecond.
Erzeugt aus den beiden PageItems eines neues PageItem, das Größe und Position des inneren PageItems hat. Du speicherst auch die GeometricBounds des neuen Objektes nach pIGB.
Dann vergleichst Du die GeometricBounds der ursprünglichen PageItems mit dem neu Erzeugten.
Das Array das gleich dem Array des neu erzeugten Pageitems ist, gehört zu PageItem, das innerhalb des anderen liegt.
Überdecken sich die PageItems teilweise, ist kein Arraypaar gleich.
Und so, wie ich Dich verstanden habe, ist es dass, was Du wolltest.
Für den Vergleich kannst Du selbstverständlich auch gefundene PageItems verwenden.
Da die ursprünglichen Objekte zerstört werden, solltest Du temporär Kopien erzeugen.
Auch noch wichtig: Ich runde die Werte, weil man mit Gleitkommazahlen keinen Vergleich vornehmen kann, je nach Rechenverfahren können solche Werte minimal voneinander abweichen.
Ich sortiere die GeometricBounds-Werte, damite alle Werte vergleichbar in der gleichen Reihenfolge vorliegen.
Um mein Skript vollständig zu verstehen, solltest Du es mit unterschiedlichen Pageitems und unterschiedlichen Positionen ausprobieren.
Danach solltest Du verstehen können, wie Du einem Vorschlag in Dein Skript einbauen kannst.
ich würde das Ganze nochmal von vorne durchdenken und das Ganze Seite für Seite durchgehen. Nützt ja nix, wenn wenn der Mittelpunkt vom Wischer auf Seite 3 innerhalb der Bounds vom Preis auf Seite 7 liegt.
Schritt 1: Alle Seiten durchgehen mit for-Schleife. (app.activeDocument.pages)
Schritt 2: Auf jeder Seite prüfen, ob es einen TextFrame mit Objektformat "streichung" gibt.
Schritt 3: falls ja, geometricBounds des Rahmens merken und alle Wischer auf der Seite suchen.
Schritt 4: für jeden Wischer den Mittelpunkt berechnen (haste ja schon) und prüfen ob der Mittelpunkt innerhalb der geometricBounds des Textrahmens liegt. Das tut er wenn die x-Koordinate des Mittelpunkts größer als die linke und kleiner als die rechte x-Koordinatee des Rahmens ist, und wenn die y-Koordinate des Mittelpunktes größer als die obere und kleiner als die untere y-Koordinate des Rahmens ist. (Gibt wahrscheinlich eine lustige if-Abfrage).
Schritt 5: wenn alles zutrifft, kannst du die beiden Objekte (die du dir vorher in einer Variablen gemerkt hast) gruppieren: app.activeDocument.pages[i].groups.add([deineGemerkteTextbox, deinGemerkterWischer]);
Ich hoffe, das klingt einigermaßen verständlich... nach meiner Denke könnte das so klappen :-)
Viel Spaß beim Tüfteln... Grüße Sascha
(Dieser Beitrag wurde von Martin Fischer am 10. Jul 2019, 09:04 geändert)
Auswahl und Gruppierung von übereinanderliegenden Objekten
danke erstmal für deine Antwort und das gedankliche Durchgehen der Vorgangsweise.
Aber diesen Satz verstehe ich nicht: "Nützt ja nix, wenn wenn der Mittelpunkt vom Wischer auf Seite 3 innerhalb der Bounds vom Preis auf Seite 7 liegt." Wie soll das gehen?
Zu Schritt 1: Generell ist das Skript für ID-Dokumente gedacht, die nur aus einer Einzelseite bzw. einer Doppelseite bestehen. Also mehr als 2 Seiten gibt es in dem Dokument gar nicht.
Um hier alle Koordinaten richtig zu bekommen, kann ich ja das Lineal auf Druckbogen statt auf pages ausrichten.
Schritt 2: Auf jeder Seite prüfen, ob es einen TextFrame mit Objektformat "streichung" gibt.
Ja bin ich dabei, da hast du recht - kann ich auch.
Schritt3: ok.
Schritt 4: die Wischer sind sowieso immer kleiner (mit immer ist gemeint für den Zweck für den das Skript gedacht ist) als die "streichung" - somit glaube ich, dass es genügt nur die x-Koordinate abzufragen. Die Y-Koordinate ist meines Erachtens gar nicht notwendig und führt nur zu unübersichtlicherem Code.
Schritt 5: genau da scheiterte ich.
Danke LG faxinger
Auswahl und Gruppierung von übereinanderliegenden Objekten
ok, ich gebe zu: ich hatte mir dein Skript im Detail nicht richtig angeschaut, und vermutet, dass der Ansatz falsch war, aber scheinbar funktioniert dein Skript bis aufs Gruppieren. Hier musst du von der übergeordneten Seite, Spread oder vom Dokument ausgehen. Also nicht:
Sondern:
Wenn ich das in deinem Skript anpasse, werden die Elemente gruppiert, allerdings gibt es eine Fehlermeldung ("ungültiger Parameter"), den ich nicht ganz verstehe...
Aber vielleicht hat da noch wer eine Idee...
Grüße Sascha
(Dieser Beitrag wurde von Medienoperator am 12. Jul 2019, 12:08 geändert)
Auswahl und Gruppierung von übereinanderliegenden Objekten
Hallo, zugegeben, ich habe mir jetzt nicht alle Posts hier durchgelesen, aber wenn Du rausfinden möchtest, ob zwei PageItems übereinander liegen (vorausgesetzt sie sind auf der selben Seite), dann kannst Du dies mit diesem kleinen Skript machen...
Gruß, Marc ------------------------------------------
vielen vielen Dank. Dein Skript funktioniert wunderbar, genauso wie ich es haben wollte. Das ist eine sehr elegante Lösung. Auf die Funktion mit BoundsIntersect in der Art und Weise wäre ich nie gekommen.
Eines hätte ich noch gerne: Das Skriptetikett des jeweiligen Textrahmens mit Objektformat streichung sollte als Etikett für die jeweilige Gruppe eingesetzt werden.
Also: der jeweilig gefundene Textrahmen mit Objektformat "streichung" hat ein label und dessen Inhalt soll auch als Label der durch das Skript entstehenden Gruppe dienen.
Ich hoffe ich habs nicht zu verwirrend beschrieben?
Mir ist nicht klar an welchem Punkt im Skript das eingesetzt gehört.
Auswahl und Gruppierung von übereinanderliegenden Objekten