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 / GLparafunc3D 柱 / 3D 矢量 / 3D 曲面(matrix)
3D scatterΔplotxy 310 预检无页、真机修复后可用(activate+页名差);见 2.2

2.2 LabTalk plotxy iy:=... plot:=<id> —— 关键结论(曾踩坑)

ID名义类型真机结果(2026b)
204Bar(原注释)/Area(实际)渲成面积图 → bar 弃用 plotxy
206Box✓ 但统一改走 box 模板更稳
215Bar✗ 某些上下文不出页
3103D scatterwks.activate() + _page_names() 差分;否则无页 → 修后可用,仍留优雅降级

教训:plot type ID 必须真机验证,官方注释值与实际版行为可能不一致。

2.3 originpro API 实测结论(写入代码的依据)

API结果用法
gl.plot_list()方法不是属性gl.plot_list()
gl.axis('x'/'y')返回 Axis 对象,.title 可读写轴标题可靠路径
p.colorRGB 元组(非 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 供复核引用。


4. 验证矩阵(全绿)

命令结果
引擎级全链路(含新能力)origin_mcp_server.py --selftestSELFTEST OK
MCP 协议级(28 工具 + 跨协议图片内容)origin_mcp_server.py --mcp-testMCP-TEST OK
并发稳定--concurrency-test8/8,6.76s
天线回归smoke\advanced_test.py / smoke\science_test.pyOK
COM 冒烟smoke\origin_com_smoke_test.pyRESULT: OK
最小调用demo_call.pyDEMO OK
compact 精简模式ORIGIN_MCP_PROFILE=compact24 工具,统计批隐藏

视觉复核(识图模型,见 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 节而非改写历史。