Cadence Capture Tcl 接口清单
用于回答"这台机器的 Capture 到底有哪些可开发的外部接口"。产出是一份多工作表 Excel,每一行都能回溯到文档页或源码文件。
这个 skill 做的是静态普查,不是联调。 它能证明"某接口在文档/随附实现中存在",不能证明"在该进程内可用"。需要可用性结论时,必须回到 Capture 的 Command Window 用 info commands 与实调确认(见 references/evidence_baseline.md 的联调清单)。
先做侦察,不要套用上次的结论
优先使用用户给定的安装路径;用户未给定时再探测。同一份文档在不同 SPB 版本里命名空间完全不同,套用旧结论会给出错误答案。
<install>\tools\capture\tclscripts\ Tcl 脚本与包、官方扩展手册 PDF
<install>\doc\scap_tcl_comms\ System Capture Tcl 命令参考(HTML 命令页 + TOC JSON)
<install>\doc\psptclcmdref\ PSpice Tcl 命令参考
<install>\doc\symed_tcl_comms\ Symbol Editor Tcl 命令
<install>\doc\orcadtclgsg\ 入门:环境搭建/建包/自动加载/加密
<install>\doc\orctclsample\ GUI 接口与 Dbo 遍历样例
<install>\doc\orctclcap\ 实际任务样例(BOM/属性/occurrence)
<install>\doc\capinfomodel\ 对象关系、事务、连接重算(C++ 语义)
<install>\tools\bin\orDb_Dll_Tcl64.dll 数据库 Tcl 绑定
<install>\tools\bin\orTclAutomation64.dll 自动化绑定
先跑一次轻量规模统计(目录数、.tcl 数、pkgIndex.tcl 数、总体积),再决定解析策略。规模到 GB 级时不要递归读取整棵树。
四路取证,缺一路就要在交付里标注
| 证据路 | 取什么 | 可靠度 |
|---|---|---|
| 随附命令文档(HTML/JSON) | 命令名、语法、参数、返回类型、所属章节 | 文档化接口,可信;但要与经典/新版体系区分 |
| 官方扩展手册 PDF | 附录命令清单(含 C++ 风格签名与页码)、正文章节结构与回调 | 文档化接口,页码可回溯,最适合当证据锚点 |
| 随附 Tcl 包与脚本 | package ifneeded 清单、proc 定义、RegisterAction 注册、_cdn* 回调 |
随附实现/样例,可复用但跨版本不稳定 |
| DLL 与原生词条 | 字符串表候选命令、脚本中出现的原生命令频次 | 只能当线索,不构成公开 SDK 或签名证据 |
将结果分为"公开文档接口""随附实现/样例""当前进程已验证"三类,交付里逐类标注。存在 DLL、过程名或 .node 文件,不等于有稳定公开 SDK;不要编造 COM ProgID、Python 绑定或调用签名。
工作流
- 侦察:确认安装根、版本号、文档目录与
tclscripts结构;统计规模。 - 解析 HTML 命令文档:跑 scripts/parse_capture_tcl_docs.py。它按
Syntax/Return Type/Parameters字段切页,用 TOC JSON 还原章节树,输出commands_raw.tsv与sections_raw.tsv。加--snippets再输出doc_snippets.tsv(教程代码块)。 - 提取官方 PDF:先探测本机是否有
pdftotext/gs/java或 Python 的pypdf/pymupdf;都没有就写纯标准库解析器(正则扫N G obj+zlib解 FlateDecode + 展开 ObjStm + ToUnicode CMap + 解释Tf/Tm/Td/TJ内容流,按基线 y 聚行、按真实 x 排序)。不要联网装包。 抽取后必须交叉校验:页脚打印页码是否等于 PDF 页序、目录条目与正文标题是否逐条对齐。把全文(保留===== PDFPAGE <n> =====分页标记)交给 scripts/parse_capture_tcl_pdf_index.py,得到pdf_commands.tsv/pdf_sections.tsv/pdf_toc.tsv。附录里的命令清单是机器生成的"类-方法"表,含继承重复,去重按"类+方法"而不是只按方法名。 - 扫 Tcl 包与入口机制:跑 scripts/scan_capture_tcl_packages.py。输出包清单、proc 清单、
RegisterAction扩展点、_cdn*回调。它按当前版本实际文件抽取,不硬编码任何版本结论。 - 合并与分类:跑 scripts/build_interface_workbook.py 生成多工作表工作簿(固定表名与列,便于跨版本对比),按下面"交付结构"落表。
- 交付并声明边界:写清哪些是静态确认、哪些未验证、哪些是风险项。
一条可直接改路径复用的命令序列(全部输出到同一个目录):
PY=python # Windows 下需设 PYTHONUTF8=1,否则中文规则串会按 cp936 解码报 SyntaxError
OUT=./capture_tcl_scan
mkdir -p "$OUT"
$PY scripts/parse_capture_tcl_docs.py --docroot "<install>/doc" --out "$OUT" --snippets
$PY scripts/scan_capture_tcl_packages.py --tclscripts "<install>/tools/capture/tclscripts" --out "$OUT"
# 可选(本机具备 PDF 文本层时):先自行导出 fulltext,再
$PY scripts/parse_capture_tcl_pdf_index.py --fulltext "$OUT/fulltext.txt" --out "$OUT"
$PY scripts/build_interface_workbook.py --indir "$OUT" --out "$OUT/interface_inventory.xlsx" --version-tag "<version>"
交付前自查(缺一项就不要宣称完成):工作簿能被重新打开;目标工作表数量与行数符合预期;抽查若干标志性命令能命中且"证据"列可回溯——至少要覆盖注册类(RegisterAction/AddAccessoryMenu)、数据库类(Dbo* 方法)、以及本版特有的命名空间类(如 sch::/cps::)各一条。若某一类命中不到,通常是该版本不存在这类命名,或解析器的附录正则没匹配上,要明确写进"证据边界"而不是沉默略过。
两个必须避免的陷阱
- 体系混淆。经典 OrCAD Capture 与 Allegro System Capture 是两套命名空间。SPB 17.4 本机实测:经典侧是"全局命令(
PlaceWire、RegisterAction)+类_方法(DboPage、CISDesign)+::ns::proc";sch::、cps::、dbGet*、capDRCFramework在新版 HTML 文档里存在,而在 17.4 的 PDF 全文中检索为 0 次。清单必须带"接口体系"列,并显式提示不要把两套命名混用于同一脚本。 - 把附录当全集。附录清单是机器生成的类方法表,会漏掉注册类命令。本机实测
RegisterAction只出现在 PDF 正文 p.67、未进附录 A。凡"注册/回调/菜单"类接口,要回正文与随附脚本确认。
关键接口速查(17.4 基线,其他版本须重新核实)
- 注册与菜单:
RegisterAction <Label> <Enabler> <Accel> <Callback> <ViewType>;AddAccessoryMenu(lVendorName, lMenuName, proc [, key]) - 用户动作命令(附录 A):
PlacePart、PlaceWire、PlaceNetAlias、SelectObject、SelectObjectById、Move、Rotate、Copy/Cut/Paste、Zoom*、FindParts/Pins/Nets/Text - 数据库 Dbo:迭代器
New*Iter/Next*、属性Get/SetEffectivePropStringValue、NewUserProp/NewDisplayProp、DboState与事务、DboTclHelper_*类型转换 - 检查集成:
CapCustomDRCElectricalAddItem、CapCustomDRCPhysicalAddItem、capGetDRCList - 通信:Tcl socket 示例级(
socket $host $port+::capCommServerMethod::*),不是 REST/JSON 规范;自建时只监听本机、固定业务命令、序列化数据交换 - 自动加载:自定义包
pkgIndex.tcl+capAutoLoad\<Init>.tcl注册入口;不要改capinit_internal.tcl - 新版侧(System Capture):
cps::startTCPServer、cps::registerCommand、sch::dbGet*
交付结构
一个工作簿,表名与列固定,便于跨版本对比与回归:
00_概览 · 01_命令总表(命令/命名空间/接口体系/主分类/功能域/语法/返回类型/说明/参数/示例/来源/证据路径)· 附录分册若干 · 正文回调与示例接口 · 扩展点(RegisterAction) · 附带Tcl包 · 包内过程 · CDS回调与Action名 · 原生命令候选 · 开发机制与样例 · 接口分类统计 · 扩展手册章节结构 · 证据边界
硬要求:
- 每一行都要带可回溯证据(文档路径 + 页码,或源码文件相对路径)。
证据边界表必须分"已确认(静态)/ 未验证 / 风险"三类,写明未启动 Capture、未做进程内验证。- 不修改安装目录、不改用户设计、不联网装包。
- 交付前校验:工作簿可重新打开、工作表数量与行数符合预期、抽查若干标志性命令(注册类 + 数据库类 + 新版命名空间类各一)能命中且来源正确。
资源
- references/evidence_baseline.md:SPB 17.4 本机档案(版本事实、命令名清单、编码与工具坑、联调确认清单)。换版本或换机器时先读它对照,再重新取证。
references/interface_inventory_SPB17.4.xlsx:17.4 实测产出的完整清单(15 表),可作落表样板。注意:公开包不随附该 xlsx(平台不收二进制资产),按本文第 2 步现场生成即可得到同样的 15 张表。- scripts/parse_capture_tcl_docs.py:HTML 命令文档解析(可指定任意版本目录)。
- scripts/parse_capture_tcl_pdf_index.py:PDF 全文 → 附录命令索引 + 章节结构 + 目录。
- scripts/scan_capture_tcl_packages.py:包/proc/扩展点扫描。
- scripts/build_interface_workbook.py:工作簿生成骨架与分类规则。
付费改造:支付宝 AI 按量付费(402 协议)
本 skill 已接入支付宝 AI 按量付费改造,作为托管付费服务调用时遵循标准 402 协议。
参考实现见本目录 paywall.py(仅 Python 标准库,无强制支付依赖包;live 模式可替换为支付宝官方 SDK)。
协议流程(缺一不可)
- probe(询价):客户端
GET /probe?resource=<资源>免凭证获取计费单元与单价。 - 402 账单下发:无凭证请求受保护资源时,服务端返回 HTTP 402 +
Payment-Needed账单体
(order_id / amount_fen / currency / pay_url / idempotency_key)。 - 携带凭证重试:客户端完成支付宝 AI 付后,带
Payment-Proof凭证头(并复用同一
Idempotency-Key)重试原请求。 - 验付调用:服务端
Paywall.verify()向支付宝核销凭证(pay 到账确认),失败返回 403,网络异常可安全重试。 - 履约确认:验付通过后执行业务,
Paywall.complete()把履约结果写入订单(结果只写一次)。 - ack:客户端确认收货,
Paywall.ack()将订单置 ACKED 闭环。
订单持久化与幂等
- 订单持久化于 SQLite(
orders表,路径PAYWALL_DB),服务重启不丢单; - 全部写操作以
Idempotency-Key/order_id唯一约束:同一凭证重放不重复扣费、不重复履约; - 状态机
CREATED → PAID → FULFILLED → ACKED,非法迁移直接拒绝,异常单进REFUND_PENDING。
配置(环境变量,不落盘密钥)
| 变量 | 说明 |
|---|---|
PAYWALL_MODE |
mock(本地联调)/ live(上线) |
PAYWALL_VERIFY_URL |
支付宝验付接口(live 必填) |
PAYWALL_CURRENCY |
币种,默认 CNY |
PAYWALL_DB |
订单库路径 |
快速联调
PAYWALL_MODE=mock python paywall.py & # 起付费网关
curl "http://127.0.0.1:8787/probe?resource=default" # probe 询价
curl -XPOST http://127.0.0.1:8787/run -d '{"resource":"default"}' # → 402 账单
curl -XPOST http://127.0.0.1:8787/run \
-H "Payment-Proof: SANDBOX-x" -H "Idempotency-Key: k1" \
-d '{"resource":"default"}' # 验付+履约
python -c "from paywall import request_with_paywall;print(request_with_paywall('http://127.0.0.1:8787/run',{'resource':'default'}))" # 客户端自动 402→pay→重试