[GastForen Programmierung/Entwicklung AppleScript Bounds - Format

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

Bounds - Format

Anonym
Beiträge gesamt: 22827

18. Okt 2003, 17:30
Beitrag # 1 von 5
Bewertung:
(1586 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, ich bin ein ziemlicher Anfänger mit AS und habe eine Frage:
Ich möchte bestimmte Textboxen einer Seite (mehr als 50 in differierender Reihenfolge) über bounds ansprechen. Das sieht dann (bei mir!)  so aus:

tell application "QuarkXPress Passportª 4.11 [k]"
 set boxlist to {}
 tell document 1
 activate
 set EmptyCount to 0
 set boxlist to {{0, 0, 50, 50}}
 --nur ein Eintrag zum Testen!
 set lastCount to count of items in boxlist
 repeat with j from 1 to count of text boxes
 repeat with i from 1 to lastCount
 if properties of text box j is {bounds:(item i of boxlist)} then
 --beliebige Aktion
 set EmptyCount to EmptyCount + 1
 end if
 end repeat
 end repeat
 end tell
end tell

Es funktioniert nicht!!?? Ich habe es schon mit dem get bounds of current box - Befehl versucht, den Text im Ergebnisfenster kopiert und eingesetzt usw., aber irgendwie muss es wohl mit dem Format meiner vorgegebenen Ränder zu tun habe.
Mir fällt  momentan nichts mehr ein, vielleicht erbarmt sich ja jemand. Besten Dank im Voraus.

MfG

KWS
X

Bounds - Format

Anonym
Beiträge gesamt: 22827

18. Okt 2003, 17:43
Beitrag # 2 von 5
Beitrag ID: #418371
Bewertung:
(1585 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mittlerweile habe ich es dank der Entdeckung des Eventprotokolles probiert mit:

if bounds of text box j is item i of boxlist then
--beliebige Aktion

Hat leider auch nicht funktioniert.

Weiss nix mehr

MfG

KS


als Antwort auf: [#418370]

Bounds - Format

Hans Haesler
  
Beiträge gesamt: 5826

18. Okt 2003, 23:42
Beitrag # 3 von 5
Beitrag ID: #418372
Bewertung:
(1585 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo KWS,

wo liegt denn Tschuldigung? In Rodgau ist ja allerhand los: Lauftreff, Frauenzimmer, RadfahrerInnen-Club, Drachenclub... ;-)

Zu Deinem Problem. Die 'bounds', also die vier Positions-Parameter von Boxen ('top of bounds' = oberer Rand, 'left of bounds' = linker Rand, 'bottom of bounds' = unterer Rand, 'right of bounds' = rechter Rand) werden als 'measurement rectangle' = Masseinheiten-Rechteck zurückgegeben. Versuche es selbst und wähle Deine Musterbox aus (das Quadrat von 50 x 50 mm mit der Position x = 0, y = 0) und führe folgendes Script aus (Tip: wenn Du den Namen der Programm-Datei auf "QuarkXPress 4.11" kürzest, dann musst Du etwas weniger tippen):
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set boxBounds to bounds
  end tell
end tell
---
Das Ergebnisfenster zeigt eine Liste von Textketten: {"0 mm", "0 mm", "50 mm", "50 mm"}

Wenn man das Script mit der Zeile 'class of boxBounds' ergänzt, sich also nach der Klasse des Resultats erkundigt, dann erhält man als Antwort: 'measurements rectangle' (das erwähnte Masseinheiten-Rechteck). Also keine "normale" Liste.

Ein ähnliches Ergebnis erhält man mit folgendem Script, welches die Klasse des oberen Randes untersucht:
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set y1 to top of bounds
  end tell
end tell
--> "0 mm"
Sieht aus wie ein String (eine Textkette), weil mit An- und Abführungszeichen eingefasst. Ist aber keiner:
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set y1 to top of bounds
  end tell
end tell
class of y1
--> vertical measurement (also eine Konstante, eine senkrechte Masseinheit).

Die 'bounds' müssen zu Beginn als Liste verlangt werden. Ein Kurzverfahren setzt die Variablen für die vier Komponenten (top, left, bottom, right) in eine Liste: 'set {y1, x1, y2, x2} to bounds as list' – und schon ist das 'measurements rectangle' in eine Liste konvertiert.

Nun müssen die vier Werte in Bruchzahlen (= 'as real') verwandelt werden (z.B. = 'set y1 to y1 as real'), damit man die Vergleiche mit den Vorgabewerten in der Liste 'boxlist' anstellen kann. Dazu gibt es verschiedene Wege.

Mit Deinem Beispiel siehst Du es richtig: mit einer Repeat-Schleife die Textboxen ansprechen und dann die Bounds mit den Werten der vorgegebenen Liste vergleichen. Aber statt auch eine Repeat-Schleife durch die Liste zu machen, kann man ganz einfach fragen, ob die Bounds-Werte der aktuellen Box in der Liste stehen:
---
set boxlist to {{0, 0, 50, 50}, {10, 10, 60, 60}, {20, 20, 70, 70}}

tell document 1 of application "QuarkXPress 4.11"
  activate
  repeat with i from 1 to count of text boxes
    tell text box i
      set {y1, x1, y2, x2} to bounds as list
      set realValues to {{y1 as real, x1 as real, y2 as real, x2 as real}}
      if realValues is in boxlist then
        set AppleScript's text item delimiters to {", "}
        display dialog "Bounds: " & realValues & "
               
Habe die Box gefunden!" buttons "OK" default button 1 with icon 1
        set AppleScript's text item delimiters to {""}
      end if
    end tell
  end repeat
end tell
---
Die 'AppleScript's delimiters' werden auf "Komma und Zwischenraum" gesetzt, damit beim Anzeigen die vier Werte getrennt werden. Den Dialog kannst Du durch die gewünschte Aktion ersetzen.

Achtung: wenn eine Box einen (oder mehrere) vermeintlich geraden Wert aufweist (z.B. "50 mm"), der aber in Wirklichkeit von "49.9999" in der Masspalette aufgerundet wurde, dann wird die Box nicht erkannt.

Trotzdem: viel Erfolg und viel Spass!

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418370]

Bounds - Format

Hans Haesler
  
Beiträge gesamt: 5826

19. Okt 2003, 09:29
Beitrag # 4 von 5
Beitrag ID: #418373
Bewertung:
(1585 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo KWS,

wie oben schon erwähnt, rundet XPress die Werte für die Anzeige in der Masspalette. Und zwar auf die dritte Stelle hinter dem Komma. Im Extremfall erscheint dann eine schön runde Zahl, aber intern ist der Wert "krumm". Ein Beispiel: erzeuge eine Textbox und ändere den Y-Wert (die vertikale Position) auf "49.9999". Nach der Bestätigung mit der Return-Taste wird daraus "50 mm".

Nun führe dieses Script aus:
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    top of bounds as real
  end tell
end tell
---
Das Ergebnisfenster zeigt 49.999893188477 und wie schon gesagt: wenn man diesen Wert mit jenem, welchen man sieht, vergleicht, dann gibt es keine Übereinstimmung.

Um diese Problem mit den eventuell auf- oder abgerundeten Werten zu umgehen, gibt es mehr als eine Lösung. Hier die zwei einfachsten.

1) Man könnte den Wert als Text verlangen, den Zwischenraum und die Masseinheit abschneiden und erst dann in eine Bruchzahl verwandeln.
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set y1 to top of bounds as string
    --> "50 mm"
    set y1 to (text 1 thru -4 of y1)
    --> "50"
    set y1 to y1 as real
    --> 50.0
  end tell
end tell
---
Das Abschneiden der drei letzten Zeichen der Textkette "50 mm" geschieht ganz einfach, indem man der Variablen 'y1' den Text vom ersten Buchstaben bis zum viertletzten (= -4) ihres Inhaltes zuweist. Beim nächsten Befehl wird dann der Wert in eine Bruchzahl verwandelt. Die Null als Nachkommastelle stört nicht, denn wenn man '50' mit '50.0' vergleicht, gibt es eine Übereinstimmung.

2) Bruchzahlen werden als 'real' bezeichnet, Ganzzahlen als 'integer'. XPress hat ein weiteres Format: 'fixed', was "auf- oder abgerundet" bedeutet.
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set y1 to top of bounds as fixed
    --> "50"
    set y1 to y1 as string
    --> "50"
    set y1 to y1 as real
    --> 50.0
  end tell
end tell
---
Die Ergebnisse von 'as fixed' und 'as string' sehen identisch aus. Doch die 'class' des ersten ist 'fixed' und jene des zweiten ist 'string'. Und diesen Umweg brauchen wir, damit nicht wieder der Rattenschwanz von Nachkommastellen erscheint.

Man kann aber die drei Zeilen in eine einzige zusammenfassen ...
---
tell document 1 of application "QuarkXPress 4.11"
  tell current box
    set y1 to top of bounds as fixed as string as real
  end tell
end tell
---
... damit die Formel etwas platzsparender dargestellt ist. Sie wird aber nicht schneller ausgeführt.

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418370]

Bounds - Format

Anonym
Beiträge gesamt: 22827

20. Okt 2003, 12:28
Beitrag # 5 von 5
Beitrag ID: #418374
Bewertung:
(1585 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die schnelle und umfangreiche Antwort. Das tschuldigung galt nicht für Rodgau selbst, sondern für den Namen an sich. Da hätten sie sich damals bei der Zusammenlegung der 5 Gemeinden was besseres einfallen lassen können.

Ich habe deine Antworten jetzt mal überlesen und gemerkt, dass ich mir zum Verständnis etwas mehr Zeit nehmen muss, das liegt aber  an meiner momentan "noch!?" beschränkten Kenntnis von AS.

Mit freundlichen Grüssen

Klaus Schwan
aus dem angenehmen Rodgau!!


als Antwort auf: [#418370]
X