形式デコレーター
@format_reader() と @format_writer() デコレーターは、クラスを LinkCAD のカスタムインポート/エクスポート形式として登録します。
@format_reader()
シグネチャ
@format_reader( name: str, extensions: list[str], description: str = "",)class MyReader(FormatReader): def read(self, path: Path, drawing: DrawingContext) -> None: ...パラメーター
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
name | str | 必須 | 形式の表示名 |
extensions | list[str] | 必須 | ファイルパターン(例: ["*.gds", "*.gdsii"]) |
description | str | "" | 形式の説明 |
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 TrueDrawingContext は図面を構築するためのビルダー API を提供します。作業単位を一度宣言すれば LinkCAD が渡された値をすべて変換します——リーダーが独自のスケール表を持つべきではありません。
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)使用できる単位は nm、um、mil、mm、cm、inch、m と、micron や millimetre などの別名です。units を未設定のままにすると生のデータベース単位になります。未知の名前、またはデータベース単位を宣言していない図面の場合は ValidationError が送出されます。
post_process()
post_process() は任意です——組み込みのネイティブリーダーが使うのと同じフックです。解析後にフェーズごとに 1 回、read() と同じインスタンス上で呼ばれるため、そこで記録した情報はそのまま利用できます。False を返すとインポートを中止します。
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.ParsedFile | 入力ファイル 1 つの解析が完了したとき |
Phase.ParsedAll | すべての入力ファイルの解析が完了したとき |
Phase.ClosedOpenCells | パーサーが開いたままにしたセルが閉じられたとき |
Phase.ResolvedRefs | すべての参照が実在のセルを指すようになったとき |
Phase.SelectedMainCell | メインセルが決定されたとき |
Phase.ResolvedLayersByBlock | ByBlock のレイヤー継承が解決されたとき |
Phase.AutoNumberedZ | レイヤーの Z 順序が割り当てられたとき |
@format_writer()
シグネチャ
@format_writer( name: str, extensions: list[str], description: str = "",)class MyWriter(FormatWriter): def write(self, path: Path, drawing: WriterContext) -> None: ...パラメーター
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
name | str | 必須 | 形式の表示名 |
extensions | list[str] | 必須 | ファイルパターン |
description | str | "" | 形式の説明 |
FormatWriter 基底クラス
class FormatWriter: def write(self, path: Path, drawing: WriterContext) -> None: """Override to implement file export logic.""" ...WriterContext は図面への読み取りアクセスを提供します。リーダーと同様、作業単位を宣言すればジオメトリは変換済みで届きます。
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() はジオメトリを走査する唯一の手段です。反復前に flatten を設定してください。flatten = False では各セル自身の形状が得られ、参照は自分で扱います。flatten = True ではホストが階層をレンダリングし、変換スタックを適用して途中で曲線をテセレーションします。
FormatInfo
どちらのデコレーターもクラスに FormatInfo オブジェクトを付与し、info() をそれを返す静的メソッドで置き換えます。
| フィールド | 説明 |
|---|---|
name | 形式の表示名 |
extensions | ファイルパターンのリスト |
description | 形式の説明 |
options | クラスから収集された Option 属性 |
登録
登録された形式は LinkCAD の「開く」「保存」ダイアログに自動的に表示されます。
- リーダー は File → Open の形式ドロップダウンに表示されます
- ライター は File → Save As の形式ドロップダウンに表示されます
extensions のリストがファイルタイプの関連付けを決めます。例:
@format_reader(name="My Format", extensions=["*.myf", "*.myfx"])これにより「My Format (*.myf, *.myfx)」が「開く」ダイアログに追加されます。