Zum Inhalt springen

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

ParameterTypStandardBeschreibung
namestrerforderlichAnzeigename des Formats
extensionslist[str]erforderlichDateimuster (z. B. ["*.gds", "*.gdsii"])
descriptionstr""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 True

Der 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
PhaseErreicht, wenn
Phase.ParsedFileEine Eingabedatei wurde geparst
Phase.ParsedAllAlle Eingabedateien wurden geparst
Phase.ClosedOpenCellsVom Parser offen gelassene Zellen wurden geschlossen
Phase.ResolvedRefsJede Referenz zeigt auf eine reale Zelle
Phase.SelectedMainCellDie Hauptzelle wurde gewählt
Phase.ResolvedLayersByBlockDie ByBlock-Ebenenvererbung wurde aufgelöst
Phase.AutoNumberedZDie 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

ParameterTypStandardBeschreibung
namestrerforderlichAnzeigename des Formats
extensionslist[str]erforderlichDateimuster
descriptionstr""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:

FeldBeschreibung
nameAnzeigename des Formats
extensionsListe der Dateimuster
descriptionFormatbeschreibung
optionsDie 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.