数据 (定位销/勾销缸/翻转缸/电缸 → 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>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
勘察未完成分类的真实数模(定位销/勾销缸/翻转缸/夹爪缸/电缸)
|
||
用法: PYTHONUTF8=1 python scan-pending-series.py
|
||
"""
|
||
import os, re, collections, sys
|
||
|
||
BASE = r'X:/新开发产品-Research and Development/1_产品3D数模(发客户仿真)'
|
||
|
||
# 各分类的数据源目录
|
||
ROOTS = {
|
||
'PIN': ['2-伸缩销', '2019 Math Data 铁臂', '2019-NEW product', '2020UNICLAMP数模汇总'],
|
||
'HOK': ['3-勾销缸'],
|
||
'ROT': ['4-翻转缸'],
|
||
'GRP': ['5-夹臂', 'GR8_REV02'],
|
||
'ELEC': ['1-夹紧缸/电缸'],
|
||
}
|
||
|
||
# 关注的系列前缀(新码 UL* / US* / UAGP / UGP / LAE)
|
||
FOCUS = re.compile(r'^(UL[A-Z]|US[A-Z]?|UAGP|UGP|LAE|LAGP|UAG)')
|
||
|
||
|
||
def scan(dirs):
|
||
found = collections.defaultdict(list)
|
||
for d in dirs:
|
||
root = os.path.join(BASE, d)
|
||
if not os.path.isdir(root):
|
||
continue
|
||
for dirpath, _, files in os.walk(root):
|
||
for f in files:
|
||
if f.lower().endswith(('.stp', '.step')):
|
||
found[f].append(os.path.join(dirpath, f))
|
||
return found
|
||
|
||
|
||
def main():
|
||
for cat, dirs in ROOTS.items():
|
||
print(f'\n{"="*70}\n### {cat} (源: {", ".join(dirs)})\n{"="*70}')
|
||
files = scan(dirs)
|
||
buckets = collections.defaultdict(set)
|
||
for fname in files:
|
||
stem = os.path.splitext(fname)[0].upper().strip()
|
||
m = FOCUS.match(stem)
|
||
if not m:
|
||
continue
|
||
pfx = m.group(1)
|
||
buckets[pfx].add(stem)
|
||
for pfx in sorted(buckets):
|
||
names = sorted(buckets[pfx])
|
||
print(f'\n -- {pfx} ({len(names)} 个)')
|
||
for n in names[:200]:
|
||
print(f' {n}')
|
||
if len(names) > 200:
|
||
print(f' ... 还有 {len(names)-200} 个')
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|