Anders als bei Bildbearbeitungsprogrammen wie etwa Gimp, besteht eine Grafik in einem Vektorzeichenprogramm wie Sketch nicht aus Pixeln, sondern aus Objekten, die im wesentlichen als mathematische Beschreibung vorliegen. Diese Darstellung ermlicht zum einen, die Grafiken beliebig zu Skalieren. Au゚erdem lassen sie sich leichter 舅dern, da man, um etwa die Farbe eines Objektes zu 舅dern, das Objekt nicht komplett neu zeichnen mu゚, sondern einfach eine neue Farbe zuweisen kann.
Die aktuelle stabile Version ist 0.6.13. Dieser Artikel bezieht sich haupts臘hlich auf diese Version, Ende gibt es jedoch noch einen Ausblick auf die Entwicklerversionen (0.7.x)
Der folgende Screenshot zeigt Das Hauptfenster von Sketch mit einigen einfachen Grafikobjekten.
Das Hauptfenster gliedert sich grob, von oben nach unten, in Men, Werkzeugleiste, Zeichenfl臘he, Farbpalette und Statuszeile.
Die meisten Arbeiten an einer Grafik finden auf der Zeichenfl臘he statt, wo man mit der Maus Objekte zeichnet und bearbeitet. Was man auf der Zeichenfl臘he gerade tun kann, h舅gt vom gerade eingestellten Modus ab, der in der Statuszeile ganz links angezeigt wird.
Im obigen Bildschirmfoto befindet sich Sketch gerade im "Bearbeiten"-Modus, in dem Objekte ausgew臧lt und verschoben oder gedreht werden knen. Das Textobjekt "Sketch" ist gerade ausgew臧lt und mit den kleinen Quadraten um das Objekt herum kann man das Objekt durch einfaches Klicken und Ziehen vergrern. Ein einfacher klick auf das ausgew臧lte Objekt 舅dert die Quadrate zu Pfeilen, mit denen man das Objekt drehen und neigen kann:
Wenn man anf舅gt, mit Sketch zu arbeiten, will man typischerweise entweder an einer bereits vorhandenen Zeichnung weiter arbeiten oder eine Neue anfangen.
Bestehende Zeichnungen l臈t man ber das Datei-Men oder ber den Entsprechenden Knopf in der Werkzeugleiste. Der normale Datei-ヨffnen Befehl kann auch einige fremde Formate laden. Die untersttzen Formate werden automatisch erkannt. Mehr Informationen dazu finden sich im Abschnitt ber Datenaustausch.
Neue Objekte zeichnet man mit den Zeichenwerkzeugen, die man am einfachsten ber die Werkzeugleiste erreicht:
Rechtecke und Ellipsen zeichnet man einfach durch Klicken und Ziehen mit der Maus. Bei gleichzeitig gedrckter Strg-Taste werden Quadrate beziehungsweise Kreise gezeichnet. Mit der Umschalten-Taste gibt der erste Punkt den Mittelpunkt statt einer Ecke an.
Bei Linienzgen und Bézierkurven sind mehrere Mausklicks erforderlich, wobei ein Klick bei Linienzgen einen Eckpunkt festlegt. Bei Bézierkurven bestimmt ein Klick und nachfolgendes Ziehen einen Punkt und die Richtung der Kurve an dem Punkt. Die mittlere Maustaste beendet den Zeichenvorgang.
Beim Text-Werkzeug klicken Sie einfach an die stelle, wo der Text erscheinen soll und tippen ihn ein.
Das Raster/EPS-Werkzeug fnet einen Dateidialog mit dem Sie die Datei ausw臧len knen, die eingebettet wird. Sketch untersttzt eine Reihe g舅giger Rasterformate wie etwa PNG und Jpeg, sowie Encapsulated PostScript (EPS). Nachdem die Datei geladen wurde, knen Sie sie mit der Maus auf der Zeichenfl臘he positionieren. Fr EPS-Grafiken ruft Sketch automatisch ghostscript auf, um eine Vorschaugrafik zu erzeugen. Beim Drucken wird die EPS-Datei dann aber so wie sie ist in die PostScript-Ausgabe geschrieben.
Nachdem einige Objekte gezeichnet sind, mhte man sie oft weiter ver舅dern und zum Beispiel einen Kreis etwas vergrern oder einen Eckpunkt eines Linienzuges verschieben. Dazu gibt es zwei Werkzeuge, "Ausw臧len" und "Bearbeiten":
Im Auswahlwerkzeug w臧lt man mit der Maus Objekte aus, entweder durch einfaches Daraufklicken oder mit dem "Gummiband", indem man klickt und ein Rechteck aufzieht wodurch alle Objekte ausgew臧lt werden, die in dem Rechteck liegen. Bei gedrckter Strg-Taste werden die so bestimmten Objekte aus der Auswahl entfernt, bei gedrckter Umschalten-Taste zur Auswahl hinzugefgt.
Das Bearbeiten-Werkzeug funktioniert je nach Typ des ausgew臧lten Objekts anders, es ist aber immer so, da゚, wenn das Objekt berhaupt bearbeitet werden kann, entsprechende Griffe erscheinen. Bei Rechtecken kann man dann die Ecken abrunden, Kreise und Ellipsen in Tortenstcke umwandeln und bei Polygonen und Bezierkurven die Eck- und Kontrollpunkte verschieben.
Die meisten der oben erw臧nten Grundobjekte knen mit Fllungen und Umrissen versehen werden. Die einzige Ausnahme sind Raster und EPS-Grafiken, sowie zu einem gewissen Grad Text, welcher nur eine Fllung haben kann.
Als Fllungen bietet Sketch neben einfachen Farben auch Farbgradienten, Strichelungen und Muster an, letztere aber bisher nur mit Rasterbildern. Natrlich kann ein Objekt auch einfach gar keine Fllung haben, wodurch das Innere des Objekts gar nicht bemalt wird.
Die folgende Abbildung zeigt Objekte mit allen g舅gigen Fllungen. Daneben ist ein Screenshot des Dialogs, mit dem sich die Fllungen einstellen lassen.
Wenn man nur einfache Farben zuweisen mhte, geht es h舫fig einfacher und schneller mit einem Klick in die Palette. Ein Klick auf das Kreuz am linken Ende der Palette (Bei den Umrissen kann man Farbe, Liniendicke, Strichelung, Pfeilspitzen und Ecken- und Endenstile definieren. Wie die Fllung ist der Umri゚ optional. Ein Objekt, fr das keinen Umri゚ definiert ist wird nur gefllt, sofern eine Fllung zugewiesen ist. Objekte ohne Fllung und Umri゚ sind unsichtbar, knen aber dennoch ntzlich sein, etwa fr an einer Kurve ausgerichteten Text, wo man die Kurve verschwinden lassen mhte.
Die folgenden beiden Screenshots zeigt die diversen Mlichkeiten sowie den Liniendialog. Die drei blauen Linien mit dem wei゚en Kern zeigen die Ecken- und Endenstile. Um nur mal schnell eine neue Linienfarbe zuzuweisen, reicht auch ein Klick mit der mittleren Maustaste in die Palette, wobei wiederum ein Klick auf das Kreuz in der Palette den Umri゚ ganz entfernt.
Fr Text bietet Sketch zun臘hst einmal nur ein sehr einfaches Textobjekt an, das nur einzeiligen Text mit einer einzigen Schriftart darstellen kann. Immerhin kann man es aber mit beliebigen Fllungen versehen, an Pfaden ausrichten und den Text sogar in Kurven umwandeln, die man dann weiter bearbeiten kann, was bei einem der Beispiele zu ワberblendungen verwendet wird.
Mit Pluginobjekten erlaubt Sketch mittlerweile auch mehrzeiligen Text.
Zusammengehende Objekte knen zu einer Gruppe zusammengefasst werden. Dadurch kann man sie leichter als ganzes bearbeiten. Natrlich kann eine Gruppe auch wieder in ihre Bestandteile auflen. Beides, Gruppieren und Gruppierungen Aufheben, geht am einfachsten ber die entsprechenden Knfe in der Werkzeugleiste:
Hin und wieder ist es ntzlich ein Objekt auszuw臧len, das Bestandteil einer Gruppe ist um es in irgendeiner Weise zu 舅dern ohne gleich alle anderen Objekte in der Gruppe mit zu 舅dern oder die Gruppe erst aufzuheben, das Objekt zu 舅dern und dann mhsam die Gruppe wieder zusammenzustellen. Dazu w臧lt man zuerst die Gruppe aus und klickt dann mit gleichzeitig gedrckten Strg- und Umschalttasten auf das Objekt.
Eine weitere Mlichkeit, Objekte zusammenzufassen, sind Ebenen. Ebenen sind sehr viel loser als Gruppen, da automatisch die Objekte in den Ebenen ausgew臧lt werden statt der Ebenen selbst. Bei Gruppen wird normalerweise die Gruppe an sich ausgew臧lt. Im Gegensatz zu Gruppen bieten Ebenen aber einige weitere Mlichkeiten, die ber den Ebenen-Dialog zug舅glich sind:
Im obigen Ebenendialog sieht man neben der normalen Ebene, "Ebene 1", auch noch zwei spezielle Ebenen, "Gitter" und "Hilfslinien".
Die Gitterebene enth舁t das Gitter, das ber das "Ausrichten" Men eingerichtet wird: Der Menpunkt "Am Gitter Fangen" stellt das Gitter an und aus (ob es sichtbar ist, wird jedoch ber den Ebenendialog eingestellt). Wenn dieser Menpunkt aktiv ist, wirken die Gitterpunkte "magnetisch" und erlauben so, Objekte gezielt in regelm葹igen Abst舅den anzuordnen. Die Gitterweite, also die Abst舅de zwischen den Gitterpunkten kann mit dem Gitterdialog festgelegt werden der mit "Gitter…" gefnet wird.
Die Hilfslinienebene enth舁t Hilfslinien, die, wenn der "An Hilfslinien fangen" aktiv ist ebenfalls magnetisch wirken. Bei einer neuen Zeichnung ist die Hilfslinienebene leer. Neue Hilfslinien zeichnet man mit den beiden "Hilfslinie zeichnen" Meneintr臠en oder man legt sie im Hilfsliniendialog ("Hilfslinien…") numerisch fest.
Die so erzeugten Hilfslinien sind waagerechte oder senkrechte Geraden. Das ist das, was man am h舫figsten braucht. Es ist aber auch oft praktisch, wenn auch andere Objekte magnetisch sein knen. Sketch bietet dazu einerseits den Menpunkt "An Objekten fangen", durch den die Eckpunkte von Polygonen und andere Spezielle Punkte von Objekten anziehend wirken. darber hinaus kann man aber auch einfach beliebige Objekte auf die Hilfslinienebene verschiebt.
Sketch kann Text an Kurven ausrichten, so da゚ der Text an der Kurve entlang gesetzt ist. Dazu w臧lt man das Textobjekt und die Kurve aus (linker Screenshot) und kombiniert sie zum Pfadtextobjekt mit dem Menpunkt "Pfadtext Erzeugen" im "Effekte" Men (rechter Screenshot):
Gradienten bieten schon sehr ntzliche Mlichkeiten, um Schattierungen zu erzeugen, manchmal braucht man aber Farbverl舫fe, die sich mit den vordefinierten Gradienten nicht erzeugen lassen. In solchen F舁len kann man sich mit ワberblendungen helfen, wie etwa bei dieser Tux-Version, die ursprnglich von Simon Budig mit einem propriet舐en Zeichenprogramm vektorisiert wurde:
In der Umri゚-Darstellung des Kopfes rechts, sieht man, da゚ die Farbverl舫fe aus vielen sehr 臧nlichen Objekten bestehen.Um eine ワberblendungen zu erzeugen, w臧lt man einfach die beiden zu berblendenden Objekte aus wendet den Menpunkt "ワberblenden" aus dem "Effekte" Men an. Sketch bemht sich, aus jeder Kombination von Objekten etwas sinnvolles zu machen, sinnvoll einsetzen lassen sich ワberblendungen aber an sich nur, wenn beide Objekte eine トhnliche Struktur haben. ワberblendungen werden brigens automatisch aktualisiert, sobald Anfangs- oder Endobjekt ver舅dert werden.
Als zweites Beispiel fr ワberblendungen ein Neon-Schriftzug:
Maskierungen sind spezielle Gruppen, bei denen ein Objekt eine Region definiert, auf die das Zeichnen der in der Gruppe enthaltenen Objekte beschr舅kt wird. Im folgenden Beispiel ist der gro゚e Kreis eine Maskierung in der der Kreis als Maske fr eine vergrerte Kopie des Pinguins fungiert:
Die eingebauten Objekttypen sind zwar schon sehr m臘htig, bieten aber nicht immer genau das, was man braucht. Daher knen in Sketch mit Plugins neue Objekttypen definiert werden.
Weiter oben wurde bereits das Plugin fr mehrzeiligen Text erw臧nt. Es wurde von Christof Ecker geschrieben uns ist seit Version 0.6.13 ein Standardbestandteil des Sketch Pakets. Hier als Beispiel das zum Plugin gehende Fenster, in dem der Text bearbeitet wird und die Zeichenfl臘he auf der der Text mit dem Auswahlwerkzeug gedreht und geneigt wurde:
Das erste Pluginobjekt, das fr Sketch geschrieben wurde, erzeugt regul舐e Vielecke, und diente haupts臘hlich dazu zu testen, wie Pluginobjekte funktionieren knen. Es ist an sich wenig spektakul舐:
Wer mit geographischen Vektordaten und Sketch eine Karte produzieren mhten kann dazu das GeoObject Plugin verwenden. Es liest Shapefiles als Gruppen von Polygonen in Sketch ein. Das Ergebnis mit passenden Fllungen und Umrissen sieht dann etwa so aus (Screenshot mit dem GeoObjects dialog; mit Demodaten vom MapServer):
Anwendungsprogramme existieren nicht in einem Vakuum, sondern mssen meist auch Daten mit anderen Programmen austauschen. Sketch untersttzt eine Reihe fremder Dateiformate, die einfach mit den normalen Datei ヨffnen und Speichern befehlen gelesen und geschrieben werden knen.
Fr diejenigen Anwender, die bereits seit L舅gerem mit Unix-臧nlichen Systemen arbeiten, ist besonders interessant, da゚ Sketch XFig-Dateien lesen kann. Daten aus Windows- oder Mac-Programmen konvertiert man am besten in Illustrators AI Format, Corel's CMX oder auch Windows WMF Format um sie dann in Sketch zu laden. Des weiteren untersttzt Sketch auch SVG.
Leider werden noch nicht alle Features dieser Formate untersttzt, so da゚ die eingelesene Grafik nicht immer so aussieht, wie in dem Originalprogramm.
Fremdformate, die Sketch schreiben kann, sind z. B. PDF (mit Hilfe von reportlab), SVG, Illustrator AI und natrlich EPS.
Daten die noch nicht in einem Format vorliegen, das Sketch lesen kann, lassen sich unter Umst舅den mit pstoedit oder AutoTrace konvertieren.
Pstoedit konvertiert PostScript-Dateien mit Hilfe von ghostscript in editierbare Vektorformate, darunter auch Sketch's Eigenes. AutoTrace dagegen vektorisiert Rastergrafiken und kann sie in verschiedenen Vektorformaten speichern. Es beherrscht auch Sketch's Dateiformat. AutoTrace wurde verwendet, um eine Vektorversion von Gnomes Fu゚abdruck fr das "Fu゚spuren"-Skript zu erzeugen.
Sketch ist zum grten Teil in der Programmiersprache Python geschrieben. Python ist eine leicht zu erlernende, sehr dynamische Interpretersprache, die sich auch gut fr Benutzerskripte eignet. Da Sketch selbst in Python geschrieben ist, haben Benutzerskripte fast automatisch Zugriff auf alle Sketch Interna.
In diesem Abschnitt werden wir uns anschauen, wie man Sketch durch Pythonskripte erweitert. Eine Einfhrung in Python wrde den Rahmen dieses Artikels sprengen. Grundkenntnisse in Python werden daher vorausgesetzt.
Als erstes schauen wir uns an, wie ein Skript in Sketch eingebunden wird. Auf den Bildschirmfotos haben Sie vielleicht schon das "Skript" Men bemerkt. Alle Benutzerdefinierten Skripte sind in diesem Men aufgefhrt.
Seit Sketch 0.6.13 enth舁t das "Skript" Men bereits einige Skripte, die mit Sketch ausgeliefert werden (Beschriftung in Englisch, da diese Skripte noch nicht in die ワbersetzung mit einbezogen sind):
Um ein selbstgeschriebenes Skript in das "Skript"-Men zu bekommen nehmen wir erst einmal ein Skript das praktisch nichts tut, au゚er "Hallo von Sketch" in einer MessageBox auszugeben:
import Sketch.Scripting def hallo(context): context.application.MessageBox(title = "Hallo", message = "Hallo von Sketch", buttons = ("OK",)) Sketch.Scripting.AddFunction('hallo', 'Hallo', hallo)Das Modul Sketch.Scripting enth舁t den Teil von Sketch, der die Benutzerskripte verwaltet. Die Funktion Sketch.Scripting.AddFunction fgt die Funktion hallo und dem internen Namen 'hallo' mit dem Titel 'Hallo' in die Liste aller Benutzerskripte ein. Der Titel erscheint dann um "Skript"-Men.
Die Funktion hallo selbst hat einen Parameter context. Wenn die Funktion von Sketch aufgerufen wird, ist context ein Objekt, das Referenzen auf einige andere Objekte enth舁t. So ist z.B. context.application das Applikationsobjekt, das einige globale Dinge verwaltet und hier verwendet wird, weil es ber die MessageBox-Methode eine MessageBox angezeigt werden kann. Das wichtigste Objekt ist aber context.document, das Dokument, das hei゚t die Zeichnung, die gerade bearbeitet wird. Dieses werden wir sp舩er noch n臧er kennen lernen.
Speichern Sie diese Datei als ~/.sketch/hallo.py. Es ist an sich relativ egal, wo die Datei gespeichert wird, solange sie in Python's Pfad (sys.path) ist. Sketch fgt automatisch einige Verzeichnisse zum Pfad hinzu, unter anderem ~/.sketch/, so da゚ es ein sehr praktischer Platz fr Benutzerskripte ist.
Jetzt mssen wir nur noch dafr zu sorgen, da゚ diese Module auch importiert wird. Das geschieht in ~/.sketch/userhooks.py. Diese Datei wird automatisch von Sketch beim Start importiert. Falls diese Datei noch nicht existiert, legen Sie sie einfach mit folgendem Inhalt an
import hallo(Fgen Sie diese Zeile hinzu, falls userhooks.py bereits existiert).
Wenn Sie nun Sketch neu starten, sollte der Menpunkt "Hallo" im "Skript"-Men auftauchen. Wenn Sie ihn aufrufen, sollte in etwa folgender Dialog erscheinen:
Nun zu einem sinnvolleren Skript, das sogar etwas tut, was Sketch selbst noch nicht kann. Der "Ausrichten"-Dialog erlaubt es, alle gerade ausgew臧lten Objekte aneinander oder an der Seite auszurichten. Dabei werden jedoch alle Objekte einzeln verschoben, so da゚ die relativen Positionen der Objekte untereinander nicht erhalten bleiben. Das ist zwar meistens das, was man braucht, es ist aber auch h舫fig wnschenswert, alle gew臧lten Objekte gemeinsam zu Zentrieren, so da゚ die relative Anordnung erhalten bleibt. Dies soll unser Skript erreichen.
Dieses Skript muss im wesentlichen zwei Dinge kennen, um seine Arbeit erledigen zu knen: den Mittelpunkt der Seite und den Mittelpunkt aller ausgew臧lten Objekte.
Das Dokument-Objekt, das man wie oben erw臧nt als context.document ansprechen kann, enth舁t auch ein Seitenlayout, was zur Zeit allerdings nur das Seitenformat, also im Grunde die Breite und He der Seite, umfa゚t. Die Ausma゚e der Seite bekommt man am einfachsten ber die PageSize Methode des Dokument-Objekts. Da der Ursprung des Koordinatensystems, das Sketch verwendet in der unteren Linken Ecke ist, erh舁t man die Koordinaten des Seitenmittelpunkts durch halbieren der Breite bzw. He:
def ausrichten(context): doc = context.document # Mittelpunkt der Seite breite, hoehe = doc.PageSize() mitte_x = breite / 2 mitte_y = hoehe / 2Dieses Code-Fragment ist der Anfang des Skriptes, das wir hier schreiben mhten. Da man das Dokument recht h舫fig braucht, ist es ntzlich, es am Anfang in der lokalen Variablen doc abzulegen.
Der n臘hste Schritt ist der Mittelpunkt der Auswahl, der auch sehr einfach aus dem Dokument bestimmt werden kann. In Sketch 0.6 wird die Auswahl vom Dokument-Objekt verwaltet (anders als in 0.7, wo es ein separates Editor Objekt gibt) und es gibt eine Methode, die nur Ausma゚e der Ausgw臧lten Objekte als "rect" zurckgibt. Ein "rect" definiert ein rechteckiges Gebiet auf der Zeichenfl臘he. Es hat unter anderem eine center Methode die seinen Mittelpunkt zurckgibt. Damit bekommen wir den Mittelpunkt der Auswahl:
# Mittelpunkt der Auswahl. auswahl_x, auswahl_y = doc.SelectionBoundingRect().center()
Bleibt noch, die Objekte tats臘hlich zu verschieben. Auch dazu hat das Dokument-Objekt bereits eine passende Methode, TranslateSelected, die alle ausgew臧lten Objekte um den angegebenen Vektor verschiebt:
doc.TranslateSelected(Point(mitte_x - auswahl_x, mitte_y - auswahl_y))Der Vektor wird durch ein Point Objekt gegeben. Point Objekte werden in Sketch an vielen Stellen verwendet, um Punkte oder Vektoren darzustellen. Sie berladen einige Operatoren, so da゚ man z.B. Vektoren addieren kann, oder per Indexoperator ([]) auf seine Elemente zugreifen kann. Letzteres sorgt unter anderem dafr, da゚ man Point Objekte 臧nlich wie Tupel auspacken kann, was im obigen Code-Fragment auch bereits benutzt wurde, da der Rckgabewert der center Methode ein Point ist.
Der ワbersicht halber das komplette Skript:
import Sketch.Scripting from Sketch import Point def ausrichten(context): doc = context.document # Mittelpunkt der Seite breite, hoehe = doc.PageSize() mitte_x = breite / 2 mitte_y = hoehe / 2 # Mittelpunkt der Auswahl auswahl_x, auswahl_y = doc.SelectionBoundingRect().center() # Alle ausgew臧lten Objekte verschieben, so da゚ die Mitte der Auswahl # auf der Seitenmitte zu liegen kommt. doc.TranslateSelected(Point(mitte_x - auswahl_x, mitte_y - auswahl_y)) Sketch.Scripting.AddFunction('ausrichten', 'Gemeinsam Ausrichten', ausrichten, script_type = Sketch.Scripting.AdvancedScript)Eine wichtige トnderung gegenber dem ersten Skript ist der vierte Parameter von AddFunction. Der Schlsselwertparameter script_type legt den Typ des Skripts fest. Der Standardwert ist Sketch.Scripting.SafeScript. Ein SafeScript wird von Sketch mit besonderen Wrapperobjekten ausgefhrt, die dem Programmierer einige Arbeit abnehmen. So mu゚ man sich bei einem SafeScript zum Beispiel nicht um Undo-Informationen kmmern. Der Nachteil bei SafeScripts ist jedoch, da゚ nicht alle Methoden der Objekte zug舅glich sind, was allerdings haupts臘hlich daran liegt, da゚ nicht fr alle definiert ist, ob und in welcher weise sie in einem SafeScript verwendet werden knen.
Der hier verwendete Skripttyp, AdvancedScript erlaubt dagegen Zugriff auf alle Methoden und Attribute, da keinerlei Wrapper verwendet werden. Das macht AdvancedScripts sehr flexibel, da sie wirklich alles in Sketch verwenden knen, andererseits aber auch "gef臧rlicher", da man besser aufpassen mu゚, was man tut. So mu゚ ein AdvancedScript zum Beispiel Undo-Informationen richtig handhaben. Obiges Skript braucht dazu aber nichts spezielles zu tun, da die einzige トnderung, die es am Dokument vornimmt, ber die TranslateSelected Methode l舫ft, die bereits alles nige selbst macht.
Als drittes Skript zeichnen wir Fu゚spuren entlang eines Pfades. Das Skript wird als Eingabe zwei Objekte erwarten, einen Fu゚abdruck und den Pfad, an dem die Spuren entlang laufen sollen. Das Resultat wird dann etwa so aussehen:
Auf den ersten Blick sieht das vielleicht nach viel Rechnerei aus, da man ja aus der mathematischen Beschreibung der Kurve bestimmen mu゚, wie man die einzelnen Abrcke positionieren mu゚. Wenn man sich aber daran erinnert, da゚ Sketch ja auch Text an einer Kurve ausrichten kann, wird klar, da゚ passender Code bereits irgendwo in Sketch existieren mu゚ und da Sketch in Python implementiert ist, kann unser Skript auch darauf zugreifen, auch dann, wenn dies von den Programmierern noch gar nicht vorgesehen war. Wir mssen nur herausfinden, wo. Leider sind die Interna von Sketch nicht sehr gut dokumentiert, so da゚ man nicht umhinkommt, sich etwas in den Quelltext einzulesen.
Der fr uns hier wichtige Teil von Sketch, die Implementierung des Pfadtext Objektes, ist im Sketch.Graphics.text. Wir brauchen insbesondere die Funktion coord_sys_at und die Konstante PATHTEXT_ROTATE. Der Anfang unseres Scripts mit allen imports sieht daher zun臘hst einmal so aus:
import Sketch.Scripting from Sketch.Graphics.text import coord_sys_at, PATHTEXT_ROTATE from Sketch import Group, Translation, Scale
Eine weitere Sache, die wir entscheiden mssen, ist, wie der Benutzer definiert, welches Objekt an welchem ausgerichtet wird, also welches Objekt der Fu゚abdruck ist. Leider l葹t sich in Sketch nicht feststellen, in welcher Reihenfolge Objekte ausgew臧lt wurden. Als Konvention wollen wir daher annehmen, da゚ genau zwei Objekte ausgew臧lt werden und da゚ das obere der beiden die Kurve ist, an der die Fu゚spuren entlanglaufen.
Also holen wir uns am Anfang unsere Funktion die aktuell ausgew臧lten Objekte mit SelectedObjects und prfen, ob es genau zwei sind, und ob das Obere eine Kurve ist:
def foot_prints_along_path(context): doc = context.document objects = doc.SelectedObjects() if len(objects) == 2 and objects[1].is_curve:
Als erstes holen wir uns den Fu゚abdruck. Wir erzeugen eine Kopie des Abdrucks um das Objekt, das ja noch Teil des Dokuments ist nicht zu ver舅dern:
foot_print = objects[0].Duplicate()
Der Rest des Skripts ist leichter, wenn der Abdruck, der als Vorlage aller anderen Abdrcke dient am Ursprung liegt. Wir verschieben ihn also so, da゚ seine linke untere Ecke im Ursprung liegt. Die Transform-Methode ver舅dert das Objekt. Daher war es gerade wichtig, es vorher zu kopieren:
r = foot_print.coord_rect foot_length = r.right - r.left foot_print.Transform(Translation(-r.right + foot_length/2, -r.bottom))
Nun zum Pfad. Die Paths Methode eines Objekts gibt ein Tupel von Pfadobjekten zurck, sofern das Objekt dies untersttzt, was immer dann der Fall ist, wenn sein is_curve Attribut wahr ist:
path = objects[1].Paths()[0]
Die Methode arc_lengths (Bogenl舅gen) liefert eine Liste mit (L舅ge, Punkt) paaren, wobei Punkt ein Punkt auf der Kurve ist und L舅ge die L舅ge der Kurve vom Anfangspunkt bis zu dem jeweiligen Punkt. Die Punkte sind so positioniert, da゚ man die Kurve zwischen ihnen als Strecke ansehen kann:
arc_lengths = path.arc_lengths()
Die eigentliche Arbeit des Scripts wird in Schleife erledigt, in der wir die Fu゚abdrcke nacheinander und abwechselnd links und rechts positionieren bis wir die Entfernung vom Anfang zum Ende zurckgelegt haben. Dazu brauchen wir noch ein paar Variablen, n舂lich fr die Gesamtl舅ge des Pfades (total_length) damit wir wissen wie weit wir gehen, dann die bereits zurckgelegte Entfernung (distance), einen Z臧ler, um zu wissen welche Fu゚abdrcke links und welche rechts sind, sowie eine Liste in der wir alle Fu゚abrcke sammeln (foot_prints):
total_length = arc_lengths[-1][0] distance = 0 count = 0 foot_prints = []
Die Schleife l舫ft solange wie wir mehr als eine Fu゚l舅ge vom Ende entfernt sind:
while total_length - distance > foot_length:
Bei jedem Schleifendurchlauf bestimmen wir die Abbildung, die die Vorlage foot_print and die richtige Position bringt, n舂lich distance vom Anfang entfernt:
trafo = coord_sys_at(arc_lengths, distance, PATHTEXT_ROTATE)
Wenn es ein rechter Fu゚ sein soll (wir nehmen an, da゚ die Vorlage zu einem linken Fu゚ geht), mssen wir erst noch an der X-Achse spiegeln:
if count % 2: trafo = trafo(Scale(1, -1))
Kopiere die Vorlage und transformiere sie in die richtige Stellung. Wie oben erl舫tert ver舅dert Transform das Objekt, daher die Kopie:
foot = foot_print.Duplicate() foot.Transform(trafo) foot_prints.append(foot)
Am Ende jedes Durchlaufs noch die zurckgelegte Entfernung und den Z臧ler aktualisieren:
distance += foot_length count += 1
Wenn die Schleife fertig ist, haben wir alle Fu゚abdrcke in der Liste. Wir mssen diese Objekte jetzt nur noch als Gruppe in das Dokument einfgen. Bei sehr kurzen Kurve, oder langen F゚en, kann es passieren, da゚ gar keine Objekte Positioniert wurden, daher Erzeugen wir nur dann eine Gruppe, wenn berhaupt Objekte da sind:
if foot_prints: doc.Insert(Group(foot_prints))
Nun noch einmal das komplette Script. Hier sind auch noch einige fehlende imports enthalten:
import Sketch.Scripting from Sketch.Graphics.text import coord_sys_at, PATHTEXT_ROTATE from Sketch import Group, Translation, Scale def foot_prints_along_path(context): doc = context.document objects = doc.SelectedObjects() if len(objects) == 2 and objects[1].is_curve: foot_print = objects[0].Duplicate() r = foot_print.coord_rect foot_length = r.right - r.left foot_print.Transform(Translation(-r.right + foot_length/2, -r.bottom)) path = objects[1].Paths()[0] arc_lengths = path.arc_lengths() # In der folgenden Schleife positionieren wir nacheinander die # Fu゚abdrcke abwechselnd links und rechts bis wir die # Entfernung vom Anfang zum Ende zurckgelegt haben. total_length = arc_lengths[-1][0] distance = 0 count = 0 foot_prints = [] while total_length - distance > foot_length: trafo = coord_sys_at(arc_lengths, distance, PATHTEXT_ROTATE) if count % 2: trafo = trafo(Scale(1, -1)) foot = foot_print.Duplicate() foot.Transform(trafo) foot_prints.append(foot) distance += foot_length count += 1 # Zum Schlu゚ fgen wir die Fu゚abdrcke als Gruppe in das # Dokument ein. Die Insert-Methode kmmert sich automatisch um # Undo-Informationen. if foot_prints: doc.Insert(Group(foot_prints)) Sketch.Scripting.AddFunction('foot_prints_along_path', 'Foot Prints', foot_prints_along_path, script_type = Sketch.Scripting.AdvancedScript)
Wenn alles klappt, msste man jetzt z.B. mit diesen beiden Objekten
Dieses Skript, das ja eigentlich gar nicht auf Fu゚abdrcke beschr舅kt ist, lie゚e noch viele Erweiterungen zu. So knte man z.B. die Gren oder Positionen der Objekte zufallsgesteuert ein wenig variieren. Man knte das ganze auch noch zu einem Plugin-Objekt erweitern und damit dafr sorgen, da゚ die Fu゚spuren automatisch aktualisiert werden, sobald man die Kurve bearbeitet.
Der augenf舁ligste Unterschied zwischen den stabilen 0.6er Versionen und den 0.7er Entwicklerversionen ist, da゚ Sketch 0.7 auf GTK statt auf Tk als GUI-Toolkit aufsetzt und ein Gimp 臧nliches Benutzerinterface hat mit einem Werkzeugkasten (im Bild oben links) und einem Hauptfenster fr jede gefnete Zeichnung:
Weitere Neuigkeiten sind:
Kantengl舩tung mit Libart (optional). Einige der Beispielgrafiken in diesem Artikel sind Screenshots der Entwicklerversion.
Freihandwerkzeug. Die so gemalten Linien werden durch Bezierkurven approximiert
Metadaten. Mit jedem Objekt knen Metadaten in Form von Schlsselwort/Wert-Paaren verknpft werden.
Webseiten
Die Heimatseite von Sketch ist der Hauptanlaufpunkt fr Informationen ber Sketch und zum Herunterladen des Programms selbst.
Auf der franzischen Webseite ber Sketch gibt es ein recht komplettes Benutzerhandbuch zu Sketch, sowie eine sehr ansehnliche Clipart-Sammlung. Die Cliparts sind auch fr Leute interessant, die des Franzischen nicht m臘htig sind.
LinuxFocus, November 1999 . Yves Ceccone beschreibt das Arbeiten mit Sketch anhand der Zeichnung einer Diskette und demonstriert einige Spezialeffekte.
LinuxUser, September 2001. Frank Wieduwilt vergleicht einige Vektorzeichenprogramme fr GNU/Linux. Fazit:
Sketch ist dem Ziel, ein universelles Zeichenprogramm fr Linux zu werden, schon am n臘hsten, sodass man der weiteren Entwicklung gespannt harren darf.
Die Programmiersprache Python ist eine sehr flexible, interpretierte Sprache, die sich zudem noch sehr leicht durch in C-geschriebene Module erweitern l葹t.
ReportLab ist eine Firma, deren Hauptprodukt eine Python-Bibliothek gleichen Namens ist, die PDF erzeugen kann. ReportLab ist freie Software.
pstoedit ist ein Programm das mit Hilfe von ghostscript PostScript-Dateien in eine reihe von Vektorformaten konvertieren kann, darunter auch Sketch's eigenes .sk-Format.
Das Programm AutoTrace vektorisiert Rastergrafiken und kann sie in verschiedenen Vektorformaten speichern. Es beherrscht auch Sketch's Dateiformat. AutoTrace wurde verwendet, um eine Vektorversion von Gnomes Fu゚abdruck fr das "Fu゚spuren"-Skript zu erzeugen.