SVG-Schrifteinheiten pro Em zu mm

In einer Anwendung, die ich schreibe, muss ich den Pfad einer Glyphe aus einer SVG-Schriftart nehmen und sie auf eine bestimmte Größe skalieren, die in Millimetern angegeben ist. Ich nehme die Pfadeigenschaft „d“ aus der SVG-Schriftart, skaliere sie, indem ich einen Skalierungsfaktor auf die Koordinaten des Pfads anwende, und verwende sie dann als regulären Pfad in der SVG, die ich erzeuge. (Für meine Anwendung kann ich 'Matrix', 'Höhe', 'Breite' oder andere eingebaute Skalierungsmethoden nicht verwenden; die Pfadkoordinaten müssen die genaue Endabmessung und Skalierung widerspiegeln). Die Mechanik zum Anwenden einer Skala auf den Pfad ist kein Problem; Ich muss nur den korrekten anzuwendenden Skalierungsfaktor herausfinden.

Die SVG-Schriftart bietet „unit-per-em“, also entweder 2048 oder 1000. Ich weiß, dass „em“ eine relative Maßeinheit und „mm“ eine absolute Einheit ist, und ich bin mir ziemlich sicher, dass die Konvertierung dies kann gemacht sein. Es wäre hilfreich, wenn jemand die Details einer solchen Konvertierung erklären oder angeben könnte, ob das, was ich versuche, keinen Sinn ergibt.

Etwas Kontext: Die SVG-Datei, die ich mit meiner (Python-)Software erzeuge, wird dann in eine Koordinatendatei (Gerber) konvertiert, die verwendet wird, um ein Objekt physisch herzustellen. Alle Elemente in beiden Dateien müssen exakte Abmessungen ohne weitere Skalierung oder Transformationen darstellen.

Können Sie nähere Angaben dazu machen, was Sie mit "die Abmessungen müssen in mm angegeben werden" meinen? Oder umgekehrt, wie werden Sie die Dateikonvertierung durchführen? Reicht es aus, die SVG-Font-Glyphe in eine Standard-SVG-Grafik mit definierter Höhe und Breite in mm umzuwandeln, oder möchten Sie, dass alle Koordinaten der Bezier-Kurven in mm vorliegen?
Ich habe die Frage bearbeitet; Ich hoffe, dass es jetzt klarer ist.

Antworten (1)

In der Typografie ist eine „em“-Einheit die maximale Höhe eines Zeichensatzes. Bei lateinischem Text bedeutet dies die Höhe vom Akzent über Großbuchstaben bis zum unteren Rand absteigender Kleinbuchstaben. ZB wäre es die Gesamthöhe von Ég.

Der „em“-Wert ist das, was Sie festlegen, wenn Sie die Schriftgröße definieren – wenn Sie die Schriftart auf 24pt festlegen, dann 1em=24pt=1/3inch. In CSS können Sie die Schriftgröße auch mit metrischen Einheiten festlegen, sodass Sie font-size:20mmdie Schriftart speziell festlegen und der SVG-Viewer beim Ausdruck auf diese Höhe (oder eine Annäherung auf dem Bildschirm) skalieren würde.

Das löst jedoch nicht das Problem für Ihre Fertigungsdatei, die die tatsächlichen Koordinaten der Bezier-Kurven in mm benötigen. Dazu müssen Sie wissen, wie sich die Koordinaten der Kurven in der Schriftart auf die endgültige Ausgabegröße beziehen.

Wie Sie festgestellt haben, befindet sich der Schlüssel im units-per-emAttribut eines <font-face>Elements oder einer CSS- @font-faceDeklaration. Die Standardwerte (1000 und 2048) werden von anderen Schriftformaten abgeleitet; theoretisch könnten Sie beliebige Werte für SVG-Fonts verwenden.

In jedem Fall definiert dies die Anzahl der Koordinaten zwischen dem oberen und unteren Rand der Zeichen, dh die Anzahl der Koordinateneinheiten in 1em-Einheiten. Von dort aus können Sie herausfinden, wie stark jede Koordinate skaliert werden muss, um der gewünschten Schriftgröße zu entsprechen.

Wenn Sie 1000 Einheiten pro em haben und eine endgültige maximale Höhe Ihrer Wörter von 500 mm haben möchten, dann ist Ihr Skalierungsfaktor

scalingFactor = (desired em height)/(units per em) 
              = (500mm/em) / (1000 units/em)
              = 0.5mm/unit

Mit anderen Worten, um von den Roheinheiten in mm umzurechnen, würden Sie jede Koordinate mit 0,5 multiplizieren.

Es gibt jedoch ein paar andere Details, die Verwirrung stiften können, abhängig von den Anforderungen Ihrer Konvertierungs- und Materialschneidesoftware und davon, wie Sie die gewünschte Größe der Buchstaben definieren:

  • Die Einheit em definiert nur die Höhe der Zeichen. Die Breite (in den meisten Schriftarten) variiert. In SVG definiert das horiz-adv-xAttribut jeder Glyphe (oder, falls nicht auf der einzelnen Glyphe angegeben, der Schriftart selbst) die Breite dieses Zeichens, einschließlich des Standardzeichenabstands, als eine Anzahl von Koordinateneinheiten. Wenn Sie Ihren Text auf eine bestimmte Breite anstatt auf eine bestimmte Höhe in mm skalieren möchten , ist dies die Anzahl der Einheiten, die Sie in Ihrer Berechnung verwenden sollten:

    scalingFactor = (desired width)/(horizontal advance in coordinate units) 
    
  • Alternativ, wenn Sie sich für die Höhe interessieren, aber nur für die Höhe eines Großbuchstabens (keine Unterlängen, also nicht die volle em-Höhe), dann müssen Sie die Anzahl der Einheiten in dieser Höhe aus den und -Attributen berechnen cap-height, alphabeticalwhich Definieren Sie die Position der Ober- und Unterseite der Großbuchstaben im Koordinatensystem:

    scalingFactor = (desired height of capital letter) /
                   [(cap-height coordinate)-(alphabetic baseline coordinate)] 
    

    (Es gibt verschiedene andere Höhen, die definiert werden können , die Sie für die Berechnung Ihres Maßstabs auf ähnliche Weise verwenden könnten.)

  • Im Gegensatz zu allem anderen in SVG erhöhen sich die Y-Koordinaten von Schriftarten, wenn Sie nach oben gehen, nicht nach unten. (Dies geschieht wiederum aus Gründen der Konsistenz mit anderen Schriftformaten.) Wenn Ihre Konvertierungssoftware das Gegenteil erwartet, müssen Sie jede Y-Koordinate umdrehen, bevor Sie sie skalieren:

    newYValue = [(units-per-em) - (oldY)] * scalingFactor
    
  • Schließlich müssen Sie möglicherweise den absoluten Wert der Koordinaten anpassen, damit sich der (0,0)-Ursprung in der richtigen Position für das befindet, was Sie tun. Sie können mit einem der Attribute arbeiten, die für das <font-face>Element angegeben sind, oder mit den Attributen horiz/ vert-origin-x/y für das <font>Element. Diese Attribute definieren die Position des Glyphenursprungs (bei lateinischem Text der Schnittpunkt der Grundlinie mit der linken Kante des Buchstabens) im Koordinatensystem. Wenn diese Null sind (der Standardwert, wenn sie nicht angegeben sind), werden Unterlängen in negativen Koordinaten angegeben. Wenn negative Koordinaten ein Problem darstellen, müssen Sie die minimale Koordinate in jeder Richtung herausfinden und jede Koordinate um diesen Betrag verschieben, um alles positiv zu machen.

Ich hoffe, das reicht Ihnen, um herauszufinden, was die Zahlen darstellen und wie Sie sie an Ihre Bedürfnisse anpassen können.

Eine letzte Option, insbesondere wenn es sich um eine einmalige Konvertierung handelt und Sie kein wiederverwendbares Skript erstellen müssen, besteht darin, das SVG in einem visuellen Editor wie Inkscape zu öffnen. Sie können den Text ausschreiben und dann den Befehl "Pfad > Objekt zu Pfad" verwenden. Ich kann keinen einfachen Weg finden, um die Koordinaten auf mm zu skalieren, aber es wird die meisten schriftartspezifischen Größenprobleme beseitigen! Wenn Sie bereits ein Konvertierungsprogramm haben, das mit SVG-Pfaden arbeitet, wäre dies der einfachste Ansatz.

Wow, was für eine Antwort! Ja, das bringt mich dem, was ich erreichen möchte, ein ganzes Stück näher. Für den weiteren Kontext ist dies das Projekt: bitbucket.org/boldport/pcbmode und das ist, was ich damit mache ;) boldport.com
Ha! Leiterplatte als Kunst – definitiv ein interessantes Projekt. Ich war ein wenig überrascht, als ich das Gerber-Format nachschlug und die meisten Treffer sich auf Leiterplatten bezogen, aber ich nahm einfach an, dass das gleiche Dateiformat von allgemeineren Materialschneidegeräten übernommen worden war.
Macht es dann keinen Unterschied, ob Sie die Breite oder Höhe einer Glyphe in mm- oder px-Einheiten umrechnen wollten? Wenn ich eine Höhe von beispielsweise 500 px haben möchte, sollte ich jede Koordinate mit einem Faktor von 0,5 multiplizieren, wie für eine gewünschte Höhe von 500 mm?
@ user141169 Ja, Sie würden den gewünschten Wert in den Teil "gewünschte em-Höhe" der Formel einsetzen, und Sie würden ein Ergebnis in denselben Einheiten erhalten.