EP04 · 讲义

Genesis2000 Python 脚本实战 · 第4集 MainLCM——一百二十个操作命令

本集学什么

这集讲「做」——查询之外,自动化真正干活的部分。学完你能写出日常操作脚本:开料号、建步骤、改层别、铺铜、输出。 一百二十个方法不用死记。先解剖一个方法看懂封装套路,再按四组巡览,最后记住几个工具方法。

回顾:第 2 集的四步骨架

Do.do.COM(...)  # VOF → 跳钩子 → COM → VON
第 2 集讲过 COM 通道和 VOF、VON 这对错误跳过开关。这一集你会发现,MainLCM 的每一个方法,都是「关错误中断、跳钩子、执行、恢复」四步的组合。 看懂一个方法,就看懂了整个文件。我们这就解剖一个。

定位:最大的模块

class MainLCM(InfoClasses.MainInfo)
MainLCM 继承 MainInfo,是四层中代码量最大的一层——三千多行,约一百二十个方法。 它把 Genesis 的操作命令一条条封装成方法:打开料号、创建步骤、增删层别、选择编辑、铺铜输出,日常写脚本不缺零件。

四步套路:解剖 createstep(完整源码)

def createstep(self, job, step):
  self.do.VOF()                         # ① VOF 关错误中断
  self.do.COM("skip_next_pre_hook")         # ② 跳过钩子
  self.do.COM('delete_entity,...type=step') # ③a 先删
  self.do.VON()                         # ③b VON 恢复
  self.do.COM('create_entity,...type=step') # ④ 再建
这是创建步骤的完整源码。第一步 VOF,关掉错误中断机制——后面哪怕有命令出错,脚本也继续往下跑;第二步声明跳过下一条命令的钩子;第三步先删旧步骤再建新步骤,中间 VON 恢复错误机制。 这个四步套路在文件里反复出现——它就是 MainLCM 的封装骨架。后面所有方法,你都能认出这个形状。

为什么先删后建、为什么跳钩子

两个问题值得展开。为什么先删后建?要确保步骤干净——旧数据旧状态,删掉重来是最简单可靠的方式。 为什么跳钩子?Genesis 的钩子机制会在命令前后自动触发脚本,删除这类操作可能引发连锁反应。声明跳过一次,只跳过紧接着的那一条——官方文档写得很清楚。

钩子开关的成对使用

config_skip_hooks('on')   # 临时关闭钩子
...多条命令...
config_skip_hooks('off')  # 恢复
单条跳过之外,还有成对的开关:执行一段需要绕开钩子的命令前,先整体关闭,执行完再恢复。 底层实现是修改一个系统配置参数——pre 钩子和 post 钩子各一个开关,封装成两个方法,随开随关。

Job 操作组

巡览第一组:料号操作。创建、打开、关闭、导出、导入,一行一个方法,内部都套着四步套路。 导出料号尤其完整:支持三种格式模板,按参数组合选择,返回状态码让调用方判断成败。

锁定列表的 rcs 故事

料号组里有个方法背后有段真实故事:查锁定列表。原来走 dbutil,后来发现它可能存在 bug,就改成直接读服务器上的锁定文件。 代码里的痕迹是:旧方法保留着,名字加了备份后缀,注释写着原因。这种「改实现、留备份」的做法,是工程里很务实的习惯。

Step 操作与组号跟随

openstep(job, step)
  → COM open_entity ...
  → AUX set_group=<COMANS 返回的组号>
步骤组看打开步骤:发打开命令之后,还要把后续命令定向到新打开的编辑器——用的正是第 2 集讲过的 AUX set_group。 组号从命令应答文本里取,实现了「打开到哪,操作就发到哪」。在 InCAM 环境下还会临时调整一个钩子参数,做完恢复——平台差异处理得很细。

层别操作与受影响层

第三组是层别操作,占了文件近三分之二。基础的有创建、改名、删除。 核心概念是受影响层:affectedly 设置哪些层受后续操作影响,display_layers 控制哪些层显示。不理解这两个概念,就看不懂大部分编辑命令为什么只作用于部分层。

选择与过滤:两段式组合

批量操作靠两段式组合。第一段 filterset:按类型、极性设置过滤条件;第二段 selattselect:在过滤范围内按属性精确选择。 选中之后接各种操作——复制到别的层就是常见例子。这种「先定义范围、再选择、再操作」的节奏,是编辑类脚本的通用套路。

添加要素:返回索引

addpad(x, y, symbol, ...)   # → 返回新要素索引
addtext(...)                  # → 返回新要素索引
添加要素的方法有个重要约定:返回新要素的索引。加了焊盘、加了文字,拿到索引,后面的移动、删除、改属性就有了操作对象。 这对应 Genesis 的要素模型:每个要素在层内有唯一索引,官方命令用它寻址。封装只是把这个约定完整保留。

工艺功能

第四组是工艺级功能。fillsuf 封装铺铜,内部按参数组合准备了四条命令模板;compensatelayer 做层补偿,配合单位自适应给双套默认值。 CompareLayers 特别实用:把两个料号的同名层逐像素比对,返回差异数量。变更验证、回归检查,现成可用。

单位自适应

unit = COM("get_units")  # 先问当前单位
容差 = inch ? 一套值 : mm ? 另一套值
单位自适应是贯穿全文件的设计:方法执行前先查当前工作单位,再按英寸或毫米给对应的默认容差。 好处是脚本与单位解耦——同一行代码,在英寸工厂和毫米工厂都给出正确行为,调用方不用关心环境。

工具方法

文件末尾还有一批工具方法:五个静态字符判断函数,判断是不是数字、有没有中文;四舍五入保留小数位。 最实用的是层序整理:把顶层底层的对应层排到一起,处理层名只差一个字符的对称层时很有用。

历史痕迹:多版本并存

读这个文件会看到明显的历史痕迹:同一个功能两三个版本并存,还有大段被注释的旧代码。 这不是乱——是真实项目的演化史。新版本替代旧版本,旧版本留着兼容或备查。写新脚本时认准带中文文档、参数清晰的那个版本用。

使用案例巡览

Do.openjob('job')            # 打开料号
Do.createstep('job', 'step')    # 创建步骤
Do.openstep('job', 'step')      # 打开步骤
最后看真实用法,三个例子摘自包内文档。打开料号、创建步骤、打开步骤——日常操作全是一行。 从下一集开始,我们离开核心四层,进入业务模块。这一百二十个方法,就是业务模块手里的零件。

小结与预告

这一集,我们用四步套路串起了一百二十个方法:料号、步骤、层别、工艺四组命令,加上单位自适应和工具方法。 下一集看四层的最顶层:Main 类。它只有一百来行,却是所有脚本的入口——那两张数字字母映射表,正是主角。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com