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.
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:20mm
die 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-em
Attribut eines <font-face>
Elements oder einer CSS- @font-face
Deklaration. 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-x
Attribut 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
, alphabetical
which 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.
AmeliaBR
Saar Drimer