DSH Origin Plugin v2
August 19, 2026 · View on GitHub
本文档是 v2(工具 16 → 28)的设计/验证依据。分四部分: ① 设计蓝图(模块职责 / 数据流 / 线程模型 / clean-room 边界) ② 真机探测矩阵(Plot Type ID / 模板 / originpro API,全部在本机 OriginPro 2026b 验证) ③ 官方文档依据(canonical URL + 探测补充说明) ④ 验证矩阵(自测 + 视觉模型复核)
1. 设计蓝图
1.1 模块职责
origin_mcp_server.py MCP 层:注册式 TOOL_CATALOG(单一事实源)、28 工具、自测入口
│ 调 origin_engine(@_synchronized 公共 API)
▼
origin_engine.py 引擎:连接/写数/画图/导出/样式应用/统计批/错误升级
│ 所有 COM 操作投递到唯一工作线程(_com_queue / _com_thread_loop)
▼
originpro (OriginExt → comtypes) → Origin64.exe(单实例 COM 自动化服务器)
新增独立模块(clean-room,仅依赖 numpy):
origin_errors.py—— 稳定错误码枚举 + recoverable + next_actions,_synchronized边界自动把历史{ok:false, error}升级为结构化错误;plot_style.py—— OKLab 色差 / CVD 色盲模拟 / 白底对比度 / style_mode 预设 / 语义轴标题推断 / 可读性计划;origin_analysis.py—— 纯 numpy 的 t 检验(Welch)/ANOVA/PCA/Kaplan-Meier。
1.2 关键设计决策
| 决策 | 取舍 |
|---|---|
| 专用 COM 线程串行化 | Origin 单实例 COM + 指针线程亲和 → 全部操作 funnel 到一条线程(天然并发安全,8/8 实测) |
graph_name 幂等命名 | 传同名时清旧重画,图名稳定;不传则 Graph+序号(兼容旧行为) |
| 样式"仅多序列/显式时改色" | 单序列保持 Origin 默认,避免模板自定义面目全非 |
| box/bar 走官方模板而非 plotxy | 真机验证 plotxy 204/215 在 2026b 会渲成面积图/不出图 |
| 3D 散点 plotxy 310 + 页名差检测 | wks.activate() 前置 + _page_names() 差分判断是否真出了新页;无输出则优雅降级 |
轴标题用 GLayer.axis('x'/'y').title | 真机验证可靠;LabTalk layer.y.title.text$ 在本机不可靠(会把标题设错页) |
预览闭环 origin_view_graph | 返回 mcp ImageContent(PNG base64),模型不落盘即可视检 |
origin_catalog 文档即实现 | 工具清单只有一份 TOOL_CATALOG;catalog/help/description 均由此生成 |
2. 真机探测矩阵(OriginPro 2026b,后台实例实测)
2.1 op.new_graph(template=...) —— 验证可用的官方模板
| 模板 | 结果 | 备注 |
|---|---|---|
| line / scatter / column / bar | ✓ | 柱状/条形 |
| box | ✓ | 箱线图(add_plot + type='?', '#'=行号作 X) |
| area / stack / doubleY | ✓ | 面积 / 堆叠 / 双 Y |
| pie / ternary / bubble / candlestick | ✓ | 饼图 / 三元 / 气泡 / K 线 |
| contour / heatmap | ✓ | 等高线 / 热图 |
| 3DBars / 3DVector / GLparafunc | ✓ | 3D 柱 / 3D 矢量 / 3D 曲面(matrix) |
| 3D scatter | Δ | plotxy 310 预检无页、真机修复后可用(activate+页名差);见 2.2 |
2.2 LabTalk plotxy iy:=... plot:=<id> —— 关键结论(曾踩坑)
| ID | 名义类型 | 真机结果(2026b) |
|---|---|---|
| 204 | Bar(原注释)/Area(实际) | ✗ 渲成面积图 → bar 弃用 plotxy |
| 206 | Box | ✓ 但统一改走 box 模板更稳 |
| 215 | Bar | ✗ 某些上下文不出页 |
| 310 | 3D scatter | 需 wks.activate() + _page_names() 差分;否则无页 → 修后可用,仍留优雅降级 |
教训:plot type ID 必须真机验证,官方注释值与实际版行为可能不一致。
2.3 originpro API 实测结论(写入代码的依据)
| API | 结果 | 用法 |
|---|---|---|
gl.plot_list() | 是方法不是属性 | gl.plot_list() |
gl.axis('x'/'y') | 返回 Axis 对象,.title 可读写 | 轴标题可靠路径 |
p.color | RGB 元组(非 int) | p.color=(r,g,b) |
p.symbol_kind / p.symbol_size | 平面属性 | 符号循环 / 降符号 |
wks.to_col_range(i) | 仅 1 col、2 位置参数 | 多列用 plotxy iy:=(...) 索引式 |
po.LT_execute | 仅 1 位置参数(脚本) | 不再传入多个参数 |
gp.obj.GetName() | 页短名 | 幂等命名/列表依据 |
gl.add_plot(wks, col, '#', type='?') | 模板图加层 | box/bar 用 |
3. 官方文档依据
本环境网络策略屏蔽 docs.originlab.com(modsearch 桥 198.18.0.88 被拦),无法直接抓取, 故全部行为以本机真机探针为最终依据;下列 canonical URL 供复核引用。
- Plot Type IDs(labtalk
plotxy plot:=枚举,注释与 2026b 行为有出入,以探针为准): https://docs.originlab.com/labtalk/ref/plot-type-ids/ - GraphPage 模板(
op.new_graph(template=...)名称清单): https://www.originlab.com/doc/Origin-Help/Display-Templates - originpro
GraphLayer.axis/Plot对象参考: https://docs.originlab.com/pythonextapi/pythonextapi/graph/GLayer.html - 无障碍/调色板参考(CVD-safe 配色 Common 思想,自研实现): https://davidmathlogic.com/colorblind/
4. 验证矩阵(全绿)
| 项 | 命令 | 结果 |
|---|---|---|
| 引擎级全链路(含新能力) | origin_mcp_server.py --selftest | SELFTEST OK |
| MCP 协议级(28 工具 + 跨协议图片内容) | origin_mcp_server.py --mcp-test | MCP-TEST OK |
| 并发稳定 | --concurrency-test | 8/8,6.76s |
| 天线回归 | smoke\advanced_test.py / smoke\science_test.py | OK |
| COM 冒烟 | smoke\origin_com_smoke_test.py | RESULT: OK |
| 最小调用 | demo_call.py | DEMO OK |
| compact 精简模式 | ORIGIN_MCP_PROFILE=compact | 24 工具,统计批隐藏 |
视觉复核(识图模型,见 smoke/visual_check.py 生成的图):
vis_styled3.png:3 序列 line_symbol — X 轴=温度(°C)、Y 轴=压力(kPa)、 蓝圈(压力) / 橙三角(信号)、图例右上 —— 调色板/符号循环/双轴语义标题全部落图;vis_bar.png:确认是真柱状图(修复前是面积图);vis_dense.png:600 点散点,符号适中未糊成线。
本文件随 v2.0.0 一并维护;新增探测结论请追加到第 2 节而非改写历史。