Python-Skript zum Finden von Übereinstimmungen in Textdateien. Grafik. Für Inkscape / Sudo Null IT-News

Ich warne Sie im Voraus – es ist ein wenig verwirrend …

Der Inkscape-Grafikeditor (wenn der Benutzer und Inkscape bei der Installation Glück haben) kann Python-Skripte ausführen, die alle möglichen Linien, Kreise, Rechtecke und sogar Text zeichnen.

Der Text des Plugins zum Finden von Übereinstimmungen in zwei Textdateien (textfa.txt und textfb.txt):

#!/usr/bin/env python # encoding=utf-8 # Importiere Grafikmagie und anderes Zeug importiere Inkex von Inkex importe TextElement, Group, Layer, Tspan, PathElement FntSz = 3.175 # Wir werden Text ausgeben – das ist also der Text size FntHt = 1.6 # Zeilenabstand FilenameA = ‘/home/user_name/textfa.txt’ # first file FilenameB = ‘/home/user_name/textfb.txt’ # second file sxA = 0 # Koordinaten für die Textausgabe aus der ersten Datei syA = 0 sxB = 1000 # Koordinaten für die Textausgabe aus der zweiten Datei syB = 0 class Comparator(inkex.EffectExtension): # was soll ich sagen… #–#–#——— –Ich möchte den genauen “SourceText” in dieser Gruppe irgendwie unterscheiden ——————————- def effect(self ): # diese Methodenklasse Comparator wird von Inkscape ar23A = gestartet [‘nothing’,’here’] # Vorbereiten eines Arrays zum Lesen aus der ersten Datei ar23B = [‘nothing’,’here’] # ein Array zum Lesen aus der zweiten Datei vorbereiten Layer = self.PrepareThelayer(‘Habr23’) # ein leeres Graphic_layer zum Zeichnen mit open(FilenameA, ‘r’) als Datei vorbereiten: BigTxA = file.read() # Text auslesen die erste Datei ar23A = BigTxA.split(‘\n’) # den Text in ein Array in Zeilen aufteilen self.drawText(Layer, sxA, syA, ar23A) # das Array von Strings mit open(FilenameB, ‘ r’) als Datei: BigTxB = file .read() # den Text aus der zweiten Datei lesen ar23B = BigTxB.split(‘\n’) # den Text in ein Array in Zeilen aufteilen self.drawText(Layer, sxB, syB , ar23B) # zeichne das Array von Strings in die Grafikdatei für nA im Bereich (0, len(ar23A)): # Schleife durch beide Arrays mit Strings und suche nach … für nB im Bereich (0, len(ar23B)): wenn (ar23A[nA] == ar23B[nB]): # …Suche nach identischen Strings if(len(ar23A[nA]) > 1): # Leerzeilen vermeiden yA = nA * FntHt * FntSz # Koordinaten für Linie zwischen übereinstimmenden Zeilen vorbereiten yB = nB * FntHt * FntSz self.drawLine(Layer, sxA+200,syA+yA, sxB, syB+yB ) # eine Linie zwischen übereinstimmenden Linien ziehen #–#–#———————————– – ———————————— def drawText(self, Layer, x, y, Tmass): # starte die text_block Erstellungszeremonie elem = TextElement( x=str(x), y=str(y)) elem.style = { # setze das Aussehen unseres Textblocks ‘font-size’:str(FntSz), # font-size ‘line-height’:str (FntHt), # Abstand zwischen ‘font-family’:’courier’ Zeilen, # usw. ‘-inkscape-font-specification’:’courier’, ‘stroke-width’:’0.264583′} # noch ein paar zeremonielle Zaubersprüche elem.set(‘xml:space’,”preserve”) # und beginne mit der Textausgabe Zeile für Zeile für n in range(0, len(Tmass)): tx23 = Tspan(Tmass[n]) # eine Zeile erstellen tx23.set(‘sodipodi:role’,”line”) # magisch… tx23.set(‘x’ ,x) tx23.set(‘y’ , y + (n * FntHt * FntSz ) ) elem.add(tx23) # Anhängen jeder Zeile an einen Textblock # Anzeigen des Textblocks in der Grafikebene (d. h. Anzeigen auf dem Bildschirm) Layer.add(elem) # Anzeigen des erstellten Textblocks auf dem Bildschirm # –#–#— —————————————– ——— ———- def PrepareThelayer(self, Lname): # versuche zuerst Graphic_layer mit dem gewünschten Namen zu finden svg = self.document.getroot() # suche im Dokument nach g in svg.xpath(‘//svg :g’, namespaces=inkex.NSS): if g.get(inkex.addNS(‘groupmode’, ‘inkscape’)) == ‘layer’: t23 = g.get (inkex.addNS(‘label’, ‘inkscape’)) if (t23 == Lname): # Stimmt der Name der Grafikebene überein? for child in g: # wenn es die gewünschte Ebene ist g.remove(child) # Inhalt löschen return g # Wir haben die Grafikebene mit dem gewünschten Namen nicht gefunden # also erstellen wir eine neue Grafikebene mit dem gewünschten Namen newlayer=self. svg.add(Layer.new(lname)) gibt newlayer zurück #–#–#—————————— — ———————— def drawLine(self, layer, x0,y0, x99, y99): # Zeichne eine Linie nach allen Inkscape-Zeremonien # zuerst eine Linie erstellen… line = PathElement() line.set(‘fill’,’none’) line.set(‘stroke’,”#4FF”) # color line.set(‘stroke-width’, ‘0.8’ ) # Dicke line.set(‘d’,’M %f %f %f %f’ % (x0, y0, x99, y99)) # Koordinaten # zeichne jetzt die Linie in der Grafikebene (d.h. auf dem Bildschirm anzeigen) append(line) # Python OOP magic if __name__ == ‘__main__’: Comparator().run()

Jetzt wird es eine Erklärung geben. Der Benutzer des Inkscape-Editors kann Python-Skripte über das Menü ausführen.

Das Fenster des grafischen Editors von Inkscape, wie ich es sehe, und mein LinuxMintDas Fenster des grafischen Editors von Inkscape, wie ich es sehe, und mein LinuxMint

Im oberen Menü des Grafikeditors von Inkscape gibt es neben allerhand File, Edit, View ein magisches Untermenü Extensions (Extensions), bei dessen Anklicken eine Liste mit Python-Skripten bereits im Editor vorhanden und laufbereit ist angezeigt.

…Die Macher von Inkscape weisen den Linux-Fan an, seine selbstgebauten Python-Skripte im „home“-Ordner „/home/user_name/.config/inkscape/extensions/“ aufzubewahren (etwas anderes für Windows-Benutzer).

Legen Sie im selben Ordner die Datei mit der Erweiterung *.inx ab
In meinem Fall war es die Datei “proba01.inx”

proba01.py all

Ich habe die beiden obigen Dateien „proba01.py“ und „proba01.inx“ im Ordner „/home/user_name/.config/inkscape/extensions/“ abgelegt, Inkscape neu gestartet und glücklicherweise das Element „proba-1“ im Ordner „ Untermenü “Erweiterungen”, in dem das Skript “proba01.py” ausgeführt wurde

Und hier ist die Ausgabe des Skripts:

Sieht ziemlich wissenschaftlich aus.

Ich plane, dieses Skript zu verbessern. Freue mich über Meinungen.
(Wo … ist hier die Schaltfläche “Speichern”?)

Similar Posts

Leave a Reply

Your email address will not be published.