Skip to main content
C

dsh-origin-bridge

caob23/dsh-origin-bridge

在对话里驱动本机 Origin / OriginPro:导入 .dat/.csv/.txt 与电化学工作站 .bin,绘图、拟合、改样式,导出图片并保存可在 Origin 里继续编辑的 .opju 工程。dsh 插件,27 个 MCP 工具。第三方工具,与 OriginLab Corporation 无关联、未获认可。

Install

dsh plugin --profile web add github:caob23/dsh-origin-bridge

README

Origin Bridge

Origin Bridge

用自然语言驱动本机 Origin / OriginPro:
丢给它一个 .dat / .csv / Excel / 电化学工作站 .bin,
拿回一张发表级图片和一个能在 Origin 里继续编辑的 .opju 工程。

27 个工具 · 1118 例全链路测试全部通过 · 数据不出本机 · 支持工作站 .txt / .bin

platform tests license

两条曲线、轴标题齐全的 Origin 成图

上图由 scripts/make_preview.py 生成:导入 → 画两条曲线 → 配色与符号 → 关掉图例 → 导出 PNG,全部走本插件自己的引擎调用,轴标题与图例可见性都读回校验后才导出。数据是 sample.dat 的合成序列,不含任何真实实验数据。


为什么是它

市面上把 Origin 接进聊天的尝试,要么要求把数据上传到云端,要么是个 200 行的玩具。Origin Bridge 反着来:

  • 数据不出本机。 没有 API key、没有云端组件,dsh 拉起一个本地 Python 进程,通过 OriginLab 官方的 originpro 驱动你机器上的 Origin。
  • 每一步都有证据。 Origin 的 X-Function 普遍"返回成功但什么都没发生"。这里画图后读回轴范围与数据跨度比对,导出后校验文件存在/体积/文件头魔数,样式逐项读回——读不回的进 failed 列表,不会假装成功。
  • 不是 74 个工具,是 27 个。 每个都有实测用途,工具描述里写着实测限制,模型不会踩坑。
  • 1000+ 次真实测试,不是自称。 1118 例全链路用例跑在真实 stdio 服务器 + 本机 OriginPro 上,1118 通过 / 0 失败:27 个工具每个至少 15 例、最多 134 例,按副作用分五层(L0 纯解析 296、L1 只读 COM 61、L2 改会话 520、L3 落盘 163、L4 进程级 78)。提示词全部按人话写,跑之前先用在线 tools/list schema 校验用例本身,所以失败只会是产品问题,不会是题目写错。另有 352 项离线/单元/边界检查(asciiio 84、binio 30、lifecycle 37、smoke 129、edge 26、paths 28、json 18)随包发布,你可以直接复跑;那 1118 例题库含提示词与模拟数据,是开发侧资产,不随包分发。originpro 的十几个文档陷阱全部记录在案并绕开。

它能做什么

你说它做
"把 D:\data\spectrum.dat 画成散点连线,X 轴 Time (s),导出到 D:\out"origin_figure:导入 → 画图 → 轴标题 → PNG + .opju
"这两个文件画在一张图上,双 Y 轴"origin_layer(右 Y 轴)+ origin_plot(往指定层画)
"给这条谱图加个图例,放右上角"origin_legend(文字/位置/可见性全部读回)
"这组 EIS 数据拟合一下"origin_fit(gauss / lorentz / voigt / expdec1… 预设,参数可固定)
"这是 CHI 工作站导出的 cv.bin"origin_import 直接读二进制,电势轴按头部方法参数重建
"这是工作站导出的 txt,前面一大段参数"origin_import 自动跳过参数头,紧贴数据的那行(Potential/V, Current/A)当表头,单位拆到列的 Units 里,参数进 metadata
"做一张 XPS 图"origin_chart_render(40 个科研预设:轴标题/图类型/建议拟合)
"热力图显示这个矩阵"origin_matrix(heat_map / cmap / mesh / contline,Origin 自带图模)

数据源支持:.dat .csv .txt .tsv(自动嗅探分隔符;编码覆盖 UTF-8 / GBK / UTF-16(有无 BOM 都行) / cp1252;多行表头、Fortran 指数、NA/-;还有 <0.001 检出限、2.5±0.1、25 mV、1,234.5、(500)、2.5* 这类被装饰过的数值——每解一种都会在 warnings 里写清代入了什么)、.xls .xlsx、电化学工作站(CH Instruments 等)导出的 .txt(几十行仪器说明自动收进 metadata,不会把首行日期当成列名),以及头部为 80 F2 1B 00 的电化学工作站二进制 .bin。

安装

要求:Windows、Origin/OriginPro 2021 或更高(originpro 的硬性下限,实测 2018 不可用)、Python 3.10+。

方式 A:用 dsh plugin 从 npm 装(推荐)

dsh plugin --profile desktop add dsh-origin-bridge

两个包名指向同一个包,装哪个都行:

dsh plugin --profile desktop add dsh-origin-bridge          # 正式包
dsh plugin --profile desktop add @caob23/dsh-origin-bridge  # 转发壳,依赖上面那个

本包是 bundle 包(package.json 的 dsh.bundle.patch 指向根目录的 cordis.patch.yml),dsh plugin 装完会自动把它加进 profile 的 dsh.profile.bundles,重启 dsh 即加载,不用再手写补丁。dsh plugin 转发给 pnpm,所以 pnpm 要在 PATH 上。

npm 只管分发,不管你的 Python 环境——Origin 依赖必须自己装进 dsh 实际使用的那个解释器:

pip install originpro numpy        # 国内网络慢就加 -i https://pypi.tuna.tsinghua.edu.cn/simple

包内补丁的默认取值是 python(PATH 上那个)和 profiles/desktop。依赖装在 venv 里、或者你用的是别的 profile,就设这两个用户环境变量(设完要重开终端、再彻底重启 dsh):

setx ORIGIN_BRIDGE_PYTHON "C:\path\to\.venv\Scripts\python.exe"
setx ORIGIN_BRIDGE_HOME   "$env:USERPROFILE\.dsh\profiles\web\node_modules\dsh-origin-bridge"

装完自检(路径按你的 profile 名改):

Test-Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-origin-bridge\server.py"

彻底退出 dsh 再打开,新会话里说"列出 origin 开头的工具",应看到 27 个 mcp__origin_bridge__origin_*。卸载:

dsh plugin --profile desktop remove dsh-origin-bridge

failOnStartupError: false 是刻意的:Origin 没开或有模态框卡住 COM 时,只让工具这一轮不注册,不把 dsh 一起拖崩。

方式 B:本地 clone(要跑测试或改代码时)

cd C:\path\to\dsh-origin-bridge
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt      # 国内网络慢就加 -i https://pypi.tuna.tsinghua.edu.cn/simple

先确认能独立跑通(会自己拉起 Origin):

.\.venv\Scripts\python.exe smoke_test.py              # 129 项,看到 ALL GOOD 才算过
.\.venv\Scripts\python.exe edge_checks.py             # 26 项边界
.\.venv\Scripts\python.exe test_asciiio.py            # 84 项,不需要 Origin
.\.venv\Scripts\python.exe test_binio.py              # 30 项,不需要 Origin;有真实 .bin 时会跟厂商 .txt 逐点对账
.\.venv\Scripts\python.exe test_lifecycle.py          # 37 项,不需要 Origin:实例分类/回收/掉线重连的安全边界
.\.venv\Scripts\python.exe test_paths.py              # 28 项,不需要 Origin:导出/保存目标路径的规范化与拒绝
.\.venv\Scripts\python.exe test_json_safety.py        # 18 项,不需要 Origin:返回值必须是严格 JSON

上面这 352 项随包发布,你可以自己复跑。另外那 1118 例全链路题库是开发侧资产(cases/ + run_cases.py),跑的是真实 stdio 服务器 + 本机 Origin,用它的提示词和你的原始数据都不适合公开,所以没有进仓库、也没有进 npm 包;本文里的覆盖数字都来自它的实际运行结果。

不是 dsh,是别的 MCP 客户端

npm 装完会生成 origin-bridge 这个可执行入口(bin/origin-bridge.mjs),stdio 直连,配置里把 command 指向它或指向 node_modules/dsh-origin-bridge/bin/origin-bridge.mjs,serverName 保持 origin_bridge 即可,工具名仍是 mcp__origin_bridge__origin_*。

挂进 dsh(只针对方式 B)

走方式 A 的话这一段可以整个跳过——dsh plugin 已经替你写好了。下面是本地 clone 时的两种接法。

自动(推荐,会先备份再写入):

powershell -ExecutionPolicy Bypass -File .\install_dsh.ps1 -Profile desktop

手动:编辑 C:\Users\<你>\.dsh\profiles\desktop\cordis.patch.yml(先备份),在文件末尾追加:

- insert:
    - id: mcp-origin-bridge
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: origin_bridge
        transport: stdio
        command: 'C:\path\to\dsh-origin-bridge\.venv\Scripts\python.exe'
        args: ['-u', '-X', 'utf8', 'C:\path\to\dsh-origin-bridge\server.py']
        env:
          PYTHONIOENCODING: utf-8
          PYTHONUNBUFFERED: '1'
        failOnStartupError: false
        toolCallTimeoutMs: 180000

然后彻底退出 dsh 再打开(配置只在启动时读一次)。新会话里说"列出 origin 开头的工具"应能看到 27 个 mcp__origin_bridge__origin_*。

三个必须对的点,都是踩过的坑:

  1. 必须以 - insert: 开头。 直接写 - id: 新名字 是"覆盖下层已存在条目"的语法,对全新 id 会被 dsh 静默忽略——症状就是改了配置、重启了、什么都没发生。
  2. name: 那行必须是 @deepseek-ai/dsh-mcp-client(dsh 的 app 包里自带这个 loader),少了它条目不会被任何加载器接管。
  3. serverName 只能是标识符:工具名是 mcp__<serverName>__<tool>,写成 origin-plot 这种带连字符的名字会得到没法寻址的工具。

failOnStartupError: false 别省:Origin 没装或卡在弹窗时,它保证 dsh 照常启动,只是那一次不注册工具。

不想用 install_dsh.ps1 也不用 npm 的话,可以把整个目录拷进 <DSH_HOME>\profiles\<profile>\node_modules\dsh-origin-bridge\,仓库自带的 cordis.patch.yml 就是 bundle 层补丁——但这只是方式 A 的手动等价物,路径与解释器仍靠 ORIGIN_BRIDGE_HOME / ORIGIN_BRIDGE_PYTHON 指定,正常情况请直接走方式 A。卡片图标与显示名来自 icon.svg 和 locale/en.json、locale/zh.json。

工具(27 个)

工具用途
origin_status连接检查、Origin 版本、已开页面。动手前先调它
origin_read_file只解析文件不碰 Origin:编码、分隔符、表头行、每列长名/单位/有效行数;.bin 走另一条路线给出技术/点数/方法参数/轴来源
origin_import导入 .dat/.csv/.txt/.tsv/.xls/.xlsx/.wks 和工作站二进制 .bin,返回 ws-N 句柄和列清单
origin_write内联数据建表:窄表 columns={列名:[值…]},宽表 headers+rows(一次写完)
origin_formula给列设计算公式(Fx)做派生列,读回算出的行数与首末值
origin_plot单条或多条曲线;template 走 Origin 自带图模;graph+layer 往指定层画
origin_layer加层(右 Y 轴、上下多面板),返回 Origin 给这层起的名字作为证据
origin_legend图例:按列长名自动生成或写死,13 个位置,文字/可见性/坐标都读回
origin_style轴标题、对数轴、范围与步长、逐曲线颜色/线宽/符号形状/大小/填充/透明度,每项读回验证
origin_annotate图上文字标注与参考线(数据坐标)
origin_matrix网格数据 → 矩阵 → 热力图 / 等高线 / 3D 彩色映射面(模板驱动)
origin_fitlinear(标准版可用);预设 gauss/lorentz/voigt/expdec1/expdec2/sine/power/logistic/boltzmann/doseresp/cubic;或 nlfitsing+func
origin_chart_presets40 个科研图表预设(XPS/XRD/UV-Vis/荧光/循环伏安/Arrhenius…)
origin_chart_preset单个预设的完整约定:要哪些列、默认轴标题、建议拟合、轴向提示
origin_chart_check拿数据列名对预设做 dry-run,不碰 Origin
origin_chart_render按预设一步出图(轴标题/图类型/图例/图片/opju)
origin_export出图,带文件存在/体积/文件头校验,PNG 还回读宽高
origin_view把图渲染成小图以 MCP image content 回传给模型自己看
origin_save_project存 .opju(可编辑工程,不是截图)
origin_open打开已有工程
origin_inspect读回页面/图层/曲线数与已分配句柄——改图前先看它,别猜索引
origin_close_pages清理攒下来的页面(长会话里这是"无效指针"的根因),支持 dry_run
origin_labtalk逃生舱:原始 LabTalk + 强制读回
origin_exit关 Origin,可选先存盘
origin_instances清点机器上的 Origin 实例:后台无窗口(客户端退出后的残留)vs 前台有窗口(可能是用户自己的项目),并标出哪些是本进程起的
origin_reclaim回收残留实例:只关没有窗口的;有窗口的一律不动,只在返回里提示用户自己关。close_background:false 只看不动手
origin_figure主路径:导入→画图→轴标题→图例→图片+opju 一次完成

工作站 .bin 是怎么回事

那种头部以 80 F2 1B 00 开头、写着 Cyclic Voltammetry / A.C. Impedance / Amperometric i-t Curve 的文件(CHI660E 一类工作站导出),尾部是一个 float32 数组 = 测量通道(电流 A),电势轴不在文件里。

Origin Bridge 的做法:

  1. 从头部"数据起点前 600 字节"的参数块读 Init/High/Low E、步长、段数;
  2. 按"正向起步的三角波"重建电势轴,重建点数必须与文件点数完全相等才采信,否则退回 axis=none 并说明原因,绝不拿错的 X 轴画图;
  3. i-t / CA / CP 的时间轴直接由采样间隔展开;EIS 的频率表是另一套参数,明说拿不到,不猜。

这条重建规则对着厂商自己导出的 .txt 逐点核过:5 个文件、每个 600 点,电势和电流 0 处不符。

设计取舍

为什么不用 mcp SDK 的 stdio 传输。 SDK 建的是 asyncio ProactorEventLoop,其 self-pipe 在 Windows 上回落到 socketpair()(127.0.0.1 listen+connect+accept)。防火墙拦回环 accept 的机器上这一步永久阻塞 → initialize 永不返回 → 客户端等满 60 秒超时。server.py 用同步换行分隔 JSON-RPC,握手毫秒级,零事件循环依赖。

为什么返回句柄而不是 Origin 引用字符串。 [Book1]Sheet1! 这类引用对大小写、空格、活动页状态都敏感,写错了不报错只静默失败。引擎内部持有真实对象,把 ws-1 / gr-2 交给模型原样传回。

为什么进程探测失败要报 probe: "unavailable" 而不是空列表。 origin_instances / origin_reclaim 靠读进程表区分"没人看的后台实例"和"用户正开着的窗口"。如果 powershell 不可用或超时就让它们返回空集合,调用方读到的是"没有残留、没有前台窗口"——一个假的清白结论。宁可说"我没看清、这次什么都没做",也不能把"未知"报成"没事"。

为什么连接时不自动回收既存的无窗口实例。 被 dsh 驱动的那个 Origin 本身就是无窗口的:可见性只说明"没有人在屏幕前看它",不说明"没有客户端在用它"。开机时顺手杀掉所有无窗口实例,会直接砍掉用户当前会话正在跑的任务。所以只有显式 origin_reclaim 才动手,且只动无窗口的;有窗口的一律留给用户自己关。

两条画图路径,各自实测过。 单 x/单 y 走 LabTalk plotxy——那是 Origin 工具栏自己的路径,主题、配色、自动缩放都对。多条曲线 / 指定层 / 指定模板走 layer.add_plot() + layer.rescale():add_plot 不 rescale 就是 0..10 空轴,但 rescale 之后颜色/符号/线宽全部正确,且只有它能精确投到某一层——plotxy 给限定范围时返回 True 却画到别的页/层上去了。

为什么每次写入都读回。 plot() 读回轴范围和数据跨度比对,不符就报 plot_axis_degenerate;origin_export 校验文件存在、体积、文件头魔数;style() / legend() 每项读回,读不进的进 failed。

缺失值消毒。 Origin 用 -1.23456789e-300 表示 missing,直接吐给模型会被当成真实拟合参数。sanitize() 统一转成 null。

originpro 1.1.15 / OriginPro 2024 实测陷阱(维护者必读)

这几条都是文档和实际行为不一致,靠读 API 文档写会静默出错:

陷阱实际行为处置
lay.add_plot(...)返回 Plot 对象、不报错,但轴停在 0..10 的空图只在 rescale() 之后使用,并用轴范围读回反证
plotxy 的 plot:= 代码200 线、201 散点、202 线+符号、203 柱(不是常见的 201=line)PLOT_CODES 常量,逐个导图目视确认
plotxy 往指定层画给限定范围返回 True,曲线却不在目标层(甚至多出一层重叠轴)指定层一律用 add_plot + rescale
add_layer(t)t=0 BottomXLeftY、1 TopX、2 RightY、3 LeftY、4 TopXRightY、5 BottomXRightY、6 InsetLAYER_TYPES 名字表 + 读回 layer.name 当证据
plot.set_cmd("w=2.5")设线宽静默无效(get_float('line.width') 仍 0.5)用 set_float('line.width', v) 并读回比对
legend X-Functionlegend 1; 把图例写成 "111";legend -s Graph1 写成 "Graph1Graph1Graph1";legend -p br 不挪图例反而多出写着 "br" 的文本框legend -r; 自动生成,文字走 layer.label('Legend').text,位置写 Legend.x/Legend.y(该层数据坐标,锚点是图例中心)
obj.is_open含义是"没被最小化/隐藏",不是"页面还存在"close_pages 用关闭后重新枚举页面名单作为证据
op.pages()是生成器:迭代第二次静默返回空一律 list(...) 落地
WSheet.set_formula(col, …)文档写 1-offset,实际 0-based;传 idx+1 在 SetStrProp 上抛 NoneType传 0-based idx,列不够先扩列
WSheet.from_list2(data)内层列表是列不是行write_block 内部转置
Axis.scale / lay.xscalesetter 收 'log10',getter 返回整数 2SCALE_TYPES 映射后按整数比对
lt_exec('layer.x.title$="…"')返回 False;字符串赋值类 LabTalk 走不通轴标题走对象模型 origin_style
op.NLFit(name)区分大小写且无别名:Gauss 可用,gauss1/Linear/Quadratic/FRADA 直接抛 Invalid fitting functionFIT_PRESETS 只收逐个构造成功的名字
op.path('p')返回工程所在文件夹,不是工程文件自己用 _project_file 记录绑定
op.save(file)语义是 Save-As;绑定后再存同名返回 False(不是失败)同路径改用无参 op.save(),并比对 mtime
COM 线程亲和连接必须在专用 COM 线程上建立;在 stdio 读线程上连接会跨 apartment 复用对象_resolve() 只查句柄表不碰 COM;有"图工具作为首个调用"的回归项守着
已销毁对象的 .name留下 C 层待处理异常,之后一个不相干的 len() 才炸成 SystemError句柄登记时顺手存页面名,清理句柄表不再回摸 COM
桥坏到一定程度op.path() 抛 "returned a result with an exception set",此时连 op.exit() 都跑不动;自动 detach()/attach() 会把可诊断的报错变成进程直接崩不自愈,抛 connection_error 并写明要外部重启 Origin
工作站 .bin 的数组布局看着像两列(各 N/2),其实厂商 .txt 里那 600 行电流正好等于整个数组——只有测量通道binio.py 按单通道 + 方法参数重建轴,点数相等做门禁
矩阵图的色标标题色条标题是模板占位文字;lt_exec 字符串赋值返回 False,而 originpro 1.1.15 里静态搜 colorscale / colorbar / cbtitle 一个 API 都没有(2026-10-12 查过)origin_matrix 只给模板选择(heat_map / cmap / mesh / contline / contgray / 3d)与 xy_range;色标区间、配色、标题都没做,标题要改只能事后在 Origin 里手点——不假装能设
导出滤镜对文件名的改写要 100%_a#b[1].png 实际写出 100%_a1b[1].png:# 被当成编号 token 换成了数字(%、[]、空格、中文都活着)。另外 Windows 会静默截掉路径组件尾部的空格/点,于是 isfile() 对我们请求的字面路径说 False,而字节确实在盘上_norm_target 先按 Win32 的规则规范化,_written_or_mangled 用 #+ → \d+ 匹配实际落名的唯一候选、os.replace 改回用户要的名字并在 warnings 里说明;匹配有歧义就不猜
没有文件名的 pathpath=" " 曾经 abspath 到进程 CWD,变成插件目录里一个叫 .png 的隐形文件(dsh 下就是 node_modules 安装目录);path="." 同理_norm_target 要求"第一个点之前有真字符",否则 bad_path;目录、盘根、UNC、未映射盘一律 bad_path;已存在但只读/被占用返回 target_locked,不覆盖也不假装成功(test_paths.py 28 项离线锁住)
编码候选顺序仪器"另存为 Unicode 文本"导出的 UTF-16(有/无 BOM)此前直接报 找不到数值数据行;而 cp1252 写的 µ/° 会被 gb18030 抢先解成 祍/癈——它不报错,所以错误一路静默到列名read_text 先认 BOM,无 BOM 时按 NUL 占比猜 utf-16 并在 encoding 里写明是猜的;再用"高位字节成对=GBK、孤立单字节=cp1252"决定候选顺序(high_byte_runs)
装饰过的数值格子<0.001、2.5±0.1、25 mV、1,234.5、2.5*、(500)、1e400 这些形态此前让整列被判"全为空"直接丢弃——用户看到的是少一列数据,不是报错cell_number 逐形态解开并回一条 warnings 说明代入了什么;溢出/Infinity 一律按缺值,绝不把 inf 送出桥
分隔符嗅探欧陆 Zeit;Signal / 0,0;1,5 会被逗号拆开,而且错的拆法因为"列更多"在评分里胜出评分改成:数值列数 → 行宽一致性 → 列数更少者优先;表头行不参与数值比
非标准 JSONjson.dumps 默认把 inf/nan 写成裸 Infinity/NaN,那不是合法 JSON——dsh 侧整条响应解析失败,看起来像"桥挂了"而不是"一个数不对"sanitize() 把 ±inf/nan 归 None;server.py 写出走 allow_nan=False,兜不住就降级成带原 id 的 JSON-RPC 错误;smoke_test 客户端用 strict_loads 拒绝,测试不会替产品掩盖它(test_json_safety.py 18 项)

已知边界

  • originpro 要求 Origin 2021+。实测 OriginPro 2018C:能连、能存空工程,但导入返回 0 行、add_plot 直接打死连接器。
  • 非线性拟合需要 OriginPro 授权;标准版调 origin_fit(kind='gauss') 会明确报 fit_function_unavailable。
  • .bin 只覆盖 80 F2 1B 00 头的工作站导出;EIS 的频率表在另一套参数里,所以 .bin 的 EIS 只有测量列。Gamry / Autolab / Pine 等其它厂商二进制没做,也不猜。
  • 图例位置是"按数据坐标摆放",对数轴上分数位置会偏;没有"避让数据点"的智能摆放。
  • 交付路径:中文目录、中文文件名、含空格、200+ 字符长路径、自动建多级目录、tiff→tif/jpeg→jpg 改名——2026-10-12 在真机上逐条实测可用(PNG/TIF/PDF/SVG/EMF 和 .opju 都试过)。不行的是网络路径:UNC 与未映射盘返回 bad_path,不去猜认证。另有两条 Origin 自己的怪脾气已经兜住:文件名里的 # 会被导出滤镜换成编号(桥发现后会改名回你要的名字并在 warnings 里说明),路径组件尾部的空格/点会被 Windows 悄悄截掉(桥先截一遍再比较,不会报"文件不存在")。
  • 千分位和逗号分隔符同形的文件(不加引号的 0,1,234.5)没法机械还原:桥按最宽行补齐并报"行长度不一致",不会假装列数对得上。欧陆小数点(0,5)只在分隔符是 ; 或 tab 时才认。
  • Origin 以管理员运行而 Python 不是(或反之)时 COM 连不上,两侧权限要一致。
  • 长会话攒太多页面会让 COM 桥报"无效指针"。origin_close_pages 能清,根治是 origin_exit 后重连。
  • Origin 实例不会跟着客户端退出:originpro 需要时自己拉一个 Origin,Python 进程结束那个实例还在。攒够就会报"实例超过上限"。现在插件在进程退出时回收自己起的、且没有窗口的实例(atexit),历史残留用 origin_reclaim 清;有窗口的实例永远不动,因为那可能是你正开着的项目。
  • 统计批处理(t 检验 / ANOVA / PCA / 生存分析)没有,originpro 本身也不提供。
  • 无并发保护:两个会话同时驱动 Origin 会互相踩。
  • 40 个图表预设只取元数据;预设自带的 render_template() 会先 op.new()——那会把用户正在编辑的工程整个丢掉,所以这里换成自己的渲染路径。

排障

现象先查
dsh 里看不到工具配置是不是漏了 - insert:;name: 有没有写成 @deepseek-ai/dsh-mcp-client;有没有彻底退出重启 dsh;python server.py --tools 能否列出 27 个
connection_errorOrigin 是否 ≥2021;pip show originpro;任务管理器里 Origin64.exe 是否只有一个
报"实例超过上限"origin_instances 看有几个、哪些没窗口;origin_reclaim 关残留的后台实例;有窗口的那些要用户自己关(可能有未保存的东西)
import_empty先 origin_read_file 看结构;空格/多行表头已由自研解析器处理,走到这个报错说明文件本身没有数值行
com_timeoutOrigin 窗口是否卡在对话框/许可证弹窗
无效指针页面攒太多:origin_close_pages,或 origin_exit 让它重开
图片没出来origin_inspect 看 plots 是否为 0;换 ASCII 路径
图是空的但没报错看返回里的 proof_level;plot_axis_degenerate 会主动抛出

给维护者

dsh-origin-bridge/
├── server.py            # 同步 stdio JSON-RPC,27 个工具的分发与 schema
├── originlab.py         # 引擎:COM 专用线程、句柄表、每个操作及其读回验证
├── asciiio.py           # 健壮的 ASCII 读取(分隔符嗅探 / GBK / 多行表头)
├── binio.py             # 工作站 .bin:单测量通道 + 方法参数重建电势轴
├── templates_catalog.py # 40 个科研图表预设(纯元数据)
├── cordis.patch.yml     # dsh bundle 补丁(serverName: origin_bridge)
├── install_dsh.ps1      # 一键装入 dsh(备份 + 写 profile 层 + 自检)
├── icon.svg             # 卡片图标(scripts/make_icon.py 生成)
├── locale/*.json        # dsh 卡片显示名与描述
├── scripts/make_preview.py # 重新生成 docs/preview.png(关掉图例后才导出)
└── test_*.py / smoke_test.py / edge_checks.py   # 352 项离线与单元检查(随包发布)

开发侧另有 cases/ + run_cases.py 的 1118 例全链路题库和 render_realdata.py 的真实数据逐文件出图脚本,两者都不随包发布(见上文)。

重新生成图标:python scripts/make_icon.py(只需要 numpy,PNG 由 stdlib 手写)。

商标声明与许可

本项目是独立的第三方工具,与 OriginLab Corporation 无关联、无合作、未获认可。Origin、OriginPro 为 OriginLab Corporation 的商标;本工具通过 OriginLab 官方公开发布的 originpro Python 包以正常方式使用其产品,未分发其任何二进制、图标或文档。

MIT © Origin Bridge Contributors

Related plugins