[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Auswahl und Gruppierung von übereinanderliegenden Objekten

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

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

23. Jun 2019, 15:10
Beitrag # 1 von 21
Bewertung:
(6997 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo ihr lieben Skriptprofis,

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:

Code
var _dok = app.documents[0];  
var allGraphics = _dok.allGraphics;

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

if(allGraphics[n].itemLink.name =="Wischer.ai")

{
var _wisch = allGraphics[n].parent;
var _wischgb = allGraphics[n].parent.geometricBounds;
var _wischhalfmiddle = ((_wischgb[3]-_wischgb[1])/2);
var _wischmiddle = _wischgb[1] + _wischhalfmiddle;
}
var nameOfObjectStyle = "streichung";
var allStories = _dok.stories.everyItem().getElements();
var objectStyle = _dok.objectStyles.itemByName(nameOfObjectStyle);

for(var k=0;k<allStories.length;k++)
{
var textContainers = allStories[k].textContainers;

// Loop all text containers of a particular story:
for(var c=0;c<textContainers.length;c++)
{
var _spgb = textContainers[c].geometricBounds;
if (_wischmiddle > _spgb[1] && _wischmiddle < _spgb[3])
{groups.add([_wisch, textContainers[c]])}
}
}
}



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?

Vielen Dank
LG
faxinger

(Dieser Beitrag wurde von Urs Gamper am 24. Jun 2019, 08:56 geändert)

Anhang:
gruppierung_test.idml (99.0 KB)
X

Auswahl und Gruppierung von übereinanderliegenden Objekten

WernerPerplies
Beiträge gesamt: 2760

23. Jun 2019, 15:59
Beitrag # 2 von 21
Beitrag ID: #570815
Bewertung:
(6979 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

ich weiß nicht, ob meine Antwort Dein Problem löst, weil ich nur einen Punkt beantworte:

Zitat Mir gelingt es nicht 2 Arrays miteinander zu vergleichen.


Diese Routine vergleicht zwei Arrays, die keine verschachtelten Elemente enthalten, die aufeinander verweisen.

Code
// DESCRIPTION compare an array 
// Dateiname: wpsPrototypesArrayCompare.jsx
// © 2018 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// created: Wed May 16 2018 08:59:36 GMT+0200
// [lastFileProps:({time:"1538052559000", size:2005, checkSum:0, clone:(function anonymous() { [compiled code] } )})]
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/Array/Prototypes/wpsPrototypesArrayCompare.jsx";
// [end of header]

// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsErrorClass.jsx";

/*Array*/Array.prototype.compare = function(/*Array*/arrayTc)
{
var /*Boolean*/result = true;
try
{
if ((typeof(arrayTc) == "object") && (arrayTc.constructor.name == "Array"))
{
if (this.length == arrayTc.length)
{
for (var i = 0; i < this.length; i++)
{
if (typeof(this[i]) != typeof(arrayTc[i]))
{
result = false;
break;
}
if ((typeof(arrayTc[i]) == "object") && (arrayTc[i].constructor.name == "Array"))
{
if (!this[i].compare(arrayTc[i]))
{
result = false;
break;
}
}
else if (this[i] != arrayTc[i])
{
result = false;
break;
}
}
}
}
}
catch (error)
{
// wpsHandleError(error, $.stack, _thisClass.name + "." + "_checkBookState", _thisClass)
alert(error.message);
}
return result;
}

alert([1,[1234],2].compare([1,[1234],2]));
alert([1,[124],2].compare([1,[1234],2]));


Allgemeiner geht es hiermit:
Objekte vergleichen - WpsCompareObjects
aber das ist dann schon richtig komplex.


als Antwort auf: [#570814]
(Dieser Beitrag wurde von Urs Gamper am 24. Jun 2019, 08:56 geändert)

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

24. Jun 2019, 08:45
Beitrag # 3 von 21
Beitrag ID: #570833
Bewertung:
(6920 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

danke für dir schnelle Antwort. Aber leider löst dein Vorschlag nicht mein Problem.


LG
faxinger


als Antwort auf: [#570815]
(Dieser Beitrag wurde von Urs Gamper am 24. Jun 2019, 08:56 geändert)

Auswahl und Gruppierung von übereinanderliegenden Objekten

WernerPerplies
Beiträge gesamt: 2760

24. Jun 2019, 10:40
Beitrag # 4 von 21
Beitrag ID: #570835
Bewertung:
(6883 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

es war auch nur eine Antwort zum Thema:
"Arrays vergleichen". (-:


als Antwort auf: [#570833]

Auswahl und Gruppierung von übereinanderliegenden Objekten

Thomas Richard
Beiträge gesamt: 19327

24. Jun 2019, 22:25
Beitrag # 5 von 21
Beitrag ID: #570841
Bewertung:
(6820 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: 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?


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 ;-)


als Antwort auf: [#570814]

Auswahl und Gruppierung von übereinanderliegenden Objekten

WernerPerplies
Beiträge gesamt: 2760

25. Jun 2019, 06:03
Beitrag # 6 von 21
Beitrag ID: #570842
Bewertung:
(6763 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,

schau Dir das mal an:
Code
    // DESCRIPTION compare an array  
// Dateiname: wpsPrototypesArrayCompare.jsx
// © 2018 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// created: Wed May 16 2018 08:59:36 GMT+0200
// [lastFileProps:({time:"1538052559000", size:2005, checkSum:0, clone:(function anonymous() { [compiled code] } )})]
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/Array/Prototypes/wpsPrototypesArrayCompare.jsx";
// [end of header]

// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsErrorClass.jsx";

/*Array*/Array.prototype.compare = function(/*Array*/arrayTc)
{
var /*Boolean*/result = true;
try
{
if ((typeof(arrayTc) == "object") && (arrayTc.constructor.name == "Array"))
{
if (this.length == arrayTc.length)
{
for (var i = 0; i < this.length; i++)
{
if (typeof(this[i]) != typeof(arrayTc[i]))
{
result = false;
break;
}
if ((typeof(arrayTc[i]) == "object") && (arrayTc[i].constructor.name == "Array"))
{
if (!this[i].compare(arrayTc[i]))
{
result = false;
break;
}
}
else if (this[i] != arrayTc[i])
{
result = false;
break;
}
}
}
}
}
catch (error)
{
// wpsHandleError(error, $.stack, _thisClass.name + "." + "_checkBookState", _thisClass)
alert(error.message);
}
return result;
}
/*Boolean*/function sortNumber(a, b) {
return a - b;
}

// zwei Rechtecke selektiert.
main ();

/*Void*/function main(){
var /*Array*/gBFirst = [], /*Array*/gBSecond = [], /*Array*/pIgB = [],
/*PageItem*/pI;

gBFirst = [Math.round(app.selection[0].geometricBounds[0]*1000),
Math.round(app.selection[0].geometricBounds[1]*1000),
Math.round(app.selection[0].geometricBounds[2]*1000),
Math.round(app.selection[0].geometricBounds[3]*1000)].sort(sortNumber);
gBSecond = [Math.round(app.selection[1].geometricBounds[1]*1000),
Math.round(app.selection[1].geometricBounds[1]*1000),
Math.round(app.selection[1].geometricBounds[2]*1000),
Math.round(app.selection[1].geometricBounds[3]*1000)].sort(sortNumber);
pI = app.selection[0].intersectPath(app.selection);
pIgB = [Math.round(pI.geometricBounds[0]*1000),
Math.round(pI.geometricBounds[1]*1000),
Math.round(pI.geometricBounds[2]*1000),
Math.round(pI.geometricBounds[3]*1000)].sort(sortNumber);
alert(pIgB.compare(gBFirst));
alert(pIgB.compare(gBSecond));
}



als Antwort auf: [#570833]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

25. Jun 2019, 17:06
Beitrag # 7 von 21
Beitrag ID: #570853
Bewertung:
(6704 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

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


als Antwort auf: [#570842]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

25. Jun 2019, 17:18
Beitrag # 8 von 21
Beitrag ID: #570854
Bewertung:
(6689 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

danke für deine Antwort.

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


als Antwort auf: [#570841]

Auswahl und Gruppierung von übereinanderliegenden Objekten

WernerPerplies
Beiträge gesamt: 2760

25. Jun 2019, 17:37
Beitrag # 9 von 21
Beitrag ID: #570855
Bewertung:
(6682 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,

Zitat Aber deinen Code verstehe ich leider gar nicht.


Wie wäre es, wenn Du es einfach mal versuchst?

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.

Zitat pI = app.selection[0].intersectPath(app.selection);

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.


als Antwort auf: [#570853]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

3. Jul 2019, 09:04
Beitrag # 10 von 21
Beitrag ID: #570916
Bewertung:
(4724 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

danke nochmal für deine Erklärungen. Trotzdem möchte ich anmerken, dass das eigentliche Ziel war den Fehler in meinem Skript aufzuspüren.

Mir ging es darum herauszufinden wo es bei meinem Skript hakt.

LG
faxinger


als Antwort auf: [#570855]

Auswahl und Gruppierung von übereinanderliegenden Objekten

WernerPerplies
Beiträge gesamt: 2760

3. Jul 2019, 09:27
Beitrag # 11 von 21
Beitrag ID: #570917
Bewertung:
(4715 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Faxinger,

Zitat danke nochmal für deine Erklärungen. Trotzdem möchte ich anmerken, dass das eigentliche Ziel war den Fehler in meinem Skript aufzuspüren.

Mir ging es darum herauszufinden wo es bei meinem Skript hakt.


Dann tut es mir leid, da habe ich genug mit meinen eigenen Skripten zu tun. :-)

Ich dachte, es ginge um eine Lösung.

Und so, wie ich Deine Aufgabe verstanden habe, sollte mein Skript einen möglichen Lösungsweg aufzeigen.

Viel Erfolg weiterhin.


als Antwort auf: [#570916]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

3. Jul 2019, 09:41
Beitrag # 12 von 21
Beitrag ID: #570918
Bewertung:
(4708 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

kein Problem, danke für deinen Input.

LG
faxinger


als Antwort auf: [#570917]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

9. Jul 2019, 16:39
Beitrag # 13 von 21
Beitrag ID: #571034
Bewertung:
(4579 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ihr lieben,

kann mir denn niemand sagen wo in meinem Skript der Hund begraben ist?

Danke
LG
faxinger


als Antwort auf: [#570814]

Auswahl und Gruppierung von übereinanderliegenden Objekten

Medienoperator
Beiträge gesamt: 47

9. Jul 2019, 19:16
Beitrag # 14 von 21
Beitrag ID: #571038
Bewertung:
(4564 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

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


als Antwort auf: [#571034]
(Dieser Beitrag wurde von Martin Fischer am 10. Jul 2019, 09:04 geändert)

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

10. Jul 2019, 09:02
Beitrag # 15 von 21
Beitrag ID: #571045
Bewertung:
(4507 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sascha,

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


als Antwort auf: [#571038]

Auswahl und Gruppierung von übereinanderliegenden Objekten

Medienoperator
Beiträge gesamt: 47

12. Jul 2019, 12:07
Beitrag # 16 von 21
Beitrag ID: #571087
Bewertung: ||
(3407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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:
Code
groups.add([_wisch, textContainers[c]]); 


Sondern:
Code
var neueGruppe = app.activeDocument.groups.add([_wisch, textContainers[c]]); 


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


als Antwort auf: [#571045]
(Dieser Beitrag wurde von Medienoperator am 12. Jul 2019, 12:08 geändert)

Auswahl und Gruppierung von übereinanderliegenden Objekten

Marc Sidon
Beiträge gesamt: 262

12. Jul 2019, 13:02
Beitrag # 17 von 21
Beitrag ID: #571088
Bewertung:
(3382 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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...

Code
function BoundsIntersect(b1, b2) { 
return (b1[1] < (b2[1] + (b2[3] - b2[1]))) &&
(b2[1] < (b1[1] + (b1[3] - b1[1]))) &&
(b1[0] < (b2[0] + (b2[2] - b2[0]))) &&
(b2[0] < (b1[0] + (b1[2] - b1[0])));
}

var itm1 = app.activeDocument.pages.firstItem().pageItems[0];
var itm2 = app.activeDocument.pages.firstItem().pageItems[1];


BoundsIntersect(itm1.geometricBounds, itm2.geometricBounds);


Gruß,
Marc


als Antwort auf: [#571087]
(Dieser Beitrag wurde von Marc Sidon am 12. Jul 2019, 13:11 geändert)

Anhang:
GeometricBoundsOfTwoPageItemsIntersect.jsx (0.62 KB)

Auswahl und Gruppierung von übereinanderliegenden Objekten

Marc Sidon
Beiträge gesamt: 262

12. Jul 2019, 13:47
Beitrag # 18 von 21
Beitrag ID: #571089
Bewertung: |||
(3370 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe mir erlaubt, Dein Skript mal komplett umzuschreiben.
SO sollte es funktionieren, wie Du es vor hattest...
Wenn nicht, sag Bescheid...

Code
function BoundsIntersect(b1, b2) { 
return (b1[1] < (b2[1] + (b2[3] - b2[1]))) &&
(b2[1] < (b1[1] + (b1[3] - b1[1]))) &&
(b1[0] < (b2[0] + (b2[2] - b2[0]))) &&
(b2[0] < (b1[0] + (b1[2] - b1[0])));
}

function CollectWischer(document) {
var found = new Array();

for(var n=0;n<document.allGraphics.length;n++) {
if(document.allGraphics[n].itemLink.name =="Wischer.ai") {
var _wisch = document.allGraphics[n].parent;
found.push(_wisch);
}
}

return found;
}

function CollectStreichung(document) {
var found = new Array();

for(var n=0;n<document.textFrames.length;n++) {
var txt = document.textFrames[n];
if(txt.appliedObjectStyle.name == 'streichung') {
found.push(txt);
}
}

return found;
}

function Execute() {
var _dok = app.documents[0];
var allWischer = CollectWischer(_dok);
var allStreichung = CollectStreichung(_dok);

for (var i=0; i<allWischer.length; i++) {
var wisch = allWischer[i];
for (var x=0; x<allStreichung.length; x++) {
var streich = allStreichung[x];
if (BoundsIntersect(wisch.geometricBounds, streich.geometricBounds)) {
_dok.pages.firstItem().groups.add([wisch, streich]);
continue;
}
}
}
}

Execute();



als Antwort auf: [#570814]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

12. Jul 2019, 14:23
Beitrag # 19 von 21
Beitrag ID: #571091
Bewertung:
(3351 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo 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.


als Antwort auf: [#571089]

Auswahl und Gruppierung von übereinanderliegenden Objekten

Marc Sidon
Beiträge gesamt: 262

12. Jul 2019, 14:37
Beitrag # 20 von 21
Beitrag ID: #571092
Bewertung: |||
(3345 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nichts leichter als das... :)

Code
 
function BoundsIntersect(b1, b2) {
return (b1[1] < (b2[1] + (b2[3] - b2[1]))) &&
(b2[1] < (b1[1] + (b1[3] - b1[1]))) &&
(b1[0] < (b2[0] + (b2[2] - b2[0]))) &&
(b2[0] < (b1[0] + (b1[2] - b1[0])));
}

function CollectWischer(document) {
var found = new Array();

for(var n=0;n<document.allGraphics.length;n++) {
if(document.allGraphics[n].itemLink.name =="Wischer.ai") {
var _wisch = document.allGraphics[n].parent;
found.push(_wisch);
}
}

return found;
}

function CollectStreichung(document) {
var found = new Array();

for(var n=0;n<document.textFrames.length;n++) {
var txt = document.textFrames[n];
if(txt.appliedObjectStyle.name == 'streichung') {
found.push(txt);
}
}

return found;
}

function Execute() {
var _dok = app.documents[0];
var allWischer = CollectWischer(_dok);
var allStreichung = CollectStreichung(_dok);

for (var i=0; i<allWischer.length; i++) {
var wisch = allWischer[i];
for (var x=0; x<allStreichung.length; x++) {
var streich = allStreichung[x];
if (BoundsIntersect(wisch.geometricBounds, streich.geometricBounds)) {
var lbl = streich.label;
var newGrp = _dok.pages.firstItem().groups.add([wisch, streich]);
newGrp.label = lbl;
continue;
}
}
}
}

Execute();



als Antwort auf: [#571089]

Auswahl und Gruppierung von übereinanderliegenden Objekten

faxinger
Beiträge gesamt: 246

12. Jul 2019, 14:53
Beitrag # 21 von 21
Beitrag ID: #571093
Bewertung:
(3333 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Marc,

super vielen vielen Dank.

Funktioniert jetzt genau so wie es sein soll. GENIAL!

Danke

Schönes Wochenende

LG
faxinger


als Antwort auf: [#571092]
X