Zum Inhalt springen

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, 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)")

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, choice und cell_choice

TableColumn-Eigenschaften

EigenschaftBeschreibung
keyDict-Schlüssel für den Wert dieser Spalte
labelText der Spaltenüberschrift
col_typestring, integer, real, choice, cell_choice
defaultStandardwert für neue Zeilen
choicesOptionen für choice-Spalten
decimalsDezimalstellen für real-Spalten
min_valueMinimum für numerische Spalten
max_valueMaximum 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 exception

Einheitenumrechnung

Die Zeichnungsdatenbank verwendet intern Nanometer. Konvertieren Sie aus benutzerseitigen Einheiten:

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