コンテンツにスキップ

形式デコレーター

@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:
...

パラメーター

パラメーター既定値説明
namestr必須形式の表示名
extensionslist[str]必須ファイルパターン(例: ["*.gds", "*.gdsii"]
descriptionstr""形式の説明

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

DrawingContext は図面を構築するためのビルダー 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)

使用できる単位は nmummilmmcminchm と、micronmillimetre などの別名です。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.ResolvedLayersByBlockByBlock のレイヤー継承が解決されたとき
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:
...

パラメーター

パラメーター既定値説明
namestr必須形式の表示名
extensionslist[str]必須ファイルパターン
descriptionstr""形式の説明

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)」が「開く」ダイアログに追加されます。