Text in svg zeigt nur einen Buchstaben

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich möchte dieses Rechteck mit einer Bemaßung versehen:
Bild
Ich bekomme aber nur den ersten Buchstaben angezeigt. Ich übergebe z.B. dies an das Template:

Code: Alles auswählen

(410.0, 200.0, 'h=2mm'), (280.0, 290.0, 'l=5mm')
svg Code

Code: Alles auswählen

    <style>
        .masse { font: bold 20px sans-serif; }
    </style> 

    {% elif grafik.object == "rechteck" %}
            <polygon class="zwei" points="{{grafik.x1}},{{grafik.y1}} {{grafik.x2}},{{grafik.y2}} {{grafik.x3}},{{grafik.y3}} {{grafik.x4}},{{grafik.y4}}"  style="stroke:black;stroke-width:1;fill: #E0FFFF"/>
            {%for x, y, txt in grafik.seiten %}
                <text x="{{x}}" y="{{y}}" class="masse">{{txt}}</text> 
            {%endfor%}
ums Verplatzen wird nur der erste Buchstabe angezeigt - was mache ich denn jetzt schon wieder falsch?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kannst Dir ja selbst anschauen, ob txt den Wert hat, den Du glaubst, dass er haben sollte.
Wenn nicht, dann passiert irgendetwas zwischen dem ersten Code und dem zweiten Code, das Du hier aber nicht zeigst.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Aber auch wenn ich den svg Code in
<text x="{{x}}" y="{{y}}" class="text">langer Text</text>
abändere, wird mir nur der erste Buchstabe angezeigt. Ich weiß nicht so recht welche Codeteile ich hier hier noch einstellen könnte, die dieses Problem verursachen.
Bild
nur oben links taucht jetzt ein Kringel auf.
Den svg Code füge ich mit

Code: Alles auswählen

    {% if grafik.name %}
        {% include grafik.name %} 
    {% endif %}
ins template ein und im View übergebe ich

Code: Alles auswählen

            grafik = {'name': 'svg/geometrie.svg', 'object': 'figur', 'h_hoehe': h_hoehe, 'h_breite': h_breite,
                    'x1':x1, 'y1':y1,'x2':x2, 'y2':y2,'x3':x3, 'y3':y3,'x4':x4, 'y4':y4,
                    'seiten': [
                    ((xkoo[n]+xkoo[n+1])/2+seiten_x[n], (ykoo[n]+ykoo[n+1])/2+seiten_y[n], seiten[n]) for n in range(0,4)
                    ]}
("rechteck" habe ich zwischenzeilich in "figur" abgeändert - da kommen noch z.B. Dreiecke)
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hast du den Hinweis von SIrius3 befolgt? Deine Antwort geht nicht darauf ein, was du vorgefunden hast.
Du kannst Dir ja selbst anschauen, ob txt den Wert hat, den Du glaubst, dass er haben sollte.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pitwheazle: dann poste hier doch mal ein fertiges svg.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Nun, ich dachte, das hätte ich. Ich habe den Inhalt von "grafik" mit print(grafik) ausgeben lassen bevor ich ihn an das template übergebe. Und bekomme z.B.:

Code: Alles auswählen

 {'name': 'svg/geometrie.svg', 'object': 'figur', 'h_hoehe': 400, 'h_breite': 600, 'x1': 240, 'y1': 210, 'x2': 360, 'y2': 210, 'x3': 360, 'y3': 190, 'x4': 240, 'y4': 190, 'seiten': [(300.0, 230.0, 'l='), (370.0, 200.0, 'h=2mm'), (300.0, 190.0, ''), (240.0, 200.0, '')]} 
und wenn ich den Inhalt von

Code: Alles auswählen

seiten = ["l=5mm", "h=2mm", "", ""]
durch irgeneinen anderen Text ersetze, dann bekomme ich den ja auch angezeigt - halt immer nur den ersten Buchstaben. Und wenn ich {{text}} im svg Code durch "langer Text" ersetze bekomme ich auch nur das "l" angezeigt. Wo kann ich denn den Inhalt sonst noch überprüfen, bzw, wo kann er denn sonst noch verändert werden? Der svg Code wird doch direkt im template angezeigt.
Und auch im inspector wird der Wert angezeigt:
Bild
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Sirius3 hat geschrieben: Freitag 11. November 2022, 15:36 @Pitwheazle: dann poste hier doch mal ein fertiges svg.
Was meinst du mit "fertig" den gesamten Code? (Der gilt auch für alle meine anderen Grafiken)
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Vielen Dank für eure Mühe, ich habe die Lösung gefunden. Ich muss die Koordinaten als int übergeben und habe

Code: Alles auswählen

((xkoo[n]+xkoo[n+1])/2+seiten_x[n], (ykoo[n]+ykoo[n+1])/2+seiten_y[n], seiten[n]) for n in range(0,4)
in

Code: Alles auswählen

(int((xkoo[n]+xkoo[n+1])/2+seiten_x[n]), int((ykoo[n]+ykoo[n+1])/2+seiten_y[n]), seiten[n]) for n in range(0,4)
geändert, jetzt klappt es! ... Warum auch immer.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

In deinem Screenshot (grrrr) sieht man ja jetzt, dass du die Koordinaten mit Komma statt mit Punkt angegeben hast.
Das sieht man an Deinem Template nicht!
Das ist für jeden Programmierer auch sehr überraschend.
Da musst Du ja irgendwas extrem seltsames gemacht haben.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich habe es gefunden. Ich muss die Koordinaten als int übergeben und musste:

Code: Alles auswählen

 'seiten': [
                    (xkoo[n]+xkoo[n+1])/2+seiten_x[n], (ykoo[n]+ykoo[n+1])/2+seiten_y[n], seiten[n]) for n in range(0,4)
in

Code: Alles auswählen

 'seiten': [
                    (int((xkoo[n]+xkoo[n+1])/2+seiten_x[n]), int((ykoo[n]+ykoo[n+1])/2+seiten_y[n]), seiten[n]) for n in range(0,4)
abändern.
Entschuldigt wieder mal die Mühe!
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Das musst Du aber nur machen weil ja irgendwas Punkte in Kommas verändert, nicht weil man da tatsächlich nur ganze Zahlen angeben kann. Und dieses irgendwas ist ja wohl Code von Dir. Das ist jetzt ein workaround für ein Problem, aber nicht wirklich die Lösung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Freitag 11. November 2022, 16:22 Und dieses irgendwas ist ja wohl Code von Dir. Das ist jetzt ein workaround für ein Problem, aber nicht wirklich die Lösung.
Nein? Ich hatte schon festgestellt, dass svg Koordinaten ganzzahlig sein müssen (das Problem hatte ich schon mal) und wenn ich den Durchschnittswert meiner beiden Ganzzahlwerten (xkoo[n] und xkoo[n+1]) bilde, indem ich diese addiere und durch Zwei teile, entsteht eine Kommazahl und mit der kann, nach meiner Erfahrung, svg nicht umgehen.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Koordinaten müssen bei SVG nicht ganzzahlig sein, das können auch Gleitkommazahlen sein, allerdings wie das im Rechnerbereich üblich ist mit einem Dezimal*punkt*. Also 0.5 geht, 0,5 nicht, und irgendwas sorgt anscheinend bei Deinem Code dafür, dass Punkte durch Kommas ersetzt werden, und *das* geht nicht. Und das ist auch grundsätzlich ein Problem, denn das sollte so nicht sein. Man kann dann ja auch keine Texte mit Punkten am Satzende oder z.B. bei Abkürzungen verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten