明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2588|回复: 14

[【PyCAD】] 做个简单的电缆统计表格【持续更新】

[复制链接]
发表于 2023-12-22 16:33:40 | 显示全部楼层 |阅读模式
本帖最后由 枫叶棋语 于 2023-12-24 11:19 编辑



原理: 用System.Windows.Forms 做界面,表格使用的DataGridView。
1. 表格的功能包括点击表头排序,点击数据行,CAD的亮显对应图形,包括类似Excel 的Ctrl+D,Ctrl+R以及自定义Ctrl+V事件;
2. 这次没有使用DataTable 作为数据源,而是使用自定义类,及BindingList 作为数据源,表格也支持手动输入数据,水平长度以及总长度设置不允许用户输入;
3. 按钮中有保存,加载,是将数据源转为Json文件,后期考虑添加缓存机制,保存或关闭窗口进行用户提示;以及保存历史数据记录;
4. 按钮中添加新行以及删除整行,进行表格行添加或删除操作;
5. 起点,重点编号支持在文本框写入编号,填充到选定行对应数据列;
6.绑定曲线按钮支持修改数据行要绑定的曲线;
7.查找曲线支持选择CAD中的曲线,在列表中显示对应的数据行;
8. 添加曲线支持Cad中选择图元,并将数据记录到表格

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-12-23 15:25:49 | 显示全部楼层
本帖最后由 枫叶棋语 于 2023-12-26 14:38 编辑
  1. import json
  2. import os
  3. import typing
  4. import clr
  5. import System
  6. from pycad.runtime import *
  7. from pycad.system import *
  8. import re, csv

  9. clr.AddReference("System.Windows.Forms")
  10. clr.AddReference("System.Drawing")
  11. from System.Drawing import *
  12. from System.Windows.Forms import *
  13. from System.ComponentModel import BindingList


  14. class CurveData:
  15.     def __init__(self, curve_id: int = 0) -> None:
  16.         super().__init__()
  17.         self.doc: Document = acap.Application.DocumentManager.MdiActiveDocument
  18.         self.db = self.doc.Database
  19.         self.句柄 = curve_id
  20.         self.起点 = ""
  21.         self.终点 = ""
  22.         self.回路 = ""
  23.         self.功率 = 0
  24.         self.电压 = "380V"
  25.         self.型号规格 = ""
  26.         self.电缆拼数 = 1
  27.         self.垂直长度 = 0
  28.         self.余量 = 3
  29.         self.备注 = ""

  30.     def to_dict(self):
  31.         return {
  32.             "起点": self.起点,
  33.             "终点": self.终点,
  34.             "句柄": self.句柄,
  35.             "回路": self.回路,
  36.             "功率": self.功率,
  37.             "电压": self.电压,
  38.             "型号规格": self.型号规格,
  39.             "电缆拼数": self.电缆拼数,
  40.             "垂直长度": self.垂直长度,
  41.             "余量": self.余量,
  42.             "备注": self.备注,
  43.         }

  44.     @staticmethod
  45.     def from_dict(data: dict):
  46.         curvedata = CurveData(data.get("句柄", 0))
  47.         curvedata.起点 = data.get("起点", "")
  48.         curvedata.终点 = data.get("终点", "")
  49.         curvedata.回路 = data.get("回路", "")
  50.         curvedata.功率 = data.get("功率", 0)
  51.         curvedata.型号规格 = data.get("型号规格", "")
  52.         curvedata.电缆拼数 = data.get("电缆拼数", 1)
  53.         curvedata.垂直长度 = data.get("垂直长度", 0)
  54.         curvedata.余量 = data.get("余量", 0)
  55.         curvedata.备注 = data.get("备注", "")
  56.         return curvedata

  57.     @property
  58.     def ObjectId(self) -> ObjectId:
  59.         if self.句柄 == 0 or self.句柄 == None or self.句柄 == "" or self.句柄 == System.DBNull.Value:
  60.             return "None"
  61.         else:
  62.             return self.db.GetObjectId(False, Handle(self.句柄), 0)

  63.     @property
  64.     def 水平长度(self):
  65.         if self.ObjectId == "None":
  66.             return 0
  67.         elif self.ObjectId.IsNull:
  68.             self.句柄 = 0
  69.             return 0
  70.         elif self.ObjectId.ObjectClass.DxfName not in ["LINE", "POLYLINE", "LWPOLYLINE"]:
  71.             return 0
  72.         else:
  73.             return float(f"{self.ObjectId.Length / 1000:0.2f}")

  74.     @property
  75.     def 总长度(self):
  76.         return (self.水平长度 + self.垂直长度 + self.余量) * self.电缆拼数


  77. class DataPanel(Panel):
  78.     def __init__(self):
  79.         super().__init__()
  80.         self.ColumnsTags = ["句柄", "起点", "终点", "回路", "功率", "型号规格", "水平长度", "垂直长度", "余量", "电缆拼数", "总长度", "备注"]
  81.         self.datagrid = DataGridView()
  82.         self.reverse = False
  83.         self.Initial()

  84.     def CreateColmns(self, column_name, ReadOnly: bool):
  85.         column = DataGridViewTextBoxColumn()
  86.         column.Name = column_name
  87.         column.DataPropertyName = column_name  # 数据属性名
  88.         column.HeaderText = column_name  # 表头文字
  89.         column.ReadOnly = ReadOnly
  90.         column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
  91.         self.datagrid.Columns.Add(column)
  92.         return column

  93.     def AddRowIndex(self):
  94.         for i, row in enumerate(self.datagrid.Rows):
  95.             row.HeaderCell.Value = str(i)

  96.     def Initial(self):
  97.         for tag in self.ColumnsTags:
  98.             if tag in ["水平长度", "总长度"]:
  99.                 column = self.CreateColmns(tag, True)
  100.                 column.DefaultCellStyle.Format = "N2"
  101.             elif tag in ["功率", "余量", "电缆拼数"]:
  102.                 column = self.CreateColmns(tag, False)
  103.                 column.DefaultCellStyle.Format = "N0"
  104.             else:
  105.                 self.CreateColmns(tag, False)
  106.         self.data_objects = BindingList[CurveData]()
  107.         self.binding_source = BindingSource(self.data_objects, None)
  108.         self.datagrid.DataSource = self.binding_source
  109.         self.display_Column = {}
  110.         for i in range(self.datagrid.Columns.Count):
  111.             self.display_Column[i] = i
  112.         self.reverse = False
  113.         self.datagrid.DataError += self.DataError
  114.         self.datagrid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
  115.         self.datagrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells
  116.         self.datagrid.Dock = DockStyle.Fill
  117.         self.datagrid.AllowUserToAddRows = True
  118.         self.datagrid.AllowUserToDeleteRows = True
  119.         self.datagrid.AllowUserToResizeRows = True
  120.         self.datagrid.MultiSelect = True
  121.         self.datagrid.ReadOnly = False
  122.         self.datagrid.RowHeadersVisible = True
  123.         self.datagrid.AutoGenerateColumns = False
  124.         self.datagrid.RowHeadersVisible = True
  125.         self.datagrid.AllowUserToOrderColumns = True
  126.         self.datagrid.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  127.         self.datagrid.RowHeadersWidth = 50
  128.         self.datagrid.SelectionMode = DataGridViewSelectionMode.CellSelect
  129.         self.datagrid.BorderStyle = BorderStyle.FixedSingle
  130.         self.datagrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  131.         self.datagrid.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
  132.         self.Controls.Add(self.datagrid)
  133.         self.datagrid.ColumnHeaderMouseClick += self.On_ColumnHeaderMouseClick
  134.         self.datagrid.CellValueChanged += self.On_CellValueChanged
  135.         self.datagrid.KeyDown += self.On_keydown
  136.         self.datagrid.ColumnDisplayIndexChanged += self.On_ColumnDisplayIndexChanged

  137.     def DataError(self, s, e: DataGridViewDataErrorEventArgs):
  138.         """处理数据类型错误"""
  139.         e.Cancel = True
  140.         prinf(f"{e.RowIndex}行,{e.ColumnIndex}列,输入格式错误")
  141.         return

  142.     def On_ColumnDisplayIndexChanged(self, sender, e):
  143.         """处理手动调整列顺序事件,并更新显示列与数据列匹配字典"""
  144.         for i in range(self.datagrid.Columns.Count):
  145.             self.display_Column[self.datagrid.Columns[i].DisplayIndex] = i

  146.     def Op_Clip(self):
  147.         """处理剪贴板文字,变成数组"""
  148.         if Clipboard.ContainsText():
  149.             pasted_text = Clipboard.GetText()
  150.             rows = csv.reader(pasted_text.splitlines(), delimiter="\t")
  151.             data = [list(row) for row in rows]
  152.             return data
  153.         else:
  154.             return None

  155.     def On_keydown(self, s, e: KeyEventArgs):
  156.         """按键事件"""
  157.         selectedCells: typing.Collection[DataGridViewTextBoxCell] = self.datagrid.SelectedCells
  158.         if selectedCells.Count > 0:
  159.             col_display_indexes = sorted({cell.OwningColumn.DisplayIndex for cell in selectedCells})
  160.             row_indexes = sorted({cell.RowIndex for cell in selectedCells})
  161.             if e.KeyCode == Keys.D and e.Control:
  162.                 """处理ctrl+D快捷键"""
  163.                 for col in col_display_indexes:
  164.                     col_cells = [cell for cell in selectedCells if cell.OwningColumn.DisplayIndex == col]
  165.                     col_cells.sort(key=lambda cell: cell.RowIndex)
  166.                     value_col0 = col_cells[0].Value
  167.                     for cell in col_cells:
  168.                         cell.Value = value_col0

  169.             if e.KeyCode == Keys.R and e.Control:
  170.                 """处理ctrl+R快捷键"""
  171.                 for row in row_indexes:
  172.                     row_cells = [cell for cell in selectedCells if cell.RowIndex == row]
  173.                     row_cells.sort(key=lambda cell: cell.OwningColumn.DisplayIndex)
  174.                     value_row0 = row_cells[0].Value
  175.                     for cell in row_cells:
  176.                         cell.Value = value_row0
  177.             if e.KeyCode == Keys.Delete:
  178.                 """处理删除快捷键"""
  179.                 for cell in selectedCells:
  180.                     cell.Value = ""
  181.             if e.KeyCode == Keys.V and e.Control:
  182.                 clipdata = self.Op_Clip()
  183.                 columns: DataGridViewColumnCollection = self.datagrid.Columns
  184.                 if clipdata:
  185.                     if len(selectedCells) == 1:
  186.                         selected_cell: DataGridViewTextBoxCell = selectedCells[0]
  187.                         row_index0 = selected_cell.RowIndex
  188.                         col_index0 = selected_cell.OwningColumn.DisplayIndex
  189.                         for i, row in enumerate(clipdata):
  190.                             for j, col in enumerate(row):
  191.                                 if row_index0 + i < self.datagrid.Rows.Count and col_index0 + j < self.datagrid.Columns.Count:
  192.                                     col_index = self.display_Column[col_index0 + j]
  193.                                     self.datagrid.Rows[row_index0 + i].Cells[col_index].Value = col

  194.                     if len(selectedCells) > 1:
  195.                         row_index_min = min(row_indexes)
  196.                         col_index_min = min(col_display_indexes)
  197.                         row_index_max = max(row_indexes)
  198.                         col_index_max = max(col_display_indexes)
  199.                         if (col_index_max - col_index_min + 1) * (row_index_max - row_index_min + 1) != len(selectedCells):
  200.                             aleernt_message = "此选择无效,粘贴区域为完整连续的范围"
  201.                             MessageBox.Show(aleernt_message, "IronPycad", MessageBoxButtons.OK, MessageBoxIcon.Error)

  202.                         else:
  203.                             for i, row in enumerate(clipdata):
  204.                                 for j, col in enumerate(row):
  205.                                     if row_index_min + i <= row_index_max and col_index_min + j <= col_index_max:
  206.                                         col_index = self.display_Column[col_index_min + j]
  207.                                         self.datagrid.Rows[row_index_min + i].Cells[col_index].Value = col

  208.     def On_CellValueChanged(self, sender, e: DataGridViewCellEventArgs):
  209.         """处理单元格值改变事件"""
  210.         self.binding_source.ResetItem(e.RowIndex)

  211.     def On_ColumnHeaderMouseClick(self, sender, e: DataGridViewCellMouseEventArgs):
  212.         """处理表头点击事件,实现排序"""
  213.         column_name = self.datagrid.Columns[e.ColumnIndex].HeaderText
  214.         self.data_objects = BindingList[CurveData](
  215.             sorted(self.data_objects, key=lambda x: getattr(x, column_name), reverse=self.reverse)
  216.         )
  217.         self.binding_source = BindingSource(self.data_objects, None)
  218.         self.datagrid.DataSource = self.binding_source
  219.         self.AddRowIndex()
  220.         self.reverse = not self.reverse


  221. class CunstomButton(Button):
  222.     def __init__(self, text):
  223.         super().__init__()
  224.         self.Text = text
  225.         self.Size = Size(100, 25)
  226.         self.Font = Font("Arial", 8)
  227.         self.Dock = DockStyle.Top


  228. class CustomTextBox(TextBox):
  229.     def __init__(self):
  230.         super().__init__()
  231.         self.Size = Size(100, 25)
  232.         self.Font = Font("Arial", 8)
  233.         self.Dock = DockStyle.Top


  234. class OpPanel(Panel):
  235.     def __init__(self):
  236.         super().__init__()
  237.         self.tag_textboex = CustomTextBox()
  238.         self.add_btn = CunstomButton("添加曲线")
  239.         self.load_btn = CunstomButton("加载数据")
  240.         self.save_btn = CunstomButton("保存数据")
  241.         self.newrow_btn = CunstomButton("添加新行")
  242.         self.delrow_btn = CunstomButton("删除整行")
  243.         self.SerialStart_btn = CunstomButton("起点编号")
  244.         self.SerialEnd_btn = CunstomButton("终点编号")
  245.         self.BindingCurve_btn = CunstomButton("绑定曲线")
  246.         self.FindData_btn = CunstomButton("查找曲线")
  247.         self.FindDatas_btn = CunstomButton("批量查线")
  248.         self.Notes_btn = CunstomButton("批量备注")

  249.         self.Controls.Add(self.Notes_btn)
  250.         self.Controls.Add(self.FindDatas_btn)
  251.         self.Controls.Add(self.add_btn)
  252.         self.Controls.Add(self.FindData_btn)
  253.         self.Controls.Add(self.BindingCurve_btn)
  254.         self.Controls.Add(self.SerialEnd_btn)
  255.         self.Controls.Add(self.SerialStart_btn)
  256.         self.Controls.Add(self.tag_textboex)
  257.         self.Controls.Add(self.newrow_btn)
  258.         self.Controls.Add(self.delrow_btn)

  259.         self.Controls.Add(self.load_btn)
  260.         self.Controls.Add(self.save_btn)


  261. class ListPanel(Form):
  262.     def __init__(self):
  263.         super().__init__()
  264.         self.doc: Document = acap.Application.DocumentManager.MdiActiveDocument
  265.         self.jsonname = os.path.splitext(self.doc.Name)[0] + ".json"
  266.         self.InitForm()

  267.     def ReBindData(self, datalist):
  268.         handles = {dataobject.句柄 for dataobject in self.datapanel.data_objects if dataobject.句柄 != 0}
  269.         for data in datalist:
  270.             if data.句柄 not in handles:
  271.                 self.datapanel.data_objects.Add(data)
  272.         self.datapanel.binding_source = BindingSource(self.datapanel.data_objects, None)
  273.         self.datapanel.datagrid.DataSource = self.datapanel.binding_source

  274.     def InitForm(self):
  275.         self.db = self.doc.Database
  276.         self.Name = self.doc.Name
  277.         self.Text = os.path.basename(self.Name)
  278.         self.Dock = DockStyle.Fill
  279.         self.Size = Size(1000, 600)
  280.         self.splitContainer = SplitContainer()
  281.         self.splitContainer.Dock = DockStyle.Fill
  282.         self.splitContainer.Location = Point(0, 0)

  283.         self.datapanel = DataPanel()
  284.         self.datapanel.Dock = DockStyle.Fill
  285.         self.datapanel.datagrid.SelectionChanged += self.On_SelectionChanged

  286.         self.oppanel = OpPanel()
  287.         self.oppanel.Dock = DockStyle.Fill
  288.         self.oppanel.add_btn.Click += self.On_Add_Click
  289.         self.oppanel.save_btn.Click += self.On_Save_Click
  290.         self.oppanel.load_btn.Click += self.On_Load_Click
  291.         self.oppanel.newrow_btn.Click += self.On_NewRow_Click
  292.         self.oppanel.delrow_btn.Click += self.On_DelRow_Click
  293.         self.oppanel.SerialStart_btn.Click += self.On_SerialStart_Click
  294.         self.oppanel.SerialEnd_btn.Click += self.On_SerialEnd_Click
  295.         self.oppanel.BindingCurve_btn.Click += self.On_BindingCurve_Click
  296.         self.oppanel.FindData_btn.Click += self.On_FindData_Click
  297.         self.oppanel.FindDatas_btn.Click += self.On_FindDatas_Click
  298.         self.oppanel.Notes_btn.Click += self.On_Notes_Click

  299.         self.splitContainer.Panel1.Controls.Add(self.datapanel)
  300.         self.splitContainer.Panel2.Controls.Add(self.oppanel)
  301.         self.Controls.Add(self.splitContainer)
  302.         self.Load += self.ListForm_Load
  303.         self.SizeChanged += self.ListForm_SizeChanged

  304.     def On_Add_Click(self, sender, e):
  305.         self.oppanel.add_btn.Enabled = False
  306.         self.doc.Window.Focus()

  307.         res = ssget(":A", TV(0, "LINE,*POLYLINE"))
  308.         if not res.ok:
  309.             self.oppanel.add_btn.Enabled = True
  310.             return
  311.         ids: typing.Collection[ObjectId] = tuple(res)

  312.         datalist = [CurveData(int(objid.Handle.Value)) for objid in ids]
  313.         self.ReBindData(datalist)
  314.         self.datapanel.AddRowIndex()
  315.         self.oppanel.add_btn.Enabled = True

  316.     def ListForm_Load(self, sender, e):
  317.         self.splitContainer.SplitterDistance = self.Width - 100

  318.     def ListForm_SizeChanged(self, sender, e):
  319.         if self.WindowState != FormWindowState.Minimized:
  320.             self.splitContainer.SplitterDistance = self.Width - 100

  321.     def GetObjectId(self, curve_id: int) -> ObjectId:
  322.         if curve_id == System.DBNull.Value:
  323.             prinf("句柄需要为整数")
  324.             return
  325.         else:
  326.             return self.db.GetObjectId(False, Handle(curve_id), 0)

  327.     def On_SelectionChanged(self, s, e):
  328.         if self.datapanel.datagrid.SelectedCells.Count > 0:
  329.             Utils.SetFocusToDwgView()
  330.             cells = self.datapanel.datagrid.SelectedCells
  331.             row_indexes = {cell.RowIndex for cell in cells if cell.Value != System.DBNull.Value}
  332.             handels = [
  333.                 self.datapanel.data_objects[rowindex].句柄
  334.                 for rowindex in row_indexes
  335.                 if self.datapanel.data_objects[rowindex].句柄 != 0
  336.             ]
  337.             try:
  338.                 objids = [self.GetObjectId(curve_id) for curve_id in handels]
  339.                 sssetfirst(tuple(objids))
  340.             except:
  341.                 prinf("Error: 非法句柄")
  342.             self.datapanel.datagrid.Focus()

  343.     def On_Save_Click(self, sender, e):
  344.         datalist = [curvedata.to_dict() for curvedata in self.datapanel.data_objects]
  345.         json_str = json.dumps(datalist, indent=4, ensure_ascii=False)
  346.         with open(self.jsonname, "w", encoding="utf-8") as f:
  347.             f.write(json_str)

  348.     def On_Load_Click(self, sender, e):
  349.         dialog = OpenFileDialog()
  350.         dialog.Filter = "json文件(*.json)|*.json"
  351.         dialog.InitialDirectory = os.path.dirname(self.jsonname)
  352.         dialog.Multiselect = False
  353.         if dialog.ShowDialog() == DialogResult.OK:
  354.             filename = dialog.FileName
  355.             with open(filename, "r", encoding="utf-8") as f:
  356.                 datalist: typing.List[dict] = json.load(f)
  357.                 self.ReBindData([CurveData.from_dict(curvedata) for curvedata in datalist])
  358.         self.datapanel.AddRowIndex()

  359.     def On_NewRow_Click(self, sender, e):
  360.         self.ReBindData([CurveData()])
  361.         self.datapanel.AddRowIndex()

  362.     def On_DelRow_Click(self, sender, e):
  363.         selectedCells = self.datapanel.datagrid.SelectedCells
  364.         rows = {cell.RowIndex for cell in selectedCells}
  365.         for row_index in sorted(rows, reverse=True):
  366.             self.datapanel.datagrid.Rows.RemoveAt(row_index)

  367.     def On_SerialStart_Click(self, sender, e):
  368.         selectedCells = self.datapanel.datagrid.SelectedCells
  369.         rows = {cell.RowIndex for cell in selectedCells}
  370.         for row_index in rows:
  371.             self.datapanel.data_objects[row_index].起点 = self.oppanel.tag_textboex.Text
  372.             self.datapanel.binding_source.ResetItem(row_index)

  373.     def On_SerialEnd_Click(self, sender, e):
  374.         selectedCells = self.datapanel.datagrid.SelectedCells
  375.         rows = {cell.RowIndex for cell in selectedCells}
  376.         for row_index in rows:
  377.             self.datapanel.data_objects[row_index].终点 = self.oppanel.tag_textboex.Text
  378.             self.datapanel.binding_source.ResetItem(row_index)

  379.     def On_BindingCurve_Click(self, sender, e):
  380.         self.oppanel.BindingCurve_btn.Enabled = False
  381.         self.doc.Window.Focus()
  382.         rowindex = self.datapanel.datagrid.SelectedCells[0].RowIndex
  383.         res = entsel("\n选择要绑定的曲线")
  384.         if not res.ok:
  385.             self.oppanel.BindingCurve_btn.Enabled = True
  386.             return
  387.         self.oppanel.BindingCurve_btn.Enabled = True
  388.         objid = res.ObjectId
  389.         if objid.ObjectClass.DxfName not in ["LINE", "POLYLINE", "LWPOLYLINE"]:
  390.             prinf("请选择直线或多段线")
  391.         else:
  392.             self.datapanel.data_objects[rowindex].句柄 = int(objid.Handle.Value)
  393.         self.datapanel.binding_source.ResetItem(rowindex)

  394.     def On_FindData_Click(self, sender, e):
  395.         self.datapanel.datagrid.SelectionChanged -= self.On_SelectionChanged  # 禁用选择更改事件
  396.         self.oppanel.FindData_btn.Enabled = False
  397.         self.doc.Window.Focus()
  398.         res = entsel("\n选择要查询的曲线")
  399.         if not res.ok:
  400.             self.oppanel.FindData_btn.Enabled = True
  401.             self.datapanel.datagrid.SelectionChanged += self.On_SelectionChanged  # 启用选择更改事件
  402.             return
  403.         self.oppanel.FindData_btn.Enabled = True
  404.         objid = res.ObjectId
  405.         if objid.ObjectClass.DxfName not in ["LINE", "POLYLINE", "LWPOLYLINE"]:
  406.             prinf("请选择直线或多段线")
  407.         else:
  408.             curve_id = int(objid.Handle.Value)
  409.             for row_index in range(self.datapanel.data_objects.Count):
  410.                 if self.datapanel.data_objects[row_index].句柄 == curve_id:
  411.                     self.datapanel.datagrid.ClearSelection()
  412.                     self.datapanel.datagrid.Rows[row_index].Selected = True
  413.                     for cell_index in range(self.datapanel.datagrid.ColumnCount):
  414.                         self.datapanel.datagrid.Rows[row_index].Cells[cell_index].Selected = True
  415.                     self.datapanel.datagrid.FirstDisplayedScrollingRowIndex = row_index
  416.         self.datapanel.datagrid.SelectionChanged += self.On_SelectionChanged  # 启用选择更改事件

  417.     def On_FindDatas_Click(self, sender, e):
  418.         self.datapanel.datagrid.SelectionChanged -= self.On_SelectionChanged  # 禁用选择更改事件
  419.         self.oppanel.FindDatas_btn.Enabled = False
  420.         self.doc.Window.Focus()
  421.         res = ssget(":A", TV(0, "LINE,*POLYLINE"))
  422.         if not res.ok:
  423.             self.oppanel.FindDatas_btn.Enabled = True
  424.             self.datapanel.datagrid.SelectionChanged += self.On_SelectionChanged  # 启用选择更改事件
  425.             return
  426.         ids: typing.List[ObjectId] = tuple(res)
  427.         handles = [int(objid.Handle.Value) for objid in ids]
  428.         self.datapanel.datagrid.ClearSelection()
  429.         for curve_id in handles:
  430.             for row_index in range(self.datapanel.data_objects.Count):
  431.                 if self.datapanel.data_objects[row_index].句柄 == curve_id:
  432.                     for cell_index in range(self.datapanel.datagrid.ColumnCount):
  433.                         self.datapanel.datagrid.Rows[row_index].Cells[cell_index].Selected = True
  434.         self.oppanel.FindDatas_btn.Enabled = True
  435.         self.datapanel.datagrid.SelectionChanged += self.On_SelectionChanged  # 启用选择更改事件

  436.     def On_Notes_Click(self, sender, e):
  437.         selectedCells = self.datapanel.datagrid.SelectedCells
  438.         rows = {cell.RowIndex for cell in selectedCells}
  439.         for row_index in rows:
  440.             self.datapanel.data_objects[row_index].备注 = self.oppanel.tag_textboex.Text
  441.             self.datapanel.binding_source.ResetItem(row_index)


  442. @Command(flags=CommandFlags.UsePickSet)
  443. def SG(doc: Document):
  444.     db = doc.Database
  445.     listform = ListPanel()
  446.     acap.Application.ShowModelessDialog(owner=doc.Window.Handle, formToShow=listform, persistSizeAndPosition=False)
复制代码
 楼主| 发表于 2023-12-23 15:27:29 | 显示全部楼层
guohq 发表于 2023-12-23 14:52
建议楼主说明一下代码的功能、对数据的要求,CAD版本等信息,不然贴一堆代码,让别人看起来也很费劲。

如果你不用pycad,你是看不懂的
 楼主| 发表于 2023-12-24 11:00:47 | 显示全部楼层
1028695446 发表于 2023-12-23 23:02
感觉还是lisp代码看起来简洁些

这里的主要代码是界面和事件代码,其实CAD交互就几句
发表于 2023-12-22 18:19:05 | 显示全部楼层
这还简单吗?对我来说太难了。
 楼主| 发表于 2023-12-23 08:09:49 | 显示全部楼层
wangsr 发表于 2023-12-22 18:19
这还简单吗?对我来说太难了。

很简单的,一点不难
发表于 2023-12-23 14:52:07 | 显示全部楼层
建议楼主说明一下代码的功能、对数据的要求,CAD版本等信息,不然贴一堆代码,让别人看起来也很费劲。
发表于 2023-12-23 17:27:34 | 显示全部楼层
枫叶棋语 发表于 2023-12-23 15:27
如果你不用pycad,你是看不懂的

什么是PYCAD能普及下最好谢谢
发表于 2023-12-23 20:25:16 | 显示全部楼层
wangsr 发表于 2023-12-23 17:27
什么是PYCAD能普及下最好谢谢

用python写的CAD插件
发表于 2023-12-23 23:02:13 | 显示全部楼层
感觉还是lisp代码看起来简洁些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-18 13:03 , Processed in 0.177677 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表