seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Josef_Knecht schrieb: also ich glaube, dass ich die .csv noch hinkriegen würde, doch bei dem gesamten Rest verstehe ich leider nur noch Bahnhof.
Die Sinnbilder und auch die Vorlage hatte ich mit Inkscape erstellt, weil mir dies vom handling her am leichtesten erschien.
Das liefert ja auch gutes Ausgangsmaterial, mit dem man weiterarbeiten kann. Ich habe mir deinen Beitrag nun mehrfach durchgelesen und auch versucht das Python Skript zu kapieren, aber ich krieg es nicht im Mindesten in die Birne...
Also dann mal ausführlich: Dein Ansatz sieht so aus, als ob du ein Makro aufzeichnen wolltest - d.h. du denkst in Schritten, die du in Inkscape machen musst, damit das SVG-Dokument so aussieht, wie du es haben willst. Mein Ansatz bricht das ganze darauf herunter, dass man sich darauf beschränkt Werte in eine Vorlage einzusetzen, damit das gewünschte Ergebnis herauskommt - ich habe folgendes gemacht, um das Template zu erstellen :
in Inkscape die SVG-Datei Objekt_1.svg als Verknüpfung importiert und an die angegebene Position gebracht Die SVG-Datei in einem Editor geöffnet und daraus ein für jinja2 nutzbares Template gemacht, d.h. alle Stellen, an denen ich später einen Wert einsetzen könnte umgebaut - ein Platzhalter {{ variablenname }} sorgt dafür, dass man später beim Rendern des Templates einen String für die Variable variablenname übergeben, kann, der dann an der Stelle in der SVG-Datei landet. D.h. das Template besitzt bereits ein Element mit <image> Tag, bei dem man nur noch einen Pfad angeben muss.
Das Python Skript macht jetzt folgendes, nachdem es in den ersten Zeilen die Module importiert, deren Funktionalität benötigt wird:
Es durchläuft den Code bis Zeile 47 und sammelt die Funktionsdefinitionen ein, die im folgenden genutzt werden es prüft in Zeile 48, ob es mit genau einem Argument aufgerufen wurde, ansonsten beendet es sich mit einer Meldung, wie man es benutzen kann In Zeile 50 ruft es die main() Funktion aus Zeile 27 auf in Zeile 28 öffnet es die Datei template.svg.j2 zum lesen und in der folgenden Zeile wird ein Template-Objekt mit ihren Inhalt erstellt In Zeile 30 wird die als erstes Argument übergebene Datei (die chapters.csv) zum Lesen geöffnet. Der csv.DictReader nimmt die Kopfzeile der Datei für die Spaltennamen Um die Kapitel und Unterkapitel durchzunummerieren werden die beiden Variablen section_number und subsection_number jeweils mit dem Wert 0 initialisiert In Zeile 34 laufe ich in einer Schleife über die restlichen Zeilen aus der csv-Datei und sehe mir im Folgenden jeweils an, ob in der Spalte Name "Section" oder "Subsection" steht. Wenn eine "Section" gefunden wird, erhöht das Skript den Wert der Variable section_number um 1, merkt sich den Namen der aktuellen Section in der Variable section und setzt die subsection_number wieder auf 0 Wenn eine "Subsection" gefunden wird, erhöht das Skript den Wert der Variable subsection_number um 1, merkt sich den Namen der Subsection und ruft dann in Zeile 42 ff. die Funktion draw_section auf, der es die genannten Variablen und das Template übergibt. Die Funktion draw_section aus Zeile 11 ff. macht jetzt folgendes: sie setzt den Namen der zu erstellenden PNG-Datei aus dem Section und Subsection Namen - durch einen Unterstrich getrennt - zusammen (da müsste man noch ergänzen, dass die Datei wie von dir gewünscht im Ordner Kopfzeilen landet) Dann erstellt sie einen Pfad für die Datei Object_1.svg, die in die Vorlage eingebunden werden soll. Path.home() ist ein Path-Objekt für das Home-Verzeichnis des Benutzers und der Operator / sorgt dafür, dass jeweils die nachfolgenden Pfadbestandteile angefügt werden Damit die Datei sicher gefunden wird, mache ich in Zeile 14 eine URL für einen lokalen Pfad draus (das muss man ggf. noch besser gestalten, damit das Leer- und Sonderzeichen korrekt umwandelt) Dann wird ein StringIO-Objekt der Variablen svg zugewiesen, das die Ausgabe des mit den angegebenen Variablen gerenderten Templates (was die fertige SVG-Datei ergibt) als Inhalt zugewiesen bekommt. Das kannst du dir wie eine temporäre Datei vorstellen, die im RAM liegt. In Zeile 24 wird dann aus der SVG-Datei die PNG-Datei berechnet und im aktuellen Arbeitsverzeichnis abgelegt (die Datei im Anhang wäre das PNG, das für das erste Unterkapitel erstellt wird).
- Bilder
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
@seahawk1986 meine Güte, was machst du dir eine Arbeit hiermit. Ist mir schon fast peinlich. Vielen Dank dafür. Im Folgenden möchte ich versuchen, dass Ganze mal ein bisschen zu rekapitulieren, falls du "Denk-Fehler" findest korrigiere mich bitte. Frage hierzu: In der obersten Zeile muss "Type;Name" stehen?
Frage hierzu: Wie importiere ich das Objekt als Verknüpfung? Wenn ich in Inkscape auf Importieren... klicke, finde ich keine Möglichkeit für Verknüpfungen.
Dann habe ich mir jetzt "jinja2" installiert bzw. "j2" ein Kommandozeilen-Inface, mit dem ich aus der SVG-Vorlagedatei (zusammen mit den importiert-verknüpften Objekten 1,2 u. 3) eine nutzbare Vorlage machen kann.
Frage hierzu: Wenn ich jinja2 über den Anwendungsverwaltung starte, öffnet sich kein Fenster. Gehe ich also recht in der Annahme, dass das dann über die Standard-Ubuntu-Konsole läuft?
Anschließend speichere ich die dabei entstandene Vorlage template.svg.j2 im Ordner "Buch" (Home/Buch), wo auch die .csv-Datei liegt. Als nächstes könnte ich dann dein Skript benutzen (über Konsole?) - Entschuldige bitte die vielen Nachfragen, aber das ist absolutes Neuland für mich. In dem Skript müsste ich dann noch einige Änderungen vornehmen: Der Pfad in Zeile 13 object_1 = Path.home() / "Buch" / section / subsection / "Objekt_1.svg" Müsste dieser dann umgeschrieben werden in object_1 = Path.home() / "Buch" / section / subsection / "Objekt_1.svg" / "Objekt_2.svg" / "Objekt_3.svg" ?
Die Funktion draw_section aus Zeile 11 ff. macht jetzt folgendes:
sie setzt den Namen der zu erstellenden PNG-Datei aus dem Section und Subsection Namen - durch einen Unterstrich getrennt - zusammen
(da müsste man noch ergänzen, dass die Datei wie von dir gewünscht im Ordner Kopfzeilen landet)
Wie muss dass dann aussehen, wenn das Verzeichnis: Home/Buch/Kopfzeilen ist? Und dann noch eine Frage: Das Verzeichnis für die Sinnbilder ist folgendermaßen:
Formatierter TextHome/Buch/Kopfzeilen/Sinnbilder/Thema_1/Objekt_1, Objekt_2, Objekt_3 Formatierter TextHome/Buch/Kopfzeilen/Sinnbilder/Thema_2/Objekt_1, Objekt_2, Objekt_3
... Kann das Skript zwischen den verschiedenen Dateien mit Namen "Objekt_1" unterscheiden, nur weil sie in verschiedenen Ordnern liegen?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Josef_Knecht schrieb: Frage hierzu: In der obersten Zeile muss "Type;Name" stehen?
Ja, dann kann man die Spalten mit einem eindeutigen Namen ansprechen. Frage hierzu: Wie importiere ich das Objekt als Verknüpfung? Wenn ich in Inkscape auf Importieren... klicke, finde ich keine Möglichkeit für Verknüpfungen.
Inkscape fragt einen, ob man das Objekt einbetten oder nur verknüpfen will. Dann habe ich mir jetzt "jinja2" installiert bzw. "j2" ein Kommandozeilen-Inface, mit dem ich aus der SVG-Vorlagedatei (zusammen mit den importiert-verknüpften Objekten 1,2 u. 3) eine nutzbare Vorlage machen kann.
Frage hierzu: Wenn ich jinja2 über den Anwendungsverwaltung starte, öffnet sich kein Fenster. Gehe ich also recht in der Annahme, dass das dann über die Standard-Ubuntu-Konsole läuft?
jinja2 ist erst mal nur eine Python-Bibliothek, mit der du nichts direkt zu tun hast. Du brauchst lediglich einen Texteditor, um die SVG-Datei so abzuändern, dass ein Template daraus wird. Wenn du mir die SVG-Datei mit den drei Objekten an der gewünschten Stelle zukommen lässt (bzw. mir verrätst, wo sie jeweils platziert sein sollen), kann ich das auch für dich machen. Wichtig ist nur, dass das Template im Arbeitsverzeichnis liegt, aus dem du das Python-Skript aufrufst. Ja genau. Ein CLI-Skript ist vergleichsweise schnell geschrieben, das mit einer GUI zu versehen ist deutlich mehr Aufwand. In dem Skript müsste ich dann noch einige Änderungen vornehmen: Der Pfad in Zeile 13 object_1 = Path.home() / "Buch" / section / subsection / "Objekt_1.svg" Müsste dieser dann umgeschrieben werden in object_1 = Path.home() / "Buch" / section / subsection / "Objekt_1.svg" / "Objekt_2.svg" / "Objekt_3.svg" ?
Nein, wenn du mehrere Pfade haben willst, musst du mehrere Variablen dafür definieren, also z.B.
| object_1 = Path.home() / "Buch" / section / subsection / "Objekt_1.svg"
object_2 = Path.home() / "Buch" / section / subsection / "Objekt_2.svg"
object_3 = Path.home() / "Buch" / section / subsection / "Objekt_3.svg"
|
Natürlich könnte man auch eine Liste erstellen, die man im Template über eine Schleife abarbeitet, aber dazu müsste man Regeln für die Platzierung der Objekte aufstellen können, damit sich das lohnt. (da müsste man noch ergänzen, dass die Datei wie von dir gewünscht im Ordner Kopfzeilen landet)
}}}
Wie muss dass dann aussehen, wenn das Verzeichnis: Home/Buch/Kopfzeilen ist?
Ich kann später noch ein überarbeitetes Skript posten, bei dem die Änderung enthalten ist - dazu müssen wir aber erst noch den nachfolgenden Punkt klären: Und dann noch eine Frage: Das Verzeichnis für die Sinnbilder ist folgendermaßen:
Formatierter TextHome/Buch/Kopfzeilen/Sinnbilder/Thema_1/Objekt_1, Objekt_2, Objekt_3 Formatierter TextHome/Buch/Kopfzeilen/Sinnbilder/Thema_2/Objekt_1, Objekt_2, Objekt_3
...
Das passt dann aber nicht zu dem was du in deinem Algorithmus beschrieben hattest: -Importieren von Objekt 1. Pfad ergibt sich aus Kombination 1. Begriff Spalte A und 1. Begriff Spalte B (bspw. Home/Buch/Hydraulik/Einführung/Objekt_1)
Wie ist da die Trennung nach Unterabschnitten umgesetzt (in dem Beispiel wäre "Hydraulik" der Abschnitt und "Einführung" der Unterabschnitt)? Kann das Skript zwischen den verschiedenen Dateien mit Namen "Objekt_1" unterscheiden, nur weil sie in verschiedenen Ordnern liegen?
Das Skript arbeitet jeweils die Dateien aus dem Ordner für den jeweiligen Unterabschnitt ab. Die anderen Dateien spielen da keine Rolle, da sie einen anderen Pfad haben.
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Dann werde ich jetzt testweise eine solche csv machen. Im Moment möchte ich noch keine Originale verwenden sondern erst mal nur Objekte bei denen es mir egal sein kann, wenn sie weg, kaputt oder sonstwas sind. Die Koordinaten für die drei Sinnbilder sind:
Objekt_1: x 672,193 : y 107,718 Objekt_2: x 720,866 : y 138,121 Objekt_3: x 769,538 : y 109,206
Wenn du dann die drei Objekte positioniert hast, könnte ich diese Datei dann später mit einem Texteditor wie Gedit öffnen, die Koordinaten ändern und dann einfach wieder speichern? (Nur für den Fall, dass sie doch nochmal anders positionieren möchte). Das passt dann aber nicht zu dem was du in deinem Algorithmus beschrieben hattest:
-Importieren von Objekt 1. Pfad ergibt sich aus Kombination 1. Begriff Spalte A und 1. Begriff Spalte B (bspw. Home/Buch/Hydraulik/Einführung/Objekt_1)
Wie ist da die Trennung nach Unterabschnitten umgesetzt (in dem Beispiel wäre "Hydraulik" der Abschnitt und "Einführung" der Unterabschnitt)?
Ja. Also der Pfad ist wie folgt: Home/Buch/Hydraulik/Einführung/und dann die Objekte. Ich denke, ich erstelle mal eine kleine Grafik über die Verzeichnisstruktur.
Poste ich dann noch
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
So, die Grafik des Verzeichnisses als Bild, nicht schön, aber hoffentlich aussagekräftig.
- Bilder
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Mir fällt da gerade noch etwas ein... Wenn das Skript die Sinnbilder eingefügt hat und als .png abspeichert, habe ich keine Chance mehr, die Texte noch zu ändern...?!?
Das wird das Skript kaum selbst erledigen können.
Vielleicht wäre es also besser, wenn es nicht .png sondern .svg erzeugt...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Josef_Knecht schrieb: Mir fällt da gerade noch etwas ein... Wenn das Skript die Sinnbilder eingefügt hat und als .png abspeichert, habe ich keine Chance mehr, die Texte noch zu ändern...?!?
Das wird das Skript kaum selbst erledigen können.
Doch, es nimmt die Namen für die Abschnitte aus der csv-Datei und nummeriert die durch - für den zweiten Unterabschnitt (hier mit den gleichen Sinnbildern/Symbolen, weil ich nicht mehr Material habe) sähe das dann wie im Anhang aus. Aber die SVG-Dateien zusätzlich so rauszuschreiben, dass Inkscape sie korrekt öffnen kann (Bildbetrachter wie EOG haben Probleme mit verlinkten SVG-Grafiken und zeigen die nicht an, also nicht wundern), ist kein Problem.
- Bilder
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Hier mal ein Zwischenstand, der zusätzlich die SVG-Dateien rausschreibt und drei Bilder ins Template einfügen kann: Edit: Pfad im Skript geändert, damit er im richtigen Verzeichnis nach den Bildern sucht.
- template.svg.j2 (6.8 KiB)
- Download template.svg.j2
- generate_chapter_headings.py (2.2 KiB)
- Download generate_chapter_headings.py
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
@seahawk1986 Also das Ergebnis das du hochgeladen hast (Download Hydraulik_Anlagen.png) ist perfekt.
Genauso dachte ich es.
Ich kann kaum fassen, dass das bei dir schon funktioniert. Bin total begeistert... Ich konnte es nicht lassen und hatte testweise
python3 generate_chapter_headings.py chapters.csv
in die Konsole getippt. Aber ich vermute, dass ich da noch etwas falsch mache. Aus dem Homeverzeichnis
~$ python3 generate_chapter_headings.py chapters.csv
python3: can't open file 'generate_chapter_headings.py': [Errno 2] No such file or directory
Aus dem Buchordner ~/Buch$ python3 generate_chapter_headings.py chapters.csv
python3: can't open file 'generate_chapter_headings.py': [Errno 2] No such file or directory Ich vermute, dass ich zu voreilig bin...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Wo hast du das Skript generate_chapter_headings.py denn abgelegt? Es scheint weder in deinem Home-Verzeichnis noch im Ordner ~/Buch zu liegen.
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Es befindet sich in Buch.
Es ist nicht in meiner Grafik aufgeführt, weil es das neue ist, dass ich erste heute morgen herunter geladen hatte. Also ~/Buch/9203576-generate_chapter_headings.py Die Zahlen zu Beginn der Datei (9203576) stellen kein Problem dar, oder?
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Die Frage mag sich blöde anhören,
aber kann es sein, dass ich erst noch ein Programm installieren muss? Damit es funktionieren kann?
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Wenn ich jedoch: ~/Buch$ python3 9203576-generate_chapter_headings.py eingebe, erhalte ich: Traceback (most recent call last):
File "9203576-generate_chapter_headings.py", line 7, in <module>
import cairosvg
ModuleNotFoundError: No module named 'cairosvg'
Da scheint es ja zumindest schonmal das Python-Skript zu laden.
Scheitert aber dann an der .svg, oder???
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Und noch ein Schrittchen weiter... Ich habe mir (ich hoffe dass ich das richtig gemacht habe) "Python3-cairosvg"
installiert.
Wenn ich jetzt: python3 9203576-generate_chapter_headings.py chapters.csv eingebe, erhalte ich: Traceback (most recent call last):
File "9203576-generate_chapter_headings.py", line 8, in <module>
from jinja2 import Template
ModuleNotFoundError: No module named 'jinja2'
|
Josef_Knecht
(Themenstarter)
Anmeldungsdatum: 8. Januar 2012
Beiträge: 329
|
Nun auch Python3-jinja2 installiert...
Ich mache eindeutig Fortschritte... python3 9203576-generate_chapter_headings.py chapters.csv ergibt jetzt: Traceback (most recent call last):
File "9203576-generate_chapter_headings.py", line 66, in <module>
main()
File "9203576-generate_chapter_headings.py", line 44, in main
with open("template.svg.j2") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'template.svg.j2'
|