[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Textrahmen > .fit (FitOptions.FRAME_TO_CONTENT)

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

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

17. Okt 2013, 18:55
Beitrag # 1 von 19
Bewertung:
(9843 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Mir ist offensichtlich nicht klar, wie der fit-Befehl im Zusammenhang mit Textrahmen funktioniert.

Beispiel 1:
Ein Textrahmen mit zwei Absätzen, der letzte Absatz teilweise im Übersatz. Wenn ich den Rahmen markiere und folgende Zeilen laufen lasse:
Code
var _auswahl = app.selection[0]; 
_auswahl.fit (FitOptions.FRAME_TO_CONTENT);

wird der Rahmen nach unten vergrößert, ähnlich dem Doppelklick Mitte unten.

Beispiel 2:
Ein Textrahmen mit zwei Absätzen, … + Zuweisen neuer Formate.
Hier wird der Rahmen nicht markiert, sondern ich habe vorher in einer Schleife nur solche Rahmen mit Label ausgelesen, diese in einem Array gespeichert und gehe dann das Array erneut mit einer Schleife durch.
Hier macht jetzt:
Code
theFrame.fit(FitOptions.FRAME_TO_CONTENT); 

mit eigentlich dem gleichen Rahmen aus Beispiel 1 nicht die Vergrößerung nach unten, sondern vergrößert mir den Rahmen nach rechts und zwar so, dass ein kompletter Absatz in der Breite hineinpasst :(

Frage:
Kann ich hier gar nicht mit dem fit-Befehl arbeiten und ich muss die letzte Grundlinie ermitteln u. dann die geometricBounds ändern oder habe ich hoffentlich nur einen Fehler gemacht und es geht doch mit 'fit'?

Anbei noch mein Code-Schnipsel. Danke.

Code
// eine Schleife durch alle gelabelten Rahmen 
for ( var i=0; i < labelFrames.length; i++ ) {
var theFrame = labelFrames[i];
theFrame.select();
// eine Schleife durch die Formatgruppen
for (var n=0; n < paraGroups.length; n++) {
var curGroup = paraGroups[n];

// prüft, ob der Name des Etiketts mit dem Namen der Absatzformategruppe übereinstimmt
if (theFrame.name == curGroup.name) {
alert ("Etikett: " + theFrame.name + "\r" + "Formatgruppe: " + curGroup.name);
// die jeweiligen Absatzformate
var pStyle1 = curGroup.paragraphStyles.itemByName("Subheadline");
var pStyle2 = curGroup.paragraphStyles.itemByName("Paragraph");

// mit parentStory erhalte ich auch Absätze im Übersatz
var allParas = theFrame.parentStory.paragraphs;
// eine Schleife durch alle Absätze im Rahmen
for ( var p=0; p < allParas.length; p++ ) {
var curPara = allParas[p];
if (curPara.appliedParagraphStyle.name == "Subheadline") {
curPara.appliedParagraphStyle = pStyle1;
}
else if (curPara.appliedParagraphStyle.name == "Paragraph") {
curPara.appliedParagraphStyle = pStyle2;
}
} // for
} // if
} // for
theFrame.fit(FitOptions.FRAME_TO_CONTENT);
} // for


(Dieser Beitrag wurde von Kai Rübsamen am 17. Okt 2013, 19:05 geändert)
X

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

17. Okt 2013, 19:15
Beitrag # 2 von 19
Beitrag ID: #518568
Bewertung:
(9788 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat Kann ich hier gar nicht mit dem fit-Befehl arbeiten und ich muss die letzte Grundlinie ermitteln u. dann die geometricBounds ändern oder habe ich hoffentlich nur einen Fehler gemacht und es geht doch mit 'fit'?


ohne den Rest jetzt genau gelesen zu haben:

Ich arbeite nicht mit fit sondern passe den Rahmen an, da habe ich dann die volle Kontrolle und brauche nicht nachdenken, ob fit so funktioniert, wie ich will.

Das war auch der Grund für meinen Vorschlag in Deinem letzten Thema.


als Antwort auf: [#518567]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

17. Okt 2013, 19:20
Beitrag # 3 von 19
Beitrag ID: #518569
Bewertung:
(9788 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

wie machst du dann das anpassen?

Muss ich vom letzten Absatz die 'baseline' ermitteln und dann diesen Wert an die geometricBounds übergeben? Ich hab das schön öfter mal gesehen, aber noch nie gemacht!


als Antwort auf: [#518568]
(Dieser Beitrag wurde von Kai Rübsamen am 17. Okt 2013, 19:22 geändert)

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 07:09
Beitrag # 4 von 19
Beitrag ID: #518580
Bewertung:
(9710 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat Muss ich vom letzten Absatz die 'baseline' ermitteln und dann diesen Wert an die geometricBounds übergeben?


So in etwa, allerdings wirst Du noch irgenwelche zusätzliche Werte addieren müssen, welche, hängt von der individuellen Situation ab.

Ich packe so etwas immer in eine eigene Funktion, die ich dann, nach Bedarf, um weitere Parameter erweitere.

Code
Ich hab das schön öfter mal gesehen, aber noch nie gemacht! 

Na ja, so etwas erlebt man beim Programmieren doch jeden Tag und oft hat man noch gar keinen Lösungsansatz gesehen.


als Antwort auf: [#518569]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 08:00
Beitrag # 5 von 19
Beitrag ID: #518581
Bewertung:
(9688 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

ich hab es jetzt so gelöst:

Code
function fitFrame(aFrame) {  
var gB = aFrame.geometricBounds;
gB[2] = gB[2]+ 50; // y2 temp. einen anderen Wert zuweisen
aFrame.geometricBounds = gB;

var lastBaseLine = aFrame.lines.lastItem().baseline;
aFrame.geometricBounds = [ gB[0], gB[1], lastBaseLine, gB[3] ];
}


Im Buch von Gregor Fellenz wird die Rahmenhöhe auch mit dem fit-Befehl angepasst.
Hat noch einer eine Idee, warum das bei mir mit fit nicht funktioniert bzw. ein merkwürdiges Ergebnis liefert?


als Antwort auf: [#518580]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 08:34
Beitrag # 6 von 19
Beitrag ID: #518582
Bewertung:
(9673 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Gutem Morgen Kai,

ich würde der Funktion als Parameter auch den Wert der temporären Vergrößerung mitgeben und als weiteren Parameter einen zusätzlichen Wert, um besser auf individuelle Situationen eingehen zu können, also in etwa so:
Code
///*void*/function fitFrame(/*TextFrame*/frame[, [/*int*/tempResizediff][, /*int*/adjustment]])  
/*void*/function fitFrame(/*TextFrame*/frame, /*int*/tempResizediff, /*int*/adjustment)
{
if (tempResizediff==null) tempResizediff=50;
if (adjustment==null) adjustment=0;
var gB = frame.geometricBounds;
frame.geometricBounds = gB;
// temp. einen anderen Wert zuweisen
gB[2] += tempResizediff;
var lastBaseLine = frame.lines.lastItem().baseline;
gB[2] = lastBaseLine+adjustment;
frame.geometricBounds = gB;
return;
}



als Antwort auf: [#518581]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 09:06
Beitrag # 7 von 19
Beitrag ID: #518583
Bewertung:
(9659 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Werner, danke für deine Zeilen. Denkst du noch dran, dass du hier mit einem Grafiker u. Skriptanfänger sprichst? Ich habe keine Ahnung, was du da in deinen ersten beiden Zeilen alles machst, bzw. was ich da eintragen soll ;-)


als Antwort auf: [#518582]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 09:33
Beitrag # 8 von 19
Beitrag ID: #518586
Bewertung:
(9648 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,
Zitat Werner, danke für deine Zeilen. Denkst du noch dran, dass du hier mit einem Grafiker u. Skriptanfänger sprichst?

;-) eigentlich schon, deshalb war ich hier besonders ausführlich.

Alos, die ersten zwei Zeilen:
Code
///*void*/function fitFrame(/*TextFrame*/frame[, [/*int*/tempResizediff][, /*int*/adjustment]]) 

// -> hiermit beginnt ein Zeilenkommentar
/* ->hiermit beginnt ein Kommentar mit variabler Länge, der mit */ endet.
/*void*/ -> beschreibt den Rückgabewert der Funktion: -> kein Rückgabewert.
[i]function Programmteil, der über einen Namen mit/ohne Parameter mehrfach aufgerufen werden kann:
In den Klammern werden Werte oder Zeiger(Referenzen) übergeben. Werte sind zum Beispiel Strings, Zahlen, Booleans, Referenzen sind z. B. Arrays und Objekte.
Wenn übergebene Werte in einer Funktion verändert werden, ändern sie sich in der aufrufenden Routine nicht, wenn [i]Inhalte (Properties) von Objekten verändert werden, hat das Auswirkungen auf alle Stellen im Skript, bei denen diese Objekte genutzt werden.
Parameter in eckigen Klammern in einer Beschreibung:
Dieser Parameter ist optional, wenn er nicht verwendet wird, wird ein Standardwert verwendet:
---> z. B.:
Code
    if (tempResizediff==null) tempResizediff=50; 
if (adjustment==null) adjustment=0;

Optionale Parameter dürfen aber nur weggelassen werden, wenn keine weiteren Parameter folgen, deshalb kannst Du die Funktion so aufrufen:
Code
fitFrame(/*TextFrame*/frame, /*int*/tempResizediff);  
fitFrame(/*TextFrame*/frame, /*int*/tempResizediff, /*int*/tempResizediff);
fitFrame(/*TextFrame*/frame, /*int*/tempResizediff, /*int*/tempResizediff, /*int*/adjustment);

aber nicht
Code
fitFrame(/*TextFrame*/frame, /*int*/tempResizediff, /*int*/adjustment); 

so,
sondern so:
Code
fitFrame(/*TextFrame*/frame, /*int*/tempResizediff, null, /*int*/adjustment) 


Die meisten dieser Infos findest in guten Büchern über Skriptprogrammierung, manche Dinge sollten selbsterklärend sein -> daür gibt es Kommentarfunktionen.

Besser?

Wenn nicht, frage gezielt nach.


als Antwort auf: [#518583]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 11:37
Beitrag # 9 von 19
Beitrag ID: #518592
Bewertung:
(9582 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

so hab ich es ungefähr verstanden ;-) Danke für die ausführliche Erklärung.


als Antwort auf: [#518586]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 11:40
Beitrag # 10 von 19
Beitrag ID: #518594
Bewertung:
(9579 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat Danke für die ausführliche Erklärung.

Da nich für. ;-)
aber
Zitat ungefähr

?
Wo klemmt's?


als Antwort auf: [#518592]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 12:18
Beitrag # 11 von 19
Beitrag ID: #518599
Bewertung:
(9559 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich glaub, wir sollten es hierbei bewenden lassen.

Mir geht es so, dass ich Dinge immer nur häppchenweise verstehe und dann kommt es unheimlich auf den Sprachgebrauch drauf an!

D.h. alleine die Namensgebung von Variablen, Kommentare im Code, Weglassen von Dingen (die viell. nützlich, aber für eine Grundversion nicht zwingend notwendig sind) machen es leichter für mich.

Ungefähr bedeutet, dass ich es jetzt so schreiben würde, wie ich es gemacht habe, weil ich DAS jetzt verstehe. Deinen Schnipsel (mit der Übergabe von Werte, Vergleich von etwas, dass viell. null ist) aber gespeichert habe u. den viell. in einem halben Jahr auch richtig verstehen werde.


als Antwort auf: [#518594]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 12:32
Beitrag # 12 von 19
Beitrag ID: #518601
Bewertung:
(9544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat Ich glaub, wir sollten es hierbei bewenden lassen.

Ja, vielleicht.

Besser wäre es, wenn Du solche Dinge im Einzelschrittverfahren durchgehst.

Und dann denkst Du vielleicht auch etwas zu kompliziert.

Dieser Aufruf entspricht in der Funktionalität genau Deinem Skript:

Code
fitFrame(/*TextFrame*/frame) 


Das heißt, Du kannst Deine Funktion ohne jede Änderung durch meine ersetzen.
Code
fitFrame(aFrame) 

Falls Du jetzt merkst, dass die Vergrößerung um 50 nicht ausreicht und 100 besser wäre, rufst Du die Funktion einfach so auf:
Code
fitFrame(aFrame, 100) 

Falls Du bei Deinen Überlegungen übersehen hast, dass Du zusätzlich zum Wert der [i]lastBaseLine noch einen Rand mit Wert 10 berücksichtigen musst, rufst Du die Funktion so auf:
Code
fitFrame(aFrame, null, 10) 


Und wenn Du Zeit und Lust hast, schaust Du Dir im Einzelschrittverfahren an, was bei diesen Änderungen innerhalb der Funktion geschieht.


als Antwort auf: [#518599]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 14:48
Beitrag # 13 von 19
Beitrag ID: #518604
Bewertung:
(9495 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

ich glaub, du formulierst erstmals so, dass es auch – von mir – zu verstehen ist und wir sind auf einem guten Weg. Ich hab deine zusätzlichen Parameter jetzt verstanden :)

Ich beherzige nun deinen Rat und gehe alles im Einzelschrittmodus durch und beobachte im Datenbrowser was passiert.

Frage:
Wenn ich in der Funktion bin und "if (tempResizediff==null)" in der Javascript-Konsole prüfe, erhalte ich als Ergebnis: "Fehler: Lesen über EOF (Dateiende) hinaus"

Ich verstehe es so, dass du in der Funktion eine Variable tempResizediff deklarierst. Übergebe ich im Funktionsauf einen entsprechenden Parameter hat die Variable einen Wert. Übergebe ich aber keinen, ist doch die Variable undefined??

1. Ist "undefined" und "null" dasselbe?
2. Warum erhalte ich in der Konsole die o.g. Fehlermeldung u. was bedeutet sie?
3. Warum brauche ich am Schluss deiner Funktion return? Wie sehe ich, was damit zurück kommt?

Danke.


als Antwort auf: [#518601]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

WernerPerplies
Beiträge gesamt: 2762

18. Okt 2013, 15:42
Beitrag # 14 von 19
Beitrag ID: #518610
Bewertung:
(9467 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat ich glaub, du formulierst erstmals so, dass es auch – von mir – zu verstehen ist und wir sind auf einem guten Weg. Ich hab deine zusätzlichen Parameter jetzt verstanden :)

wie schön ;-)
Zitat Frage:
Wenn ich in der Funktion bin und "if (tempResizediff==null)" in der Javascript-Konsole prüfe, erhalte ich als Ergebnis: "Fehler: Lesen über EOF (Dateiende) hinaus"

Wenn Du Dir das Statement mal genau ansiehst, müsstest Du die Frage eigentlich selbst beantworten können:
Code
if (Bedingung) 
{ mache irgend etwas }
else (oder wenn die Bedingung nicht gilt
{ mache etwas anderes}

Die {} kann man weglassen, wenn der ausführende Teil nur aus einem Statement besteht.

Wenn Du also if (Bedingung) in der Konsole eingibst, ist das Statement unvollstandig!

Gebe deshalb nur die Bedingung ein:
(tempResizediff==null)

Zitat 1. Ist "undefined" und "null" dasselbe?

Nein!
undefined bedeutet niemals für einen Gültigkeitsbereich deklariert
null -> deklariert, aber nichts oder null zugewiesen.

Wenn einem Parameter im Funktionsaufruf nichts zugewiesen wird, enthält er null.

Wenn Du aber beispielsweise Deinen Parameter in der Funktion falsch schreibst, ist er undefined!

Ein nicht zugwiesener Parameter entspricht in etwa dieser Deklaration
var test;

Allerdings kann ein Vergleich (null==undefined) durchaus positiv sein, das liegt an der internen Typumwandlung bei Javascript.

Das kannst Du leicht überprüfen, in dem Du genauer vergleichst:

(null==undefined) -> true
(null===undefined) -> false
(null===null) true

Alles klar?

Erschlage bitte nicht den Boten der Botschaft ;-)

Zitat 2. Warum erhalte ich in der Konsole die o.g. Fehlermeldung u. was bedeutet sie?

Weil sich der Interpreter auf die Suche nach dem kompletten Kommando macht und deshalb über das Dateiende hinaus lesen will.

Zitat 3. Warum brauche ich am Schluss deiner Funktion return? Wie sehe ich, was damit zurück kommt?

Ein return ohne Wert zurückzugeben kann man weglassen, ich mache das aber in der Regel nicht.
Zurück kommt, was Du zurück gibst:
return Das gebe ich zurück;
Prüfung in der Konsole während des Debugging:
MeineFunktion()

So, ich hoffe, das war jetzt nicht zu schwierig und einigermaßen klar beantwortet.

Eine Anmerkung noch:
Du schriebst mal, das du das Buch von Grant Gamble hast, hast Du es auch gelesen?

Kapitel 11 (in meiner Ausgabe) - Error handling and debugging
ist echt Klasse und allein schon den Anschaffungspreis wert.


als Antwort auf: [#518604]

Textrahmen> .fit (FitOptions.FRAME_TO_CONTENT)

Kai Rübsamen
Beiträge gesamt: 4684

18. Okt 2013, 18:42
Beitrag # 15 von 19
Beitrag ID: #518626
Bewertung:
(9426 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Eine Anmerkung noch:
Du schriebst mal, das du das Buch von Grant Gamble hast, hast Du es auch gelesen?

siehe oben! Ich weis nicht, ob du oder ein erfahrener Skripter das verstehen kann: Du liest etwas 10x und denkst: Was will der Typ von mir?! Ich hab das Buch noch nicht komplett gelesen, wohl aber mehrmals überflogen.

Oder: Das ich kein halbes if-Statement in der Konsole prüfen kann, erscheint mir jetzt logisch. Von alleine wäre ich allerdings nicht darauf gekommen!

Ansonsten habe ich alles verstanden :)

Letzte Frage im Beitrag:
Wenn ich in der Funktion 3 Variablen angebe, im Aufruf aber nur einen Parameter übergebe, macht das Skript bei mir nichts. Ich nehme an, ich muss dann diese Variablen wie von dir auskommentiert in eckige Klammern, also optional setzen? Wenn ich hier deinen Code entkommentiere, erhalte ich Fehler und das ESTK will, dass ich runde Klammern setze.

Schreib mir doch bitte mal eine lauffähige Version ohne Kommentare in den Beitrag, in der deine beiden zusätzlichen Parameter optional sind. Danke.


als Antwort auf: [#518610]
X