Format-Dekoratoren
Die Dekoratoren @format_reader() und @format_writer() registrieren Klassen als benutzerdefinierte Import-/Exportformate in LinkCAD.
@format_reader()
Signatur
@format_reader( name: str, extensions: list[str], description: str = "",)class MyReader(FormatReader): def read(self, path: Path, drawing: DrawingContext) -> None: ...Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
name | str | erforderlich | Anzeigename des Formats |
extensions | list[str] | erforderlich | Dateimuster (z. B. ["*.gds", "*.gdsii"]) |
description | str | "" | Formatbeschreibung |
Basisklasse FormatReader
class FormatReader: def read(self, path: Path, drawing: DrawingContext) -> None: """Override to implement file import logic.""" ...
def post_process(self, phase, drawing, resolution) -> bool: """Optional. Take part in the phases LinkCAD runs after parsing.""" return TrueDer DrawingContext stellt eine Builder-API zum Aufbau der Zeichnung bereit. Benennen Sie Ihre Arbeitseinheit einmal, und LinkCAD rechnet alles um, was Sie übergeben — ein Reader sollte keine eigene Skalierungstabelle mitführen:
def read(self, path: Path, drawing: DrawingContext) -> None: drawing.units = "um" # coordinates below are microns with drawing.cell("main", main=True) as cell: with cell.layer("metal1") as layer: layer.polygon([(0, 0), (100, 0), (100, 100), (0, 100)]) layer.polyline(10, [(0, 0), (200, 200)], closed=False) layer.circle((500, 500), 200)Zulässige Einheiten sind nm, um, mil, mm, cm, inch und m sowie Aliasse wie micron und millimetre. Bleibt units ungesetzt, gelten reine Datenbankeinheiten. Ein unbekannter Name oder eine Zeichnung ohne deklarierte Datenbankeinheiten löst ValidationError aus.
post_process()
post_process() ist optional — derselbe Hook, den auch die eingebauten nativen Reader verwenden. Er wird nach dem Parsen einmal pro Phase aufgerufen, auf derselben Instanz wie read(), sodass dort Notiertes weiterhin verfügbar ist. Ein False bricht den Import ab.
from linkcad.v1.plugin import Phase
class MyReader(FormatReader): def post_process(self, phase, drawing, resolution) -> bool: if phase == Phase.ResolvedRefs: ... # every reference now points at a real cell return True| Phase | Erreicht, wenn |
|---|---|
Phase.ParsedFile | Eine Eingabedatei wurde geparst |
Phase.ParsedAll | Alle Eingabedateien wurden geparst |
Phase.ClosedOpenCells | Vom Parser offen gelassene Zellen wurden geschlossen |
Phase.ResolvedRefs | Jede Referenz zeigt auf eine reale Zelle |
Phase.SelectedMainCell | Die Hauptzelle wurde gewählt |
Phase.ResolvedLayersByBlock | Die ByBlock-Ebenenvererbung wurde aufgelöst |
Phase.AutoNumberedZ | Die Z-Reihenfolge der Ebenen wurde vergeben |
@format_writer()
Signatur
@format_writer( name: str, extensions: list[str], description: str = "",)class MyWriter(FormatWriter): def write(self, path: Path, drawing: WriterContext) -> None: ...Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
name | str | erforderlich | Anzeigename des Formats |
extensions | list[str] | erforderlich | Dateimuster |
description | str | "" | Formatbeschreibung |
Basisklasse FormatWriter
class FormatWriter: def write(self, path: Path, drawing: WriterContext) -> None: """Override to implement file export logic.""" ...Der WriterContext bietet lesenden Zugriff auf die Zeichnung. Wie bei Readern gilt: benennen Sie Ihre Arbeitseinheit, und die Geometrie kommt bereits umgerechnet an:
def write(self, path: Path, drawing: WriterContext) -> None: drawing.units = "mm" # coordinates below are millimetres drawing.flatten = True # resolve cell references into placed shapes with open(path, "w") as f: for shape in drawing.shapes(): f.write(f"{shape.layer_name}: {len(shape.vertices)} vertices\n")shapes() ist die einzige Traversierung für Geometrie. Setzen Sie flatten vor dem Iterieren: mit flatten = False erhalten Sie die Formen jeder Zelle und behandeln Referenzen selbst; mit flatten = True rendert der Host die Hierarchie, wendet den Transformationsstapel an und tesseliert Kurven unterwegs.
FormatInfo
Beide Dekoratoren erzeugen ein FormatInfo-Objekt an der Klasse und ersetzen info() durch eine statische Methode, die es zurückgibt:
| Feld | Beschreibung |
|---|---|
name | Anzeigename des Formats |
extensions | Liste der Dateimuster |
description | Formatbeschreibung |
options | Die aus der Klasse gesammelten Option-Attribute |
Registrierung
Registrierte Formate erscheinen automatisch in den Dialogen „Öffnen“ und „Speichern“ von LinkCAD:
- Reader stehen in der Formatauswahl unter File → Open
- Writer stehen in der Formatauswahl unter File → Save As
Die Liste extensions bestimmt die Dateizuordnung. Zum Beispiel:
@format_reader(name="My Format", extensions=["*.myf", "*.myfx"])Damit erscheint „My Format (*.myf, *.myfx)“ im Öffnen-Dialog.