Tutorial zur Panel-Zusammenstellung
Dieses fortgeschrittene Tutorial zeigt den Aufbau eines praxisnahen Tools, das den Typ Option.table() verwendet, um ein interaktives Raster zum Festlegen von Panel-Layouts zu erstellen.
Ziel
Erstellen Sie ein „Panelizer“-Tool, das mehrere Zellen mit konfigurierbarem Abstand und Wiederholung in einem Panel-Raster anordnet.
Vollständiges Plugin
from linkcad.plugin import tool, Tool, Option, TableColumnfrom linkcad.db import Drawing, Cell, Transactionfrom 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)")Wie die Tabellenoption funktioniert
Option.table() erstellt ein bearbeitbares Raster im Tool-Dialog:
- Spalten werden durch
TableColumn-Objekte definiert - Zeilen werden vom Benutzer über Schaltflächen hinzugefügt/entfernt
- Der Wert ist eine
list[dict], wobei jedes Dict Spaltenschlüssel auf Werte abbildet - Spaltentypen umfassen
string,integer,real,choiceundcell_choice
TableColumn-Eigenschaften
| Eigenschaft | Beschreibung |
|---|---|
key | Dict-Schlüssel für den Wert dieser Spalte |
label | Text der Spaltenüberschrift |
col_type | string, integer, real, choice, cell_choice |
default | Standardwert für neue Zeilen |
choices | Optionen für choice-Spalten |
decimals | Dezimalstellen für real-Spalten |
min_value | Minimum für numerische Spalten |
max_value | Maximum für numerische Spalten |
Der Spaltentyp cell_choice
Eine cell_choice-Spalte rendert ein Dropdown, das mit allen Zellennamen aus der aktuellen Zeichnung gefüllt wird. Dies ist die empfohlene Methode, um Benutzer Zellen auswählen zu lassen.
Wichtige Muster
Auf Tabellenzeilen zugreifen
for row in self.entries: cell_name = row["cell_name"] offset_x = row["offset_x"]Datenbanktransaktionen verwenden
Umschließen Sie Zeichnungsänderungen immer mit einer Transaktion:
with Transaction(dwg) as txn: # ... modify drawing ... # auto-commits on successful exit; auto-rolls-back on exceptionEinheitenumrechnung
Die Zeichnungsdatenbank verwendet intern Nanometer. Konvertieren Sie aus benutzerseitigen Einheiten:
x_nm = int(x_um * 1000) # µm → nm