[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Rahmenpositionierung mit/trotz Objektformat

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

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

22. Jul 2016, 12:42
Beitrag # 1 von 16
Bewertung:
(7043 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe Skriptenthusiasten,

es geht (CS5) um zwei Rahmen, die (alles im Skript) innerhalb einer Zeile verankert werden.
In den ersten Rahmen wird dann ein Bild platziert. Die Breite des Rahmens ist definiert. Das Bild füllt den Rahmen im nächsten Schritt proportional (mit der definierten Breite, aber einer mir zunächst unbekannten variablen Höhe), dann wird der Rahmen auf diese Höhe verringert (ich habe ihn zuvor groß genug gemacht). So weit, so gut.
Der zweite Rahmen wird mit Text befüllt. Er hat die gleiche Breite wie der erste.
Zum Schluss soll der zweite Rahmen unterhalb des ersten Rahmen positioniert werden. Dazu verwende ich "geometricBounds".
Das Problem ist, der zweite Rahmen bleibt oben in der verankerten Zeile; also auf gleicher Höhe wie der erste, obwohl ihm eigentlich per Skript ein neuer y1-Wert zugewiesen wird. Wenn ich die Koordinaten beider Rahmen im Skript mit "alert" ausgeben lasse, scheint auch alles meinen Absichten und Berechnungen zu entsprechen.
Ich vermute, es hängt mit dem Objektformat für den zweiten Rahmen zusammen. Beiden erstellten Rahmen wird ein Objekformat zugewiesen. Dort, bei den "Optionen für verankertes Objekt", ist "Benutzerdefiniert" eingestellt, außerdem "y relativ zu Zeile (Grundlinie)" und 0 mm "y-Versatz". Ich finde hierzu keine Alternative, die es dem Skript erlauben würde, den Rahmen neu zu positionieren.
Habt Ihr eine Idee?
Vielen Dank für das Interesse!
Gruß
Jan
X

Rahmenpositionierung mit/trotz Objektformat

Kai Rübsamen
Beiträge gesamt: 4684

22. Jul 2016, 13:48
Beitrag # 2 von 16
Beitrag ID: #551410
Bewertung:
(7017 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Jan, du solltest deinen Beiträgen Blindabsätze und Beispielbilder bzw. .idmls spendieren :)

Ich rate mal:
Die geometricBounds greifen nicht, weil das Teil verankert ist. Per y-Versatz bekomme ich den zweiten Rahmen schon unter den ersten. Objekformate haben dann logischerweise eine Abweichung.

Nicht verstanden:
Warum verankerst du generell? Was passiert mit Texten oben drüber / unten drunter (Umfluss)? Warum verschiebst du den zweiten Rahmen nicht einfach in einen neuen Absatz …


als Antwort auf: [#551408]

Rahmenpositionierung mit/trotz Objektformat

Uwe Laubender
Beiträge gesamt: 5316

22. Jul 2016, 15:55
Beitrag # 3 von 16
Beitrag ID: #551414
Bewertung:
(6965 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jan,
mein Vorschlag:

erst die Rahmen bauen und befüllen.
Dann eine Gruppe bilden und diese verankern.

Mit dem "Verankern" gibt's allerdings ein Problem.
Ab CS5.5 ist das ein Leichtes über die Funktion insertAnchoredObject().
Mit CS5 etwas umständlicher. Da gibt's diese Funktion noch nicht.

Ansonsten die anchoredObjectSettings des verankerten Objekts inspizieren und dort die Werte ändern.


als Antwort auf: [#551408]

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

23. Jul 2016, 17:10
Beitrag # 4 von 16
Beitrag ID: #551434
Bewertung:
(6813 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke für Eure Antworten.

Kai, Du meinst Leerzeilen zum besseren Lesen, da hast Du wohl recht. Eine idml zu bauen, da scheue ich den Aufwand, ehrlich gesagt;)

Mit scheint aber, Du hast das Problem trotzdem so weit erfasst.

Ich kann den y-Versatz tatsächlich problemlos nach Ablauf des Skripts per Hand ändern und den Rahmen runterschieben. Die Abweichung im OF ist auch klar und kein Problem. Nur das Skript macht es eben nicht.

Ich verankere, weil es sich um Mengensatz handelt und der Text darüber immer mal wieder sich noch ändern kann. So fließen Bild und Quelle (= der zweite Rahmen) immer gleich mit. Der Text bleibt im Übrigen stets ober- oder unterhalb der Bilder.

Dass ich den zweiten Rahmen im selben Absatz habe, hat mit dem Skriptaufbau zu tun (also mit der Textvorlage, mit der ich arbeite). Das wäre aber einen Versuch wert, hier mit zwei verschiedenen Absätzen zu verfahren. Das Skript würde zwar umständlicher, aber das traue ich mir schon zu. Ich werde es probieren.

Uwe, das klingt nach einer guten Idee. Es übersteigt jedoch meine bisherigen Kenntnisse (wie per Skript normalen Rahmen platzieren?, wie gruppieren?; und wenn das Verankern bei CS5 nicht mit der von Dir genannten Funktion geht, wüsste ich hier auch nicht weiter). Ich probier erst mal das mit den Absätzen.

Habt schon mal vielen Dank!
Gruß
Jan


als Antwort auf: [#551410]

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

23. Jul 2016, 18:03
Beitrag # 5 von 16
Beitrag ID: #551436
Bewertung:
(6795 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Den zweiten Rahmen in einen eigenen Absatz zu setzen ändert leider auch nichts daran, dass sich dieser Rahmen mit neu berechneten geometricBounds nicht vertikal verschieben lassen will.

Bliebe noch die Option über die Settings, wie von Uwe vorgeschlagen. Wenn ich es richtig verstehe, könnte ich die Einstellungen des verankerten Rahmens per Skript ändern!? Es ginge dann um anchorYoffset. Den Wert kann ich aus den geometricBounds errechnen. Nur leider funktioniert die letzte Zeile in
Code
... 
var myFrame2Content = mySelection.paragraphs[4];
var myFrame2 = app.selection[0].paragraphs[3].textFrames.add();
myFrame2Content.move(LocationOptions.AT_END, myFrame2.parentStory);
...
myFrame2.anchorYoffset = myBerechneteVariable;

nicht. Wäre ja auch zu schön gewesen.

(Man merkt vielleicht, ich habe diese ganze Skriptsprache nicht verstanden, sondern hangel mich von Versatzstück zu Versatzstück;)

Aber vielleicht kann mir jemand auf die Sprünge helfen?

Edit: Heureka!
Natürlich muss es heißen:
Code
myFrame2.anchoredObjectSettings.anchorYoffset = myBerechneteVariable; 


Jetzt muss ich nur noch meine Berechnung verbessern, denn die haut noch nicht hin. Aber ein Weg ist da.

Nochmals danke und Gruß
Jan


als Antwort auf: [#551434]
(Dieser Beitrag wurde von former am 23. Jul 2016, 18:18 geändert)

Rahmenpositionierung mit/trotz Objektformat

Uwe Laubender
Beiträge gesamt: 5316

23. Jul 2016, 19:12
Beitrag # 6 von 16
Beitrag ID: #551437
Bewertung:
(6767 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jan,
ich würde die Sache folgendermaßen angehen:
1. Stelle die gewünschte Situation im UI nach
2. Lese die properties und deren Werte aus den gebauten Objekten aus.
Notieren.
3. Lese die properties und deren Werte per Skript aus den gebauten Objekten aus und stelle eine Korrelation der notierten Werte mit den per Skript ausgelesenen Eigenschaften und Werten her.

Eine Übersicht zu den AnchoredObjectSettings findest Du beispielsweise hier:
http://jongware.mit.edu/...edObjectSetting.html

Die gesamte Übersicht zu CS5, bequem durchsuchbar, kannst Du Dir als chm-Datei bei Jongware herunterladen (auch als HTML):

http://www.jongware.com/idjshelp.html

Falls Du Hilfe zu Punkt 3 brauchst:
Property/Werte-Paare kann man beispielsweise über ein for-in-Schleife auslesen.

Anhand einer Auswahl eines verankerten Grafikrahmens demonstriert:

Code
// Anchored graphic frame selected: 
var myAnchoredObjectSettings = app.selection[0].anchoredObjectSettings;
$.writeln(app.selection[0]);
for(x in myAnchoredObjectSettings)
{
try{
$.writeln( x+"\t"+myAnchoredObjectSettings[x].toString() );
}catch(e){ $.writeln( x+"\t"+e.message ) };
};


Beispiel für ein Ergebnis aus der JavaScript-Konsole des ESTK:

Code
[object Rectangle] 
anchoredPosition ANCHORED
spineRelative false
lockPosition false
pinPosition false
anchorPoint BOTTOM_RIGHT_ANCHOR
horizontalAlignment LEFT_ALIGN
horizontalReferencePoint TEXT_FRAME
verticalAlignment BOTTOM_ALIGN
verticalReferencePoint LINE_BASELINE
anchorXoffset -94
anchorYoffset 64.3890767415684
anchorSpaceAbove 0
isValid true
parent [object Rectangle]
properties [object Object]
events [object Events]
eventListeners [object EventListeners]
isValid true


Alles kein Hexenwerk…


als Antwort auf: [#551436]

Rahmenpositionierung mit/trotz Objektformat

Kai Rübsamen
Beiträge gesamt: 4684

24. Jul 2016, 00:44
Beitrag # 7 von 16
Beitrag ID: #551441
Bewertung:
(6696 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jan,

warum soll hier einer auch nur zwei Minuten Zeit investieren, wenn du den Aufwand scheust eine Demodatei zu bauen?

Damit ich dir eine Antwort geben konnte, hatte ich mir ein Beispiel gebaut. Uwe hat es möglicherweise genauso gemacht.

Ich bin bei meinem Gedanken davon ausgegangen, dass der zweite Rahmen bei korrekt eingerichtetem Zeilenabstand bereits richtig sitzt. Per Skript ausprobiert hatte ich das allerdings nicht.

Und noch etwas: Dir ist klar, was du da vor hast. Andere raten hier aber. Da wäre ein Beispiel vorher / nachher eigentlich nicht zuviel verlangt.


als Antwort auf: [#551437]
(Dieser Beitrag wurde von Kai Rübsamen am 24. Jul 2016, 00:49 geändert)

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

24. Jul 2016, 17:56
Beitrag # 8 von 16
Beitrag ID: #551449
Bewertung:
(6511 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Uwe, hallo, Kai,
zunächst danke für Eure Antworten.

Kai, Du hast natürlich völlig Recht, etwas Aufwand kann man schon verlangen, wenn man Hilfe erwartet. Daher habe ich der Vollständigkeit wegen das Skript auf das Notwendigste reduziert und gebe es unten gerne als Beispiel für diesen Beitrag dazu. Eine idml kann ich als Nicht-Member nicht hochladen, aber eine Standardvorlage mit den beiden Objektformaten "OF1" und "OF2" sollte genügen. Dazu muss man noch irgendein Bild von der eigenen Festplatte auswählen.

Code
#target InDesign 
if (app.selection[0].paragraphs.length == 3)
var mySelection=app.selection[0];
else
alert ("Du musst 3 Absätze markieren!");

var myBB = 50; // Festlegen der Bildbreite
var myFrame1 = mySelection.paragraphs[0].textFrames.add();
var myFrame2 = mySelection.paragraphs[1].textFrames.add();
var myOStyle1 = app.activeDocument.objectStyles.item("OF1");
var myOStyle2 = app.activeDocument.objectStyles.item("OF2");
var myBounds1 = [ "0p", "0p", "150mm", myBB];
var myBounds2 = [ "0p", "0p", "20mm", myBB];

myFrame1.applyObjectStyle(myOStyle1, true); // Zuweisung des Objektstils
myFrame2.applyObjectStyle(myOStyle2, true); // Zuweisung des Objektstils
myFrame1.geometricBounds = myBounds1; // Zuweisung der Koordinaten (Höhe und Breite)
myFrame2.geometricBounds = myBounds2; // Zuweisung der Koordinaten (Höhe und Breite)

// Abfrage Bild
var myFigure = File.openDialog("Bild wählen");

// Bild in Bildrahmen setzen
myFrame1.place(myFigure);
myFrame1.fit(FitOptions.PROPORTIONALLY);
myFrame1.fit(FitOptions.FRAME_TO_CONTENT);

// Werte beider Rahmen in Variable bringen
var myR1 = myFrame1.geometricBounds;
var myR2 = myFrame2.geometricBounds;

var myY2NR2 = myR1[2] - myR2[0];
myFrame2.anchoredObjectSettings.anchorYoffset = myY2NR2;


(Wenn es mir möglich gewesen wäre, zwei vorhandene verankerte Objekte im Skript "anzusprechen", hätten auch noch weniger Zeilen genügt. Nun werden eben die verankerte Rahmen erst erstellt.)

Jedenfalls funktioniert es nun: Es setzt mir den zweiten Rahmen an die korrekte Position.

Ja, über den Zeilenabstand wäre das Positionieren tatsächlich auch möglich (bzw. würde sich quasi von selbst ergeben), nur ist eben das Problem, dass der erste Rahmen eine variable Höhe hat (je nach Bildgröße) und somit nicht (bzw. fast nie) mit den Zeilen abschließt.

Uwe, danke für Deinen Lösungsvorschlag. In das Objektmodell hatte ich bereits mal reingeschaut. Dank Deinem Hinweis auf die AnchoredObjectSettings stieß ich dort auch auf anchorYoffset.

Mit UI meinst Du das normale InDesign-Programm, oder?

Um ehrlich zu sein, beim Auslesen der properties per Skript hätte ich schon nicht gewusst wie. Da ich den Code im Notepad schreibe -- das ist mir einfach angenehmer in der Handhabe --, mangelt es also schon an der Konsole. Aber im Großen und Ganzen bin ich ja trotzdem so vorgegangen. Nur dass ich einfach die geometricBounds statt der AnchoredObjectSettings genommen habe. Mit denen war ich schon vertraut, mit denen habe ich auch schon im Skript hantiert.

Okay, nichts für ungut. Nochmals danke und Gruß
Jan


als Antwort auf: [#551441]

Rahmenpositionierung mit/trotz Objektformat

Uwe Laubender
Beiträge gesamt: 5316

25. Jul 2016, 09:30
Beitrag # 9 von 16
Beitrag ID: #551455
Bewertung:
(6389 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jan,

nichts gegen das Schreiben von Scripts in Notepad.
Für das Debuggen allerdings ist das ESTK (ExtendScript Toolkit) meiner Meinung nach unverzichtbar. Gerade für Skripter, die entweder noch nicht sattelfest im DOM sind oder für Skripter, die sich auf Bereiche stürzen, mit denen sie noch keine Erfahrung gesammelt haben.

Oder man etabliert ein wirklich sehr ausgefeiltes Error-Handling mit Unterroutinen, die die Eigenschaften von Objekten abklappern oder gar Methoden auf mögliche Argumente untersuchen können. Sehr aufwändig.

Zum Thema Aufwand, was das Bereitstellen von Testdateien angeht:
Ein Dropbox-Link ist schnell gepostet. Dropbox einrichten dauert nur ein paar Minuten. Und ist kostenlos.

Und da komme ich zu Deinen Codezeilen:
1. Ohne eine Beispieldatei ist dieser nicht nachvollziehbar, da beispielsweise die Definition der Objektfomate nicht ersichtlich ist.

2. Du schreibst:
Zitat von Jan (Wenn es mir möglich gewesen wäre, zwei vorhandene verankerte Objekte im Skript "anzusprechen", hätten auch noch weniger Zeilen genügt. Nun werden eben die verankerte Rahmen erst erstellt.)

Auch das geht. Nämlich über die pageItems eines Textes. Zwei hintereinander verankerte Objekte in einem ausgewählten Text können beispielsweise folgendermaßen angesprochen werden:

Code
// Text selected: 
// Text selected:

var firstAnchoredObject = app.selection[0].pageItems[0].getElements()[0];
var secondAnchoredObject = app.selection[0].pageItems[1].getElements()[0];

$.writeln("firstAnchoredObject"+"\t"+firstAnchoredObject);
$.writeln("secondAnchoredObject"+"\t"+secondAnchoredObject);

/*
Example result from the JavaScript Console of the ESTK:

firstAnchoredObject [object Rectangle]
secondAnchoredObject [object TextFrame]

*/


Das getElements()[0] ist notwendig, um den genauen Objekttyp zu ermitteln, da die Überklasse PageItems ausgelesen wird. Also: Ist das angesprochene pageItem beispielsweise ein TextFrame, ein Rectangle etc.pp.
Es gilt das Motto: "Wie Du in den Wald rufst, schallt es heraus." Konkret: Du fragst nach pageItems, Du bekommst pageItems zurück.

Wenn man natürlich mit absoluter Sicherheit sagen kann, dass da wirklich genau ein Rectangle und ein TextFrame vorhanden sind, dann geht auch:

Code
var firstAnchoredObject = app.selection[0].rectangles[0];  
var secondAnchoredObject = app.selection[0].textFrames[0];


Praktischer wäre es aber man würde zunächst die Anzahl der pageItems im Text ermitteln, um sie dann mit einer Schleife abzuklappern.

Code
var myPageItemLength = app.selection[0].pageItems.length; 
if(myPageItemLength > 0)
{
var pageItemsinText = app.selection[0].pageItems.everyItem().getElements();

for(var n=0;n<myPageItemLength;n++)
{
$.writeln(n+"\t"+pageItemsinText[n]);
}
}



als Antwort auf: [#551449]

Rahmenpositionierung mit/trotz Objektformat

Uwe Laubender
Beiträge gesamt: 5316

25. Jul 2016, 10:48
Beitrag # 10 von 16
Beitrag ID: #551457
Bewertung:
(6346 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Jan.

Was Du noch nicht geschrieben hast:

Was sind die Inhalte der Textrahmen?
Willst Du Bildbeschreibungen aus den Metadaten der Bilder auslesen?
Texte, die im Haupttext vorhanden sind, in den Textrahmen überführen?
Ich habe keinen Schimmer…


Deshalb sei mir ein Hinweis auf im Netz vorhandene Skripte erlaubt.
Schau Dir u.a. mal WpsCreateAnchoredFrames von Werner Perplies an.
Vielleicht taugt Dir das. Das Testen mit wenigen Rahmen ist kostenlos.

Einarbeitungszeit in die sehr umfangreichen Möglichkeiten des Skripts brauchst Du allerdings.

Eine Demoversion mit Beschreibung gibt's hier:
http://www.weepee.de/?page_id=4390

Falls Du auf Mac OSX mit InDesign CS5 unterwegs bist:
Das UI der "Voreinstellungen" des Skripts hat bei mir unter OSX 10.6.8 leider ein paar Macken (hab' das soeben festgestellt). Auf Windows sollte das UI anstandslos funktionieren.
Wende Dich an Werner, wenn Du Fragen dazu haben solltest.

// Ergänzung:
Da Du von "Notepad" schreibst, nehme ich an, dass Du auf Windows unterwegs bist.


als Antwort auf: [#551455]
(Dieser Beitrag wurde von Uwe Laubender am 25. Jul 2016, 10:49 geändert)

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

27. Jul 2016, 19:08
Beitrag # 11 von 16
Beitrag ID: #551523
Bewertung:
(6108 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Uwe,

hab ganz vielen Dank für Deine ausführlichen Hinweise!

Du meinst, dass im ESTK Fehler sogleich angezeigt werden, oder wie ist das mit dem Errorhandling gemeint? Ich werde ihm eine neue Chance geben bzw. habe es sogleich probiert, ein paar Vorteile hat es ja schon (Schritt für Schritt durchgehen, die prompte Anzeige der Ergebnisse bei Berechnungen).

Danke auch für das Beispiel, wie man vorhandene verankerte Objekte anspricht. Für das aktuelle Skript habe ich sie zwar nicht verwendet, weil ich darin die Rahmen ohnehin erst erstelle (ich hatte es nur versucht, als ich zuletzt das Skript hier in den Beitrag geschrieben habe, um mich darin auf das Nötigste zu beschränken), aber ich bin mir sicher, auf die getElements zukünftig zurückzugreifen.

Ja, ich arbeite auf Windows.

Und bzgl. meiner Absichten, war Dein zweiter Tipp richtig: Ich möchte Text, der im Haupttext vorhanden ist, in den Rahmen verschieben.

Ich habe nun noch einmal das Skript plus .indd bzw. .idml-Dateien erstellt:
https://www.dropbox.com/...h5jbgjf6e/a.zip?dl=0

Das Zip enthält ein Vorher (a1.idml), in dem die drei Absätze markiert werden müssen, ein Nachher, dazu ein Bsp.bild (was beliebig ersetzt werden kann) und schließlich das Skript selbst (text.js), das ich aber auch hier vorstellen möchte:
Code
#target InDesign 
if (app.selection[0].paragraphs.length == 3)
var mySelection=app.selection[0];
else
{
alert ("Bitte 3 Absätze markieren! Der dritte enthält die Webadresse."); // wenn nur 2 Absätze markiert werden, kommt beim Erstellen des zweiten Rahmens der Fehler "Objekt ist ungültig" (!?)
// ein weiteres Problem ist, wenn ich die Webadresse im 2. Absatz habe und in diesem Absatz auch den 2. Rahmen erstelle, kann ich den Text nicht verschieben, weil ich ihn dann an die selbe Stelle verschieben würde (!?)
exit (); }

var myBB = 50; // Festlegen der Bildbreite
var myFrame1 = mySelection.paragraphs[0].textFrames.add();
var myFrame2 = mySelection.paragraphs[1].textFrames.add();
var myOStyle1 = app.activeDocument.objectStyles.item("OF1");
var myOStyle2 = app.activeDocument.objectStyles.item("OF2");
var myBounds1 = [ "0p", "0p", "100mm", myBB];
var myBounds2 = [ "0p", "0p", "20mm", myBB];

myFrame1.applyObjectStyle(myOStyle1, true); // Zuweisung des Objektstils
myFrame2.applyObjectStyle(myOStyle2, true); // Zuweisung des Objektstils
myFrame1.geometricBounds = myBounds1; // Zuweisung der Koordinaten (Höhe und Breite)
myFrame2.geometricBounds = myBounds2; // Zuweisung der Koordinaten (Höhe und Breite)

// Abfrage Bild, das in den 1. Rahmen soll
var myFigure = File.openDialog("Bild wählen");
// Bild in Bildrahmen setzen, proportional füllen (max. myBB) und Rahmen an Inhalt anpassen (i.e. die Höhe anpassen)
myFrame1.place(myFigure);
myFrame1.fit(FitOptions.PROPORTIONALLY);
myFrame1.fit(FitOptions.FRAME_TO_CONTENT);

// der Text des 2. Absatzes soll in den 2. Rahmen mit einem anderen Absatzformat
mySelection.paragraphs[2].appliedParagraphStyle = "Rahmentext_ohne_Raster";
// dafür gibt es diese Variable
var myFrame2Content = mySelection.paragraphs[2];
// die nun verschoben wird
myFrame2Content.move(LocationOptions.AT_END, myFrame2.parentStory);
// es entsteht ein Relikt (!?), daher: letztes Zeichen (Absatzmarke) im Rahmen 2 löschen
myFrame2.characters.item(-1).properties = {contents:""};
// und wieder Rahmen an Inhalt anpassen, weil der Text auch zweizeilig sein kann
myFrame2.fit(FitOptions.FRAME_TO_CONTENT);

// Werte beider Rahmen in Variable bringen
var myR1 = myFrame1.geometricBounds;
var myR2 = myFrame2.geometricBounds;

var myY2NR2 = myR1[2] - myR2[0];
myFrame2.anchoredObjectSettings.anchorYoffset = myY2NR2;

// an der Stelle dachte ich schon mal, ich hätte es; nur leider wird der 2. Rahmen durch das Anpassen zu schmal, denn er soll ja myBB breit sein
// daher folgender Versuch, der zwar zum korrekten Ergebnis führt, aber auch zu einer Fehlermeldung (!?)
myFrame2.geometricBounds = [myR1[2], myR1[1], myR2[2], myR1[3]];
var myBounds3 = [ "0p", "0p", "0p", myBB];
myFrame2.geometricBounds = myBounds3;


Wie man sieht, habe ich darin noch einige Fragezeichen. Vor allem aber haut das Handling des zweiten Rahmens noch immer nicht sauber hin. Zwar ist mein Ergebnis nun das Gewünschte, aber nur auf Kosten einer Fehlermeldung, was ja nicht der Weisheit letzter Schluss sein kann.

Eigentlich wäre es naheliegend, "einfach" die Rahmenbreite nach dem Befüllen und Anpassen des Rahmens noch einmal festzulegen, wobei die variable Höhe konstant gehalten werden müsste. Aber das scheint doch schwieriger, als man denkt. Wenn man im Objektformat die Breite (die ich leider auch nicht im OM zu den Settings finden kann) ändern will, geht das auch nur über "Feste Breite", und das ist für mich nicht praktikabel, weil ich auch Rahmen mit anderer Breite, aber demselben Objektformat haben will. Und mein Versuch über die geometricBounds ist halt irgendwie fehlerhaft.

Gruß
Jan


als Antwort auf: [#551457]

Rahmenpositionierung mit/trotz Objektformat

Kai Rübsamen
Beiträge gesamt: 4684

27. Jul 2016, 23:03
Beitrag # 12 von 16
Beitrag ID: #551525
Bewertung:
(6077 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: // wenn nur 2 Absätze markiert werden, kommt beim Erstellen des zweiten Rahmens der Fehler "Objekt ist ungültig" (!?)

Glaub ich nicht! Wenn nur zwei Absätze ausgewählt werden, kommt der alert.
Du solltest allerdings auch abfangen, wenn nichts ausgewählt ist.

Antwort auf: // ein weiteres Problem ist, wenn ich die Webadresse im 2. Absatz habe und in diesem Absatz auch den 2. Rahmen erstelle, kann ich den Text nicht verschieben, weil ich ihn dann an die selbe Stelle verschieben würde (!?)

Wenn das Skript nur läuft, wenn drei Absätze ausgewählt sind, stellt sich diese Frage nicht. Das mit dem Verschieben ginge schon, aber zunächst muss die Auswahl geklärt werden. >> Du könntest prüfen, ob ein Text mit www im zweiten oder dritten Absatz steht und dann reagieren.

Ansonsten:
Dein Objektformat 2 erhält eine Abweichung, wenn du das Absatzformat nachträglich zuweist. Ich würde das Absatzformat im Objektformat hinterlegen und dann den Text nicht verschieben, sondern nur den Inhalt einfügen.

Bei der Verankerung bin ich mir nicht ganz sicher, ob ich das richtig verstanden habe. Aber bei mir funktioniert folgendes:

Code
if (app.selection[0].paragraphs.length == 3) { 
var mySelection = app.selection[0];
}
else {
alert("Achtung:\rBitte 3 Absätze markieren!\nDer dritte enthält die Webadresse.");
exit();
}

var myDoc = app.activeDocument;

var myBB = 50; // Festlegen der Bildbreite
var myFrame1 = mySelection.paragraphs[0].textFrames.add({geometricBounds: [0 , 0, 100, myBB]});
myFrame1.appliedObjectStyle = myDoc.objectStyles.itemByName("OF1"); // Zuweisung des Objektstils
var myFrame2 = mySelection.paragraphs[1].textFrames.add({geometricBounds: [0, 0, 20, myBB]});
myFrame2.appliedObjectStyle = myDoc.objectStyles.itemByName("OF2"); // Zuweisung des Objektstils

// Abfrage Bild, das in den 1. Rahmen soll
var myFigure = File.openDialog("Bild wählen");
// Bild in Bildrahmen setzen, proportional füllen (max. myBB) und Rahmen an Inhalt anpassen (i.e. die Höhe anpassen)
myFrame1.place(myFigure);
myFrame1.fit(FitOptions.PROPORTIONALLY);
myFrame1.fit(FitOptions.FRAME_TO_CONTENT);

// der Inhalt des 3. Absatzes …
var para3contents = mySelection.paragraphs[2].characters.itemByRange(0,-2).contents[0];
// … wird in den Rahmen eingefügt
myFrame2.insertionPoints[0].contents = para3contents;
// und wieder Rahmen an Inhalt anpassen, weil der Text auch zweizeilig sein kann
var tfGB = myFrame2.geometricBounds;
// den Rahmen vergrößern …
tfGB[2] = tfGB[2] + 20;
myFrame2.geometricBounds = tfGB;
// … und wieder an den Text anpassen
fitFrame(myFrame2);
// den 3. Absatz löschen
mySelection.paragraphs[2].remove();

// Werte beider Rahmen in Variable bringen
var myR1 = myFrame1.geometricBounds;
var myR2 = myFrame2.geometricBounds;

var myY2NR2 = myR1[2] - myR2[0];
myFrame2.anchoredObjectSettings.anchorYoffset = myY2NR2;


function fitFrame(aFrame) {
var lastBaseLine = aFrame.lines[-1].baseline;
var b = aFrame.geometricBounds;
aFrame.geometricBounds = [b[0], b[1], lastBaseLine, b[3]];
}



als Antwort auf: [#551523]
(Dieser Beitrag wurde von Kai Rübsamen am 27. Jul 2016, 23:03 geändert)

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

28. Jul 2016, 19:18
Beitrag # 13 von 16
Beitrag ID: #551562
Bewertung:
(5899 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Kai,

danke für Deine Antwort.

Antwort auf [ Kai Rübsamen ]
Antwort auf: // wenn nur 2 Absätze markiert werden, kommt beim Erstellen des zweiten Rahmens der Fehler "Objekt ist ungültig" (!?)

Glaub ich nicht! Wenn nur zwei Absätze ausgewählt werden, kommt der alert.
Du solltest allerdings auch abfangen, wenn nichts ausgewählt ist.

Das bezieht sich dann natürlich darauf, wenn ich bei der ersten Abfrage 2 Absätze abfragen würde: Wenn ich dann in der Folge den zweiten Rahmen verankern will, kommt der Fehler.

Antwort auf [ Kai Rübsamen ]
Antwort auf: // ein weiteres Problem ist, wenn ich die Webadresse im 2. Absatz habe und in diesem Absatz auch den 2. Rahmen erstelle, kann ich den Text nicht verschieben, weil ich ihn dann an die selbe Stelle verschieben würde (!?)

Wenn das Skript nur läuft, wenn drei Absätze ausgewählt sind, stellt sich diese Frage nicht. Das mit dem Verschieben ginge schon, aber zunächst muss die Auswahl geklärt werden. >> Du könntest prüfen, ob ein Text mit www im zweiten oder dritten Absatz steht und dann reagieren.

Auch diesen Punkt meinte ich unter der Annahme, nur zwei Absätze abzufragen. Ich wollte also erklären, warum drei Absätze markiert sein sollen. Im Prinzip würde es mir auch genügen, nur einen Absatz zu markieren, den mit der Webadresse. Aber ich kam bisher nur so zum Ziel.

Antwort auf [ Kai Rübsamen ] Dein Objektformat 2 erhält eine Abweichung, wenn du das Absatzformat nachträglich zuweist. Ich würde das Absatzformat im Objektformat hinterlegen

Ja, das wäre einfacher und sauberer.

Antwort auf [ Kai Rübsamen ] Bei der Verankerung bin ich mir nicht ganz sicher, ob ich das richtig verstanden habe.

Exakt so, hatte ich es gemeint

Antwort auf [ Kai Rübsamen ] Aber bei mir funktioniert folgendes:

Bei mir auch. Vielen Dank! Auch für die Funktion und die vielen Vereinfachungen!

Gruß
Jan


als Antwort auf: [#551525]

Rahmenpositionierung mit/trotz Objektformat

Kai Rübsamen
Beiträge gesamt: 4684

28. Jul 2016, 19:51
Beitrag # 14 von 16
Beitrag ID: #551563
Bewertung:
(5876 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jan,

zunächst: Es gibt Beispieldateien und ein ausführbares Skript: Fast vorbildlich. Aber ;-) : Dein Beispiel ist ja eher "Hello world" als aus der Praxis gegriffen. D.h. wenn du vorher nachher Text hast oder deine URL zweizeilig sein kann, muss das auch im Beispiel abgebildet werden. Sonst kann es sein, das ein hier gepostetes Ergebnis nur zur Hälfte funktioniert. Also beim nächsten Mal …

Antwort auf: Das bezieht sich dann natürlich darauf, wenn ich bei der ersten Abfrage 2 Absätze abfragen würde: Wenn ich dann in der Folge den zweiten Rahmen verankern will, kommt der Fehler.

Also: zunächst ist es wichtig, ob du das Skript für dich schreibst oder ob es andere ausführen. Wenn es nur für dich ist, reicht es, wenn du ein bisschen was prüfst. Ist es für Andere, sollte es Idiotensicher sein.

Egal wie, du musst dir Gedanken über die Auswahl machen: Ist nichts ausgewählt? Ist Text ausgewählt? Wieviel Absätze? Was soll passieren, wenn ein, zwei, drei oder mehr Absätze ausgewählt sind?

Wenn zwei Absätze ausgewählt sind, kannst du prüfen, ob im zweiten Absatz die Url steht, bei drei Absätzen, ob im dritten …

Antwort auf: // ein weiteres Problem ist, wenn ich die Webadresse im 2. Absatz habe und in diesem Absatz auch den 2. Rahmen erstelle, kann ich den Text nicht verschieben, weil ich ihn dann an die selbe Stelle verschieben würde (!?)

In dem Fall musst du wahrscheinlich von deinem Absatz vorher das erste Zeichen abziehen und dann den Inhalt (nicht den Absatz) verschieben.

Antwort auf: Im Prinzip würde es mir auch genügen, nur einen Absatz zu markieren, den mit der Webadresse. Aber ich kam bisher nur so zum Ziel.

Wo hakt es? Du könntest den Absatz markieren, zwei neue Returns vorher einfügen und dort dann deine Rahmen erstellen.

Achso: Überleg mal, ob deine Variablen etwas kürzer sein könnten. Dann wird der Code auch etwas übersichtlicher.


als Antwort auf: [#551562]
(Dieser Beitrag wurde von Kai Rübsamen am 28. Jul 2016, 19:54 geändert)

Rahmenpositionierung mit/trotz Objektformat

former
Beiträge gesamt: 164

2. Aug 2016, 11:39
Beitrag # 15 von 16
Beitrag ID: #551689
Bewertung:
(5499 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Kai,

auch zweizeilige Beispiele anzuführen, wenn diese mit abgedeckt werden sollen, ist sicher sinnvoll. Im Übrigen ist das Skript tatsächlich nur für mich gedacht, daher muss das mit den Abfragen auch nicht unbedingt ;) idiotensicher sein.

Antwort auf: Antwort auf:
// ein weiteres Problem ist, wenn ich die Webadresse im 2. Absatz habe und in diesem Absatz auch den 2. Rahmen erstelle, kann ich den Text nicht verschieben, weil ich ihn dann an die selbe Stelle verschieben würde (!?)

In dem Fall musst du wahrscheinlich von deinem Absatz vorher das erste Zeichen abziehen und dann den Inhalt (nicht den Absatz) verschieben.

Hier komm ich nicht ganz mit: Was meinst Du mit abziehen? Löschen? Nicht in die Auswahl einbeziehen? Und wenn ich dann den Inhalt verschiebe (wie Du es in Deinem Skript in der Zeile
Code
myFrame2.insertionPoints[0].contents = para3contents; 

gemacht hast), fehlt das erste Zeichen dann nicht?

Antwort auf: Du könntest den Absatz markieren, zwei neue Returns vorher einfügen und dort dann deine Rahmen erstellen.

Okay. Zwar kennte ich als Weg hierfür nur "changeGrep", womit ich es bestimmt etwas umständlicher machte als nötig, aber es wäre eine für mich handhabbare Möglichkeit.

Antwort auf: Überleg mal, ob deine Variablen etwas kürzer sein könnten.

Durch das vorgeschaltete "my" haben meine Variablen immer schon mal zwei Zeichen, die könnte ich vielleicht weglassen. (Nebenbei: Deine "para3contents" ist zwar leicht erkennbar, aber auch nicht unbedingt kurz ;)

Gruß
Jan


als Antwort auf: [#551563]
X