ツールプラグインの作成
このチュートリアルでは、自動生成されるオプションダイアログとともに LinkCAD のメニューに表示される Python ツールの作成方法を説明します。
ツールフレームワーク
ツールプラグインは次の要素で構成されます。
Toolを継承し@tool()で装飾したクラス- UI ダイアログを定義する Option クラス属性
- ロジックを実装し、結果の辞書を返す
run()メソッド
run() に渡される drawing は linkcad.v1.db.Drawing——アプリケーションが所有するライブデータベースです。データベース API を通じて読み取ります: drawing.cells、drawing.layers、cell.shapes など。
例: レイヤー統計
プラグインディレクトリに layer_stats.py を作成します。
from typing import Any, Dict
from linkcad.v1.plugin import tool, Tool, Option
@tool( name="Layer Statistics", menu="Tools/Analysis", tooltip="Show shape count per layer",)class LayerStats(Tool): include_empty = Option.boolean( "Include empty layers", default=False, tooltip="Show layers with zero shapes", )
def run(self, drawing) -> Dict[str, Any]: counts = {layer.name: 0 for layer in drawing.layers}
# One pass over the drawing, sorting each shape into its layer's tally. # Walking the drawing once per layer would re-read every shape as many # times as there are layers. for cell in drawing.cells: for shape in cell.shapes: if shape.layer is not None: counts[shape.layer.name] = counts.get(shape.layer.name, 0) + 1
if not self.include_empty: counts = {name: n for name, n in counts.items() if n}
return { "layers": counts, "summary": f"{len(counts)} layers, {sum(counts.values())} shapes", }
def format_result(self, result: Dict[str, Any]) -> str: lines = [f"{name}: {n} shapes" for name, n in result["layers"].items()] lines += ["", result["summary"]] return "\n".join(lines)仕組み
@tool()がクラスを LinkCAD ツールとして登録しますnameがメニューに表示され、menuがメニューパスを決めますOption.boolean(...)は自動生成ダイアログにチェックボックスを作ります- ダイアログで OK が押されると
run()が呼ばれ、結果の辞書を返します format_result()はその辞書を LinkCAD が表示するテキストに変換します。既定より見やすくしたい場合はオーバーライドしてください
図面を変更する
run() の実行中、フレームワークは読み取りロックを保持しています。書き込むにはトランザクションを開きます。成功時にコミットされ、例外が発生するとロールバックされ、取り消し履歴では 1 つのエントリになります。
from linkcad.v1.db import Transaction
def run(self, drawing): with Transaction(drawing, "Add Frame"): frame = drawing.add_cell("FRAME") layer = drawing.add_layer("OUTLINE") b = drawing.main_cell.bounds frame.add_polyline( layer, [(b.min_x, b.min_y), (b.max_x, b.min_y), (b.max_x, b.max_y), (b.min_x, b.max_y)], closed=True, ) return {"summary": "Added FRAME"}オプション型
| ファクトリー | UI コントロール | 例 |
|---|---|---|
Option.integer() | スピンボックス | Option.integer("Count", default=1, min=0, max=100) |
Option.real() | 小数スピンボックス | Option.real("Scale", default=1.0, decimals=4) |
Option.boolean() | チェックボックス | Option.boolean("Enable", default=True) |
Option.string() | テキストフィールド | Option.string("Name", default="output") |
Option.choice() | ドロップダウン | Option.choice("Mode", choices=["Fast", "Precise"]) |
Option.path() | ファイル選択 | Option.path("Output", file_filter="*.csv") |
Option.color() | カラーピッカー | Option.color("Fill", default="#FF0000") |
Option.table() | 編集可能なグリッド | パネルアセンブリ を参照 |
Option.cell_choice() | セルのドロップダウン | Option.cell_choice("Target Cell") |
条件付きオプション
enabled_when を使うとオプションを動的に有効/無効にできます。
class MyTool(Tool): mode = Option.choice("Mode", choices=["Simple", "Advanced"]) threshold = Option.real( "Threshold", default=0.5, enabled_when=lambda self: self.mode == "Advanced", )threshold フィールドは mode が “Advanced” のときだけ有効になります。
キーボードショートカット
@tool( name="My Tool", menu="Tools/Custom", shortcut="Ctrl+Shift+M",)class MyTool(Tool): ...次のステップ
- 形式プラグインの作成——カスタムのインポート/エクスポート形式を追加します
- オプション型リファレンス——完全なオプション API