[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:
(6999 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:
(6981 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:
(6922 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:
(6885 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:
(6822 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:
(6765 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:
(6706 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:
(6691 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:
(6684 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:
(4726 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:
(4717 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:
(4710 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:
(4581 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:
(4566 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:
(4509 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]
X