Note: A French version of this text can be found here
______________
RagTime 5 kann unter Mac OS in fast allen Bereichen von einem AppleScript gesteuert werden. Damit lassen sich sowohl regelmäßige Aufgaben innerhalb RagTimes automatisieren als auch durch Integration mit anderen Programmen komplexe Speziallösungen bauen.
AppleScript ist zugleich die interne Scriptingsprache von RagTime (Macintosh). Scripts können also sowohl das Programm von außen steuern als auch innerhalb des Programms ablaufen (und dabei ggf. andere Programme steuern).
Die Abbildungen zeigen dasselbe Script, einmal in dem Script-Bearbeitungsfenster von RagTime, einmal in einem separaten Script Editor. In beiden Fällen verhält sich das Script gleich, wenn es gestartet wird.
Dieser Artikel gibt eine knappe Übersicht über die Arbeit mit AppleScript in RagTime. Er wurde ursprünglich für RagTime Version 5 geschrieben und hier leicht angepasst.
Wenn Sie AppleScripts für RagTime entwickeln, ist das normale Vorgehen:
Zunächst bauen Sie das Script in einem externen Editor auf. Das kann der Apple Skripteditor sein oder auch das Produkt eines anderen Herstellers wie der Script Debugger von Late Night Software. In unseren Abbildungen eines Editors wird durchweg der Script Debugger gezeigt.
Ist das Script fertig und soll in RagTime installiert werden, kopieren Sie den kompletten Scripttext aus Ihrem Editor. In RagTime legen Sie unter „Extras -> AppleScript -> Skripte verwalten“ ein neues Script an und setzten den Scripttext dort ein. Klicken Sie dann den Knopf „Aufheben“. In RagTime dauert vor allem bei längeren Scripten das Kompilieren und aufheben recht lange. Dieser Schritt sollte also zum Schluss erfolgen.
Umgekehrt können Sie auch den Text eines bestehenden Scripts aus RagTime kopieren und in einem anderen Script-Editor einsetzen. Dies Vorgehen ist sinnvoll, wenn Sie ein bestehendes Script überarbeiten wollen.
Beispielscripts in diesem Aufsatz sind vollständig gehalten, Sie können Sie also aus dem Browser in einen Script Editor kopieren und haben nach dem Kompilieren ihre bevorzugte Syntax-Färbung.
Der Name im RagTime-Scripteditor erscheint danach im RagTime-Menü, der Beschreibungstext wird als Hilfstext angezeigt, wenn die Maus über der Anweisung bleibt.
Versions-Hinweis: Beispiele für RagTime 6.5 und aktuelles OS X 10.5 angepasst. Dabei einige Änderungen insbesondere zum Objekt selection, die notwendig wurden. Bei der Gelegenheit hab ich noch Seiten zum Anlegen von Polygonen und Bézierkurven und zur Transformation von Zeichenobjekten ergänzt.
Juni 2009, Jürgen Schell
Mit einem Script-Editor können Sie das RagTime-Verzeichnis der vorhandenen AppleScript-Elemente öffnen. Am einfachsten geht das, indem Sie das Programm RagTime auf den Script Editor ziehen. Es wird ein Fenster angezeigt, dass bei den meisten Editoren links die Gruppen der AppleScript-Elemente zeigt. Unsere Abbildung zeigt das Fenster im Apple Scripteditor.
Die Liste ist in „Suiten“ gegliedert, Gruppen von sinnvoll zusammenhängenden Objekte und Anweisungen.
Die folgenden Seiten führen durch die wichtigsten Objekte, ihre Eigenschaften und ihre Anweisungen.
Der Dialog „Extras -> AppleScript -> Scripte verwalten“? zeigt in der Liste links zwei Haupteinträge: Die RagTime-Hilfsmittel (je nach RagTime-Version heißen sie etwas unterschiedlich) und den Titel Ihres aktiven Dokuments.
In den Hilfsmitteln und im Dokument können AppleScripts gesichert werden. Scripts in den Hilfsmitteln stehen immer zur Verfügung, wenn mit RagTime gearbeitet wird. Scripts in einem Dokument stehen nur zur Verfügung, wenn dieses Dokument im Vordergrund ist.
Durch Ziehen können Sie Scripts von einem Dokument auf die Hilfsmittel übertragen und umgekehrt. Ein Doppelklick auf ein Script öffnet den RagTime-Script-Editor für dieses Script. Mit dem Knopf „Neu“ legen Sie ein neues Script an.
Der Script-Editor von RagTime hat ähnlich dem AppleScript-Editor einen Bereich für die Beschreibung und für das Script selbst. Zusätzlich gibt es noch eine Bereich für den Titel.
Die Beschreibung hat eine Besonderheit: Was Sie hier eintippen, erscheint als Balloon-Hilfe, wenn ein Anwender mit der Maus auf den Script-Menüeintrag geht.
Beachten Sie noch den Knopf „Aufheben“. Er heißt absichtlich nicht „Sichern“. Wenn Sie ihn klicken, wird ein Script dem Dokument zugefügt (bzw. Änderungen in das Dokument übernommen). Dies findet aber zunächst nur im Hauptspeicher statt. Wenn Sie das Dokument nicht sichern, geht das Script beim Schließen verloren.
(Die Hilfsmittel werden automatisch gesichert, wenn Sie RagTime beenden.)
Wenn Scripte sich innerhalb RagTimes und außerhalb gleich verhalten, weshalb sollte man sie überhaupt in RagTime installieren?
a) Scripte in RagTime können Sie direkt aus dem Menü Extras aufrufen während Sie in RagTime arbeiten. Sie können Scripte auch Knöpfen auf Dokumentseiten zuweisen.
b) Der Teil der Scripte, der RagTime steuert, läuft innerhalb RagTimes deutlich schneller. (Wird zugleich ein anderes Programm wie FileMaker angesprochen, ist es für diesen Teil der Scripte gleichgültig, ob sie in RagTime oder im Skripteditor laufen.)
c) Scripte können in einem RagTime-Dokument gesichert sein. Dann kann das Dokument zusammen mit seinen Scripts eine komplexe Lösung bilden, die vollständig innerhalb einer Datei gesichert ist und sich deshalb leicht weitergeben lässt.
Textkomponenten heißen in RagTimes Scriptspache “text flows�. Ein text flow besteht aus paragraphs, words und characters.
Folgendes Script weist den Textinhalt einer ganzen Textkomponente einer Variable zu:
tell application "RagTime 6.5"
     tell document 1
          set derText to text flow 1 as text
     end tell
end tell
Beachten Sie dabei die Anweisung zur Typumwandlung, “as text�. Dies ist ungewöhnlich, aber ohne die Umwandlung wird der Text nicht korrekt zurück geliefert.
“as text� liefert liefert auch Text mit Zeichen aus anderen Schriftsystemen zurück, vgl. Abbildung.
Weitere typische Konstruktionen:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          set derText to paragraphs 2 thru 6 as text
     end tell
end tell
weist “derText� den Textinhalt der Absätze 2 bis 6 zu. Etwas aufpassen muss man bei Wörtern: Der Code
tell application "RagTime 6.5" -- Problembeispiel!!!
     tell text flow 1 of document 1
          set derText to words 2 thru 6 as text
     end tell
end tell
führt zu meist unerwünschten Resultaten. RagTime liefert die Wörter als Liste zurück und AppleScript verbindet deren Bestandteile zu einem Text. Das Ergebnis ist die Sequenz der Wörter, getrennt vom aktuellen text item delimiter von AppleScript, ohne Satzzeichen etc. Die korrekte Sequenz liefert:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          set derText to text from word 2 to word 6 as text
     end tell
end tell
Will man nur die Wörter, getrennt von Leerzeichen haben, kann man die erste Variante nehmen und den text item delimiter umsetzen:
tell application "RagTime 6.5" --Problembeispiel!!!
set AppleScript's text item delimiters to " "
tell text flow 1 of document 1
set derText to words 2 thru 3 as text
end tell
set AppleScript's text item delimiters to ""
end tell
(Man sollte den text item delimiter zum Schluss zurücksetzen, sonst kann es Nebenwirkungen auf andere Scripts geben.)
Texte werden am einfachsten mit “make new text� eingefügt:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          make new text at end with data " Schlusswort"
     end tell
end tell
Am Ende der Komponente wird “ Schlusswort� angehängt. Die Position kann mit den gängigen “at beginning�, “at end�, “at after� und “at before� erfolgen. Beispiele:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          make new text at after paragraph 2 with data "Dies ist ein zusätzlicher Absatz nach Absatz 2\r"
     end tell
end tell
Beachten Sie, dass nur am Ende des Textes ein Return steht, nicht am Anfang. “after paragraph� erzeugt immer einen neuen Absatz.
Eine Besonderheit von Texten ist, dass man oft dort etwas einfügen will, wo noch nichts steht. Soll heißen: Nicht Buchstabe 2 eines Absatzes soll auf xyz gesetzt werden, sondern zwischen Buchstabe 2 und 3 soll xyz eingefügt werden. In der von Apple normierten Text Suite ist das Hilfsmittel dafür der “insertion point�. Der folgender Code setzt am Anfang des zweiten Absatzes Text ein:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          set insertion point before paragraph 2 to "Dies ist ein neuer Anfangssatz für Absatz 2. "
     end tell
end tell
Statt “before paragraph 2� könnte auch “after paragraph 1� stehen. Der Effekt wäre derselbe. In dieser Notation können Sie das Ende eines Absatzes ansprechen in der Form:
...
set insertion point after character -2 of paragraph 2 to...
...
Achten Sie darauf, dass der insertion point mit after oder before, nicht aber mit at benutzt wird: Das Ziel ist nicht ein bestehendes Objekt.
Formeln sind in RagTime Eigenschaften. Bei Tabellen ist es intuitiv recht klar, dass Formeln als Eigenschaften von Zellen gefasst werden. In Texten mag das zunächst etwas verblüffen. Man setzt nicht eine Formel an einer Textstelle ein sondern man setzt die Formeleigenschaft einer Textstelle.
Formeln werden am einfachsten als Eigenschaft des insertion point gesetzt. Bei der Gelegenheit kann auch gleich das Werteformat präzisiert werden.
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          set insertion point before paragraph 2 to " "
          set formula of insertion point before paragraph 2 to "Heute()"
          set value format of first character of paragraph 2 to "Vollständiges Datum"
     end tell
end tell
fügt am Anfang des zweiten Absatzes ein automatisches Datum ein, gefolgt von einem Leerzeichen. Analog:
tell application "RagTime 6.5"
     tell text flow 1 of document 1
          set insertion point before paragraph 2 to "\t"
          set paragraph numbers of insertion point before paragraph 2 to ""
     end tell
end tell
Dieser Code setzt eine (römische) Absatznumerierung am Anfang von Absatz 2 ein, gefolgt von einem Tab. (Die Syntax für Absatznummer-Formeln finden Sie in der RagTime On-Screen-Referenz unter dem Stichwort “Absatznummern (Menü)�)
Im Falle von Bildern braucht man fast immer den Import. Folgender Code lädt eine Datei in ein RagTime-Dokument:
set dasBild to choose file with prompt "Bitte Bild wählen"
tell application "RagTime 6.5"
     tell document 1
          make new picture at end with data dasBild
     end tell
end tell
Das Bild erscheint im Inventar und ist nirgends platziert. Die Komponente hat den Namen der Bilddatei. Folgender Code lädt ein neues Bild in eine bestehende Komponente:
set dasBild to choose file with prompt "Bitte Bild wählen"
tell application "RagTime 6.5"
     tell document 1
          change picture 1 to dasBild
     end tell
end tell
Bei der change-Anweisung kann man auch expizit angeben, ob das Bild mit der Datei verknüpft sein soll oder nicht: “...dasBild with link to file� oder “...dasBild without link to file�. Soll ein Bild mit Verknüpfung geladen werden, benutzt man zuerst make ohne data, dann change:
set Bilddatei to choose file with prompt "Bitte Bild wählen"
tell application "RagTime 6.5"
     tell document 1
          set dasBild to make new picture at end
          change dasBild to Bilddatei with link to file
     end tell
end tell
Unter den properties von Bildern befinden sich welche, die den guten RagTime-Kenner verblüffen werden: scaling, horizontal scaling und vertical scaling.
Ein Bild kann in einem Dokument mehrfach platziert sein und dabei in jedem der Container eine andere Skalierung haben. Skalierung ist genau genommen nicht die Eigenschaft eines Bildes sondern einer konkreten Installation des Bildes. Sehen wir uns zuerst an, was die Abfrage einer Skalierung liefert. In einem Dokument haben wir dafür zwei Bilder geladen. Das erste ist einmal platziert und auf 50% skaliert. Das zweite ist doppelt platziert, einmal mit 25%, einmal mit 75 % Skalierung. In das folgende Script sind die Antworten aus dem AppleEvent Log hineinkopiert:
tell application "RagTime 6.5"
     tell document 1
          get scaling factor of picture 1
          --> 0.5
          get scaling factor of picture 2
          --> {0.25, 0.75}
     end tell
end tell
Im Falle des einfach platzierten Bildes wird eine Zahl geliefert, im anderen eine Liste. Die Liste enthält alle vorkommenden Skalierungsfaktoren. Ist ein Bild mehrfach platziert aber immer mit derselben Skalierung, wird nur eine Zahl und keine Liste geliefert.
Mit set darf nur eine Zahl benutzt werden:
tell application "RagTime 6.5"
     tell document 1
          set scaling factor of picture 1 to 0.5
     end tell
end tell
Dieser Code setzt die Skalierung aller Installationen von Bild 1 auf 50%.
Wollen Sie bei mehrfach installierten Bildern mit der Skalierung einer bestimmten Installation arbeiten, führt der Weg über den contents des Containers.
Die Abfrage:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          scaling factor of contents of rectangle 2
     end tell
end tell
Die Form beim setzen:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set scaling factor of contents of rectangle 2 to 0.3
     end tell
end tell
Dichter an der RagTime-Bedienung über Menü ist die Anweisung “align picture�. Hier einige Beispiele:
tell application "RagTime 6.5"
     tell document 1
          align picture picture 1 relative size fitting picture to frame
     end tell
end tell
passt alle Installationen eines Bildes an den Container an. Dabei erscheint ggf. die Meldung, ob die Einstellung “Original Seitenverhältnis bewahren� ausgeschaltet werden soll.
Mit der Zeile “align picture picture 1 relative size fitting picture to frame keeping proportions� kann das Seitenverhältnis bewahrt werden.
align picture kann nicht direkt für einzelne Installationen benutzt werden
tell application "RagTime 6.5" -- Problem-Beispiel!!!
     tell page 1 of layout 1 of document 1
          align picture (contents of rectangle 1) horizontally at left side
     end tell
end tell
richtet alle Installationen aus. Dies ist einer der wenigen Fälle, in denen Sie beim RagTime-Scripting notfalls über eine Auswahl arbeiten müssen:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          select contents of rectangle 1
     end tell
     align picture selection horizontally at left side
end tell
(Achtung: Weil Dokumente keine Auswahl kennen sondern nur das Programm und Fenster, muss hier das align picture außerhalb des “tell page...� stehen!)
Formatvorlagen sind generell eine Zusammenfassung von Eigenschaften unter einem Namen, die dann Objekten insgesamt zugewiesen werden können. Eine Schriftvorlage umfasst z.B. die Schriftart, -größe, -farbe etc. Eine Absatzvorlage kennt Ränder, Zeilen- und Absatzabstände... Linienvorlagen kennen Linienstärken, -strichelungen, Arten von Linienenden...
Formatvorlagen sind Bestandteil eines Dokuments auf oberster Ebene. Bei der Arbeit stehen immer die Vorlagen aus zwei Dokumenten zur Verfügung: die des aktuellen Dokuments und die des RagTime-Hilfsmittel-Dokuments.
Weil neu angelegten Objekten in einem neuen Dokument immer bestimmte Standardvorlagen aus den Hilfsmitteln zugeordnet wird (solange der Anwender keine andere wählt), steckt in diesen Vorlagen auch ein großer Teil der RagTime-Voreinstellungen, beispielsweise, welche Schriftart ein neues Dokument voreingestellt bekommt.
Bei allen Unterschieden in den einzelnen Merkmalen werden Formatvorlagen sehr einheitlich bearbeitet.
tell application "RagTime 6.5"
     tell document 1
          make new character style sheet at end
     end tell
end tell
erzeugt eine neue Schriftvorlage mit dem Standardnamen (“Ohne Titel�), öffnet das Fenster zur Bearbeitung der Vorlagen und wählt sie aus.
Nicht geöffnet wird das Fenster, wenn die Vorlage zusammen mit ihren properties angelegt wird:
tell application "RagTime 6.5"
     tell document 1
          make new character style sheet with properties {name:"Vorlage 1", font:"Arial", size:10} at end
     end tell
end tell
Das Ergebnis ist eine Schriftvorlage namens “Vorlage 1� im Dokument, die 10 Punkt Arial benutzt.
Die meisten Arten von Formatvorlagen kennen Hierarchien für vererbte Merkmale. Eine Schriftvorlage unterhalb von Standardschrift kann alle Merkmale von Standardschrift erben, die Größe z.B. könnte man dagegen aus der Vererbung herausnehmen und fest, unvererbt festlegen. Wenn man dann die Schriftart von Standardschrift ändert, ändert sich auch die (vererbte) Schriftarteigenschaft des untergeordneten Stils, die Größe würde in diesem Beispiel aber nicht mit geändert werden. Für die Vererbung muss man neue Vorlagen in der Hierarchie einordnen können. Betrachten Sie folgendes Script:
tell application "RagTime 6.5"
     tell document 1
          set stil_1 to (make new character style sheet with properties {name:"Top Stil"} at before character style sheet 1)
          set stil_2 to (make new character style sheet with properties {name:"Kind 1"} at end of stil_1)
          set stil_3 to (make new character style sheet with properties {name:"Kind 2"} at end of stil_1)
          set stil_4 to (make new character style sheet with properties {name:"Enkel"} at end of stil_2)
     end tell
end tell
Der Stil “Top Stil� wird vor dem ersten vorhandenen Stil angelegt. Da der bisher erste Stil immer auf oberster Ebene (d.h. ohne geerbte Eigenschaften) liegt, liegt jetzt auch Top Stil auf oberster Ebene.
Unterhalb von Top Stil werden die beiden Stile “Kind 1� und “Kind 2� angelegt. “Enkel� dagegen wird unterhalb von “Kind 1� angelegt. Wenn man dieses Script auf ein neues Dokument anwendet, sieht die Anordnung der Schriftvorlagen im Inventar aus wie Abgebildet.
Es gibt im Dokument spezielle Vorlagen für Farben, die zu einem von drei Farbmodellen gehören, die RagTime kennt: RGB, CMYK und CIE Lab.
Grundsätzlich werden Farben wie folgt angelegt:
tell application "RagTime 6.5"
     tell document 1
          make new named color with properties ¬
               {name:"Lab-Rot", kind:process, color:{LabL:50, Laba:80, Labb:80}} at end
     end tell
end tell
Die Script-Bezeichnung für benannte Farben ist “named color�. Im record der properties ist ein Eintrag wiederum ein record: color. Für Lab- und RGB-Farben hat dieser record drei Einträge, für CMYK 4. Die benutzten Koordinaten im record bestimmen das Farbmodell. Beispiele für die drei Modelle:
color: {LabL:80, Laba:-50, Labb:-60}
color: {red:0.0, green:82.0, blue:100.0}
color: {cyan:55.0, magenta:0.0, yellow:6.0, black:0.0}
(Es ist in diesen records sinnlos, Koordinaten verschiedener Modelle zu mischen.)
Bei Lab liegen die Werte für Luminanz im Bereich 0 bis 100, die beiden Farbton-Koordinaten a und b liegen im Bereich von -127 bis +128.
Die Komponenten von RGB- und CMYK-Farben werden in Prozent angegeben, also im Wertebereich von je 0 bis 100.
Infografiken haben sehr viele Eigenschaften, die meisten sind aber einfach zu handhaben. Als Einstieg zeigen wir ein Script, dass ein komplettes Beispiel-Dokument aufbaut. Zunächst wird ein Rechenblatt auf einer Seite mit ein paar Werten angelegt. (Die Werte werden in den Rechenblattbereich einfach als Text eingetragen. Dies entspricht einer manuellen Eingabe einschließlich der normalen Typerkennung. Man könnte auch den Bereich A2:B6 in einem Durchlauf setzen, indem man abwechselnd Tabulatoren und returns zwischen den Zahlen einfügt. Die Konstruktion hier wurde gewählt, damit Kopieren / Einsetzen aus dem Web-Browser funktioniert.)
Dann wird eine Infografik erzeugt, in einem Rechteck platziert und ihre Eigenschaften gesetzt:
-----------------------------
set Werte1 to "4
6
3
8"
set Werte2 to "2
3
9
3"
tell application "RagTime 6.5"
     set dasdokument to (make new document with properties {component types:layout} at end)
     tell dasdokument
          delete every drawing object of page 1 of layout 1
          set dieTabelle to (make new table at end)
          tell dieTabelle
               set range "A2:A6" to Werte1
               set range "B2:B6" to Werte2
          end tell
          make new rectangle at beginning of page 1 of layout 1 with data {100, 50, 400, 250}
          set contents of rectangle 1 of page 1 of layout 1 to dieTabelle
          make new rectangle at beginning of page 1 of layout 1 with data {100, 300, 400, 800}
          -- Damit ist die Seite aufgebaut und der Code für die Grafik kann beginnen
          set dieGrafik to (make new graph at end)
          set contents of rectangle 1 of page 1 of layout 1 to dieGrafik
          set chart type of dieGrafik to xy graph
          set neueserie to (make new series at end of dieGrafik)
          set formula of x value list of neueserie to name of dieTabelle & "!A2:A7"
          set formula of y value list of neueserie to name of dieTabelle & "!B2:B7"
     end tell
end tell
-----------------------------
Der einzige interessante Trick hier ist, wie die Formeln für die Datenreihe aufgebaut wird. Die Formel wird als Text übergeben. Sie enthält den Namen des Rechenblatts, dann ein Semikolen und abschließend den Bereich. Der Teil ab dem Semikolen ist hier als Textkonstante fest eingegeben. Der Name davor wird über “name of dieTabelle� berechnet.
Pipelines sind Bestandteile des Dokuments auf oberster Ebene und nicht einzelnen Komponenten zugeordnet. Master Pipelines sind die Variante, die für Stammlayouts benutzt wird. Wiederum sind sie nicht Bestandteil des Stammlayouts sondern des Dokuments.
Angelegt werden sie mit einer Liste von Referenzen auf Container. Ein Script-Beispiel vermittelt die Struktur am besten. Angenommen wird ein Dokument mit einem Layout und diversen Seiten. Jeweils rectangle 1 auf jeder Seite soll in die Pipeline aufgenommen werden:
set rechteckListe to {}
tell application "RagTime 6.5"
     tell document 1
          tell layout 1
               repeat with n from 1 to count pages
                    copy (a reference to rectangle 1 of page n) to end of rechteckListe
               end repeat
          end tell
          set diePipeline to make new pipeline with data rechteckListe at end
     end tell
end tell
Nach der repeat-Schleife enthält rechteckListe die Referenzen auf die Rechtecke, in der make-Anweisung werden sie übergeben. Die Variable diePipeline enthält anschließend einen Wert wie
pipeline "Pipeline 1" of document id 1 of application "RagTime 6.5"
Soll die Pipeline anschließend noch im Script bearbeitet werden, muss man sich diesen Bezug unbedingt in eine Variable schreiben, man hat sonst kaum eine Chance, die Pipeline wieder anzusprechen.
Im folgenden Script erzeugen wir eine Pipeline, die abwechselnd das rectangle 1 jeder Seite mit einer vertikalen und einer horizontalen Verbindung versieht. Installiert man in dieser Pipeline ein Rechenblatt, werden die ersten Spalten auf den (linken) Seiten 2, 4, 6.. gezeigt. Die folgenden Spalten der Tabelle erscheinen auf den (rechten) Seiten 3, 5, 7...
set rechteckListe to {}
tell application "RagTime 6.5"
     tell document 1
          tell layout 1
               set seitenAnzahl to count pages
                    repeat with n from 2 to seitenAnzahl by 2
                         copy (a reference to rectangle 1 of page n) to end of rechteckListe
                    end repeat
          end tell
          set diePipeline to make new pipeline with data rechteckListe at end
          repeat with n from 1 to round ((seitenAnzahl - 1) / 2) rounding down
               set horizontal successor of pipeline element n of diePipeline to rectangle 1 of page (n * 2 + 1) of layout 1
          end repeat
     end tell
end tell
In der ersten Schleife wird die vertikale Pipeline auf mit den Rechtecken auf den geraden Seiten angelegt.
In der zweiten Schleife wird jedem Element der Pipeline ein horizontaler Nachfolger zugewiesen.
Die Eigenschaften horizontal successor, vertical successor, horizontal predecessor und vertical predecessor gehören den Objekten “pipeline element�. Mit ihnen kann eine Pipeline an bestimmten Positionen gezielt erweitert oder umgelenkt werden
Die wichtigsten zwei Objekte des Programms sind die geöffneten Dokumente und die Fenster.
Wollen Sie ein Dokument ansprechen und kennen dessen Namen, können sie ihn benutzen:
tell application “RagTime 6.5�
     tell document “Bericht 1� -- nach Name
          -- hier der Code
     end tell
end tell
Das Dokument wird dann unabhängig davon angeprochen, ob es gerade im Vordergrund ist oder ein anderes.
Wollen Sie das Dokument ansprechen, an dem der Benutzer gerade arbeitet, benutzen Sie den Index:
tell application “RagTime 6.5�
     tell document 1 -- nach Index
          -- hier der Code
     end tell
end tell
document 1 ist immer das gerade aktive Dokument. Das nächste, das dahinter liegt, ist document 2 usw.
Folgender Code legt ein neues RagTime-Dokument, beginnend mit einem Layout, an:
tell application "RagTime 6.5" set neues_dokument to (make new document at end with properties {component types:layout}) end tell
Dasselbe funktioniert natürlich auch mit anderen Komponenten zum Start. Hier für ein Rechenblatt:
Bei Bedarf kann man das Dokument auch gleich benennen, obwohl es noch gar nicht gesichert ist:
Oder man sichert die Datei gleich nach dem Anlegen:
set save_file to (((path to documents folder) as text) & "Testdatei.rtd") tell application "RagTime 6.5" set neues_dokument to (make new document at end with properties {component types:layout}) save neues_dokument in file save_file end tell
Fenster werden ähnlich angesprochen, aber ein Dokument kann mehrere geöffnete Fenster haben. Beachten Sie dabei, dass auch das Inventar ein Fenster ist.
Mögliche Ergebnisse von
tell application “RagTime 6.5�
     get name of window 1
end tell
sind zum Beispiel:
--> Bericht 1, Layout 1
--> Bericht 1, Inventar
--> Schriftvorlagen
--> Dokumenteinstellungen
Sie sehen an den Beispielen, dass ein Fenster nicht unbedingt eine Dokumentkomponente enthalten muss.
Ein RagTime-Dokument ist ähnlich wie ein Dateisystem aufgebaut. Sollen bestimmte Objekte in einem Dokument verändert werden, muss deshalb zunächst die Komponente angesprochen werden.
Komponenten sind:
layout
master layout -- Stammlayout
text flow -- eine Textkomponente
table -- ein Rechenblatt
drawing -- eine Zeichnung
picture -- ein Bild
button -- ein Knopf
graph -- eine Infografik
Layouts und Stammlayouts sind dabei wieder aus ihren Seiten aufgebaut - technisch entprechen sie tatsächlich weitgehend einer Zeichnungskomponente.
Typische Code-Fragmente sind deshalb:
tell application “RagTime 6.5�
     tell document 1
          tell text flow “Text 1�
               -- hier der Code
          end tell
     end tell
end tell
oder aber:
tell application “RagTime 6.5�
     tell document 1
          tell layout 1
               tell page 2
                    -- hier der Code
               end tell
          end tell
     end tell
end tell
Wiederum können die Komponenten über ihren Namen oder den Index angesprochen werden. Der Index hängt mit der Reihenfolge zusammen, in der die Komponenten dem Dokument zugefügt oder aus ihn gelöscht werden. Solange Sie während des Script-Ablaufs keine Komponente löschen, bleibt deshalb ein Index konstant.
Erzeugt werden Komponenten mit “make�. Die make-Anweisung benötigt in fast allen Fällen eine Positionsangabe der Form “at beginning� oder “at end�, selbst, wenn technisch nur eines von beiden möglich ist (zu Ausnahmen der Abschnitt über fehlende Zielangaben).
tell application “RagTime 6.5�
     tell document 1
          make new table at end
     end tell
end tell
erzeugt ein neues Rechenblatt im Dokument. Es ist in keinem Container installiert. Sie sehen es nur im Inventar aufgelistet und können es von dort mit einem Doppelklick in einem eigenen Fenster öffnen.
Seiten können eine flexible Referenz im make haben:
tell application "RagTime 6.5"
     tell layout 1 of document 1
          make new page at after page 1
     end tell
end tell
Analog: “at end�, “at before page 1�.
Das Programm und Fenster haben eine Vielzahl von Eigenschaften. Für die Navigation in einem Script ähnlich wichtig wie Fenster und Dokumente ist die “selection�.
Die selection des Programms ist das Objekt, dass der Benutzer im aktiven Fenster ausgewählt hat. Zugleich ist selection auch eine Eigenschaft von Fenstern. Damit können Sie zusätzlich auf die Auswahl in weiter hinten liegenden Fenstern zugreifen.
Auf die selection des Programms kann nur zugegriffen werden, wenn RagTime im Vordergrund ist.
tell application "RagTime 6.5"
     activate
     get selection
end tell
oder
tell application "RagTime 6.5"
     get selection of window 2
end tell
Beispiele für Antworten:
--> insertion point after character 5 of contents of text flow "Text 1" of document id 1 of application "RagTime 6.5"
--> rectangle 1 of page 1 of layout "Layout 1" of document id 1 of application "RagTime 5"
--> cell "A1" of table "Rechenblatt 1" of document id 1 of application "RagTime 6.5"
Wichtig: Die selection kann für des Programms und die Fenster angesprochen werden, nicht aber für Dokumente. Während
tell application "RagTime 6.5"
     tell window 1
          get selection
     end tell
end tell
ein korrekter Code ist, führt
tell application "RagTime 6.5" -- Fehlerbeispiel
     tell document 1
          get selection
     end tell
end tell
zu einer Fehlermeldung!
Beachten Sie weiter, dass das Resultat von selection eine vollständige Referenz ist. Folgender Code ist deshalb OK:
tell application "RagTime 6.5"
     tell window 1
          set Auswahl to selection
     end tell
     tell document 1
          -- hier weiterer Code
          delete Auswahl
          -- hier weiterer Code
     end tell
end tell
Tabellen sind eine angenehm klar gegliederte Struktur. Entsprechend sind die Objekte in Tabellen aus Script-Sicht auch sehr übersichtlich. Es gibt columns, rows, ranges, cells.
In der ersten Lage zeigt das folgende Script zusammen mit der Abbildung des Resultats, wie Zellbereiche angesprochen werden:
tell application "RagTime 6.5"
     tell table 1 of document 1
          set color of column 2 to {cyan:80, magenta:80, yellow:20, black:5}-- dunkelblau
          set color of row 3 to {cyan:5, magenta:100, yellow:100, black:20}-- dunkelrot
          set color of cell 5 of column 3 to {cyan:0, magenta:0, yellow:0, black:40}-- hellgrau
          set color of cell "C6" to {cyan:20, magenta:20, yellow:20, black:50}-- dunkelgrau
          set color of range "B10:D15" to {cyan:5, magenta:100, yellow:100, black:0}-- kräftiges rot
     end tell
end tell
Wenn ein Rechenblatt mehrere Lagen hat, sollten Sie Zellen in anderen Lagen als 1 mit der Bereichsbezeichnung ansprechen:
...
set color of range "[3]B:[3]B" to {cyan:80, magenta:80, yellow:20, black:5}
...
setzt die Farbe von Spalte B in Lage 3.
Wird in eine RagTime-Zelle etwas getippt, erfolgt eine automatische Typerkennung. Ziffernsequenzen werden als Zahlen erkannt, Zeichenfolgen wie “15.2.2002� als Datum etc.
Wird, wie auf der vorangehenden Seite, ein Text mit “value of� an eine Zelle übergeben, erfolgt keine Typerkennung.
...
set value of cell "A2" to "15.2.2002" liefert einen Text in der Zelle ab.
Setzt man dagegen die Zelle ohne explizit die value-Eigenschaft zu benutzen, erfolgt die Typerkennung wie bei manueller Eingabe:
set cell “A2� to “15.2.2002�
erzeugt ein Datum. Beispiel:
tell application "RagTime 6.5"
     tell column 1 of table 1 of document 1
          set cell 1 to "15%"
          -- die Zelle A1 enthält die Zahl 0,15 mit der Formatierung Prozent
          set value of cell 2 to "15%"
          -- die Zelle A2 enthält den Text "15%"
     end tell
end tell
Der Weg über “value of� ist direkter und deshalb schneller. Werden in einer Schleife viele Werte gesetzt, sollte man deshalb value of cell benutzen, wenn man nicht ausdrücklich die Typerkennung haben will.
Ähnlich wie im grafischen User Interface kann die Typerkennung von Zellen auch abgeschaltet werden:
tell application "RagTime 6.5"
     tell table 1 of document 1
          set preset type of column 2 to single line text
     end tell
end tell
setzt die Spalte B der Tabelle auf einfachen Text. Zulässige Werte für "set preset type" sind:
auto
single line text
multi line text
Die wichtigsten Eigenschaften einer Zelle sind ihr value und ihre formula.
tell application "RagTime 6.5"
     tell column 1 of table 1 of document 1
          set value of cell 1 to "abc"
          set value of cell 2 to 250.052
     end tell
end tell
trägt in die Zelle A1 den Text “abc� ein, in Zelle A2 die Zahl 250,052
Folgendes Script erzeugt in zwei Zellen dieselbe Formel, aber mit einer unterschiedlichen Technik:
tell application "RagTime 6.5"
     tell column 1 of table 1 of document 1
          set formula of cell 1 to "Summe(B:B)"
          set sylk formula of cell 2 to "SUM(C[1]:C[1])"
     end tell
end tell
Sowohl in Zelle A1 als auch A2 wird die Formel “Summe(B:B)� eingetragen. Der Unterschied ist: Variante 1 funktioniert nur mit einem deutsch-sprachigen RagTime, Variante 2 mit allen Sprachen. SYLK-Formeln sind unabhängig von der Sprache normiert. Wie bekommen Sie die Syntax für eine SYLK-Formel heraus? Einfach mit einem Script. Installieren Sie sich folgendes Hilfsscript in RagTime:
-- Hilfsscript für SYLK-Syntax
tell application "RagTime 6.5"
     set dieSYLKFormel to (sylk formula of selection) as text
end tell
set the clipboard to dieSYLKFormel
Wählen Sie eine Zelle mit einer Formel aus und rufen das Script auf. Die Formal steht danach in der SYLK-Syntax in der Zwischenablage und kann in einem Script eingesetzt werden.
path to me
Läuft ein Script innerhalb RagTimes, liefert path to me den Pfad zur RagTime-Programmdatei. Wenn Sie ein Script in der Entwurfsphase in einem Script Editor anlegen, ist das Resultat naturgemäß ein anderes. Das Verhalten des Scripts innerhalb von RagTime kann aber ohne Probleme bereits in der Entwurfsphase erzwungen werden: Machen Sie RagTime zum parent des Scripts. Irgendwo am Anfang muss folgende property-Deklaration stehen:
property parent : application "RagTime 6.5"
Alle Anweisungen werden dann zuerst an RagTime geschickt und erst später in der Hierarchie ggf. weitergeleitet.
Umgekehrt setzt folgendes Script auch innerhalb von RagTime an der Auswahl den Pfad zum Programm FileMaker ein (sofern die Auswahl Text annehmen kann):
property parent : application "FileMaker Pro"
tell application "RagTime 6.5"
set selection to (path to me as text)
end tell
(Hinweis: Im vorangehenden Beispiel ist das »tell application "RagTime 6.5"« auch dann unbedingt nötig, wenn da Script innerhalb von RagTime läuft. Die parent-Eigenschaft sorgt sonst dafür, dass die selection-Abfrage an FileMaker geschickt wird!)
Die Lebesdauer von properties
Scripts werden innerhalb von RagTime nach bloßem Ablauf nicht neu in das Dokument oder die Hilfsmittel zurück geschrieben. Wird während eines Script-Ablaufs eine property geändert und das Script später neu aufgerufen, überlebt deshalb die Änderung nur so lange, wie sich das Script im Hauptspeicher befindet. Für ein Script im Dokument bedeutet das: Eine property überlebt, bis Sie das Dokument schließen. Für ein Script in den Hilfsmitteln bedeutet das: Die property überlebt, bis Sie RagTime beenden. Ein Beispielscript:
property Eigenschaft : 1
display dialog "Die Eigenschaft beträgt " & Eigenschaft as text buttons {"OK"} default button 1
set Eigenschaft to Eigenschaft + 1
Ist dieses Script in einem Dokument gesichert, zeigt der Dialog beim ersten Aufruf nach Öffnen des Dokuments immer 1, beim nächsten Aufruf 2 etc. Wird das Dokument geschlossen und wieder geöffnet, beträgt der Wert wieder 1.
Ist das Script in den Hilfsmitteln gesichert, zeigt der Dialog beim ersten Aufruf nach Programmstart eine 1. Mit jedem Aufruf wird um 1 hoch gezählt, bis Sie RagTime beenden.
Zeichnungen und Seiten sind aus drawing objects aufgebaut. Sie umfassen gezeichnete Objekte wie Rechtecke und Kurven sowie grafische Texte.
Die Objekte werden über ihren Index oder - sofern sie haben - über ihren Namen angesprochen. Der Name kann vom Anwender über die Palette Objektkoordinaten vergeben werden, oder das Script legt sie mit einem Namen an.
Der Index zählt in der Zeichnung von vorn nach hinten: Das am weitesten vorn liegende Zeichnungsobjekt hat den Index 1, das nächste 2 usw.
drawing objects haben für die Varianten Unterklassen:
rectangle -- Rechteck
graphic line -- Linie
graphic text -- Graphischer Text
arc -- Bogen
oval
sector
polygon
Bezier curve
multigon -- Vieleck
Wird das Objekt über die Unterklasse angesprochen, kann der Index niedriger sein. polygon 1 kann drawing object 5 sein. Es ist das am weitesten vorn liegende Polygon.
tell application "RagTime 6.5"
     tell document 1
          delete rectangle 1 of page 1 of layout 1
     end tell
end tell
löscht das am weitesten vorn liegende Rechteck der Seite 1 von Layout 1, selbst, wenn davor noch ein Oval liegt. “delete drawing object 1� dagegen löscht das am weitesten vorn liegende Objekt, gleich, ob ein Rechteck, ein grafischer Text etc. (Um das am weitesten hinten liegende Objekt zu löschen, benutzen Sie den Index -1: delete rectangle -1 of page 1 of layout 1
Erzeugt werden Zeichnungsobjekte mit make. Dabei muss die hinten/vorn-Position mit z.B. “at end� oder “at beginning� angegeben werden.
tell application "RagTime 6.5"
     tell document 1
          make new rectangle at beginning of page 1 of layout 1
     end tell
end tell
legt ein Rechteck auf Seite 1 des Layouts 1 an, das VOR allen anderen Objekten liegt. Soll es hinten liegen, benutzt man “at end�.
Wie bei Seiten kann auch “at before� und “at after� benutzt werden:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          make new rectangle at after drawing object 1 with data {100, 100, 200, 300}
     end tell
end tell
erzeugt ein Rechteck in der zweiten Ebene von vorn und legt die Position auf der Seite gemessen in Punkt fest.
Zuerst wird mitten auf einer Seite ein Kreis gezeichnet und mit »Zeichnung – Objektart – Bézier-Kurve« umgewandelt. Dann werden die Punkte mit dem Testscript abgefragt. In meinem Fall ist das Ergebnis die Liste
{{158.7401, 409.6062}, {158.7401, 336.809}, {217.7539, 277.7952}, {290.5511, 277.7952}, {363.3483, 277.7952}, {422.3621, 336.809}, {422.3621, 409.6062}, {422.3621, 482.4034}, {363.3483, 541.4172}, {290.5511, 541.4172}, {217.7539, 541.4172}, {158.7401, 482.4034}, {158.7401, 409.6062}}
RagTime legt die Punkte bei dem Kreis beginnend bei 9 Uhr im Uhrzeigersinn an. Hervorgehoben hab ich die Punkte 3 bis 5. Sie werden etwas umgestaltet für die Tropfenform.
Folgendes Script wird nun für die Zeichnung benutzt:
set punkteListe to {{158.7401, 409.6062}, {158.7401, 336.809}, {217.7539 + 50, 277.7952}, {290.5511, 277.7952 - 150}, {363.3483 - 50, 277.7952}, {422.3621, 336.809}, {422.3621, 409.6062}, {422.3621, 482.4034}, {363.3483, 541.4172}, {290.5511, 541.4172}, {217.7539, 541.4172}, {158.7401, 482.4034}, {158.7401, 409.6062}}
tell application "RagTime 6.5"
     set neuesDokument to (make new document with properties {component types:drawing} at end)
     tell drawing 1 of neuesDokument
          set dasPolygon to (make new Bezier curve at beginning with data punkteListe with properties {color:{red:10, green:60, blue:60}})
         Â
     end tell
end tell
Hervorgehoben sind wieder die Punkte mit den Änderungen. Das Resultat ist ein garantiert symmetrischer Tropfen.
Gruppen von Zeichnungsobjekten sind in RagTime ein weiteres Objekt der Seite / der Zeichnung. Um Objekte zu gruppieren legt man das neue Gruppenobjekt an und übergibt die Bestandteile als Daten:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          make new drawing group at end with data {rectangle 1, rectangle 2, rectangle 3}
     end tell
end tell
Der Code legt auf der Seite eine neue Gruppe an und die ersten drei Rechtecke sind die gruppierten Objekte.
Für die Umkehrung gibt es ein eigenes Verb:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          ungroup drawing group 1
     end tell
end tell
Alle Koordinatenangaben sind in Punkt (1/72 Zoll) gemessen von der oberen linken Ecke. Vertikale Koordinaten werden nach unten größer, horizontale nach rechts.
Beim Anlegen eines Rechtecks ist es naheliegend, die Koordinaten gleich als dessen Daten zu übergeben:
tell application "RagTime 6.5"
     tell layout 1 of document 1
          make new rectangle at beginning of page 1 with data {100, 100, 300, 200}
     end tell
end tell
Die Reihenfolge der Koordinaten ist: {X links, Y oben, X rechts, Y unten}
Bei den Koordinaten ist im AppleScript-Verzeichnis der Unterschied zwischen definition rect und bounds wichtig (sowie auf den ersten Blick vielleicht etwas unklar):
In RagTime können Zeichnungsobjekte transformiert werden: gedreht, skaliert, geschert.
Das definition rect gibt die Koordinaten an, die vor dieser Transformation galten. (Wenn Sie in der Palette Objektkoordinaten auf “Standard� klicken, bekommt das Objekt wieder die Grenzen des definition rect.) bounds hingegen gibt die Koordinaten an, mit denen das transformierte Objekt auf der Seite / der Zeichnung sichtbar ist. (Dies entspricht im User Interface von RagTime in der Palette "Objektkoordinaten" der Teilung in die Koordinaten, die oben in der Gruppe unter "Name" stehen, und die Koordinaten, die in der nächsten Gruppe für die Ränder stehen. Drehen Sie in RagTime ein Rechteck auf z.B. 45°, um den Unterschied zu sehen.)
Analog: left und left position. die zweite Form gibt den Wert des transformierten Objekts.
Beispiel (die Antworten von RagTime sind mit “-->� eingetragen. Sie wurden aus dem AppleEvent Log des Script Editors kopiert.):
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          make new rectangle at beginning with data {200, 250, 300, 400}
               tell rectangle 1
               set vertical scaling factor to 2.5
               set horizontal scaling factor to 2.5
               get definition rect
               --> {200.0, 250.0, 300.0, 400.0}
               get bounds
               --> {125.0, 137.5, 375.0, 512.5}
               get left
               --> 200.0
               get left position
               --> 125.0
          end tell
     end tell
end tell
Die Koordinaten von bounds umfassen einen größeren Bereich und left position liegt weiter links, weil die Skalierung von 250% berücksichtigt wird.
Polygone und Bézierkurven werden in RagTime als Listen von Punkten angelegt. Jeder Punkt ist dabei wieder eine Liste. Beispiel:
-- Script 1
set punkteListe to {{50, 50}, {100, 200}, {150, 50}, {50, 50}}
tell application "RagTime 6.5"
     set neuesDokument to (make new document with properties {component types:drawing} at end)
     tell drawing 1 of neuesDokument
          make new polygon at beginning with data punkteListe with properties {color:{red:10, green:60, blue:60}}
     end tell
end tell
Das Script legt ein neues Dokument – bestehend aus einer Zeichnung – an und zeichnet ein Dreieck. Die Liste {{50, 50}, {100, 200}, {150, 50}, {50, 50}} ist die Liste der Eckpunkte des Polygons. Jeder Punkt ist wieder eine Liste von zwei Koordinaten, X und Y. Y wird dabei von oben nach unten gemessen. Die Maßeineit sind Punkt (also 1/72 Zoll). Wie bei der Eigenschaft definition rect handelt es sich um die Koordinaten ohne irgendwelche Transformationen wie Drehung. Dies wird Deutlich im folgenden Script:
-- Script 2
set punkteListe to {{50, 50}, {100, 200}, {150, 50}, {50, 50}}
tell application "RagTime 6.5"
     set neuesDokument to (make new document with properties {component types:drawing} at end)
     tell drawing 1 of neuesDokument
          set dasPolygon to (make new polygon at beginning with data {{0, 0}, {1, 1}} with properties {color:{red:10, green:60, blue:60}})
          set rotation of dasPolygon to 0.25
          change point list of dasPolygon to punkteListe
     end tell
end tell
Hier wird zunächst ein Polygon mit nur zwei Punkten angelegt und anschließend rotiert. Dann wird die Punktliste auf denselben Wert gesetzt, wie im Script 1. Das Resultat ist ein Dreieck, dessen Spitze nach links zeigt: Die Dreihung wird weiterhin auf die Koordinaten angewandt.
Sehen wir uns eine Bézierkurve an. Zuerst wird von Hand eine in RagTime gezeichnet, wie abgebildet. Während sie ausgewält ist, wird die Punktliste mit einem Script abgefragt:
tell application "RagTime 6.5"
     try
          get point list of selection of window 1
     end try
end tell
(In der Praxis ist dieses simple Testscript sehr hilfreich. In vielen Fällen ist es am einfachsten, zunächst eine ungefähre Kurve von Hand anzulegen und deren Werte abzufragen, um die Größenordnung der realistischen Werte zu bekommen.)
Das Script liefert in meinem Fall folgende Liste als Resultat:
{{34.7244, 141.0236}, {64.4882, 87.1653}, {138.8976, 95.6693}, {182.1259, 136.063}, {225.3543, 176.4566}, {287.7165, 177.1653}, {318.1889, 155.1968}}
Das sind sieben Koordinatenpaare für Punkte. Sehen wir uns die Kurve noch einmal mit ausgewählten Punkten an (Abbildung unten):
Es gibt drei Punkte auf der Kurve und vier Endpunkte von den »Anfassern«. Jede Bézierkurve in RagTime (und in anderen Programmen) ist zusammengesetzt aus einer Reihe von Segmenten, die je von vier Punkten definiert sind. Der letzte Punkt eines Segments ist immer der erste des folgenden. So eine Bézierkurve als ganzes ist also immer durch Anzahl_Segmente * 3 + 1 Punkte definiert.
Alle Transformationen in RagTime wirken auf das Zeichnungsobjekt einschließlich seiner Linienstärken und ggf. auch auf die Darstellung seines Inhalts. Schreibt man in einem gespiegelten Rahmen, erscheint auch der Text spiegelverkehrt. Ebenso erscheint Text in einem gescherten Rahmen selbst geschert.
Skalieren eines Objekts:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set vertical scaling of Rechteck to 3
          set horizontal scaling of Rechteck to 3
     end tell
end tell
Vertikale und horizontale Skalierung werden einzeln gesetzt. Die Zahl ist einfach der Faktor der Skalierung. Ein Skalierungsfaktor -1 spiegelt das Objekt.
Rotieren eines Objekts:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set rotation of Rechteck to 45 / 360
     end tell
end tell
Das Script legt ein Rechteck an und dreht es um 45° im Uhrzeigersinn. Beachten Sie den Ausdruck »45 / 360«. RagTime behandelt 1 als vollständige 360°-Drehung. 0.5 dreht also um 180°, 0.25 um 90° usw.
Scheren eines Objekts
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to 15 / 360
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set horizontal skewing of Rechteck to X
     end tell
end tell
Das Script legt ein Rechteck an und schert es um 15°. Die maximale Scherung, die RagTime akzeptiert ist ± 63,4° (± 0,1762). Wieder sind 360° auf 1 normiert, deshalb der Ausdruck »15 / 360«.
Lassen Sie sich nicht davon verwirren, dass nach den Setzen einer Transformation die anschließende Abfrage bisweilen etwas anderes liefert. Die Transformation eines Objekts ist letztlich eine 2*2 Matrix. Und mehrere Einzeloperationen führen zur selben Matrix. Wenn RagTime dann wieder rückwärts rechnet, können die Einzeltransformationen anders aussehen:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to 30 / 360
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set vertical skewing of Rechteck to X
         Â
          vertical skewing of Rechteck
          --> 0.0
          horizontal skewing of Rechteck
          --> 0.0833
          vertical scaling of Rechteck
          --> 0.866
          horizontal scaling of Rechteck
          --> 1.1547
          rotation of Rechteck
          --> 0.0833
          transformation matrix of Rechteck
          --> {1.0, 0.5773, 0.0, 1.0}
     end tell
end tell
Das Rechteck wird ursprünglich um 30° vertikal geschert. Fragt man anschließend die Eigenschaften ab, ist die vertikale Skalierung zu 0 geworden, alle anderen Eigenschaften sind allerdings anders. Die Kombination von Scherung, Skalierung und Drehung, die das Script zurück meldet, ist tatsächlich äquivalent zu einer 30° vertikalen Scherung. Die Matrix wird im Script im letzten Schritt abgefragt. Sollen mehrere Objekte mit gleichen Transformationen erzeugt werden, ist es oft am einfachsten, ein Objekt mit den vertrauten Techniken (drehen, skalieren) anzulegen, dann dessen Matrix abzufragen und anschließend die weiteren Objekte mit dieser Matrix zu erzeugen.
Sollen Objekte gleich mit einer Transformation erzeugt werden (schneller, weniger Bildschirm-Updates), sieht die Syntax wie folgt aus:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to {1.0, 0.5773, 0.0, 1.0}
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400} with properties {transformation matrix:X})
     end tell
end tell
Meistens sollen Rechtecke und andere Zeichnungsobjekte auf einer Seite RagTime-Komponenten enthalten: Texte, Bilder, Rechenblätter etc. Hier ein paar Strategien:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          make new rectangle at beginning with data {200, 250, 300, 400} ¬
               with properties {contents type:table}
     end tell
end tell
ist die kürzeste Form, ein Rechteck mit einem Rechenblatt anzulegen. (Nebenbei: Die property-Liste kann auch noch Eigenschaften wie Linienformat, Farbe etc. für das Rechteck enthalten.)
Nachteilig bei dem Verfahren ist, dass man keine Referenz auf das erzeugte Rechenblatt bekommt. Die braucht man aber evtl. später im Code. Alternative:
tell application "RagTime 6.5"
     tell document 1
          set neueTabelle to (make new table at end)
          tell page 1 of layout 1
               make new rectangle at beginning with data {200, 250, 300, 400}
               set contents of rectangle 1 to neueTabelle
          end tell
     end tell
end tell
“neueTabelle� enthält jetzt die Referenz auf das Rechenblatt, das in dem Rechteck angelegt wurde, z.B.
--> table "Rechenblatt 1" of document id 1
Komponenten können mit der “save�-Anweisung exportiert werden. Das Vorgenen ist damit so ähnlich wie beim Sichern eines Dokuments im RagTime-eigenen Format.
Der save-Anweisung (Sie finden Sie in der Standard Suite im AppleScript-Verzeichnis) kennt eine Reihe von Optionen für den Export. Folgendes Script exportiert die Textkomponente namens “Text 1� im Word-Format:
set zielDatei to choose file name with prompt ¬
     "Wohin soll der Text exportiert werden?"
tell application "RagTime 6.5"
     save text flow "Text 1" of document 1 in zielDatei ¬
          converting to "MS-Word 6/95"
end tell
Die Export-Optionen lassen sich durch recording ermitteln. Deshalb verzichten wir hier auf eine detailiertere Darstellung.
Die Import-Optionen, z.B. welche Textkodierung benutzt werden soll, kann man steuern, wenn man zuerst die Komponente anlegt und dann mit change auf den Inhalt der Importdatei setzt:
set textDatei to choose file with prompt "Text-Datei auswählen"
tell application "RagTime 6.5"
     tell document 1
          set Textkomponente to (make new text flow at end)
          change Textkomponente to textDatei using encoding 256 without link to file
-- Encoding 256 ist Mac Roman
          set Rechenblattkomponente to (make new table at end)
          change cell "A1" of Rechenblattkomponente to textDatei using encoding 256 without link to file, value format detection and import formats
     end tell
end tell
Das Script erzeugt eine neue Textkomponente und setzt dann den Inhalt auf textDatei, gibt aber dabei bereits das Encoding vor. Die für die meisten Anwender wohl wichtigsten Encodings sind:
256: Macintosh Standard für westeuropäische Sprachen
512: Windows Standard für westeuropäische Sprachen
Encoding-Nummern finden Sie in der RagTime-Hilfe "RagTime-Formeln und -Funktionen" im Abschnitt "Hintergrundinformationen".
Es wird ein Rechenblatt angelegt und die Zelle A1 auf die Datei geändert. Da value format detection und import formats beide festgelegt sind (hier: ausgeschaltet), folgt auch dieser Dialog nicht.
Die so importierten Komponenten können mit set (“set rectangle 1 of page 1 to...�) platziert werden.
Für den Import können auch Filter festgelegt werden, besonders bei Bildern bisweilen wichtig:
...convert with "JPEG" ...
Ein Beispielscript:
set bildDatei to choose file with prompt "Bild-Datei auswählen" of type list {"JPEG"}
tell application "RagTime 6.5"
     tell document 1
          set Bildkomponente to (make new picture at end)
          change Bildkomponente to bildDatei ¬
               convert with "JPEG" without link to file
     end tell
end tell
Importe werden aufgerufen, indem man den Wert eines Objekt, das die Importdatei aufnehmen kann, auf einen alias / ein file setzt oder eine bestehende Komponente dahin umwandelt. Folgendes Script weist zunächst über einen Auswahldialog einer Variable einen alias-Wert zu und importiert dann diese Datei an verschiedenen Stellen in das aktive Dokument:
set textDatei to choose file with prompt "Text-Datei auswählen"
tell application "RagTime 6.5"
     activate
     tell document 1
          make new text flow with data textDatei at end
          -- Importiert die Datei und fügt sie als neue Textkomponente hinzu, ohne diese zu platzieren
          set Rechteck to make new rectangle with data {100, 50, 300, 500} at beginning of page 1 of layout 1
          set contents of Rechteck to textDatei
          -- Setzt die Inhaltsart des Rechtecks auf Text und importiert die Datei
          set text flow 1 to textDatei
          -- Importiert die Datei und ersetzt die erste Textkomponente durch deren Inhalt
          set insertion point after last character of text flow 1 to textDatei
          -- Importiert die Datei und hängt sie am Ende von Textkomponente 1 an
          set Rechteck to make new rectangle with data {350, 50, 550, 500} with properties {contents type:table} at beginning of page 1 of layout 1
          set cell "A1" of table 1 to textDatei
          -- Importiert die Textdatei in das Rechenblatt beginnend mit Zelle A1
     end tell
end tell
Bei dieser Technik erfolgt der Import so, wie manuell aufgerufen. Es werden also jedesmal die Dialoge gezeigt, die RagTime auch sonst zeigt: Welche Codierung der Text hat, ob beim Import in das Rechenblatt eine Werteformaterkennung erfolgen soll etc.
Beim Entwurf eines Scripts schafft es etwas unterschiedliche Situationen, ob ein Script ein Dokument (oder Teile davon) vollständig aufbaut, oder ob man das Objekt beeinflussen will, an dem der Benutzer gerade arbeitet.
Ein typisches Beispiel für die erste Situation ist eine Datenbankanbindung, bei der z.B. auf Basis ausgewählter Datensätze in FileMaker bestimmte Layout-Seiten aufgebaut werden. Ein einfaches Beispiel für die zweite Situation: Man braucht eine Anweisung, die ein ausgewähltes Rechteck mit einem Schatten versieht.
Zwei Techniken gehen auf die aktuelle Tätigkeit des Benutzers ein:
a) Bei einer Reihe von Aktionen, die eigentlich ein klares Ziel brauchen, darf dieses Ziel im Script fehlen. RagTime wählt das Ziel dann bezogen auf das Objekt, an dem der Benutzer gerade arbeitet.
b) Das selection Objekt kann ausgewertet werden.
In folgendem Script-Fragment
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     -- weiterer Script-Code
end tell
ist es im “weiteren Script-Code� nicht immer dasselbe, ob “selection� benutzt wird oder die Variable “Auswahl�. “selection� greift direkt auf ein RagTime-Objekt zu. Beim Zuweisen der Variablen wird das Objekt in eine Referenz aufgelöst und diese im Script abgelegt. Der Zugriff über “Auswahl� ist indirekter. In den meisten Fällen ist das Resultat bei beiden Zugriffen identisch. Im Abschnitt über die Ausrichtung von Bildern gab es einen Fall, der zu verschiedenen Resultaten führt.
Betrachten wir den Fall etwas detailierter: Angenommen war ein Dokument mit einem Bild. Das Bild ist in zwei Containern installiert. Der Anwender hat das Bild in einem der Container ausgewählt.
Script-Variante 1:
tell application "RagTime 6"
     align picture selection of window 1 horizontally at left side
end tell
Script-Variante 2:
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     align picture Auswahl horizontally at left side
end tell
In der ersten Variante wird das Bild nur in dem Container nach links ausgerichtet, in dem es ausgewählt ist. In der zweiten Variante wird es in allen Containern ausgerichtet. In der “set Auswahl...�-Zeile wird selection in einen Bezug der Form “picture "Bild 1" of document id 1� aufgelöst (das Bild heißt bei Ihnen ggf. anders). Die “align picture�-Anweisung wird dann an diese Bildkomponente geschickt. Diese Anweisung richtet das Bild an allen Stellen aus, an denen es installiert ist.
Dieser Text würde sehr lang werden, wenn wir alle Fälle behandelten, in denen sich die beiden Formen in der Wirkung gleichen und in welchen nicht. Für die eigene Arbeit mit dem selection-Objekt sollte nur klar sein: Technisch sind die beiden Zugriffsformen immer verschieden. Wenn also im konkreten Fall die eine das falsche tut, probiert man die andere.
Im Regelfall ist der direkte Zugriff auf selection in der Wirkung dichter am Aufruf einer Anweisung in der RagTime-Benutzungsoberfläche.
Änderungen in AppleScript haben leider dazu geführt, dass sich das sogenannte "Default Targeting" unterschiedlich verhält, abhängig davon, ob das Script im Programm selbst läuft oder aber es von außen (Script Editor) steuert. Mit "Default Targeting" ist gemeint, welches Ziel in einem Programm benutzt wird, wenn eine klare Zielangabe fehlt. In vielen Fällen wird dann die bestehende Auswahl ausgewertet. Die für das Programm gültige Auswahl steht aber nicht mehr zur Verfügung, wenn RagTime im Hintergrund ist.
Gehen wir von folgender Situationsannahme aus:
In RagTime ist ein Dokument mit mehreren Seiten geöffnet. Auf einer der Seiten ist ein Grafik-Objekt angeklickt, oder aber, es wurde zuletzt in den leeren Seitenbereich geklickt.
In RagTime 6.5 funktioniert dann folgendes Script:
make new rectangle with data {100, 100, 200, 300}
(Das »tell application "RagTime 6.5"« kann innerhalb von dem RagTime-Script-Editor natürlich fehlen. Das Script ist so vollständig.)
Ohne irgend eine Angabe, wo in einem Dokument dieses Rechteck angelegt werden soll, bestimmt die aktuelle Auswahl das Ziel. Das Rechteck wird auf der Zeichenfläche angelegt, die (oder in der) gerade die aktuelle Auswahl steht. Das ist zum Beispiel die Seite oder Zeichnung, in deren leeren Bereich zuletzt geklickt wurde. Oder aber die Seite / Zeichnung, in der gerade ein beliebiges Grafikobjekt ausgewählt ist.
Vom AppleScript Editor aus funktioniert diese Technik nur, wenn RagTime zuerst in den Vordergrund geholt wird:
tell application "RagTime 6.5"
     activate
     make new rectangle with data {100, 100, 200, 300}
end tell
Lässt man das »activate« weg, führt das Script in eine Fehlermeldung.
Um diese Technik noch etwas weiter zu illustrieren: Folgendes Script zieht Hilfslinien genau durch den Mittelpunkt des ausgewählten Objekts:
tell application "RagTime 6.5"
     activate
     set {X, Y} to position of selection
     make new vertical guide with data X
     make new horizontal guide with data Y
end tell
(Wiederum würde innerhalb von RagTime folgendes Script dasselbe tun:
set {X, Y} to position of selection
make new vertical guide with data X
make new horizontal guide with data Y
)
Im ersten Schritt wird die Position des Auswahl-Objekts ausgelesen. Da die Anweisung an RagTime geht (und nicht etwa an window 2 u.ä.) ist dies immer die Auswahl im aktuellen Dokument.
Die beiden folgenden Anweisungen legen Hilfslinien in der gerade benutzten Zeichnungsumgebung an. Das ist immer die Umgebung, in der das Objekt gerade ausgewählt ist.
Kriterium dafür, dass die Zielangabe fehlt, ist die fehlende “at�-Klausel. Selbst, wenn der “make new...�-Ausdruck in einem tell-Block steht, wird er als “Ohne Zielangabe� behandelt, wenn das “at� fehlt. Folgende Beispiele
tell application "RagTime 6.5" -- Fehlerbeispiel
     activate
     make new rectangle with data {100, 100, 200, 300} at beginning
end tell
Das Script führt bei Ausführung in eine Fehlermeldung. Wenn die “at�-Klausel vorhanden ist, muss das Ziel vollständig gegeben sein.
Für das nächste Beispiel wieder eine Situationsannahme: Sie haben ein Layout mit drei Seiten vor sich und ein Objekt auf Seite 3 angeglickt:
tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          activate
          make new rectangle with data {100, 100, 200, 200}
          make new rectangle with data {100, 100, 350, 350} at beginning
     end tell
end tell
Bei dem ersten (kleineren) Rechteck fehlt die “at�-Klausel. Die Anweisung geht an die aktuelle Zeichnungsumgebung und das Rechteck erscheint auf der angeklickten Seite 3 trotz des umgebenden “tell�.
Das zweite Rechteck hat eine “at�-Klausel und der umgebende tell-Block gibt das Ziel vollständig an. Das Rechteck wird auf Seite 1 erzeugt.
Selbst, wenn in dem “tell� ein “of document 2� stünde, würde das erste Rechteck in Dokument 1 angelegt werden, das zweite aber in Dokument 2. Deutlich sieht man den Unterschied, wenn man sich im AppleEvent Log ansieht, wie die Kommunikation mit RagTime abläuft:
tell application "RagTime 6.5" -- Ausschnitt aus AppleEvent Log
     activate page 1 of layout 1 of document 1
     make new rectangle with data {100, 100, 200, 200}
     --> rectangle 1 of page 3 of layout "Layout 1" of document id 1
     make new rectangle with data {100, 100, 350, 350} at beginning of page 1 of layout 1 of document 1
     --> rectangle 1 of page 1 of layout "Layout 1" of document id 1
end tell
Arbeitet man mit dem selection-Objekt, kann es leicht zu allen möglichen Fehlern im Ablauf des Scripts kommen: Die aktuelle Auswahl des Benutzers ist evtl. gar nicht geeignet für die Aktionen des Scripts. Zwei Techniken bieten sich an: Wenn das Script nur für eine ganz bestimmte Art von Objekten geeignet ist, fragt man zunächst die Klasse der Auswahl ab und arbeitet nur im geeigneten Fall weiter. Wird mit einer Eigenschaft gearbeitet, die viele unterschiedliche Objekte haben können (position ist ein Beispiel), und ist das Script für (fast) alle dieser Objekte geeignet, ist ein try nützlicher.
Ein Beispieldokument enthalte ein Rechenblatt namens “Rechenblatt 1�. Wenn der Benutzer Text ausgewählt hat, soll dieses Rechenblatt am Anfang der Auswahl eigefügt werden.
tell application "RagTime 6.5"
     set textAuswahl to selection of window 1
     set Tabelle to a reference to table "Rechenblatt 1" of document 1
     if (class of selection of window 1) is text then
          set insertion point before textAuswahl to Tabelle
     end if
end tell
Ist irgend etwas anderes als Text ausgewählt, wird der if-Teil nicht ausgeführt. Dennoch sollte man auch in diesem Fall ein try erwägen. Es gibt immer Fälle, in denen das Script Fehlermeldungen auslöst und die man vergisst. Hier wären folgende Fälle betroffen: Die Einfügemarke steht in einem leeren Text, im Rechenblatt in einem Mehrzeilertext oder in einem grafischen Text.
Ein vorangehendes Beispiel hat Hilfslinien durch ein ausgewähltes Objekt gezeichnet. Dies ist ein typisches Beispiel für den Einsatz von try: Die Eigenschaft position haben Rechtecke, Beziérkurven, Punkte von Beziérkurven... In allen Fällen ist die folgende Anweisung, Hilfslinien durch die Position der Auswahl zu zeichnen, sinnvoll. Ist aber Text oder eine Rechenblattzelle ausgewählt, ist das Script nicht sinnvoll und führt in einen Fehler. Hier ist try die beste Technik:
tell application "RagTime 6.5"
     try
          set {X, Y} to position of selection of window 1
          activate
          make new vertical guide with data X
          make new horizontal guide with data Y
     end try
end tell
Wenn das ausgewählte Objekt die property position gar nicht hat oder aber in der benutzten Umgebung keine Hilfslinien möglich sind (z.B. ein Objekt einer Infografik ist ausgewählt), bricht die Ausführung einfach ab ohne durch eine unverständliche Fehlermeldung zu irritieren. In allen Fällen, in denen aber sinnvoll die Hilfslinien gezeichnet werden können, wird die Anweisung ausgeführt. Hält man eine Warnung für sinnvoll, kann man natürlich eine eigene Meldung erzeugen: Folgende Variante erzeugt eine eigene Meldung, gefolgt von der Originalmeldung:
property Fehlertext1 : "Es konnten keine Hilfslinien angelegt werden. Vermutlich ist kein geeignetes Objekt ausgewählt."
property Fehlertext2 : "AppleScript-Fehler: Nummer "
tell application "RagTime 6.5"
     try
          set {X, Y} to position of selection of window 1
          activate
          make new vertical guide with data X
          make new horizontal guide with data Y
     on error Meldung number Fehlernummer
          display dialog Fehlertext1 & return & return & Fehlertext2 & ¬
               Fehlernummer & ", " & Meldung buttons {"OK"} default button 1
     end try
end tell
Zum Abschluss noch eine Variante, die eher traditionellem “exception handling� entspricht: Statt einer eigenen Meldung wird die normale AppleScript-Meldung hochgereicht, aber ergänzt um die eigene Information:
property Fehlertext : "Vermutlich können durch das ausgewählte Objekt keine Hilfslinien gezogen werden."
tell application "RagTime 6.5"
     try
          set {X, Y} to position of selection of window 1
          activate
          make new vertical guide with data X
          make new horizontal guide with data Y
     on error Meldung number Fehlernummer
          error Meldung & return & Fehlertext number Fehlernummer
     end try
end tell
Beim Arbeiten mit Variablen, denen das selection-Objekt zugewiesen wurde, kann auch die Änderung der Auswahl durch eine Script-Aktion oder aber die Änderung ihres Bezugs eine Falle stellen.
Folgende Script-Varianten gehen davon aus, dass ein Rechteck ausgewählt ist.
Variante 1
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     make new rectangle at before Auswahl with data {50, 100, 150, 300}
     set color of Auswahl to {cyan:10, magenta:50, yellow:80, black:5}
end tell
Variante 2
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     make new rectangle at before Auswahl with data {50, 100, 150, 300}
     set color of selection of window 1 to {cyan:10, magenta:50, yellow:80, black:5}
end tell
In Variante 1 wird das neu angelegte Rechteck orange gefärbt, in Variante 2 das ausgewählte. Grund: Die Variable Auswahl enthält eine Referenz auf das Rechteck nach Index. Dadurch, das vor dem ausgewählten Rechteck ein neues angelegt wurde, hat dieses neue Rechteck den Index, den vorher das ausgewählte hatte. “Auswahl� zeigt deshalb jetzt auf das neue Rechteck.
Besonders bei Texten kann sich die Auswahl von Buchstaben durch Hinzufügen oder Löschen ändern. Ein Beispielscript soll vor und nach der Auswahl einen Bindestrich einfügen.
tell application "RagTime 6.5"-- Unerwartetes Resultat
     set Auswahl to selection of window 1
     set insertion point before Auswahl to "-"
     set insertion point after Auswahl to "-"
end tell
Durch das Einfügen des ersten Bindestrichs hat sich die Anzahl der Buchstaben verändert. Der zweite wird deshalb einen Buchstaben zu früh eingefügt.
In einen Fehler läuft auch die naheliegende Idee, direkt auf selection zu arbeiten:
tell application "RagTime 6.5"-- Fehlerhaftes Beispiel
     set insertion point before selection of window 1 to "-"
     set insertion point after selection of window 1 to "-"
end tell
Einer der Fälle, in denen sich der direkte und der indirekte Zugriff auf die Auswahl unterscheiden.
Eine Lösungsmöglichkeit ist, in der ersten Variante die Auswahl erneut abzufragen:
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     set insertion point before Auswahl to "-"
     set Auswahl to selection of window 1
     set insertion point after Auswahl to "-"
end tell
In Fällen wie diesem, in dem die Aktion die Anzahl der Buchstaben auf jeden Fall vergrößert, kann man natürlich auch einfach die Reihenfolge beim Einsetzen ändern und von hinten nach vorn arbeiten:
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     set insertion point after Auswahl to "-"
     set insertion point before Auswahl to "-"
end tell
Wie in dem einführenden Teil zu Programmobjekten beschrieben, kann man in RagTime und unterhalb von RagTime über Fenster das Objekt selection ansprechen. In Dokumenten kann man das Objekt selection nicht ansprechen.
Seit einiger Zeit ist allerdings die für das Programm gültige Auswahl nur im Script-Zugriff, wenn RagTime im Vordergrund ist. Lässt man ein Script in RagTime laufen, ist das immer der Fall. Nicht aber, wenn man den Apple Script Editor im Vordergrund hat und das Script von dort aus laufen lässt.
tell application "RagTime 6.5" -- Problembeispiel
     set A to selection
end tell
führt zu einer Fehlermeldung. Hingegen funktioniert folgende Variante korrekt:
tell application "RagTime 6.5"
     activate
     set A to selection
end tell
Wird explizit ein Fenster angesprochen, kann das activate fehlen:
tell application "RagTime 6.5"
     set A to selection of window 1
end tell
führt zu keinem Fehler. Folgendes Script eignet sich zum Experimentieren, wenn man sich im Script Editor anschließend das Resultat ansieht:
tell application "RagTime 6.5"
     activate
     set A to selection
     set B to selection of window 1
     set C to selection of window 2
     {A, B, C}
end tell
Nehmen wir folgende Situation an: Zwei Dokumente sind geöffnet, im hinteren ist etwas Text ausgewählt, im forderen ein Rechteck auf einer Seite. Dann wird das Resultat dieses Scripts etwa wie folgt aussehen:
{
rectangle 1 of page 1 of layout "Layout 1" of document id 2 of application "RagTime 6.5",
rectangle 1 of page 1 of layout "Layout 1" of document id 2 of application "RagTime 6.5",
text from character 1 to character 10 of contents of text flow "Text 1" of document id 1 of application "RagTime 6.5"
}
Die ersten beiden Abfragen, selection und selection of window 1, liefern dasselbe Resultat, die Auswahl im ersten Dokument. Die Variable C enthält die Auswahl im zweiten Dokument.
Wird nun im forderen Dokument das Fenster Schriftvorlagen geöffnet und “Standardschrift� in der Liste ausgewählt, liefert das Script folgendes Resultat:
{
character style sheet "Standardschrift" of document id 2 of application "RagTime 6.5",
character style sheet "Standardschrift" of document id 2 of application "RagTime 6.5",
rectangle 1 of page 1 of layout "Layout 1" of document id 2 of application "RagTime 6.5"
}
In dieser Variante gehören die beiden ersten Fenster zu Dokument 1: Das Schriftvorlagen-Fenster und das Layout-Fenster. Variable A und B enthalten wieder dasselbe. Die selection von RagTime ist immer gleich der selection des ersten Fensters von RagTime. C enthält jetzt die Auswahl in dem Layout-Fenster von Dokument 1.
Wenn ein Gruppierungs-Objekt angelegt werden soll, muss ein Ziel angegeben werden, die Anweisung direkt an RagTime zu schicken, funktioniert nicht.
Es bietet sich folgende Technik an: Als Ziel kann “at after� bezogen auf das direkte selection-Objekt benutzt werden. Als Datenangabe kann das einer Variable zugewiesene selection-Objekt genutzt werden:
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     tell window 1
          make new drawing group at after selection with data Auswahl
     end tell
end tell
Dieser Code gruppiert die ausgewählten Zeichnungsobjekte. Die Gruppe ist danach nicht ausgewählt. Will man das normale Programm-Verhalten haben, bei dem nach dem Gruppieren die Gruppe ausgewählt ist, nimmt man folgenden Code:
tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     tell window 1
          set Gruppe to (make new drawing group at after selection with data Auswahl)
          select Gruppe
     end tell
end tell
Eine Gruppe wird einfach mit ungroup wieder aufgelöst:
tell application "RagTime 6.5"
     ungroup selection of window 1
end tell