tutorial:inkscape:plugins
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
tutorial:inkscape:plugins [2016/03/04 14:40] – [Phython Code] thore.mehr | tutorial:inkscape:plugins [2023/06/07 16:58] (aktuell) – hellmuth | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Plugins für Inkscape ====== | ====== Plugins für Inkscape ====== | ||
- | In diesem Tutorial | + | In diesem Tutorial |
+ | ===== Liste von nützlichen Plugins ===== | ||
+ | |||
+ | * Polygon [[https:// | ||
+ | * Mehr_BoxMaker [[https:// | ||
+ | * Gear-dev [[https:// | ||
+ | |||
===== Installieren ===== | ===== Installieren ===== | ||
- | ==== Windows ==== | + | |
- | Die Erweiterungen liegen im Ordner \Inkscape\share\extensions. In der standart installation also in C:\Program Files\Inkscape\share\extensions | + | Hat man einen zip-File |
- | ==== Ubuntu | + | |
- | Die Erweiterungen liegen im Ordner / | + | Alternativ können die .py und die .inx Datei direkt in den Extentions-Ordner kopiert |
+ | |||
+ | Es sollten die Dateien direkt sein, nicht ein Ordner, der diese Dateien enthält. Ausserdem sollte man beachten, daß wie bei allem Code, den man sich auf den Rechner lädt, man den Quellen vertrauen muss. | ||
+ | |||
===== Schreiben von Plugins ===== | ===== Schreiben von Plugins ===== | ||
- | Die Inkscape- Plugins bestehen aus zwei Teilen, einer GUI und dem eigentlichen Code. In diesem | + | Die Inkscape- Plugins bestehen aus zwei Teilen, einer GUI und dem eigentlichen Code. Dieses |
- | Ein plugin | + | Ein Plugin |
Außerdem kann ein plugin zu einer von vier Klassen gehören, import, export, | Außerdem kann ein plugin zu einer von vier Klassen gehören, import, export, | ||
- | Davon ist effect am interessantesten, | + | Davon ist effect am interessantesten, |
==== GUI ==== | ==== GUI ==== | ||
Die GUI wird in Form einer XML-Datei mit der Endung .inx definiert. Der aufbau der Datei ist wie folgt:\\ | Die GUI wird in Form einer XML-Datei mit der Endung .inx definiert. Der aufbau der Datei ist wie folgt:\\ | ||
- | | + | <code xml> |
- | < | + | <?xml version=" |
- | < | + | < |
- | < | + | < |
+ | < | ||
+ | </code> | ||
$NAME solte der Name des Plugins sein. $ID ist die ID des Plugins und muss einzigartig sein. Ich verwende momentan de.mehr.flk.$name.\\ | $NAME solte der Name des Plugins sein. $ID ist die ID des Plugins und muss einzigartig sein. Ich verwende momentan de.mehr.flk.$name.\\ | ||
Danach folgt dann eine Anzahl Parameter. Wie diese fuktionieren kann [[http:// | Danach folgt dann eine Anzahl Parameter. Wie diese fuktionieren kann [[http:// | ||
Auf die Parameter folgt dann noch die Informationen zum Aufruff des Phython Programs:\\ | Auf die Parameter folgt dann noch die Informationen zum Aufruff des Phython Programs:\\ | ||
- | | + | <code xml> |
- | < | + | < |
- | < | + | < |
- | <submenu _name=" | + | < |
- | </ | + | <submenu _name=" |
- | </ | + | </ |
+ | </effect> | ||
+ | </code> | ||
Dieser Block ist spezifisch für die effect Klasse. | Dieser Block ist spezifisch für die effect Klasse. | ||
+ | <code xml> | ||
< | < | ||
- | < | + | < |
</ | </ | ||
</ | </ | ||
+ | </ | ||
In $SUBMENUENAME kommt der Name des Submenues rein, ich verwende Laser Tools. In $PLUGINNAME sollte der Name der .py rein, normalerweise der Name der Erweiterung.\\ | In $SUBMENUENAME kommt der Name des Submenues rein, ich verwende Laser Tools. In $PLUGINNAME sollte der Name der .py rein, normalerweise der Name der Erweiterung.\\ | ||
Es ist nicht möglich aus dem Code Einfluss auf die GUI zu nehmen, die GUI ist nur dazu da, eine Oberfläche auf ein Comandozeilenwerkzeug zu setzten. | Es ist nicht möglich aus dem Code Einfluss auf die GUI zu nehmen, die GUI ist nur dazu da, eine Oberfläche auf ein Comandozeilenwerkzeug zu setzten. | ||
Zeile 38: | Zeile 55: | ||
Danach folgen Funktionen. | Danach folgen Funktionen. | ||
Einige nützliche Funktionen sind | Einige nützliche Funktionen sind | ||
- | | + | <code python> |
- | t = inkex.etree.Element(inkex.addNS(' | + | def textElement(text, |
- | t.text=text | + | t = inkex.etree.Element(inkex.addNS(' |
- | t.set(' | + | t.text=text |
- | t.set(' | + | t.set(' |
- | parent.append(t) | + | t.set(' |
- | return t | + | parent.append(t) |
- | + | return t | |
- | def drawS(XYstring, | + | </ |
- | name=' | + | <code python> |
- | style = { ' | + | def drawS(XYstring, |
- | drw = {' | + | name=' |
- | inkex.etree.SubElement(parent, | + | style = { ' |
- | return | + | drw = {' |
- | + | inkex.etree.SubElement(parent, | |
- | def groupdraw(XYstrings, | + | return |
- | if len(XYstrings)==1: | + | </ |
- | drawS(XYstrings[0], | + | <code python> |
- | return | + | def groupdraw(XYstrings, |
- | grp_name = ' | + | if len(XYstrings)==1: |
- | grp_attribs = {inkex.addNS(' | + | drawS(XYstrings[0], |
- | grp = inkex.etree.SubElement(parent, | + | |
- | name=' | + | |
- | for i in range(len(XYstrings)): | + | |
- | style = { ' | + | |
- | drw = {' | + | |
- | inkex.etree.SubElement(grp, | + | |
return | return | ||
+ | grp_name = ' | ||
+ | grp_attribs = {inkex.addNS(' | ||
+ | grp = inkex.etree.SubElement(parent, | ||
+ | name=' | ||
+ | for i in range(len(XYstrings)): | ||
+ | style = { ' | ||
+ | drw = {' | ||
+ | inkex.etree.SubElement(grp, | ||
+ | return | ||
+ | </ | ||
In der ersten wird ein Textelement mit dem Text text an der Position (x,y,unit) erzeugt. In self wird eine Instance von inkex.Effect übergeben. diese ist nach der Initalisierung in self gespeichert. Ich habe noch nicht herausgefunden, | In der ersten wird ein Textelement mit dem Text text an der Position (x,y,unit) erzeugt. In self wird eine Instance von inkex.Effect übergeben. diese ist nach der Initalisierung in self gespeichert. Ich habe noch nicht herausgefunden, | ||
drawS zeichet einen SVG-Pfad in der üpbergebenen Fabe. Diese wird in HEX im Format '# | drawS zeichet einen SVG-Pfad in der üpbergebenen Fabe. Diese wird in HEX im Format '# | ||
Darauf hin kann man mit der Definition der Klasse beginnen. | Darauf hin kann man mit der Definition der Klasse beginnen. | ||
- | | + | <code python> |
- | def __init__(self): | + | class $CLASSNAME(inkex.Effect): |
- | # Call the base class constructor. | + | def __init__(self): |
- | inkex.Effect.__init__(self) | + | # Call the base class constructor. |
+ | inkex.Effect.__init__(self) | ||
+ | </ | ||
Dieser Block leitet die Definition der Klasse vor. In $Classname kommt der Name der Klasse, ich verwende da den Namen des Pugins. Danach werden die Optionen nach folgeneden Schema übernommen: | Dieser Block leitet die Definition der Klasse vor. In $Classname kommt der Name der Klasse, ich verwende da den Namen des Pugins. Danach werden die Optionen nach folgeneden Schema übernommen: | ||
- | | + | <code python> |
+ | self.OptionParser.add_option(' | ||
dest=' | dest=' | ||
+ | </ | ||
In $OPTIONNAME kommt der Name der Option rein, genau so geschrieben, | In $OPTIONNAME kommt der Name der Option rein, genau so geschrieben, | ||
Danach wird mit | Danach wird mit | ||
- | | + | <code python> |
- | global parent, $OTHERVARS | + | def effect(self): |
+ | global parent, $OTHERVARS | ||
+ | </ | ||
der Effect definiert. Hier kommt der eigentliche Code rein. Auf Variablen im global bereich kann aus allen Funktionen in der .py zugegriffen werden. Auf die zuvor übernommenen Parameter kann mit | der Effect definiert. Hier kommt der eigentliche Code rein. Auf Variablen im global bereich kann aus allen Funktionen in der .py zugegriffen werden. Auf die zuvor übernommenen Parameter kann mit | ||
- | | + | <code python> |
+ | self.options.$DESTINATIONVAR | ||
+ | </ | ||
zugegriffen werden. | zugegriffen werden. | ||
Danach erstellen wir eine neue Ebene auf die wir Zeichenen wollen. Dies tun wir mit | Danach erstellen wir eine neue Ebene auf die wir Zeichenen wollen. Dies tun wir mit | ||
- | svg = self.document.getroot() | + | <code python> |
- | + | svg = self.document.getroot() | |
- | | + | # Get the attibutes: |
- | widthDoc | + | widthDoc |
- | heightDoc = self.unittouu(svg.get(' | + | heightDoc = self.unittouu(svg.get(' |
- | + | | |
- | | + | layer = inkex.etree.SubElement(svg, |
- | layer = inkex.etree.SubElement(svg, | + | layer.set(inkex.addNS(' |
- | layer.set(inkex.addNS(' | + | layer.set(inkex.addNS(' |
- | layer.set(inkex.addNS(' | + | parent=self.current_layer |
- | + | </ | |
- | | + | Damit wird ein neuer Layer mit Namen parent |
- | Damit erschaffen wir einen neuen Layer mit Namen parent, auf den wir zeichnen. | + | |
Den Abschluss des Programms bildet | Den Abschluss des Programms bildet | ||
- | | + | <code python> |
- | effect.affect() | + | effect = $CLASSNAME() |
+ | effect.affect() | ||
+ | </ | ||
+ | womit Inkscape das Programm aufruft. | ||
=== Nützliche Fuktionen === | === Nützliche Fuktionen === | ||
+ | <code python> | ||
self.unittouu(str(value)+unit) | self.unittouu(str(value)+unit) | ||
+ | </ | ||
gibt Strecken in einer Einheit in der von Inkscape genutzte universale Einheit, Pixel, zurück. | gibt Strecken in einer Einheit in der von Inkscape genutzte universale Einheit, Pixel, zurück. | ||
- |
tutorial/inkscape/plugins.1457098808.txt.gz · Zuletzt geändert: 2016/03/04 14:40 von thore.mehr