コンテンツにスキップ

パネルアセンブリチュートリアル

この高度なチュートリアルでは、Option.table() 型を使用してパネルレイアウトを指定する対話型グリッドを作成する、実世界向けツールの構築方法を示します。

目標

複数のセルをパネルグリッドに配置し、間隔と繰り返しを設定できる “Panelizer” ツールを作成します。

完全なプラグイン

from linkcad.plugin import tool, Tool, Option, TableColumn
from linkcad.db import Drawing, Cell, Transaction
from linkcad.geom import Point
@tool(
name="Panelize",
menu="Tools/Drawing",
tooltip="Arrange cells into a panel layout",
requires_drawing=True,
)
class Panelizer(Tool):
panel_name = Option.string(
"Panel cell name",
default="PANEL",
tooltip="Name for the generated panel cell",
)
entries = Option.table(
"Panel Layout",
columns=[
TableColumn(
key="cell_name",
label="Cell",
col_type="cell_choice",
),
TableColumn(
key="offset_x",
label="Offset X (µm)",
col_type="real",
default=0.0,
decimals=3,
),
TableColumn(
key="offset_y",
label="Offset Y (µm)",
col_type="real",
default=0.0,
decimals=3,
),
TableColumn(
key="repeat_x",
label="Repeat X",
col_type="integer",
default=1,
min_value=1,
max_value=1000,
),
TableColumn(
key="repeat_y",
label="Repeat Y",
col_type="integer",
default=1,
min_value=1,
max_value=1000,
),
TableColumn(
key="pitch_x",
label="Pitch X (µm)",
col_type="real",
default=1000.0,
decimals=3,
),
TableColumn(
key="pitch_y",
label="Pitch Y (µm)",
col_type="real",
default=1000.0,
decimals=3,
),
],
)
flatten_result = Option.boolean(
"Flatten result",
default=False,
tooltip="Flatten the panel cell after assembly",
)
def run(self, drawing) -> None:
dwg = Drawing.current()
with Transaction(dwg) as txn:
panel = Cell.create(dwg, self.panel_name)
for row in self.entries:
cell_name = row["cell_name"]
if not cell_name:
continue
cell = dwg.find_cell(cell_name)
if cell is None:
print(f"Warning: cell '{cell_name}' not found, skipping")
continue
ox = int(row["offset_x"] * 1000) # µm to nm
oy = int(row["offset_y"] * 1000)
rx = int(row.get("repeat_x", 1))
ry = int(row.get("repeat_y", 1))
px = int(row["pitch_x"] * 1000)
py = int(row["pitch_y"] * 1000)
for ix in range(rx):
for iy in range(ry):
x = ox + ix * px
y = oy + iy * py
panel.add_ref(cell, Point(x, y))
# auto-commits on successful exit
print(f"Created panel '{self.panel_name}' with "
f"{len(self.entries)} cell group(s)")

テーブルオプションの仕組み

Option.table() は、ツールダイアログ内に編集可能なグリッドを作成します。

  • TableColumn オブジェクトで定義されます
  • はユーザーがボタンで追加/削除します
  • 値は list[dict] で、各辞書が列キーを値に対応付けます
  • 列タイプには stringintegerrealchoicecell_choice があります

TableColumn プロパティ

プロパティ説明
keyこの列の値の辞書キー
label列見出しテキスト
col_typestringintegerrealchoicecell_choice
default新しい行のデフォルト値
choiceschoice 列のオプション
decimalsreal 列の小数桁数
min_value数値列の最小値
max_value数値列の最大値

cell_choice 列タイプ

cell_choice 列は、現在の図面にあるすべてのセル名で埋められたドロップダウンとして表示されます。ユーザーにセルを選択させる推奨方法です。

主要パターン

テーブル行へのアクセス

for row in self.entries:
cell_name = row["cell_name"]
offset_x = row["offset_x"]

データベーストランザクションの使用

図面の変更は常にトランザクションで囲みます。

with Transaction(dwg) as txn:
# ... modify drawing ...
# auto-commits on successful exit; auto-rolls-back on exception

単位変換

図面データベースは内部的にナノメートルを使用します。ユーザー向け単位から変換します。

x_nm = int(x_um * 1000) # µm → nm