[GastForen Programmierung/Entwicklung AppleScript ID CS6: Rechenungenauigkeiten bei div und mod?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

ID CS6: Rechenungenauigkeiten bei div und mod?

Goar
Beiträge gesamt: 392

9. Sep 2012, 17:37
Beitrag # 1 von 8
Bewertung:
(2663 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Skripter,

in einem Katalog sind immer wieder Bilder im Text verankert, die nicht spaltenbreit sind, es läuft also Text an einer Seite.
Die Texte haben immer die gleiche Typo, die Bilder schließen oben mit der Versaloberkante der ersten Zeile im Absatz ab; die Bildhöhe ist variabel, solange die Unterkante auf der Schriftlinie einer der nachfolgenden Zeilen steht.

Um die Bildhöhe komfortabel ändern zu können (je nach Umbrucherfordernissen und Bildinhalt) habe ich ein Skript geschrieben, dass die aktuelle Bildhöhe ermittelt, die Versalhöhe der Textschrift davon abzieht und den Rest durch den Zeilenabstand teilt (mit div). Dabei sollte eigentlich ein glatter Wert herauskommen. Da aber die Rahmenunterkante etwas nach oben oder unten gezupft worden sein kann, habe ich auch den Rest ermittelt (mit mod).

Die Rahmenhöhe ermittle ich aus den geometric bounds des Rahmens.
Die Versalhöhe und den Zeilenabstand habe ich als feste Werte in Variablen vorgegeben, was aber für mein Problem keine Rolle spielen dürfte.

So sieht der Teil des Skripts aus:


Code
set ascentCopy to 2.025 -- 2.026319037543 -- Schrifthöhe der Grundschrift 
set leadVal to 3.175 -- Zeilenabstand der Grundschrift

tell application "Adobe InDesign CS6"
set boxObjects to {rectangle, EPS, image}
set curSelection to selection


set {y1, x1, y2, x2} to geometric bounds of curObject
set frameHeight to y2 - y1
set frHghtminAsc to frameHeight - ascentCopy -- Höhe des Rahmens abzüglich des Ascent
set cntZAB to (frHghtminAsc div leadVal) -- soviel ganze ZAB ist der Rahmen hoch
set ZABover to (frHghtminAsc mod leadVal) -- soviel ragt der Rahmen unter die "letzte" Grundlinie

-- …
end tell


Meist klappt alles wunderbar, der Rest ist mal 0.0, mal 1.68753899743024E-14 oder ähnlich, also ganz weit weg vom Komma; oder der Rest ist 3.175 mit einer nicht angezeigten minimalen Abweichung und ergibt zusammen mit dem Ergebnis aus der div-Zeile die richtige Gesamtzeilenzahl. Mit diesen kleinen Ungenauigkeiten kann ich umgehen.

Jetzt gibt es aber auch den Fall, dass die div-Zeile z. B. bei einem 6 Zeilen hohen Rahmen 6 ergibt (ist ja auch in Ordnung) und die mod-Zeile 3.175. Dieser Fall tritt auf, ich konnte aber noch keine Logik dafür finden.

Kann mir da jemand auf die Sprünge helfen?
X

ID CS6: Rechenungenauigkeiten bei div und mod?

Hans Haesler
  
Beiträge gesamt: 5818

9. Sep 2012, 21:55
Beitrag # 2 von 8
Beitrag ID: #500585
Bewertung:
(2627 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

ich werde gerne versuchen, Dir auf die Sprünge zu helfen. Doch aus Erfahrung weiss ich, dass es in solchen Fällen notwendig ist, ein Demo-Dokument zu bekommen, mit welchem das Problem auf Anhieb nachvollzogen werden kann.

Bitte sende mir eine Testdatei. Allerdings kann ich mich frühestens Mittwochabend darum kümmern.

Gruss, Hans


als Antwort auf: [#500582]

ID CS6: Rechenungenauigkeiten bei div und mod?

-hans-
Beiträge gesamt: 748

10. Sep 2012, 08:22
Beitrag # 3 von 8
Beitrag ID: #500590
Bewertung:
(2590 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

das könnten tasächlich Rundungsdifferenzen sein, zumindest lässt es sich nachstellen ab der 14 Nachkommastelle.

Code
run script "1.99999999999999 mod 2" --> 2 
run script "1.99999999999999 div 2" --> 1


Also wäre ein Mittel die Kommastelle etwas nach hinten zu verschieben. Eventuell auf die Shell wechseln Z.B. "bc"; dort kann man auch die Zahl der Nachkommastellen (-scale) bestimmen.


als Antwort auf: [#500585]

ID CS6: Rechenungenauigkeiten bei div und mod?

Hans Haesler
  
Beiträge gesamt: 5818

13. Sep 2012, 20:06
Beitrag # 4 von 8
Beitrag ID: #500838
Bewertung:
(2529 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

ich bedanke mich für die Testdateien. Allerdings konnte ich das Problem ...

Zitat Jetzt gibt es aber auch den Fall, dass die div-Zeile z. B. bei einem 6 Zeilen hohen Rahmen 6 ergibt (ist ja auch in Ordnung) und die mod-Zeile 3.175. Dieser Fall tritt auf, ich konnte aber noch keine Logik dafür finden.

... nicht ausfindig machen.

Würdest Du mir bitte ein abgespecktes Dokument zustellen, und auf das Bild hinweisen, welches das Problem verursacht? Besten Dank im voraus.

Gruss, Hans


als Antwort auf: [#500582]

ID CS6: Rechenungenauigkeiten bei div und mod?

Hans Haesler
  
Beiträge gesamt: 5818

13. Sep 2012, 20:19
Beitrag # 5 von 8
Beitrag ID: #500844
Bewertung:
(2516 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

bc ist ein guter Hinweis. Wurde hier auch schon vorgeschlagen.
In dieser Diskussion: http://www.hilfdirselbst.ch/..._P422961.html#422961

Gruss, Hans


als Antwort auf: [#500590]

ID CS6: Rechenungenauigkeiten bei div und mod?

-hans-
Beiträge gesamt: 748

13. Sep 2012, 20:48
Beitrag # 6 von 8
Beitrag ID: #500847
Bewertung:
(2500 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Cool ;-),

damals hast Du mir sehr geholfen!

das lese ich mir morgen nochmal in Gänze durch :)

Danke Hans


als Antwort auf: [#500844]

ID CS6: Rechenungenauigkeiten bei div und mod?

Hans Haesler
  
Beiträge gesamt: 5818

13. Sep 2012, 21:41
Beitrag # 7 von 8
Beitrag ID: #500849
Bewertung:
(2472 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

ja, das war ein Ding!
Ende März 2009 vorgeschlagen und (meinerseits) seither nie mehr eingesetzt. :-)

Gruss, Hans


als Antwort auf: [#500847]

ID CS6: Rechenungenauigkeiten bei div und mod?

Goar
Beiträge gesamt: 392

14. Sep 2012, 08:45
Beitrag # 8 von 8
Beitrag ID: #500852
Bewertung:
(2406 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

habe mir die zitierte Diskussion auf der Zunge zergehen lassen.
Hoffentlich finde ich sie wieder, wenn ich mal was davon brauche.

Mein ursprüngliches Problem mit mod/div habe ich untypischerweise aufgegeben.

Inzwischen habe ich eine flüssige Version mit / (geteilt durch) geschrieben.

Code
set cntZABreal to (frHghtminAsc / leadVal) 
set cntZAB to cntZABreal as integer -- soviel ganze Zeilen ist der Rahmen hoch
set ZABover to cntZABreal - cntZAB -- soviel ragt der Rahmen unter die "letzte" Grundlinie


Das reicht für meine Zwecke.

Vielen Dank für Euren Einsatz!


als Antwort auf: [#500844]
X