Printing output to GUI frontend

#does not print sth to front GUI
print("print()")
sys.stdout.write("sys.stdout.write()")
sys.stderr.write("sys.stderr.write()")

#works
self.debug("self.debug()") #an error message with prepended "<DEBUG>"
self.msg("msg()") #an error message
inkex.errormsg("inkex.errormsg()") #the same error message like previous way
inkex.utils.errormsg("inkex.utils.errormsg()") #the same error message like previous way
inkex.utils.debug("inkex.utils.debug()") #the same error message like previous way

Einzele oder mehrere Elemente aus XML-Struktur bekommen

(info) Es ist besser das Wort "Element" zu nutzen als das Wort "node". Denn unter "node" verstehen wir in Inkscape einen Punkt eines Pfads. Eine "node" ist in XML-typischerweise jedoch auch ein Elementknoten.

Hier gibt es unzählige Möglichkeiten zum Entlanghangeln des XML Baums.

In InkScape 1.2dev

#Gets a single element from the given xpath or returns None
element = self.svg.getElement(self, xpath)

#Get an element in this svg document by it's ID attribute
element = self.svg.getElementById(self, eid, elm='*')

#Get an element by it's inkscape:label (aka name)
element = self.svg.getElementByName(self, name, elm='*')

#Get elements by it's class name (list)
for element in self.svg.getElementsByClass(self, class_name):

#Get elements by their href xlink attribute (list)
for element in self.svg.getElementsByHref(self, eid):

#Get elements by a style attribute url (list)  
for element in self.svg.getElementsByStyleUrl(self, eid, style=None):

#Get all selected
for element in self.svg.selected.values():

#Get all selected, but filtered
self.svg.selection.filter(inkex.PathElement).values(): #filter for things like ShapeElement, PathElement, Group, ... 
element = self.svg.findone()

for element in self.document.xpath(xpath):

for element in self.svg.xpath(xpath):

for element in self.svg.findall(pattern):

for element in self.document.getroot().iter("*"):

Convert strokes or objects (legacy/low-level items) to paths by code

Der SVG-Standard definiert einige grundlegende Formen (https://www.w3.org/TR/SVG2/shapes.html), die in Inkscape als Objekte und Strokes aufgeteilt werden.Die folgenden Formen können mit wenig Code in Pfade umgewandelt werden:

Inkscape categorynameSVG tag

object

rectanglesvg:rect

object

ellipsesvg:ellipse
objectcirclesvg:circle
objectstarsvg:path
objectspiralsvg:path
objectarcsvg:path

stroke

line

svg:line

stroke

polyline

svg:polyline

stroke

polygon

svg:polygon

Siehe \inkex\elements\_polygons.py

#works for objects like rectangles only
for element in self.svg.selected.values():
    element.replace_with(element.to_path_element())

Pfade

Pfade sind Elemente mit dem SVG-Tag "svg:path". Ihr Aufbau wird durch das Attribut "d" gesteuert. Dieses enthält eine Liste von Anweisungen (commands) und Koordinaten (relativ oder absolut). Die Koordinaten können durch visuelle Knotenpunkte (nodes) verändert werden. Die Steigungen können an den nodes durch Anfasser (handles) modifiziert werden. Ein Pfad wird kontrolliert durch eine Sequenz aus Linienzügen und/oder Bezierkurven. Diese können zusammenhängen oder lose einaneinandergereiht sein. Entsprechend gibt es unter Umständen Unterpfade (sub paths), getrennt durch eine neue Anweisung mit dem Befehl "move" (M oder m). Pfade können somit in Unterpfade geteilt werden (break apart) oder kombiniert werden (combine).

Inkscape Segmentbefehle

Absolut - kurzRelativ - kurzAbsolutRelativBezeichner
MmMovemovemoveto
LlLinelinelineto
HhHorzhorzhorizontal lineto
VvVertvertvertical lineto
CcCurvecurvecurveto
SsSmoothsmoothsmooth curveto
QqQuadraticquadraticquadratic Bézier curve
TtTepidQuadratictepidQuadraticsmooth quadratic Bézier curveto
AaArcarcelliptical Arc
Zz

ZoneClose

zoneCloseclosepath
  • Path
  • CubicSuperPath
  • InvalidPath
  • PathCommand
  • AbsolutePathCommand
  • RelativePathCommand

Weitere Infos gibt es auch unter https://inkscape.org/de/doc/tutorials/advanced/tutorial-advanced.html und https://www.w3schools.com/graphics/svg_path.asp

An den Pfad gelangen wir grundsätzlich:

#Zugriff auf nativen Path (beste Wahl)
element.path

#Zugriff über Attribut (weniger elegant, nicht nativ)
element.get('d')

Alle wichtigen Pfad-Operationen finden sich in \inkex\paths.py - viele Extensions in MightyScape Extension Collection sind leider "dreckig" programmiert ("historisch gewachsen") und enthalten noch sehr alten Spaghetti-Code, der migriert werden könnte. Dadurch sparen wir hunderte Zeilen Code und stabilisieren die Funktionen.

Pfaddarstellungen

als String ('d')

Die übliche Repräsentation als plain 'd'-Attribut, z.B.:

M 77.274639,37.856768 C 129.18134,61.273324 140.88962,3.9027594 129.57161,62.444153 118.25361,120.98554 88.982917,118.64389 128.40079,138.54796
element.get('d')

Path

Eine Liste von Segmentbefehlen, die zusammen eine Form zeichnen

#Zugriff auf nativen Path (beste Wahl)
p = element.path

#some good commands
p.to_absolute()
p.to_relative()
p.to_non_shorthand() #converts V/H to regular M commands (can help for readability)

als Array aus Arrays (deprecated)

#veraltet
element.path.to_arrays()

Cubic Super Path (CSP)

Eine alternative Pfaddarstellung, die auf beide Handles eines Knotens gleichzeitig zugreift. Dabei verloren geht die Eigenschaft geschlossener Kurven, falls vorher existent. Ein CSP ist eine Umwandlung eines Pfades in eine vorhersagbare Liste von kubischen Kurven, die als eine Liste von vereinfachten Anweisungen bearbeitet werden kann. Bei der Rückkonvertierung in einen Pfad werden alle Linien, Bögen etc. in Kurvenanweisungen umgewandelt. Die Struktur besteht aus Unterpfaden (sub paths)

#Erhalte den CSP
csp = element.path.to_superpath()

#Bekomme die einzelnen Unterpfade (sub paths, Segmente)
csp.to_segments()
  • No labels