Inkscape Programmier Schnittstelle

SSD1TB

Ensign
Registriert
Okt. 2010
Beiträge
242
So viel ich weiss hat Inkscape die Möglichkeit Programmcode auszuführen.
Wäre so etwas möglich:

Ich habe eine Grafik und ein Wort drunter, z.B. BERLIN.
Ich möchte aus einer Textdatei Zeile für Zeile Wörter auslesen, jede Zeile besteht aus einem anderen Städtenamen.
Dann soll das Programm ein Wort aus der Liste nehmen, und anstatt BERLIN einfügen, zentrieren, und das Bild als Stuttgart.png abspeichern.
Das ganze mit 500 Namen aus der Liste wiederholen.
Ich würde den Auftrag auf einer Jobplattform aufgeben, aber ist dies unter Inkscape überhaupt so möglich?
 
Die Grafik mit dem Wort, ist das eine .svg Datei und liegt das Wort als Vectortext vor?

Falls ja sollte das "theoretisch" relativ einfach gehen. Das Zentrieren ist dabei das Aufwendigste.
Wenn ich das richtig gelesen habe, dann kann man auch einfache Pythonscripts für Inkscape bauen und muss nicht unbedigt direkt eine Erweiterung in C++ schreiben, das spart einiges an Zeit.

Da es Funktionen zum Zentrieren gibt und man diese zu 90% auch aufrufen können sollte, ist das vermutlich in kurzer Zeit zusammengebaut, gerade wenn es nur Python ist.

Ich schaue mir das gegen Abend gerne mal an, ich arbeite auch gerne mit Inkscape und zu wissen wie man kleine Skripte baut ist nicht verkehrt. ;)
Es ist ja eigentlich auch nicht viel zu programmieren: Liste einlesen -> Text ändern -> Text zentieren -> Export.
Wenn die API diese Funktionen bereitstellt ist das prinzipiell echt kein Akt, wenn es einfach nur funktionieren soll.

Falls der Text kein Vectortext ist, dann ist das nicht so einfach. Im besten Fall wäre der Text alleine auf einem Layer, das wäre auch noch lösbar.
 
Hallo KingLz.
die Grafik ist eine .svg Datei. Wenn ich die Wörter manuell ersetze ist das ganz simpel:
Wort aus der Textdatei kopieren, Doppelklick auf den Text im Inkscape, bzw. markieren und dann "Einfügen".
Und auf vertikal zentrieren klicken. (Schriftgrösse und Schriftart werden automatisch übernommen)
Dann speichern unter.... Wieder das Wort einfügen, und dann speichern bzw als .png exportieren.

Halt zeitaufwändig und stupide weil ich das immer wieder benötige.
 
Falls du mit Inkscape-Erweiterungen nicht klar kommst, könntest du das theoretisch auch mit beliebiger Sprache direkt in der svg-Datei vornehmen. Die ist ja auch nur ein Textdokument. Und da man Text in svg netterweise direkt mittig ausrichten kann, würde sich das Vorhaben auf das Ersetzen des Wortes BERLIN durch das aus einer Liste und abspeichern unter neuem Namen beschränken. Im Grunde geht das auch einfach über ein shell-Skript.

Edit: Nachdem du also deine svg mit zentriertem Text als BERLIN.svg und deine Liste mit Städtenamen hast:
Code:
names=`cat names.txt`
for name in $names
    do sed "s/BERLIN/${name}/" BERLIN.svg > ${name}.svg
    done
 
Zuletzt bearbeitet:
Das Problem mit der Textausrichtung ist allerdings, dass diese im Bezug zum Ankerpunkt verläuft.
Da Standardmäßig der Textanker allerdings oben links angebracht ist und nicht mittig müssten wir diesen erstmal neu berechnen, was allerdings nut mit der Boundingbox des Textes geht, diese allerdings selbst in der Inkscape Python API, die total bescheiden dokumentiert ist, nicht geht. Der beste Workaround ist dann ein verstecktes Rechteck einzuzeichnen um über dessen Mittelpunkt die Mitte des Textes zu bestimmen.

Damit könnten wir das allerdings in der Tat auf eine einfache Weise zusammenbasteln. Ein kleines Script zum erstellen von X Dateien, die wir dann einfach per Commandozeilen Batchexport auf png umwandeln können mit Inkscape (vermutlich). Das ganze würde ein paar Minuten dauern bis es läuft und <1h bis es gut läuft. ;)
Das wäre allerdings eine Bastellösung nur für dieses eine Problem.
 
@KingLz Er muss den Text ja relativ zu irgendwas zentrieren. Das ist in Inkscape standardmäßig das Dokument/die Seite. Da dessen Ausmaße ja bekannt sein müssen, ist der zentrale Anker relativ schnell einmalig berechnet, ganz ohne die aktuelle Textboundingbox zu kennen und ohne ein verstecktes Rechteck.
Oder, falls du nicht die einmalige Neuberechnung des Mittelpunkts gemeint hast, sondern dass der Textanker grundsätzlich oben links wäre, dann der Hinweis, dass er sich mit text-anchor="middle" eben auf mittig setzen lässt.
Grundsätzlich wäre es aber natürlich sicher auch interssant, wie sowas als Inkscape Erweiterung aussehen würde. Dürfte auch nicht allzu viel Code ergeben.
 
@simpsonsfan
Der Text soll aber nur vertikal zentiert werden. Da je nach Buchstaben die Höhe der Boundingbox sich verändern sollte, auch bei gleichbleibender Textgröße, wird das direkt zu einem Problem, da wir die BBox ja nicht so einfach berechnen können. Also müssen wir am Ende doch irgendein Objekt, wie ein Rechteck, irgendwo hinterlegen mit dessen Mittelpunkt wir die exakte Position berechnen können. Vor allem gehe ich davon aus, dass man den Text in Inkscape an die richtige Stelle rutschen will und nicht PI mal Daumen über den svg Code.

Natürlich kann man den Textanker im Code ganz einfach ändern. Aber soviel ich gesehen habe kann man es in Inkscape halt nicht. Falls doch sag mir doch bitte wo die Funktion in Inkscape ist. Habe mich übrigens vertan und Inkscape richtet alles nach unten links aus. Also bei 0 0 wird der Text in der unteren linken Ecke eingehängt.

Das ganze Projekt wäre prinzipiell nur ein paar Zeilen Python Script wenn die Dokumentation nicht so super schlecht wäre. Wenn man den Text z.B. mit ausgewählteTexnode.text = setzen will, dann behält er den im Dokument hinterlegten Text bei und fügt den Text durch den Code als Prefix ein...
Zudem kann man den png Export, wenn ich es richtig verstanden habe, sowieso nur über die Inkscape Shell oder Commandozeile aufrufen und es gibt gar keine API für diese Funktion.
 
@KingLz Ich weiß leider auch nicht, ob sich der Textanker in Inkscape ändern lässt, dafür nutze ich Inkscape allgemein zu selten.
Ich würde annehmen, dass der TE den Text tatsächlich horizontal zentrieren möchte. Dummerweise heißt nämlich in Inkscape (zumindest in meiner Inkscape 0.48.4 r9939 Portable) die Funktion zum horizontalen Zentrieren "vertikal zentrieren" und umgekehrt, vermutlich ein Übersetzungsfehler.
horizontal.png
vertikal.png


Aber stimmt, Text vertikal zentral ausrichten kann man, soweit ich das sehe, in svg nicht direkt im Code.
 
@simpsonsfan

Also egal was ich geschrieben habe, sagen wir doch einfach der Text soll "links rechts" mittig ausgerichtet werden. So habe ich das jedenfalls verstanden. Die relative Position nach unten/oben soll beibehalten werden.
 
Hallo Leute, Danke für die Mühe!

Ich meinte "vertikal zentrieren", zumindest heisst es in Inkscape so. Dass eben der Text auf gleicher Höhe bleibt und mittig ausgerichtet wird.
Das Script von simpsonsfan:
Ich habe keinen Plan wie ich das überhaupt ausführen soll, gibt es da in Inkscape eine Schnittstelle?
 
Da sist ein Skript für die Standard Linux-Shell. Unter Windows kannst du das bspw. in dem (in Win10) integrierten linuxSubsystem for Windows oder unter cygwin ausführen. Inkscape benötigst du dafür garnicht. Lässt sich aber auch in powershell, python oder sonstigem ähnlich umsetzen. Der Punkt ist ja, dass du nur in der svg das Wort "Berlin" durch deinen neuen Städtenamen ersetzen musst, während die Zentrierung schon vorher eingestellt ist.
 
Zurück
Oben