From 5f59b3dd4f52184d922ae1cd7019df0a36b130eb Mon Sep 17 00:00:00 2001 From: mikael-lovqvists-claude-agent Date: Fri, 13 Mar 2026 16:52:26 +0000 Subject: [PATCH] Fix ColumnSorterMixin attribute name and sheet detection Use itemDataMap (required by wx mixin) instead of item_data_map, and use fp.GetSheetname() instead of GetProperties() lookup. Co-Authored-By: Claude Sonnet 4.6 --- plugins/component_table/__init__.py | 38 +++++++++++------- .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 8930 bytes 2 files changed, 24 insertions(+), 14 deletions(-) create mode 100644 plugins/component_table/__pycache__/__init__.cpython-314.pyc diff --git a/plugins/component_table/__init__.py b/plugins/component_table/__init__.py index b5da952..1abe136 100644 --- a/plugins/component_table/__init__.py +++ b/plugins/component_table/__init__.py @@ -1,6 +1,7 @@ import pcbnew import wx import wx.lib.mixins.listctrl as listmix +import traceback COLUMNS = ['Designation', 'Value', 'Library', 'Package', 'Sheet'] @@ -15,7 +16,7 @@ class Sortable_Component_List(wx.ListCtrl, listmix.ColumnSorterMixin): col_widths = [100, 120, 160, 200, 200] for i, (col, w) in enumerate(zip(COLUMNS, col_widths)): self.InsertColumn(i, col, width=w) - self.item_data_map = {} + self.itemDataMap = {} listmix.ColumnSorterMixin.__init__(self, len(COLUMNS)) def GetListCtrl(self): @@ -23,13 +24,13 @@ class Sortable_Component_List(wx.ListCtrl, listmix.ColumnSorterMixin): def populate(self, rows): self.DeleteAllItems() - self.item_data_map = {} + self.itemDataMap = {} for idx, row in enumerate(rows): item = self.InsertItem(idx, row[0]) for col, val in enumerate(row[1:], start=1): self.SetItem(idx, col, val) self.SetItemData(idx, idx) - self.item_data_map[idx] = row + self.itemDataMap[idx] = row class Component_Table_Dialog(wx.Dialog): @@ -60,17 +61,9 @@ class Component_Table_Dialog(wx.Dialog): def _get_sheet(fp): try: - props = fp.GetProperties() - for key in ('Sheetname', 'Sheet', 'sheet'): - val = props.get(key, '') - if val: - return val - except Exception: - pass - try: - path = str(fp.GetPath()) - if path and path != '/': - return path + name = fp.GetSheetname() + if name: + return name except Exception: pass return '-' @@ -85,6 +78,23 @@ class Component_Table_Action(pcbnew.ActionPlugin): self.icon_file_name = '' def Run(self): + try: + self._run() + except Exception: + msg = traceback.format_exc() + dlg = wx.Dialog(None, title='Component Table — Error', size=(600, 350)) + sizer = wx.BoxSizer(wx.VERTICAL) + txt = wx.TextCtrl(dlg, value=msg, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL) + txt.SetFont(wx.Font(9, wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + sizer.Add(txt, 1, wx.EXPAND | wx.ALL, 6) + btn = wx.Button(dlg, wx.ID_CLOSE, 'Close') + btn.Bind(wx.EVT_BUTTON, lambda e: dlg.Close()) + sizer.Add(btn, 0, wx.ALIGN_RIGHT | wx.RIGHT | wx.BOTTOM, 8) + dlg.SetSizer(sizer) + dlg.ShowModal() + dlg.Destroy() + + def _run(self): board = pcbnew.GetBoard() components = [] diff --git a/plugins/component_table/__pycache__/__init__.cpython-314.pyc b/plugins/component_table/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8604311569864d10bedfd5f1f29218d2005fe769 GIT binary patch literal 8930 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 PR><}o*?yZeE7SR3AGF5= literal 0 HcmV?d00001