EP04 · 讲义
Genesis2000 Python 脚本实战 · 第4集 MainLCM——一百二十个操作命令
本集学什么
这集讲「做」——查询之外,自动化真正干活的部分。学完你能写出日常操作脚本:开料号、建步骤、改层别、铺铜、输出。 一百二十个方法不用死记。先解剖一个方法看懂封装套路,再按四组巡览,最后记住几个工具方法。
回顾:第 2 集的四步骨架
- 第 2 集:COM 通道 + VOF/VON 错误跳过开关
Do.do.COM(...) # VOF → 跳钩子 → COM → VON
第 2 集讲过 COM 通道和 VOF、VON 这对错误跳过开关。这一集你会发现,MainLCM 的每一个方法,都是「关错误中断、跳钩子、执行、恢复」四步的组合。 看懂一个方法,就看懂了整个文件。我们这就解剖一个。
定位:最大的模块
class MainLCM(InfoClasses.MainInfo)
- 3319 行 · 约 120 个方法
- 近三分之二是层别操作
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 的封装骨架。后面所有方法,你都能认出这个形状。
为什么先删后建、为什么跳钩子
- 删除是清理重来的最简单方式
- 钩子会自动触发额外操作
- skip 只对下一条命令生效
- 官方文档:skip_next_pre_hook 只跳过紧接的那一条
两个问题值得展开。为什么先删后建?要确保步骤干净——旧数据旧状态,删掉重来是最简单可靠的方式。 为什么跳钩子?Genesis 的钩子机制会在命令前后自动触发脚本,删除这类操作可能引发连锁反应。声明跳过一次,只跳过紧接着的那一条——官方文档写得很清楚。
钩子开关的成对使用
config_skip_hooks('on') # 临时关闭钩子...多条命令...
config_skip_hooks('off') # 恢复单条跳过之外,还有成对的开关:执行一段需要绕开钩子的命令前,先整体关闭,执行完再恢复。 底层实现是修改一个系统配置参数——pre 钩子和 post 钩子各一个开关,封装成两个方法,随开随关。
Job 操作组
- createjob
- openjob
- closejob
- exportjob
- importjob
- get_job_lock_list
- 导出料号:三种格式模板按参数组合
- 返回状态码供判断成败
巡览第一组:料号操作。创建、打开、关闭、导出、导入,一行一个方法,内部都套着四步套路。 导出料号尤其完整:支持三种格式模板,按参数组合选择,返回状态码让调用方判断成败。
锁定列表的 rcs 故事
- dbutil 可能存在 bug
- → 改读 rcs 文件
- → 旧方法保留备份后缀
料号组里有个方法背后有段真实故事:查锁定列表。原来走 dbutil,后来发现它可能存在 bug,就改成直接读服务器上的锁定文件。 代码里的痕迹是:旧方法保留着,名字加了备份后缀,注释写着原因。这种「改实现、留备份」的做法,是工程里很务实的习惯。
Step 操作与组号跟随
openstep(job, step)
→ COM open_entity ...
→ AUX set_group=<COMANS 返回的组号>
- 打开到哪,操作就发到哪
- InCAM 环境临时调钩子参数,做完恢复
步骤组看打开步骤:发打开命令之后,还要把后续命令定向到新打开的编辑器——用的正是第 2 集讲过的 AUX set_group。 组号从命令应答文本里取,实现了「打开到哪,操作就发到哪」。在 InCAM 环境下还会临时调整一个钩子参数,做完恢复——平台差异处理得很细。
层别操作与受影响层
- createlayer
- renamelayer
- affectedly 受影响层
- display_layers 显示层
- 受影响层 = 后续操作的作用范围
- 不理解它就看不懂大部分编辑命令
第三组是层别操作,占了文件近三分之二。基础的有创建、改名、删除。 核心概念是受影响层:affectedly 设置哪些层受后续操作影响,display_layers 控制哪些层显示。不理解这两个概念,就看不懂大部分编辑命令为什么只作用于部分层。
选择与过滤:两段式组合
- filterset 设条件
- → selattselect 按属性选
- → selcopyother 复制到别的层
批量操作靠两段式组合。第一段 filterset:按类型、极性设置过滤条件;第二段 selattselect:在过滤范围内按属性精确选择。 选中之后接各种操作——复制到别的层就是常见例子。这种「先定义范围、再选择、再操作」的节奏,是编辑类脚本的通用套路。
添加要素:返回索引
addpad(x, y, symbol, ...) # → 返回新要素索引
addtext(...) # → 返回新要素索引
- 索引是后续操作的句柄
- 对应 Genesis 要素模型的唯一索引寻址
添加要素的方法有个重要约定:返回新要素的索引。加了焊盘、加了文字,拿到索引,后面的移动、删除、改属性就有了操作对象。 这对应 Genesis 的要素模型:每个要素在层内有唯一索引,官方命令用它寻址。封装只是把这个约定完整保留。
工艺功能
- fillsuf 铺铜
- dataoutput 输出
- compensatelayer 补偿
- CompareLayers 层比对
- 铺铜:四条命令模板按参数组合
- 层比对:逐像素比较返回差异数量
第四组是工艺级功能。fillsuf 封装铺铜,内部按参数组合准备了四条命令模板;compensatelayer 做层补偿,配合单位自适应给双套默认值。 CompareLayers 特别实用:把两个料号的同名层逐像素比对,返回差异数量。变更验证、回归检查,现成可用。
单位自适应
unit = COM("get_units") # 先问当前单位容差 = inch ? 一套值 : mm ? 另一套值
单位自适应是贯穿全文件的设计:方法执行前先查当前工作单位,再按英寸或毫米给对应的默认容差。 好处是脚本与单位解耦——同一行代码,在英寸工厂和毫米工厂都给出正确行为,调用方不用关心环境。
工具方法
- 五个字符判断函数
- set_decimal_places 四舍五入
- UpdateLayerSort 层序整理
文件末尾还有一批工具方法:五个静态字符判断函数,判断是不是数字、有没有中文;四舍五入保留小数位。 最实用的是层序整理:把顶层底层的对应层排到一起,处理层名只差一个字符的对称层时很有用。
历史痕迹:多版本并存
- isjobopened 与 isjobopen 并存
- 大段注释掉的旧代码
- 同名方法两三种写法
- 真实项目的演化史
- 新脚本认准带中文文档、参数清晰的那个版本
读这个文件会看到明显的历史痕迹:同一个功能两三个版本并存,还有大段被注释的旧代码。 这不是乱——是真实项目的演化史。新版本替代旧版本,旧版本留着兼容或备查。写新脚本时认准带中文文档、参数清晰的那个版本用。
使用案例巡览
Do.openjob('job') # 打开料号Do.createstep('job', 'step') # 创建步骤Do.openstep('job', 'step') # 打开步骤- 摘自包内 docstring「使用例子」原文
- 这一百二十个方法就是业务模块的零件
最后看真实用法,三个例子摘自包内文档。打开料号、创建步骤、打开步骤——日常操作全是一行。 从下一集开始,我们离开核心四层,进入业务模块。这一百二十个方法,就是业务模块手里的零件。
小结与预告
这一集,我们用四步套路串起了一百二十个方法:料号、步骤、层别、工艺四组命令,加上单位自适应和工具方法。 下一集看四层的最顶层:Main 类。它只有一百来行,却是所有脚本的入口——那两张数字字母映射表,正是主角。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com