Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorial:inkscape:plugins

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
tutorial:inkscape:plugins [2016/03/04 14:47] – [Liste von nützlichen Plugins] thore.mehrtutorial:inkscape:plugins [2023/06/07 16:58] (aktuell) hellmuth
Zeile 1: Zeile 1:
 ====== Plugins für Inkscape ====== ====== Plugins für Inkscape ======
-In diesem Tutorial wir das schreiben und installieren von Plugins für Inkscape behandelt.+In diesem Tutorial wird das Schreiben und Installieren von Plugins für Inkscape behandelt.
 ===== Liste von nützlichen Plugins ===== ===== Liste von nützlichen Plugins =====
-  * Cuttest + 
-  * Polygon +  * Polygon [[https://github.com/ThoreMehr/inkscape-polygon]] 
-  * DrawerCabinetMaker +  * Mehr_BoxMaker [[https://github.com/ThoreMehr/Mehr_BoxMaker]] 
-  * OpenTabbedBoxMaker+  * Gear-dev [[https://github.com/jnweiger/inkscape-gears-dev]] 
 + 
 ===== 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 der Erweiterung, kann man in Inkscape im Top-Menu Erweiterungen -> "Manage Extensions" aufrufen und den Tab "Install Packages" anwählen. Dann unten das Icon selektieren und in einem Filedialog den Zip-File angeben.  
-==== Ubuntu und viele andere Linux Varianten ==== + 
-Die Erweiterungen liegen im Ordner /usr/share/inkscape/extensionsDa der Eigentümer dieses Ordners root ist, hat ein normaler Benutzter keine SchreibrechteDies muss noch geändert werden. Dazu wird der Dateimanager als root gestartet werden,Für Ubuntu währe das im Terminal sudo nautilusund mit der GUI diese Einstellung vorgenommen.+Alternativ können die .py und die .inx Datei direkt in den Extentions-Ordner kopiert werden. Den Ordner findet man in Inkscape durch Aufruf von Bearbeiten -> Einstellungen -> System und dort in der Zeile "Benutzererweiterungen:" . Wenn man willkann man da auch einen anderen, leichter zu erreichenden Ordner einstellen. 
 + 
 +Es sollten die Dateien direkt sein, nicht ein Ordner, der diese Dateien enthältAusserdem 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 Tutorial wird sich auf die Verwendung der Standart-GUI und Code in Phython beschrenkt+Die Inkscape- Plugins bestehen aus zwei Teilen, einer GUI und dem eigentlichen Code. Dieses Tutorial beschränkt sich auf die Verwendung der Standart-GUI und Code in Phython. 
-Ein plugin besteht aus zwei Dateien, einer .inx und ,da in Phython programiert wird, einer .py.+Ein Plugin besteht aus zwei Dateien, einer .inx und einer .py, da in Phython programiert wird.
 Außerdem kann ein plugin zu einer von vier Klassen gehören, import, export,print und effect. Außerdem kann ein plugin zu einer von vier Klassen gehören, import, export,print und effect.
-Davon ist effect am interessantesten, da es Geometrie erzeugen und verändern kann. Daher, damit kann man Zeichnen. Dazu solten SVG-Pfade verstanden werden. Hier ist ein [[tutorial:inkscape:svg|tutorial]] dafür.+Davon ist effect am interessantesten, da es Geometrie erzeugen und verändern kann. Das heißt, damit kann man Zeichnen. Dazu solten SVG-Pfade verstanden werden. Hier ist ein [[tutorial:inkscape:svg|tutorial]] dafür.
 ==== 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:\\
-  <?xml version="1.0" encoding="UTF-8"?> +<code xml> 
-  <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> +<?xml version="1.0" encoding="UTF-8"?> 
-  <_name>$NAME</_name> +<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> 
-  <id>$ID</id>+<_name>$NAME</_name> 
 +<id>$ID</id
 +</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://wiki.inkscape.org/wiki/index.php/INX_Parameters|hier]] nachgeschlagen werden. Die ganzen Anführungszeichen sind ein Muss, wenn diese nicht benuzt werden kann die GUI nicht verarbeitet werden und das Plugin erscheint nicht im Menu. Wenn viele Parameter verwendet werden, sind tabs durch den "notebook" Parameter zwingend, da sonst, vorallem bei Bildschirmen mit niedriger Auflösung, die Anwenden Taste außerhalb des Bildschirmes liegt.\\ Danach folgt dann eine Anzahl Parameter. Wie diese fuktionieren kann [[http://wiki.inkscape.org/wiki/index.php/INX_Parameters|hier]] nachgeschlagen werden. Die ganzen Anführungszeichen sind ein Muss, wenn diese nicht benuzt werden kann die GUI nicht verarbeitet werden und das Plugin erscheint nicht im Menu. Wenn viele Parameter verwendet werden, sind tabs durch den "notebook" Parameter zwingend, da sonst, vorallem bei Bildschirmen mit niedriger Auflösung, die Anwenden Taste außerhalb des Bildschirmes liegt.\\
 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:\\
-  <effect> +<code xml> 
-  <object-type>all</object-type> +<effect> 
-    <effects-menu> +<object-type>all</object-type> 
-      <submenu _name="$SUBMENUENAME"/> +  <effects-menu> 
-    </effects-menu> +    <submenu _name="$SUBMENUENAME"/> 
-  </effect>+  </effects-menu> 
 +</effect
 +</code>
 Dieser Block ist spezifisch für die effect Klasse. Dieser Block ist spezifisch für die effect Klasse.
 +<code xml>
   <script>   <script>
-    <command reldir="extensions" interpreter="python">$PLUGINNAME.py</command>+    <command location="inx" interpreter="python">$PLUGINNAME.py</command>
   </script>   </script>
   </inkscape-extension>   </inkscape-extension>
 +</code>
 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 43: Zeile 55:
 Danach folgen Funktionen.  Danach folgen Funktionen. 
 Einige nützliche Funktionen sind Einige nützliche Funktionen sind
-  def textElement(text,positon,self): +<code python> 
-    t = inkex.etree.Element(inkex.addNS('text','svg')) +def textElement(text,positon,self): 
-    t.text=text +  t = inkex.etree.Element(inkex.addNS('text','svg')) 
-    t.set('x',str(self.unittouu(str(positon[0])+positon[2]))) +  t.text=text 
-    t.set('y',str(self.unittouu(str(positon[1])+positon[2]))) +  t.set('x',str(self.unittouu(str(positon[0])+positon[2]))) 
-    parent.append(t) +  t.set('y',str(self.unittouu(str(positon[1])+positon[2]))) 
-    return t +  parent.append(t) 
- +  return t 
-  def drawS(XYstring,color):         # Draw lines from a list +</code> 
-    name='part' +<code python> 
-    style = { 'stroke': color, 'fill': 'none'+def drawS(XYstring,color):         # Draw lines from a list 
-    drw = {'style':simplestyle.formatStyle(style),inkex.addNS('label','inkscape'):name,'d':XYstring} +  name='part' 
-    inkex.etree.SubElement(parent, inkex.addNS('path','svg'), drw ) +  style = { 'stroke': color, 'fill': 'none'
-    return +  drw = {'style':simplestyle.formatStyle(style),inkex.addNS('label','inkscape'):name,'d':XYstring} 
- +  inkex.etree.SubElement(parent, inkex.addNS('path','svg'), drw ) 
-  def groupdraw(XYstrings,colors) +  return 
-    if len(XYstrings)==1: +</code> 
-      drawS(XYstrings[0],colors[0]+<code python> 
-      return +def groupdraw(XYstrings,colors) 
-    grp_name = 'Group' +  if len(XYstrings)==1: 
-    grp_attribs = {inkex.addNS('label','inkscape'):grp_name} +    drawS(XYstrings[0],colors[0])
-    grp = inkex.etree.SubElement(parent, 'g', grp_attribs)#the group to put everything in +
-    name='part' +
-    for i in range(len(XYstrings)): +
-      style = { 'stroke': colors[i%len(colors)], 'fill': 'none'+
-      drw = {'style':simplestyle.formatStyle(style),inkex.addNS('label','inkscape'):name+str(i),'d':XYstrings[i]} +
-      inkex.etree.SubElement(grp, inkex.addNS('path','svg'), drw )+
     return     return
 +  grp_name = 'Group'
 +  grp_attribs = {inkex.addNS('label','inkscape'):grp_name}
 +  grp = inkex.etree.SubElement(parent, 'g', grp_attribs)#the group to put everything in
 +  name='part'
 +  for i in range(len(XYstrings)):
 +    style = { 'stroke': colors[i%len(colors)], 'fill': 'none' }
 +    drw = {'style':simplestyle.formatStyle(style),inkex.addNS('label','inkscape'):name+str(i),'d':XYstrings[i]}
 +    inkex.etree.SubElement(grp, inkex.addNS('path','svg'), drw )
 +  return
 +</code>
 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, wie ich ohne diese Instance unittouu aufruffe. 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, wie ich ohne diese Instance unittouu aufruffe.
 drawS zeichet einen SVG-Pfad in der üpbergebenen Fabe. Diese wird in HEX im Format '#RRGGBB' übergeben. groupdraw macht das gleiche für ein Array an SVG-Pfaden. Wenn mehr Strings als Faben verwendet übergeben wird werden Faben wiederholt. drawS zeichet einen SVG-Pfad in der üpbergebenen Fabe. Diese wird in HEX im Format '#RRGGBB' übergeben. groupdraw macht das gleiche für ein Array an SVG-Pfaden. Wenn mehr Strings als Faben verwendet übergeben wird werden Faben wiederholt.
 Darauf hin kann man mit der Definition der Klasse beginnen. Darauf hin kann man mit der Definition der Klasse beginnen.
-  class $CLASSNAME(inkex.Effect): +<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) 
 +</code>
 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:
-  self.OptionParser.add_option('--$OPTIONNAME',action='store',type='$OPTIONTYPE',+<code python> 
 +self.OptionParser.add_option('--$OPTIONNAME',action='store',type='$OPTIONTYPE',
         dest='$DESTINATIONVAR',default='$DEFAULTVAL',help='$HELPTEXT')         dest='$DESTINATIONVAR',default='$DEFAULTVAL',help='$HELPTEXT')
 +</code>
 In $OPTIONNAME kommt der Name der Option rein, genau so geschrieben, wie in der .inx. In $OPTIONSTYPE kommt entweder string, float, int oder inkbool rein, je nach dem, was ihr verwendet. Wenn ihr ein enum oder optionsgroup Parameter als string speichert, müssen vergleiche mit strings gemacht werden, daher z.B. =='0' und nicht ==0. In $OPTIONNAME kommt der Name der Option rein, genau so geschrieben, wie in der .inx. In $OPTIONSTYPE kommt entweder string, float, int oder inkbool rein, je nach dem, was ihr verwendet. Wenn ihr ein enum oder optionsgroup Parameter als string speichert, müssen vergleiche mit strings gemacht werden, daher z.B. =='0' und nicht ==0.
 Danach wird mit Danach wird mit
-    def effect(self): +<code python> 
-    global parent, $OTHERVARS+def effect(self): 
 +global parent, $OTHERVARS 
 +</code>
 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
-  self.options.$DESTINATIONVAR+<code python> 
 +self.options.$DESTINATIONVAR 
 +</code>
 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: +  # Get the attibutes: 
-    widthDoc  = self.unittouu(svg.get('width')) +widthDoc  = self.unittouu(svg.get('width')) 
-    heightDoc = self.unittouu(svg.get('height')) +heightDoc = self.unittouu(svg.get('height')) 
- +   # Create a new layer. 
-        # Create a new layer. +layer = inkex.etree.SubElement(svg, 'g'
-    layer = inkex.etree.SubElement(svg, 'g'+layer.set(inkex.addNS('label', 'inkscape'), 'newlayer'
-    layer.set(inkex.addNS('label', 'inkscape'), 'newlayer'+layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer'
-    layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer'+parent=self.current_layer 
-     +</code>
-    parent=self.current_layer+
 Damit wird ein neuer Layer mit Namen parent erschaffen, auf den gezeichnet wird. Dann können die Pfade als String geschrieben werden und mit den Drawfunktionen gezeichnet werden. Damit wird ein neuer Layer mit Namen parent erschaffen, auf den gezeichnet wird. Dann können die Pfade als String geschrieben werden und mit den Drawfunktionen gezeichnet werden.
 Den Abschluss des Programms bildet Den Abschluss des Programms bildet
-  effect = $CLASSNAME() +<code python> 
-  effect.affect()+effect = $CLASSNAME() 
 +effect.affect() 
 +</code>
 womit Inkscape das Programm aufruft. womit Inkscape das Programm aufruft.
 === Nützliche Fuktionen === === Nützliche Fuktionen ===
 +<code python>
   self.unittouu(str(value)+unit)   self.unittouu(str(value)+unit)
 +</code>
 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.1457099238.txt.gz · Zuletzt geändert: 2016/03/04 14:47 von thore.mehr

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki