Files
pythonocc-step-editor/README.md
T

479 lines
30 KiB
Markdown
Raw Normal View History

# STEP 零件与特征查看编辑原型
2026-07-23 18:35:02 +08:00
这是一个基于 Python、pythonocc-core/OCCT、VTK、PySide6/Qt 和 SpaceClaim/SCDM 的 STEP 模型查看、选择、受限参数化编辑与导出原型。程序入口是 `main.py`
## 快速读懂
- 本软件处理的是 STEP 里的 B-Rep 结果几何,不恢复原 CAD 软件的完整建模历史,也不等于 CAD 级完成。
- 当前统一走 `SCDM-first` 主线:SCDM 负责识别和执行它能稳定处理的直接建模能力;本软件负责 UI、选择、能力字典、参数表、关系式、任务 JSON、`/RunScript` 脚本生成、后台执行、结果校验、失败回滚、ID 续接、参数导出和本地 OCCT 兜底。
- SCDM 能人工修改很多内容,不代表本软件可以立刻全部开放。只有能拿到结构化对象、当前值、可用命令和结果校验方式的能力,才会进入客户参数表。
- 本软件不是给成千上万个 Face/Edge/一级/二级/三级情况各写一套代码,而是走 `capability key -> 中文参数 -> scdm_edit_job.json -> SCDM 脚本模板 -> 结果校验`。新增能力通常补一类能力模板,不补某个 Face ID 特判。
- Analysis Situs 和本地 OCCT 现在只做辅助定位、兜底识别、对照验证和历史回归,不再作为新增能力主线。
- 启动 `python main.py` 会快速进入空场景,不默认读取大 STEP;点击“导入几何模型”后才加载模型。
- README 的阅读顺序:先看 `SCDM-first 主路线``本软件与 SCDM 如何交互``怎么运行``验证`。后面的本地 OCCT 口径只是兜底基线。
2026-07-23 18:35:02 +08:00
## 软件整体架构
行数是本次交付前刷新过的源码/脚本文本统计值。统计口径包含 `.py``.md``.json``.ps1` 等文本文件,不包含 `.git``local/``dist/`、第三方参考目录、截图和二进制 STEP 模型。
```text
python-occt92597 行)
├── main.py7 行)
│ └── 程序入口,支持普通启动、烟测、隔离子进程 worker 入口
├── step_editor/66988 行)
│ ├── app.py2007 行)
│ │ └── 主窗口初始化、左侧操作面板、按钮和布局
│ ├── window_core.py4369 行)
│ │ └── STEP 加载、VTK 视图、模型显示、拾取、高亮、坐标轴、FPS、显示刷新
│ ├── window_actions.py9677 行)
│ │ └── 导出、参数化建模动作、后台任务、隔离子进程、操作历史
│ ├── window_state.py10613 行)
│ │ └── 选择状态、参数表状态、按钮启用/禁用、撤销/重做、历史定位
│ ├── model.py5796 行)
│ │ └── StepModel 核心对象,保存 shape、Face、Edge、Solid、拓扑缓存和 mixin 组合
│ ├── scdm_backend.py623 行)
│ │ └── 自动发现并缓存 SpaceClaim.exe,生成 `/RunScript` 命令并做最小烟测
│ ├── scdm_probe.py972 行)
│ │ └── 生成 SCDM 识别任务和 probe 脚本,约定 raw 识别输出
│ ├── scdm_feature_mapper.py2389 行)
│ │ └── 把 SCDM raw 结果映射成 UI 可用的特征、参数和对象 locator
│ ├── scdm_capabilities.py380 行) / scdm_property_specs.py814 行) / scdm_schema.py122 行)
│ │ └── 把 SCDM raw 结果翻译成产品化能力、中文参数和参数表 spec
│ ├── scdm_edit_runner.py2503 行)
│ │ └── 生成 SCDM 修改任务、修改脚本、结果 STEP 和错误 JSON
│ ├── scdm_result_validator.py1086 行)
│ │ └── 结果文件检查、目标值回测、对象漂移守门、ID 续接和关系式重写
│ ├── scdm_status.py568 行)
│ │ └── SCDM 可用性、cache 状态和软件进度摘要
│ ├── relation_formulas.py307 行)
│ │ └── 关系式解析、补全、求值、依赖检查和单位字面量
│ ├── parametric_component.py609 行)
│ │ └── 导出参数 schema 和组件目录 main.py
│ ├── recognition_graph.py539 行) / asitus_bridge.py308 行) / recognition_priority.py240 行)
│ │ └── 本地几何图、Analysis Situs 辅助桥接和兜底识别排序
│ ├── features.py3591 行) / operations.py14604 行) / geometry_utils.py1427 行)
│ │ └── 本地 OCCT 兜底识别、计划和几何编辑实现
│ ├── polydata.py425 行) / step_io.py160 行) / export.py179 行)
│ │ └── OCCT 与 VTK 显示数据转换、STEP 读写和导出
│ ├── workers.py51 行) / widgets.py11 行) / ui_helpers.py1401 行) / info_panel.py284 行)
│ │ └── Qt worker、自定义控件和 UI 辅助
│ └── 其它小模块:transforms.py565 行)、isolated_edit_worker.py238 行)、records.py20 行)、model_types.py25 行)、constants.py70 行)
├── scripts/24721 行)
│ └── 自动化验证脚本和 `verify_first_level_edit_suites.py` 总入口
├── tools/asitus_probe/47 行)
│ └── Analysis Situs probe 的 C++ 源码,构建产物不提交
└── assets/models/
└── 仓库自带 STEP 测试模型
```
## SCDM-first 主路线
本阶段只有一条主线:SCDM 负责识别和执行它能稳定处理的直接建模能力;本软件负责 UI、选择、参数表、关系式、任务生成、后台执行、校验、回滚、ID 续接和参数导出。SCDM 内部如何处理相邻面、圆角链、二级/三级拓扑传播,交给 SCDM。本软件不再把手写一级、二级、三级传播当成新增能力主线。
### 模型树和 cache
SCDM 界面里的模型树主要表达装配和显示层级,比如 `Design -> Pattern -> Component -> Geom -> Solid`。它对阵列、组件、实体定位很有价值,但它不是本软件可以直接展示给客户的参数 cache。
本软件仍然需要自己的 `scdm_feature_cache.json`,原因有四个:
- 要把 SCDM 对象映射回当前 UI 里的 `Face``Edge``Solid``Feature` ID。
- 要把 SCDM 原始对象翻译成客户看得懂的参数,例如 `偏移``直径``位置``阵列间距`
- 要知道每个参数应该生成哪类 SCDM 修改脚本,以及失败时怎么解释。
- 要在修改后用新 STEP、新 cache 和 OCCT 校验结果,并续接关系式里的对象 ID。
所以正确关系是:SCDM 模型树和 raw 识别结果是证据来源;本软件 cache 是 UI、脚本生成、校验和回滚的中间表示。
### 本软件与 SCDM 如何交互
本软件不是把 SCDM 界面嵌进来,也不是让客户写脚本。客户看到的仍然是本软件:导入 STEP、点击对象、修改中文参数、点击“参数化建模”。SCDM 只在后台作为几何编辑后端运行。
两边通过“文件中转 + 命令启动”交互。`RunScript` 不是我们生成的文件名,而是 SpaceClaim 的启动参数;本软件真正生成的是临时 Python 脚本和任务 JSON,然后用 `/RunScript` 交给 SCDM 执行。
```text
导入 STEP
-> 本软件显示模型并建立 Face / Edge / Solid 基础索引
-> 本软件自动找到 SpaceClaim.exe,并缓存路径、来源、版本和验证结果
-> 本软件写 scdm_probe_job.json,说明要打开哪个 STEP、输出写到哪里
-> 本软件生成 scdm_probe.py,并用 SpaceClaim.exe /RunScript=scdm_probe.py 启动 SCDM
-> SCDM 打开 STEP,识别对象、参数、命令候选、模型树和限制原因
-> SCDM 写回 scdm_raw_features.json
-> 本软件读取 raw 结果,翻译为 scdm_feature_cache.json 并缓存,以便点击对象时直接查
-> 用户在参数表修改目标值并点击“参数化建模”
-> 本软件写 scdm_edit_job.json 和 scdm_edit.py
-> SpaceClaim.exe /RunScript=scdm_edit.py 在后台执行修改
-> SCDM 输出 result.step 或 error.json
-> 本软件用 OCCT 回读 result.step,做 B-Rep 校验、目标值回测、对象漂移检查和失败回滚
-> 校验通过后替换当前模型,重新 probe,刷新 cache、ID 映射和关系式引用
```
中转文件放在 `local/scdm/<模型名>_<模型指纹>/`,不提交 Git,删掉后可以重新生成。典型目录如下:
```text
local/scdm/ICEPAK-NATURAL_19ff9d1ede49/
├── scdm_probe.py # 本软件生成,喂给 SCDM 做识别
├── scdm_probe_job.json # 本软件生成,说明识别任务
├── scdm_raw_features.json # SCDM 写回的原始识别结果
├── scdm_feature_cache.json # 本软件生成的产品化能力缓存
└── edit/
├── scdm_edit.py # 本软件生成,喂给 SCDM 做修改
├── scdm_edit_job.json # 本软件生成,说明修改任务
├── result.step # SCDM 修改成功后输出
└── error.json # SCDM 修改失败时输出
```
模型文件变更后会重新计算指纹;mapper 版本变化后旧 cache 也会丢弃,避免旧识别结果误用到新模型或新规则上。
### 能力开放规则
这里说的“SCDM 能做”,不是指 SCDM 界面里人工能点的所有按钮,而是指本软件能通过脚本拿到下面四类证据:
1. SCDM 返回了结构化对象或可定位几何,比如 Face、Hole、Slot、Boss、Round、Chamfer、Pattern、Shell。
2. SCDM 返回或脚本环境确认了可用命令,比如 `OffsetFaces``Move``Fill``Delete``Chamfer``ConstantRound`
3. 当前对象有可用的当前值或定位信息,比如直径、位置、半径、Face locator、实例中心。
4. 修改后能用新 STEP、新 cache、目标值回测或“目标特征消失”证明结果是对的。
不满足这四点的内容,只能进入诊断、日志或待适配能力,不能直接展示成客户可修改参数。
大模型上的歧义圆柱面要优先等 SCDM cache。比如 `assets/models/geom_extract.step` 的 Face1722SCDM raw 识别为 `round`,不是普通圆柱孔;本地 OCCT 快速兜底曾经会把它误猜成孔/槽候选。当前策略是:SCDM cache 未就绪时,先不开放这类圆柱孔/槽参数;cache 就绪后按 SCDM 的结构化对象决定展示圆角、槽、孔或只读诊断。
状态标记:
- `[x]` 已适配:已有能力字典、参数表/命令入口、edit job、runner 或 UI gate、结果校验和回归测试。
- `[~]` 部分适配:已有识别、cache、脚本入口或假 runner,但真实 STEP 样例、命令细节或结果守门还要继续补。
- `[ ]` 待适配:SCDM 可能能做,但本软件还没有完成结构化识别、命令脚本和结果校验闭环。
核心路线只保留下面这一棵树。前半段是 SCDM 后端闭环,中间是参数表和关系式入口,后半段是按客户高频和 SCDM 可验证能力开放参数:
```text
SCDM-first 主路线
├── 0. 后端发现与可用性
│ ├── [x] [自动发现 SpaceClaim.exe -> 缓存路径、来源、版本和验证结果]
│ ├── [x] [发现顺序 -> 缓存、注册表、环境变量、ANSYS 常见目录、PATH]
│ ├── [x] [找不到 -> 导入模型后弹出路径选择,用户选中后写回缓存]
│ └── [x] [SCDM 不可用 -> 软件仍可查看、导出并使用本地兜底能力]
├── 1. SCDM 识别与缓存
│ ├── [x] [scdm_probe_job.json -> /RunScript 扫描 STEP]
│ ├── [x] [scdm_raw_features.json -> 保存 SCDM 结构化对象、几何属性、模型树、命令候选和限制原因]
│ ├── [x] [scdm_feature_cache.json -> 映射为本软件能力字典和中文参数]
│ ├── [x] [cache 命中 -> 点击对象只查缓存,不重复启动 SCDM]
│ ├── [x] [cache 守门 -> 模型指纹或 mapperRevision 不匹配就丢弃,避免旧缓存把圆角/槽误当孔]
│ ├── [~] [SCDM 模型树 -> 已读取 Pattern / Component / Solid 层级证据;下一步用于阵列和组件参数定位]
│ └── [x] [不能产品化的 raw 结果 -> 只进诊断,不进客户参数表]
├── 2. 能力字典、参数表和用户入口
│ ├── [x] [capability key -> 中文名、单位、输入类型、建模意图、后端命令和 postCheck]
│ ├── [x] [参数表 -> 只显示已产品化、可执行、可校验的参数]
│ ├── [x] [不可改 -> UI 阶段直接说明是未实现、命令不可用、识别不完整还是风险过高]
│ ├── [x] [参数化建模 -> 多个目标值统一提交,不再每行一个操作按钮]
│ ├── [x] [导出参数 -> 勾选输入参数后生成组件目录 main.py 和参数 schema]
│ └── [x] [参数变更收集 -> 用户可一次修改多个目标值,统一交给执行层]
├── 3. 关系式与参数联动
│ ├── [x] [公式输入 -> 支持 Face85.直径 = Face87.半径 这类对象.参数表达式和补全]
│ ├── [x] [添加守门 -> 阻止自引用、重复目标、循环依赖和当前无可执行参数的公式]
│ ├── [~] [公式求值 -> 添加公式后立即计算目标值并触发 SCDM 修改;启停/删除公式后按公式快照回滚或按剩余启用公式重算,真实 SCDM 多公式样例待补]
│ ├── [~] [批量联动 -> 多条公式先求值成一组目标参数,再合并为一个参数化建模任务]
│ ├── [~] [ID 续接 -> 修改后按新 cache 重写公式里的 Face / Edge / 特征 ID;复杂拆分/合并需要提示重新选择]
│ └── [~] [关系式管理 -> 公式启停、删除回滚、基础单位字面量 mm/cm/m、JSON 导入/导出已接;优先级和更细错误定位待补]
├── 4. SCDM 参数化建模执行
│ ├── [x] [scdm_edit_job.json -> 记录模型、对象签名、能力、目标值、输出路径和超时]
│ ├── [x] [/RunScript 后台执行 -> 成功写 result.step/result.json,失败写 error.json]
│ ├── [x] [face.offset / hole.diameter / hole.position -> ICEPAK 真实 SCDM 回测通过]
│ ├── [~] [slot.width / slot.depth / slot.position / boss.diameter / boss.height / boss.position -> runner、UI gate 和目标校验已接,真实样例待补]
│ └── [~] [round.radius / chamfer.distance / feature.fill / feature.delete_round_or_chamfer -> 脚本和假 runner 已接,真实样例待补]
├── 5. 结果校验、回滚和 ID 续接
│ ├── [x] [OCCT 回读 result.step -> 检查输出文件、B-Rep 和基础模型规模]
│ ├── [~] [目标回测 -> 已覆盖数值目标、位置目标、目标特征消失和未编辑对象漂移]
│ ├── [~] [ID 续接 -> 简单唯一匹配已接,歧义/拆分/合并样例继续补]
│ ├── [~] [关系式刷新 -> 修改后按新 cache 重写 Face / Edge / 特征 ID]
│ └── [x] [失败 -> 回滚原模型并给出明确原因]
├── 6. 当前已开放或正在开放的 SCDM 能力
│ ├── [x] [Face 偏移 -> face.offset / OffsetFaces]
│ ├── [x] [孔直径 -> hole.diameter / StandardHoles 或同轴 OffsetFaces]
│ ├── [x] [孔位置 -> hole.position / Move]
│ ├── [x] [填孔/删除小特征 -> feature.fill / Fill 或 Delete]
│ ├── [~] [槽宽 -> slot.width / OffsetFaces,真实 STEP 回测待补]
│ ├── [~] [槽深 -> slot.depth / Move 或 OffsetFaces,只开放 SCDM 返回槽深、槽底面和深度方向证据的槽]
│ ├── [x] [槽位置 -> slot.position / Move]
│ ├── [~] [凸台直径 -> boss.diameter / OffsetFaces,真实 STEP 回测待补]
│ ├── [~] [凸台高度 -> boss.height / Move 或 OffsetFaces,真实 STEP 回测待补]
│ ├── [x] [凸台位置 -> boss.position / Move]
│ ├── [~] [圆角半径 -> round.radius / ConstantRound,只开放 SCDM 明确返回等半径证据的圆角]
│ ├── [~] [倒角距离 -> chamfer.distance / Chamfer,只开放 SCDM 明确返回等距倒角证据的倒角]
│ ├── [~] [删除圆角/倒角 -> feature.delete_round_or_chamfer / Fill 或 Delete,真实 STEP 回测待补]
│ ├── [x] [阵列间距 -> pattern.spacing / Move,整体阵列保持中心不变并等距重排;安全范围由支撑面动态计算,不针对 Face92 写死]
│ ├── [~] [局部间距 -> pattern.segment_spacing / Move,按“FaceA-FaceB 间距”或“零件A-零件B 间距”修改相邻段;已支持固定前项移动后侧、固定后项移动前侧、两侧均分保持中心、只移动前项、只移动后项]
│ ├── [~] [阵列实例位置 -> pattern.instance_position / Move,只移动当前阵列成员;不自动保持整体阵列等距,真实 STEP 回测待补]
│ └── [~] [壳体厚度 -> shell.thickness / Move,薄壁两平面配对后固定一侧、移动另一侧;真实 STEP 回测待补]
├── 7. 下一批只按 SCDM 能力适配
│ └── [ ] [SCDM 之外的新能力 -> 等 SCDM 能力适配完再评估]
└── 8. 交付与兜底边界
├── [x] [软件进度 -> 只展示能识别、不能识别、能修改、不能修改]
├── [x] [日志 -> 记录本次使用 SCDM / OCCT / Analysis Situs 哪个后端]
├── [x] [Analysis Situs -> 只做辅助定位、兜底识别和开源对照]
├── [x] [本地 OCCT -> 只保留已验证兜底能力,不再作为新主线扩展]
├── [ ] [商业 SCDM -> 不打包进本软件,只检测客户本机安装和许可证]
└── [ ] [SCDM 之外的新能力 -> 等 SCDM 能力适配完再评估]
```
## 关系式实现流程
关系式是 SCDM-first 的上层参数驱动入口,不绕过 SCDM 手写几何。公式只负责把 `Face87.直径 = Face85.半径``Face92.位置 = Face85.位置 + (0, 0, -3.5)` 这类用户意图求值成一组目标参数;真正改模型仍然生成 `scdm_edit_job.json`,交给 SCDM 执行,再由本软件做校验、回滚和 ID 续接。
当前策略:
- 输入框与选择模式解耦,关系式可以引用当前模型里任意已知 `Face``Edge``Solid` 或能力对象。
- 补全只补对象和参数名,不要求用户理解底层 capability key。
- 添加公式后会立即求值并尝试执行;失败时公式保留原因,模型不被破坏。
- 修改后若对象 ID 能唯一续接,公式文本会自动改成新 ID;若发生拆分、合并或歧义匹配,会提示重新选择。
- 已支持公式启停、删除后按启用公式重算或恢复公式基准;公式数字可写 `mm``cm``m` 或“毫米/厘米/米”并统一换算为当前参数表使用的毫米值;可把当前公式组导出为 JSON,也可从 JSON 批量导入并整组重算;后续要补更细错误定位和多公式优先级。
## 交互稳定性和大模型策略
大模型上最容易出问题的不是单一计算慢,而是显示 actor 更新、后台线程结束、SCDM cache 刷新和 VTK 相机旋转同时发生。当前守门原则:
- STEP 读取和显示网格生成走 `LoadWorker` 后台线程,导入失败不替换当前模型。
- 大模型首屏优先显示面片,默认延后全量边线和全量识别预热。
- 鼠标旋转时不做自动选择;悬停和普通点选只做轻量拾取。
- 边线 overlay、局部 actor 替换和后台显示刷新会在相机交互结束后再装入场景,降低“导入后旋转一下偶发闪退”的概率。
- SCDM probe 对大模型按需启动:用户点击对象后才补识别;识别完成前不把本地圆柱兜底猜测当成已确认孔/槽能力。
如果仍出现偶发闪退,优先收集:模型路径、导入后是否立刻旋转、是否正在补边线、是否正在 SCDM probe、控制台输出和 `local/scdm/` 对应目录。
## Analysis Situs 辅助定位(非主线后端)
Analysis Situs 不再作为当前主识别路线继续接入;它保留为辅助定位、兜底识别和开源对照验证。当前已经完成孔组识别桥接、AAG 轻量关系摘要和基础几何关系摘要,可用于整孔高亮、参数表兜底、候选置信度和 SCDM 结果对照。
边界很明确:
2026-07-29 15:43:28 +08:00
- `[x]` 可读取外部孔组 JSON,并把 1-based AAG Face 映射成本软件 0-based Face。
- `[x]` 可缓存邻接、曲面类型、共面、同轴、平行、垂直和相切摘要。
- `[x]` 可作为 `recognition_graph.py` 的外部证据,提高孔、槽、凸台、圆角候选排序。
- `[ ]` 不把 Analysis Situs 的完整 AAG 图接成主识别数据源。
- `[ ]` 不让 Analysis Situs 直接驱动一级/二级/三级编辑计划。
- `[ ]` 不把 C++ CLI 编译产物纳入当前打包;找不到 CLI 时主程序不报错退出。
2026-07-29 15:43:28 +08:00
## 本地 OCCT 兜底能力的当前基线
2026-07-29 15:43:28 +08:00
本地 OCCT 兜底能力继续保留,用来在没有 SCDM 或 SCDM 失败时处理已经验证过的少量快路径,也用于自动化回归。它不再代表新增能力主线。
2026-07-29 15:43:28 +08:00
| 对象 | 本地兜底现在能做 | 主要边界 |
| --- | --- | --- |
| Face | 平面 Face 的 `偏移`、部分矩形/简单全平面 Face 的面内长度和面内宽度、壳体厚度、圆柱端盖/完整圆柱侧面高度。 | 自由曲面、复杂内孔面、非矩形复杂局部重建、二级/三级传播不承诺。 |
| 孔/槽 | 规则圆柱孔直径/半径/位置、盲孔/盲槽深度、槽宽、槽深、弧长、弧角、长圆槽总长度和中心距。 | 螺纹孔、复杂槽、多槽联动、孔组阵列联动不走本地新扩展。 |
| Edge | 直线 Edge 长度/端点、圆边半径/相邻轴心、椭圆主/小半径、部分圆角/倒角。 | 任意复杂曲线 Edge、复杂链式圆角/倒角不承诺。 |
| 凸台/圆角/壳体/解析面 | 有专项回归覆盖的简单样例。 | 新客户入口优先等 SCDM capability 适配。 |
2026-07-29 15:43:28 +08:00
Face 阶段的当前验收口径(本地 OCCT 兜底基线,R1 已收口):
2026-07-29 15:43:28 +08:00
- 已验收:平面 Face 的 `偏移`,稳定矩形/简单全平面 Face 的 `面内长度``面内宽度`,以及壳体厚度、圆柱端盖/圆柱侧面高度这类挂在 Face 入口上的高频编辑。
- 已验收:Face 的一级关系定义为选中 Face 本身、必要的同域/共面碎片 Face、这些 Face 的边界 Edge/Vertex,以及与该区域共享边的直接相邻 Face。
- 未实现/不承诺:原 CAD 历史恢复、任意复杂 Face 的通用局部重建、手写孔底/槽底/台阶等二级/三级传播、跨特征约束求解和特征组联动。
2026-07-29 15:43:28 +08:00
孔/槽阶段的当前验收口径(本地 OCCT 兜底基线,R2/R3 已收口):
2026-07-29 15:43:28 +08:00
- 已验收:圆柱孔/盲孔的 `直径``半径``轴心``盲孔深度``封堵/删除孔`
- 已验收:槽/半孔/长圆槽的 `槽宽``槽深``圆弧长度``圆弧角度``开口角度``轴心``总长度``中心距`
- 未实现/不承诺:孔组、阵列孔、同尺寸孔联动、多槽组联动、螺纹孔语义编辑、任意草图槽、跨复杂面槽、手写孔底/槽底带动台阶的二级/三级传播。
2026-07-29 15:43:28 +08:00
## 怎么运行
2026-07-29 15:43:28 +08:00
Windows PowerShell
2026-07-29 15:43:28 +08:00
```powershell
cd C:\Users\admin\Desktop\python-occt
conda activate pyocc
2026-07-29 15:43:28 +08:00
python main.py
```
第一次配置环境:
```powershell
conda env create -f environment.yml
conda activate pyocc
```
烟测:
```powershell
python main.py --smoke-test
```
直接打开指定 STEP
2026-07-29 15:43:28 +08:00
```powershell
python main.py assets\models\cube_10mm.step
python main.py assets\models\geom_extract.step
2026-07-29 15:43:28 +08:00
```
如果当前 shell 里没有 `conda`
2026-07-29 15:43:28 +08:00
```powershell
C:\Users\admin\miniforge3\Scripts\conda.exe run -n pyocc python main.py
```
如果 `conda run` 输出中文时报 `UnicodeEncodeError`
```powershell
$env:PYTHONIOENCODING='utf-8'
$env:PYTHONUTF8='1'
C:\Users\admin\miniforge3\Scripts\conda.exe run -n pyocc python scripts\verify_first_level_edit_suites.py --quick
```
## 验证
当前整体验证基线:
- `python scripts\verify_first_level_edit_suites.py --quick` 是一级编辑总验证入口的轻量回归,覆盖 smoke test、属性表规格、参数表 UI、关系式规则、参数导出组件生成、SCDM 后端发现、SCDM 状态、SCDM probe/cache、SCDM edit runner、SCDM result validator、Analysis Situs 孔组桥接、ICEPAK 同域圆柱孔、特征识别优先级、一级事实图、关联探测、显示网格预算和 README 守门。
- `python scripts\verify_first_level_edit_suites.py --stage face` 覆盖 Face 阶段兜底基线。
- `python scripts\verify_first_level_edit_suites.py --stage hole-slot` 覆盖孔/槽阶段兜底基线。2026-08-11,在 `pyocc` 环境下已通过 `python scripts\verify_first_level_edit_suites.py --stage hole-slot`,覆盖 R2/R3 孔槽专项套件、隔离执行、逻辑 Face ID 保持和孔槽阶段收口口径。
- `python scripts\verify_first_level_edit_suites.py --stage edge` 覆盖 Edge 阶段兜底基线。
- `python scripts\verify_first_level_edit_suites.py --stage boss --stage round-chamfer --stage shell --stage analytic` 覆盖凸台、圆角/倒角、壳体和解析曲面兜底基线。
`--quick` 直接或间接检查的脚本:
```text
main.py --smoke-test
verify_property_editor_specs.py
verify_property_card_editor_ui.py
verify_relation_formula_rules.py
verify_parametric_component_export.py
verify_scdm_backend.py
verify_scdm_status.py
verify_scdm_probe_pipeline.py
verify_scdm_edit_runner.py
verify_scdm_result_validator.py
verify_asitus_hole_bridge.py
verify_icepak_cylindrical_region_selection.py
verify_feature_recognition_summary.py
verify_first_level_fact_graph.py
verify_associated_features.py
verify_first_level_acceptance_docs.py
```
完整阶段脚本:
```text
verify_face_edit_suite.py
verify_isolated_face_edit.py
verify_hole_slot_edit_suite.py
verify_edge_edit_suite.py
verify_edge_isolated_edit.py
verify_boss_edit_suite.py
verify_round_chamfer_edit_suite.py
verify_shell_edit_suite.py
verify_analytic_surface_resize.py
verify_cone_semi_angle_isolation.py
```
真实 STEP 失败项要优先补到对应 SCDM 或本地兜底回归里,不能只靠手动操作说明“这次能过”。
开发时常用静态检查:
2026-07-29 15:43:28 +08:00
```powershell
python -m compileall -q main.py step_editor scripts
git diff --check
```
2026-07-23 18:35:02 +08:00
## 怎么使用
- 右侧是 3D 模型窗口,左侧是操作面板。
- 鼠标左键拖动旋转,滚轮缩放,中键或 VTK 默认组合平移。
- 只有明确单击模型才选择对象;拖动旋转后鼠标落到某个 Face 上不会自动改选。
- 选择模式使用英文:`Part``Solid``Face``Edge``Feature`
- `Feature` 表示把点到的对象交给 SCDM/cache/兜底识别去解释成孔、槽、凸台、圆角、阵列、壳体等候选;它不是说 STEP 文件里原本带有 CAD 历史特征。
- `特征参数` 只显示可修改输入参数;面积、识别摘要、一级关系、关联探测和其它诊断不混入参数表。
- 用户可一次修改多个目标值,统一点击“参数化建模”。
- “软件进度”只显示客户关心的能识别、不能识别、能改、不能改;SCDM cache 数、probe 细节和内部对象数量留在日志。
2026-07-23 18:35:02 +08:00
## 当前版本边界
- 不恢复原 CAD 历史树。
- 不把 SCDM/SpaceClaim 商业内核打包进本软件;只检测客户本机安装和许可证。
- 不承诺 SCDM 人工界面里能做的所有操作都已经产品化到本软件。
- 不把 SCDM raw 技术名直接暴露给客户;必须先进入能力字典并有中文参数、脚本和校验。
- 不把 Analysis Situs 或本地 OCCT 继续扩成主识别/主编辑后端。
- 复杂 STEP 上仍可能出现 SCDM 命令失败、对象 ID 无法唯一续接、关系式目标歧义或结果漂移;此时必须回滚并说明原因。
## 交付检查清单
交付前先确认四件事:
1. 本地运行入口正常:
```powershell
conda activate pyocc
python main.py --smoke-test
```
2. 轻量回归通过:
```powershell
python scripts\verify_first_level_edit_suites.py --quick
```
3. Git diff 没有空白错误,CRLF 提示可以接受但不要出现真实 whitespace error
```powershell
git diff --check
```
4. 只提交源码、脚本、README 和明确需要交付的测试模型:
```powershell
git status --short
```
不提交 `local/``dist/``third_party/``assets/screenshots/`、临时截图、临时 markdown、第三方参考项目、SCDM 运行中转文件和本地打包产物。
## Windows 文件夹版打包
```powershell
conda activate pyocc
powershell -ExecutionPolicy Bypass -File .\scripts\package_windows.ps1
```
输出:
```text
dist\GeometryParametric_windows_x64.zip
```
`dist` 是本地构建产物,默认不提交 Git。
## 提交与忽略
- `local/``dist/``third_party/``assets/screenshots/`、临时截图、临时 markdown 和第三方参考项目不提交。
- 仓库自带可复现测试 STEP 可以提交,例如 `assets/models/ICEPAK-NATURAL.stp`
- 本次 SCDM-first 交付版建议提交命令:
```powershell
python scripts\verify_first_level_edit_suites.py --quick
git diff --check
git status --short
git add README.md step_editor scripts
git status --short
git commit -m "feat: 完善 SCDM-first 参数化编辑交付版"
```
## 后续开发备注
这一节给后续开发交接使用,普通试用人员可以跳过。
- 当前主线是 `SCDM-first 主路线`。继续开发时先读这条路线,不要回到“自己手写 Face 一级、孔槽、Edge、凸台、圆角、壳体、二级三级传播”的旧路线。
- 新增客户入口必须先有 SCDM raw 证据、capability key、中文参数、SCDM edit job/脚本、postCheck 校验、失败解释和回归脚本。
- 本地 OCCT 和 Analysis Situs 只作为兜底、对照和历史回归基线。
- 大模型交互稳定性优先:导入、旋转、边线补充、SCDM probe、参数表刷新和 actor 替换不能在 UI 线程互相抢。
- `geom_extract.step` 的 Face1722 是重要误识别样例:SCDM raw 标为 `round`,本地兜底不能在 cache 未就绪时把它当普通圆柱孔开放。
- 当前需要继续补的主线问题:SCDM 模型树用于 Pattern/Component/Solid 定位、阵列局部间距真实 STEP 回测、槽/凸台/圆角/壳体真实 SCDM 样例、关系式优先级/更细错误定位、复杂 ID 续接歧义提示、偶发 VTK 旋转闪退复现。