Files
OnebotCatalog/onebot-data/tools/test-zip-ratio.py
wangruiguo 3c4f236cba v2.0: 4 分类真实数据替换 + 手册彩色重做 + 网页版改版
数据 (定位销/勾销缸/翻转缸/电缸 → Univer 真实数模)
- 新增 19 系列 1124 型号 (PIN 303 / HOK 73 / ROT 741 / ELEC 9)
- 命名规则取自官方图册 CODIFICATION KEY (pdftotext 提取), 非推测
- 解析用「官方值域校验 + 左对齐 DFS 填空」, 可处理省略空位的型号
- 参数组合唯一性门禁: 1124 型号全部通过 (避免选型静默错配)
- 占位/测试文件 (如 USP50J_0___K0 销径为空) 在解析阶段丢弃
- catalog.json 分类系列表同步; crossref 失效引用清理

手册页
- 全部 42 系列改为彩色 (此前脚本误写死 csGRAY 转灰度), 346 页
- 修复 UCBT 附图只有 1 页 (筛选条件写死 UCBT40 且漏 CLAMPING ARMS)
- gen-pending-series.py 改为扫描 manual 目录自动生成附件清单,
  避免重跑脚本把多页附件覆盖回单页

网页版
- 首页改为系列缩略图网格 (40 张: 27 张真实产品图 + 13 张占位图),
  按大类分组; 图放 web/series/<系列码>.webp, 覆盖同名文件即可替换
- 左侧树改手风琴 (默认收起, 一次展开一个), 父级带 SVG 图标,
  悬停放大动画, 按钮间距随高度均匀分布; 可收起为图标窄条
- 修复分隔条被拖出容器后无法找回 (上限改为容器感知 + resize 重夹取
  + 双击复位); 同时阻止图片原生拖拽
- 购物车打包改取 .step.gz 副档 (传输量降至约 1/4.5), 无副档自动回退
- 修复搜索到型号后点结果内容区空白 (switchTab('dim') 已失效)
- OpcPackage 超大包 (>1.5GB) 改走临时文件, 绕过 MemoryStream 2GB 上限

工具
- gen-pending-series/manual, copy-pending-step, gen-step-gz,
  gen-series-thumbs, scan-pending-series 等 11 个脚本

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 01:05:41 +08:00

50 lines
2.0 KiB
Python

# -*- coding: utf-8 -*-
"""测试 STEP 文件的 zip 压缩率 —— 判断"下载时压缩"能省多少。"""
import zipfile, os, tempfile
FILES = [
r'D:/开发/OnebotCatalog/onebot-data/catalog/step/UAGP155__045BS0.step',
r'D:/开发/OnebotCatalog/onebot-data/catalog/step/LAGP210OA045BC.step',
r'D:/开发/OnebotCatalog/onebot-data/catalog/step/ULP50040AEK0.step',
r'D:/开发/OnebotCatalog/onebot-data/catalog/step/UCBP40OESK0.step',
]
tmp = tempfile.mkdtemp()
tot_raw = tot_def = tot_sto = 0
print(f'{"文件":30s} {"原始":>9s} {"deflate":>9s} {"压缩率":>7s}')
for f in FILES:
if not os.path.exists(f):
print(f' 缺失: {f}')
continue
raw = os.path.getsize(f)
tot_raw += raw
sizes = {}
for lvl, tag in ((zipfile.ZIP_DEFLATED, 'def'), (zipfile.ZIP_STORED, 'sto')):
p = os.path.join(tmp, tag + '.zip')
with zipfile.ZipFile(p, 'w', lvl) as z:
z.write(f, os.path.basename(f))
sizes[tag] = os.path.getsize(p)
tot_def += sizes['def']
tot_sto += sizes['sto']
print(f'{os.path.basename(f):30s} {raw/1048576:8.2f}M {sizes["def"]/1048576:8.2f}M '
f'{(1-sizes["def"]/raw)*100:6.1f}%')
if tot_raw:
print(f'\n合计 {len(FILES)} 个: 原始 {tot_raw/1048576:.2f}MB')
print(f' deflate {tot_def/1048576:.2f}MB (省 {(1-tot_def/tot_raw)*100:.1f}%)')
print(f' 不压缩 {tot_sto/1048576:.2f}MB')
# 同时测 .opc 整包压缩率(判断主包还有多少水分)
opc = r'D:/开发/OnebotCatalog/sample/OnebotCatalog_2026.08.opc'
if os.path.exists(opc):
print(f'\n.opc 主包: {os.path.getsize(opc)/1073741824:.2f}GB')
try:
with zipfile.ZipFile(opc) as z:
infos = z.infolist()
c = sum(i.compress_size for i in infos)
u = sum(i.file_size for i in infos)
print(f' 内部 {len(infos)} 条目: 未压缩 {u/1073741824:.2f}GB -> 已压缩 {c/1073741824:.2f}GB '
f'(当前压缩率 {(1-c/u)*100:.1f}%)')
except Exception as e:
print(' 读取失败:', e)