首次提交: OnebotCatalog 项目代码与文档(含 NX 按需生成服务二期、后台、一键启动)
This commit is contained in:
1
onebot-data/catalog/catalog.json
Normal file
1
onebot-data/catalog/catalog.json
Normal file
@@ -0,0 +1 @@
|
||||
{"schemaVersion":"1.0","genApi":"","catalogName":"ONEBOT 气动元件目录","catalogNameEn":"ONEBOT Pneumatic Catalog","catalogVersion":"2026.08","defaultLang":"zh","langs":["zh","en"],"categories":[{"code":"AUT","nameZh":"汽车行业气缸 Automotive","nameEn":"Automotive Cylinders","keywords":"","series":["KC","KCB","KSB","KCS","KS","KSU"]},{"code":"MIN","nameZh":"不锈钢迷你缸 (ISO6432)","nameEn":"Stainless Mini Cylinders (ISO6432)","keywords":"","series":["M","MS","MSC"]},{"code":"ALU","nameZh":"铝合金迷你缸","nameEn":"Aluminium Mini Cylinders","keywords":"","series":["MAL","MALC"]},{"code":"CLM","nameZh":"气动夹紧缸","nameEn":"Pneumatic Clamping Cylinders","keywords":"","series":["UCBM"]},{"code":"PIN","nameZh":"气动可伸缩定位销","nameEn":"Pneumatic Retractable Locating Pins","keywords":"","series":["ULP"]},{"code":"HOK","nameZh":"气动勾销缸","nameEn":"Pneumatic Pin Clamp Cylinders","keywords":"","series":["USP"]},{"code":"GRP","nameZh":"气动夹爪缸","nameEn":"Pneumatic Gripper Cylinders","keywords":"","series":["UGP"]},{"code":"ROT","nameZh":"气动翻转缸","nameEn":"Pneumatic Flip Cylinders","keywords":"","series":["UAGP"]},{"code":"ELEC","nameZh":"电动气缸","nameEn":"Electric Cylinders","keywords":"","series":["LAE"]}],"series":[]}
|
||||
504
onebot-data/catalog/crossref.csv
Normal file
504
onebot-data/catalog/crossref.csv
Normal file
@@ -0,0 +1,504 @@
|
||||
brand,foreign_model,our_model,note
|
||||
JELPC,SQ32-100,KCS0032-100,基础型平替(待核对)
|
||||
JELPC,SQ32-10,KCS0032-10,基础型平替(待核对)
|
||||
JELPC,SQ32-50,KCS0032-50,基础型平替(待核对)
|
||||
SMC,SQ32-50,KCS0032-50,基础型平替(待核对)
|
||||
AIRTAC,JSCK50XXXXAM1CHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK50XXXXAM3CHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK50XXXXAM3LHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK50XXXXAM3RHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK63XXXXAM1CHL,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK63XXXXAM1CHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK63XXXXAM3CHL,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK63XXXXAM3CHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCK63XXXXAM3LHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV50XXXXAM1CHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV50XXXXAM3CHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV50XXXXAM3LHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV50XXXXAM3RHLK,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM1CHL,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM1CHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM3CHL,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM3CHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM3LHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSCKV63XXXXAM3RHLK,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM1CKNXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM1CKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM1LKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM1RKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM3CKNXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM3CKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM3LKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK40AM3RKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM1CKNXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM1CKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM1LKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM1RKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM3CKNXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM3CKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM3LKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK50AM3RKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM1CKNXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM1CKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM1CXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM1LKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM1RKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3CKNXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3CKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3CXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3LKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3LXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3RKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK63AM3RXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK80AM3CKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK80AM3LKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSK80AM3RKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM1CKNXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM1CKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM1LKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM1RKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM3CKNXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM3CKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM3LKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV40AM3RKXXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM1CKNXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM1LKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM1RKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM3CKNXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM3CKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM3LKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV50AM3RKXXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM1CKNXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM1CKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM1CXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM1LKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM1RKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3CKNXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3CKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3CXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3LKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3LXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3RKXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV63AM3RXXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV80AM3CKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV80AM3LKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
AIRTAC,JSKV80AM3RKXXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8ULR45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8ULS45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8UMR45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8UMS45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8URR45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-3E230080L8URS45-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8ULR15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8ULR45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8ULS15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8ULS45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8UMR15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8UMR45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8UMS15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8UMS45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8URR15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8URR45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8URS15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040L8URS45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040N8UMR15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040N8UMR45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040N8UMS15-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030040N8UMS45-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8ULR15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8ULR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8ULS15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8ULS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8UMR15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8UMR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8UMS15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8UMS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8URR15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8URR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8URS15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050L8URS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050N8UMR15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050N8UMR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050N8UMS15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030050N8UMS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300ULR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300ULS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300UMR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300UMR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300UMS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300UMS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300URR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03006300URS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8ULR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8ULR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8ULS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8ULS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8UMR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8UMR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8UMS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8UMS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8URR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8URR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8URS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063L8URS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063N8UMR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063N8UMR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063N8UMS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C030063N8UMS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8ULR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8ULS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8UMR15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8UMR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8UMS15-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8UMS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8URR45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H050L8URS45-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H06300UMR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H06300UMR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H06300UMS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H06300UMS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8ULR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8ULS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8UMR15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8UMR45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8UMS15-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8UMS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,82M-4C03H063L8URS45-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DESTACO,DUP80**,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
DESTACO,UPU80**,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA10S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA10S14GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA11S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA12S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA50S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA50S14GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA51S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40HA52S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA10S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA10S14GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA11S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA12S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA50S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA50S14GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA51S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC40VA52S12GXXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA10S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA10S14GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA11S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA12S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA40S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA40S14GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA41S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50HA42S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA10S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA10S14GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA11S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA12S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA40S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA40S14GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA41S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC50VA42S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA10S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA10S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA10S14GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA11S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA12S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA40S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA40S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA40S14GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA41S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA41S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA42S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63HA42S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA10S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA10S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA10S14GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA11S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA12S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA40S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA40S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA40S14GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA41S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA41S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA42S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC63VA42S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80HA40S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80HA41S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80HA42S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80VA40S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80VA41S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DC80VA42S12GXXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50HA10S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50HA40S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50HA41S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50HA42S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50VA10S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50VA40S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50VA41S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM50VA42S12GXXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63HA10S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63HA10S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63HA40S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63HA40S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63HA42S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA10S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA10S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA40S00GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA40S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA41S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DCM63VA42S12GXXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DF80HA01KLBS12GXXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
DOTRAN,DF80VA03KLBS12GXXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
HITOP,AKF80-VE01W12-XXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
HITOP,AKFK80-VE02W12-XXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH50-L02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH50-R02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH50-Z01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH50-Z02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH63-L02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH63-Z01W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH63-Z01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH63-Z02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUH63-Z02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV50-L02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV50-R02W12-105,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV50-Z01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV50-Z02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-L02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-R02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-Z01W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-Z01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-Z02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUHV63-Z02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-L01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-L02W12-105,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-R01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-R02W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-Z01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-Z01W12N-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-Z02W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS40-Z02W12N-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-L01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-L02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-R01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-R02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-Z01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-Z01W12N-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-Z02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS50-Z02W12N-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-L01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-L02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-L02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-R01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-R02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-R02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z01W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z01W12N-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS63-Z02W12N-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS80-L02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS80-R02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUS80-Z02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-L01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-L05W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-R01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-R05W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-Z01W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-Z01W12N-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-Z05W12-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV40-Z05W12N-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-L01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-L02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-R01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-R02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-Z01W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-Z01W12N-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-Z02W12-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV50-Z02W12N-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-L01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-L02W00-105,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-L02W12-105,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-R01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-R02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-R02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z01W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z01W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z01W12N-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z02W00-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z02W12-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV63-Z02W12N-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV80-L02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV80-R02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
HITOP,AKUSV80-Z02W12-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T40-XXXT+CKZT40-A045LS,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT+CKZT50-A045CS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT+CKZT50-A045LS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT+CKZT50-A045RS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT-X2568L+CKZT50-A045CS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT-X2568L+CKZT50-A045LS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T50-XXXT-X2568L+CKZT50-A045RS,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT+CKZT63-A045CS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT+CKZT63-A045LS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT+CKZT63-A045RS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT-X2568L+CKZT63-A045CS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT-X2568L+CKZT63-A045LS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXT-X2568L+CKZT63-A045RS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXW+CKZT63-A045CS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXW+CKZT63-A045LS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXW+CKZT63-A045RS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T63-XXXW-X2568L+CKZT63-A045CS,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
SMC,CKZ5T80-XXXT+CKZT80-A045LS,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,KS 80.6 SG A01 LH T12 XXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
TUENKERS,KS2 80.6 SG A03 LH T12 XXX,UAGP080_W,"德系对照表: 翻转气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A10 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A10 T12N XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A11 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A12 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A50 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A50 T12N XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A51 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 40 BR2 A52 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR2 Z A10 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR2 Z A40 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR2 Z A41 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR2 Z A42 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A10 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A10 T12N XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A11 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A12 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A40 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A40 T12N XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A41 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 50.1 BR3 A42 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR2 Z A10 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR2 Z A10 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR2 Z A40 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR2 Z A40 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR2 Z A42 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A10 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A10 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A10 T12N XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A11 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A12 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A40 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A40 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A40 T12N XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A41 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A41 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A42 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 63.1 BR3 A42 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 80.1 BR2 A40 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 80.1 BR2 A41 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V 80.1 BR2 A42 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A10 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A10 T12N XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A11 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A12 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A50 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A50 T12N XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A51 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 40 BR2 A52 T12 XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR2 Z A10 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR2 Z A40 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR2 Z A41 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR2 Z A42 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A10 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A10 T12N XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A11 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A12 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A40 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A40 T12N XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A41 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 50.1 BR3 A42 T12 XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A10 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A10 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A40 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A40 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A41 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR2 Z A42 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A10 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A10 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A10 T12N XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A11 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A12 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A40 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A40 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A40 T12N XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A41 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A41 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A42 T00 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 63.1 BR3 A42 T12 XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 80.1 BR2 A40 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 80.1 BR2 A41 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
TUENKERS,V2 80.1 BR2 A42 T12 XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50OCSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50OESKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50OFSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50OLSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50VCSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50VESKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50VFSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM50VLSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OCSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OCSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OESKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OESNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OFSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63OLSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63VCSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63VCSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63VESKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63VESNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBM63VLSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40OCSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40ODSK0--XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40OESK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40OFSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40OLSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40OSSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VCSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VDSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VESK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VFSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VLSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP40VSSK0-XXX,UCBM40,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50OCSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50ODSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50OESKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50OFSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50OLSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50OSSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VCSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VDSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VESKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VFSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VLSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP50VSSKO-XXX,UCBM50,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OCSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OCSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63ODSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OESKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OESNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OFSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OFSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OLSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OLSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63OSSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VCSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VCSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VDSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VESKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VESNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VFSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VFSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VLSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VLSNO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP63VSSKO-XXX,UCBM63,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80OESKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80OFSKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80OLSKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80VESKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80VFSKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
UNIVER,UCBP80VLSKO-XXX,UCBM80,"德系对照表: 夹紧气缸 (自动映射, 待核对)"
|
||||
|
5
onebot-data/catalog/crossref.csv.bak_20260825_131113
Normal file
5
onebot-data/catalog/crossref.csv.bak_20260825_131113
Normal file
@@ -0,0 +1,5 @@
|
||||
brand,foreign_model,our_model,note
|
||||
JELPC,SQ32-100,KCS0032-100,基础型平替(待核对)
|
||||
JELPC,SQ32-10,KCS0032-10,基础型平替(待核对)
|
||||
JELPC,SQ32-50,KCS0032-50,基础型平替(待核对)
|
||||
SMC,SQ32-50,KCS0032-50,基础型平替(待核对)
|
||||
2629
onebot-data/catalog/csv/KC.csv
Normal file
2629
onebot-data/catalog/csv/KC.csv
Normal file
File diff suppressed because it is too large
Load Diff
589
onebot-data/catalog/csv/KCB.csv
Normal file
589
onebot-data/catalog/csv/KCB.csv
Normal file
@@ -0,0 +1,589 @@
|
||||
model_code,bore,stroke,magnet,mount,step_file
|
||||
KCB32-10,32,10,,,KCB--32x10.step
|
||||
KCB32-10FA,32,10,,FA,KCB--32x10.step
|
||||
KCB32-10FB,32,10,,FB,KCB--32x10.step
|
||||
KCB32-10CA,32,10,,CA,KCB--32x10.step
|
||||
KCB32-10CB,32,10,,CB,KCB--32x10.step
|
||||
KCB32-10LB,32,10,,LB,KCB--32x10.step
|
||||
KCB32-10YB,32,10,,YB,KCB--32x10.step
|
||||
KCB32-10M,32,10,M,,KCB--32x10.step
|
||||
KCB32-10MFA,32,10,M,FA,KCB--32x10.step
|
||||
KCB32-10MFB,32,10,M,FB,KCB--32x10.step
|
||||
KCB32-10MCA,32,10,M,CA,KCB--32x10.step
|
||||
KCB32-10MCB,32,10,M,CB,KCB--32x10.step
|
||||
KCB32-10MLB,32,10,M,LB,KCB--32x10.step
|
||||
KCB32-10MYB,32,10,M,YB,KCB--32x10.step
|
||||
KCB32-20,32,20,,,KCB--32x20.step
|
||||
KCB32-20FA,32,20,,FA,KCB--32x20.step
|
||||
KCB32-20FB,32,20,,FB,KCB--32x20.step
|
||||
KCB32-20CA,32,20,,CA,KCB--32x20.step
|
||||
KCB32-20CB,32,20,,CB,KCB--32x20.step
|
||||
KCB32-20LB,32,20,,LB,KCB--32x20.step
|
||||
KCB32-20YB,32,20,,YB,KCB--32x20.step
|
||||
KCB32-20M,32,20,M,,KCB--32x20.step
|
||||
KCB32-20MFA,32,20,M,FA,KCB--32x20.step
|
||||
KCB32-20MFB,32,20,M,FB,KCB--32x20.step
|
||||
KCB32-20MCA,32,20,M,CA,KCB--32x20.step
|
||||
KCB32-20MCB,32,20,M,CB,KCB--32x20.step
|
||||
KCB32-20MLB,32,20,M,LB,KCB--32x20.step
|
||||
KCB32-20MYB,32,20,M,YB,KCB--32x20.step
|
||||
KCB32-30,32,30,,,KCB--32x30.step
|
||||
KCB32-30FA,32,30,,FA,KCB--32x30.step
|
||||
KCB32-30FB,32,30,,FB,KCB--32x30.step
|
||||
KCB32-30CA,32,30,,CA,KCB--32x30.step
|
||||
KCB32-30CB,32,30,,CB,KCB--32x30.step
|
||||
KCB32-30LB,32,30,,LB,KCB--32x30.step
|
||||
KCB32-30YB,32,30,,YB,KCB--32x30.step
|
||||
KCB32-30M,32,30,M,,KCB--32x30.step
|
||||
KCB32-30MFA,32,30,M,FA,KCB--32x30.step
|
||||
KCB32-30MFB,32,30,M,FB,KCB--32x30.step
|
||||
KCB32-30MCA,32,30,M,CA,KCB--32x30.step
|
||||
KCB32-30MCB,32,30,M,CB,KCB--32x30.step
|
||||
KCB32-30MLB,32,30,M,LB,KCB--32x30.step
|
||||
KCB32-30MYB,32,30,M,YB,KCB--32x30.step
|
||||
KCB32-50,32,50,,,KCB--32x50.step
|
||||
KCB32-50FA,32,50,,FA,KCB--32x50.step
|
||||
KCB32-50FB,32,50,,FB,KCB--32x50.step
|
||||
KCB32-50CA,32,50,,CA,KCB--32x50.step
|
||||
KCB32-50CB,32,50,,CB,KCB--32x50.step
|
||||
KCB32-50LB,32,50,,LB,KCB--32x50.step
|
||||
KCB32-50YB,32,50,,YB,KCB--32x50.step
|
||||
KCB32-50M,32,50,M,,KCB--32x50.step
|
||||
KCB32-50MFA,32,50,M,FA,KCB--32x50.step
|
||||
KCB32-50MFB,32,50,M,FB,KCB--32x50.step
|
||||
KCB32-50MCA,32,50,M,CA,KCB--32x50.step
|
||||
KCB32-50MCB,32,50,M,CB,KCB--32x50.step
|
||||
KCB32-50MLB,32,50,M,LB,KCB--32x50.step
|
||||
KCB32-50MYB,32,50,M,YB,KCB--32x50.step
|
||||
KCB32-75,32,75,,,KCB--32x75.step
|
||||
KCB32-75FA,32,75,,FA,KCB--32x75.step
|
||||
KCB32-75FB,32,75,,FB,KCB--32x75.step
|
||||
KCB32-75CA,32,75,,CA,KCB--32x75.step
|
||||
KCB32-75CB,32,75,,CB,KCB--32x75.step
|
||||
KCB32-75LB,32,75,,LB,KCB--32x75.step
|
||||
KCB32-75YB,32,75,,YB,KCB--32x75.step
|
||||
KCB32-75M,32,75,M,,KCB--32x75.step
|
||||
KCB32-75MFA,32,75,M,FA,KCB--32x75.step
|
||||
KCB32-75MFB,32,75,M,FB,KCB--32x75.step
|
||||
KCB32-75MCA,32,75,M,CA,KCB--32x75.step
|
||||
KCB32-75MCB,32,75,M,CB,KCB--32x75.step
|
||||
KCB32-75MLB,32,75,M,LB,KCB--32x75.step
|
||||
KCB32-75MYB,32,75,M,YB,KCB--32x75.step
|
||||
KCB32-100,32,100,,,KCB--32x100.step
|
||||
KCB32-100FA,32,100,,FA,KCB--32x100.step
|
||||
KCB32-100FB,32,100,,FB,KCB--32x100.step
|
||||
KCB32-100CA,32,100,,CA,KCB--32x100.step
|
||||
KCB32-100CB,32,100,,CB,KCB--32x100.step
|
||||
KCB32-100LB,32,100,,LB,KCB--32x100.step
|
||||
KCB32-100YB,32,100,,YB,KCB--32x100.step
|
||||
KCB32-100M,32,100,M,,KCB--32x100.step
|
||||
KCB32-100MFA,32,100,M,FA,KCB--32x100.step
|
||||
KCB32-100MFB,32,100,M,FB,KCB--32x100.step
|
||||
KCB32-100MCA,32,100,M,CA,KCB--32x100.step
|
||||
KCB32-100MCB,32,100,M,CB,KCB--32x100.step
|
||||
KCB32-100MLB,32,100,M,LB,KCB--32x100.step
|
||||
KCB32-100MYB,32,100,M,YB,KCB--32x100.step
|
||||
KCB40-10,40,10,,,KCB--40x10.step
|
||||
KCB40-10FA,40,10,,FA,KCB--40x10.step
|
||||
KCB40-10FB,40,10,,FB,KCB--40x10.step
|
||||
KCB40-10CA,40,10,,CA,KCB--40x10.step
|
||||
KCB40-10CB,40,10,,CB,KCB--40x10.step
|
||||
KCB40-10LB,40,10,,LB,KCB--40x10.step
|
||||
KCB40-10YB,40,10,,YB,KCB--40x10.step
|
||||
KCB40-10M,40,10,M,,KCB--40x10.step
|
||||
KCB40-10MFA,40,10,M,FA,KCB--40x10.step
|
||||
KCB40-10MFB,40,10,M,FB,KCB--40x10.step
|
||||
KCB40-10MCA,40,10,M,CA,KCB--40x10.step
|
||||
KCB40-10MCB,40,10,M,CB,KCB--40x10.step
|
||||
KCB40-10MLB,40,10,M,LB,KCB--40x10.step
|
||||
KCB40-10MYB,40,10,M,YB,KCB--40x10.step
|
||||
KCB40-20,40,20,,,KCB--40x20.step
|
||||
KCB40-20FA,40,20,,FA,KCB--40x20.step
|
||||
KCB40-20FB,40,20,,FB,KCB--40x20.step
|
||||
KCB40-20CA,40,20,,CA,KCB--40x20.step
|
||||
KCB40-20CB,40,20,,CB,KCB--40x20.step
|
||||
KCB40-20LB,40,20,,LB,KCB--40x20.step
|
||||
KCB40-20YB,40,20,,YB,KCB--40x20.step
|
||||
KCB40-20M,40,20,M,,KCB--40x20.step
|
||||
KCB40-20MFA,40,20,M,FA,KCB--40x20.step
|
||||
KCB40-20MFB,40,20,M,FB,KCB--40x20.step
|
||||
KCB40-20MCA,40,20,M,CA,KCB--40x20.step
|
||||
KCB40-20MCB,40,20,M,CB,KCB--40x20.step
|
||||
KCB40-20MLB,40,20,M,LB,KCB--40x20.step
|
||||
KCB40-20MYB,40,20,M,YB,KCB--40x20.step
|
||||
KCB40-30,40,30,,,KCB--40x30.step
|
||||
KCB40-30FA,40,30,,FA,KCB--40x30.step
|
||||
KCB40-30FB,40,30,,FB,KCB--40x30.step
|
||||
KCB40-30CA,40,30,,CA,KCB--40x30.step
|
||||
KCB40-30CB,40,30,,CB,KCB--40x30.step
|
||||
KCB40-30LB,40,30,,LB,KCB--40x30.step
|
||||
KCB40-30YB,40,30,,YB,KCB--40x30.step
|
||||
KCB40-30M,40,30,M,,KCB--40x30.step
|
||||
KCB40-30MFA,40,30,M,FA,KCB--40x30.step
|
||||
KCB40-30MFB,40,30,M,FB,KCB--40x30.step
|
||||
KCB40-30MCA,40,30,M,CA,KCB--40x30.step
|
||||
KCB40-30MCB,40,30,M,CB,KCB--40x30.step
|
||||
KCB40-30MLB,40,30,M,LB,KCB--40x30.step
|
||||
KCB40-30MYB,40,30,M,YB,KCB--40x30.step
|
||||
KCB40-50,40,50,,,KCB--40x50.step
|
||||
KCB40-50FA,40,50,,FA,KCB--40x50.step
|
||||
KCB40-50FB,40,50,,FB,KCB--40x50.step
|
||||
KCB40-50CA,40,50,,CA,KCB--40x50.step
|
||||
KCB40-50CB,40,50,,CB,KCB--40x50.step
|
||||
KCB40-50LB,40,50,,LB,KCB--40x50.step
|
||||
KCB40-50YB,40,50,,YB,KCB--40x50.step
|
||||
KCB40-50M,40,50,M,,KCB--40x50.step
|
||||
KCB40-50MFA,40,50,M,FA,KCB--40x50.step
|
||||
KCB40-50MFB,40,50,M,FB,KCB--40x50.step
|
||||
KCB40-50MCA,40,50,M,CA,KCB--40x50.step
|
||||
KCB40-50MCB,40,50,M,CB,KCB--40x50.step
|
||||
KCB40-50MLB,40,50,M,LB,KCB--40x50.step
|
||||
KCB40-50MYB,40,50,M,YB,KCB--40x50.step
|
||||
KCB40-75,40,75,,,KCB--40x75.step
|
||||
KCB40-75FA,40,75,,FA,KCB--40x75.step
|
||||
KCB40-75FB,40,75,,FB,KCB--40x75.step
|
||||
KCB40-75CA,40,75,,CA,KCB--40x75.step
|
||||
KCB40-75CB,40,75,,CB,KCB--40x75.step
|
||||
KCB40-75LB,40,75,,LB,KCB--40x75.step
|
||||
KCB40-75YB,40,75,,YB,KCB--40x75.step
|
||||
KCB40-75M,40,75,M,,KCB--40x75.step
|
||||
KCB40-75MFA,40,75,M,FA,KCB--40x75.step
|
||||
KCB40-75MFB,40,75,M,FB,KCB--40x75.step
|
||||
KCB40-75MCA,40,75,M,CA,KCB--40x75.step
|
||||
KCB40-75MCB,40,75,M,CB,KCB--40x75.step
|
||||
KCB40-75MLB,40,75,M,LB,KCB--40x75.step
|
||||
KCB40-75MYB,40,75,M,YB,KCB--40x75.step
|
||||
KCB40-100,40,100,,,KCB--40x100.step
|
||||
KCB40-100FA,40,100,,FA,KCB--40x100.step
|
||||
KCB40-100FB,40,100,,FB,KCB--40x100.step
|
||||
KCB40-100CA,40,100,,CA,KCB--40x100.step
|
||||
KCB40-100CB,40,100,,CB,KCB--40x100.step
|
||||
KCB40-100LB,40,100,,LB,KCB--40x100.step
|
||||
KCB40-100YB,40,100,,YB,KCB--40x100.step
|
||||
KCB40-100M,40,100,M,,KCB--40x100.step
|
||||
KCB40-100MFA,40,100,M,FA,KCB--40x100.step
|
||||
KCB40-100MFB,40,100,M,FB,KCB--40x100.step
|
||||
KCB40-100MCA,40,100,M,CA,KCB--40x100.step
|
||||
KCB40-100MCB,40,100,M,CB,KCB--40x100.step
|
||||
KCB40-100MLB,40,100,M,LB,KCB--40x100.step
|
||||
KCB40-100MYB,40,100,M,YB,KCB--40x100.step
|
||||
KCB50-10,50,10,,,KCB--50x10.step
|
||||
KCB50-10FA,50,10,,FA,KCB--50x10.step
|
||||
KCB50-10FB,50,10,,FB,KCB--50x10.step
|
||||
KCB50-10CA,50,10,,CA,KCB--50x10.step
|
||||
KCB50-10CB,50,10,,CB,KCB--50x10.step
|
||||
KCB50-10LB,50,10,,LB,KCB--50x10.step
|
||||
KCB50-10YB,50,10,,YB,KCB--50x10.step
|
||||
KCB50-10M,50,10,M,,KCB--50x10.step
|
||||
KCB50-10MFA,50,10,M,FA,KCB--50x10.step
|
||||
KCB50-10MFB,50,10,M,FB,KCB--50x10.step
|
||||
KCB50-10MCA,50,10,M,CA,KCB--50x10.step
|
||||
KCB50-10MCB,50,10,M,CB,KCB--50x10.step
|
||||
KCB50-10MLB,50,10,M,LB,KCB--50x10.step
|
||||
KCB50-10MYB,50,10,M,YB,KCB--50x10.step
|
||||
KCB50-20,50,20,,,KCB--50x20.step
|
||||
KCB50-20FA,50,20,,FA,KCB--50x20.step
|
||||
KCB50-20FB,50,20,,FB,KCB--50x20.step
|
||||
KCB50-20CA,50,20,,CA,KCB--50x20.step
|
||||
KCB50-20CB,50,20,,CB,KCB--50x20.step
|
||||
KCB50-20LB,50,20,,LB,KCB--50x20.step
|
||||
KCB50-20YB,50,20,,YB,KCB--50x20.step
|
||||
KCB50-20M,50,20,M,,KCB--50x20.step
|
||||
KCB50-20MFA,50,20,M,FA,KCB--50x20.step
|
||||
KCB50-20MFB,50,20,M,FB,KCB--50x20.step
|
||||
KCB50-20MCA,50,20,M,CA,KCB--50x20.step
|
||||
KCB50-20MCB,50,20,M,CB,KCB--50x20.step
|
||||
KCB50-20MLB,50,20,M,LB,KCB--50x20.step
|
||||
KCB50-20MYB,50,20,M,YB,KCB--50x20.step
|
||||
KCB50-30,50,30,,,KCB--50x30.step
|
||||
KCB50-30FA,50,30,,FA,KCB--50x30.step
|
||||
KCB50-30FB,50,30,,FB,KCB--50x30.step
|
||||
KCB50-30CA,50,30,,CA,KCB--50x30.step
|
||||
KCB50-30CB,50,30,,CB,KCB--50x30.step
|
||||
KCB50-30LB,50,30,,LB,KCB--50x30.step
|
||||
KCB50-30YB,50,30,,YB,KCB--50x30.step
|
||||
KCB50-30M,50,30,M,,KCB--50x30.step
|
||||
KCB50-30MFA,50,30,M,FA,KCB--50x30.step
|
||||
KCB50-30MFB,50,30,M,FB,KCB--50x30.step
|
||||
KCB50-30MCA,50,30,M,CA,KCB--50x30.step
|
||||
KCB50-30MCB,50,30,M,CB,KCB--50x30.step
|
||||
KCB50-30MLB,50,30,M,LB,KCB--50x30.step
|
||||
KCB50-30MYB,50,30,M,YB,KCB--50x30.step
|
||||
KCB50-50,50,50,,,KCB--50x50.step
|
||||
KCB50-50FA,50,50,,FA,KCB--50x50.step
|
||||
KCB50-50FB,50,50,,FB,KCB--50x50.step
|
||||
KCB50-50CA,50,50,,CA,KCB--50x50.step
|
||||
KCB50-50CB,50,50,,CB,KCB--50x50.step
|
||||
KCB50-50LB,50,50,,LB,KCB--50x50.step
|
||||
KCB50-50YB,50,50,,YB,KCB--50x50.step
|
||||
KCB50-50M,50,50,M,,KCB--50x50.step
|
||||
KCB50-50MFA,50,50,M,FA,KCB--50x50.step
|
||||
KCB50-50MFB,50,50,M,FB,KCB--50x50.step
|
||||
KCB50-50MCA,50,50,M,CA,KCB--50x50.step
|
||||
KCB50-50MCB,50,50,M,CB,KCB--50x50.step
|
||||
KCB50-50MLB,50,50,M,LB,KCB--50x50.step
|
||||
KCB50-50MYB,50,50,M,YB,KCB--50x50.step
|
||||
KCB50-75,50,75,,,KCB--50x75.step
|
||||
KCB50-75FA,50,75,,FA,KCB--50x75.step
|
||||
KCB50-75FB,50,75,,FB,KCB--50x75.step
|
||||
KCB50-75CA,50,75,,CA,KCB--50x75.step
|
||||
KCB50-75CB,50,75,,CB,KCB--50x75.step
|
||||
KCB50-75LB,50,75,,LB,KCB--50x75.step
|
||||
KCB50-75YB,50,75,,YB,KCB--50x75.step
|
||||
KCB50-75M,50,75,M,,KCB--50x75.step
|
||||
KCB50-75MFA,50,75,M,FA,KCB--50x75.step
|
||||
KCB50-75MFB,50,75,M,FB,KCB--50x75.step
|
||||
KCB50-75MCA,50,75,M,CA,KCB--50x75.step
|
||||
KCB50-75MCB,50,75,M,CB,KCB--50x75.step
|
||||
KCB50-75MLB,50,75,M,LB,KCB--50x75.step
|
||||
KCB50-75MYB,50,75,M,YB,KCB--50x75.step
|
||||
KCB50-100,50,100,,,KCB--50x100.step
|
||||
KCB50-100FA,50,100,,FA,KCB--50x100.step
|
||||
KCB50-100FB,50,100,,FB,KCB--50x100.step
|
||||
KCB50-100CA,50,100,,CA,KCB--50x100.step
|
||||
KCB50-100CB,50,100,,CB,KCB--50x100.step
|
||||
KCB50-100LB,50,100,,LB,KCB--50x100.step
|
||||
KCB50-100YB,50,100,,YB,KCB--50x100.step
|
||||
KCB50-100M,50,100,M,,KCB--50x100.step
|
||||
KCB50-100MFA,50,100,M,FA,KCB--50x100.step
|
||||
KCB50-100MFB,50,100,M,FB,KCB--50x100.step
|
||||
KCB50-100MCA,50,100,M,CA,KCB--50x100.step
|
||||
KCB50-100MCB,50,100,M,CB,KCB--50x100.step
|
||||
KCB50-100MLB,50,100,M,LB,KCB--50x100.step
|
||||
KCB50-100MYB,50,100,M,YB,KCB--50x100.step
|
||||
KCB63-10,63,10,,,KCB--63x10.step
|
||||
KCB63-10FA,63,10,,FA,KCB--63x10.step
|
||||
KCB63-10FB,63,10,,FB,KCB--63x10.step
|
||||
KCB63-10CA,63,10,,CA,KCB--63x10.step
|
||||
KCB63-10CB,63,10,,CB,KCB--63x10.step
|
||||
KCB63-10LB,63,10,,LB,KCB--63x10.step
|
||||
KCB63-10YB,63,10,,YB,KCB--63x10.step
|
||||
KCB63-10M,63,10,M,,KCB--63x10.step
|
||||
KCB63-10MFA,63,10,M,FA,KCB--63x10.step
|
||||
KCB63-10MFB,63,10,M,FB,KCB--63x10.step
|
||||
KCB63-10MCA,63,10,M,CA,KCB--63x10.step
|
||||
KCB63-10MCB,63,10,M,CB,KCB--63x10.step
|
||||
KCB63-10MLB,63,10,M,LB,KCB--63x10.step
|
||||
KCB63-10MYB,63,10,M,YB,KCB--63x10.step
|
||||
KCB63-20,63,20,,,KCB--63x20.step
|
||||
KCB63-20FA,63,20,,FA,KCB--63x20.step
|
||||
KCB63-20FB,63,20,,FB,KCB--63x20.step
|
||||
KCB63-20CA,63,20,,CA,KCB--63x20.step
|
||||
KCB63-20CB,63,20,,CB,KCB--63x20.step
|
||||
KCB63-20LB,63,20,,LB,KCB--63x20.step
|
||||
KCB63-20YB,63,20,,YB,KCB--63x20.step
|
||||
KCB63-20M,63,20,M,,KCB--63x20.step
|
||||
KCB63-20MFA,63,20,M,FA,KCB--63x20.step
|
||||
KCB63-20MFB,63,20,M,FB,KCB--63x20.step
|
||||
KCB63-20MCA,63,20,M,CA,KCB--63x20.step
|
||||
KCB63-20MCB,63,20,M,CB,KCB--63x20.step
|
||||
KCB63-20MLB,63,20,M,LB,KCB--63x20.step
|
||||
KCB63-20MYB,63,20,M,YB,KCB--63x20.step
|
||||
KCB63-30,63,30,,,KCB--63x30.step
|
||||
KCB63-30FA,63,30,,FA,KCB--63x30.step
|
||||
KCB63-30FB,63,30,,FB,KCB--63x30.step
|
||||
KCB63-30CA,63,30,,CA,KCB--63x30.step
|
||||
KCB63-30CB,63,30,,CB,KCB--63x30.step
|
||||
KCB63-30LB,63,30,,LB,KCB--63x30.step
|
||||
KCB63-30YB,63,30,,YB,KCB--63x30.step
|
||||
KCB63-30M,63,30,M,,KCB--63x30.step
|
||||
KCB63-30MFA,63,30,M,FA,KCB--63x30.step
|
||||
KCB63-30MFB,63,30,M,FB,KCB--63x30.step
|
||||
KCB63-30MCA,63,30,M,CA,KCB--63x30.step
|
||||
KCB63-30MCB,63,30,M,CB,KCB--63x30.step
|
||||
KCB63-30MLB,63,30,M,LB,KCB--63x30.step
|
||||
KCB63-30MYB,63,30,M,YB,KCB--63x30.step
|
||||
KCB63-50,63,50,,,KCB--63x50.step
|
||||
KCB63-50FA,63,50,,FA,KCB--63x50.step
|
||||
KCB63-50FB,63,50,,FB,KCB--63x50.step
|
||||
KCB63-50CA,63,50,,CA,KCB--63x50.step
|
||||
KCB63-50CB,63,50,,CB,KCB--63x50.step
|
||||
KCB63-50LB,63,50,,LB,KCB--63x50.step
|
||||
KCB63-50YB,63,50,,YB,KCB--63x50.step
|
||||
KCB63-50M,63,50,M,,KCB--63x50.step
|
||||
KCB63-50MFA,63,50,M,FA,KCB--63x50.step
|
||||
KCB63-50MFB,63,50,M,FB,KCB--63x50.step
|
||||
KCB63-50MCA,63,50,M,CA,KCB--63x50.step
|
||||
KCB63-50MCB,63,50,M,CB,KCB--63x50.step
|
||||
KCB63-50MLB,63,50,M,LB,KCB--63x50.step
|
||||
KCB63-50MYB,63,50,M,YB,KCB--63x50.step
|
||||
KCB63-75,63,75,,,KCB--63x75.step
|
||||
KCB63-75FA,63,75,,FA,KCB--63x75.step
|
||||
KCB63-75FB,63,75,,FB,KCB--63x75.step
|
||||
KCB63-75CA,63,75,,CA,KCB--63x75.step
|
||||
KCB63-75CB,63,75,,CB,KCB--63x75.step
|
||||
KCB63-75LB,63,75,,LB,KCB--63x75.step
|
||||
KCB63-75YB,63,75,,YB,KCB--63x75.step
|
||||
KCB63-75M,63,75,M,,KCB--63x75.step
|
||||
KCB63-75MFA,63,75,M,FA,KCB--63x75.step
|
||||
KCB63-75MFB,63,75,M,FB,KCB--63x75.step
|
||||
KCB63-75MCA,63,75,M,CA,KCB--63x75.step
|
||||
KCB63-75MCB,63,75,M,CB,KCB--63x75.step
|
||||
KCB63-75MLB,63,75,M,LB,KCB--63x75.step
|
||||
KCB63-75MYB,63,75,M,YB,KCB--63x75.step
|
||||
KCB63-100,63,100,,,KCB--63x100.step
|
||||
KCB63-100FA,63,100,,FA,KCB--63x100.step
|
||||
KCB63-100FB,63,100,,FB,KCB--63x100.step
|
||||
KCB63-100CA,63,100,,CA,KCB--63x100.step
|
||||
KCB63-100CB,63,100,,CB,KCB--63x100.step
|
||||
KCB63-100LB,63,100,,LB,KCB--63x100.step
|
||||
KCB63-100YB,63,100,,YB,KCB--63x100.step
|
||||
KCB63-100M,63,100,M,,KCB--63x100.step
|
||||
KCB63-100MFA,63,100,M,FA,KCB--63x100.step
|
||||
KCB63-100MFB,63,100,M,FB,KCB--63x100.step
|
||||
KCB63-100MCA,63,100,M,CA,KCB--63x100.step
|
||||
KCB63-100MCB,63,100,M,CB,KCB--63x100.step
|
||||
KCB63-100MLB,63,100,M,LB,KCB--63x100.step
|
||||
KCB63-100MYB,63,100,M,YB,KCB--63x100.step
|
||||
KCB80-10,80,10,,,KCB--80x10.step
|
||||
KCB80-10FA,80,10,,FA,KCB--80x10.step
|
||||
KCB80-10FB,80,10,,FB,KCB--80x10.step
|
||||
KCB80-10CA,80,10,,CA,KCB--80x10.step
|
||||
KCB80-10CB,80,10,,CB,KCB--80x10.step
|
||||
KCB80-10LB,80,10,,LB,KCB--80x10.step
|
||||
KCB80-10YB,80,10,,YB,KCB--80x10.step
|
||||
KCB80-10M,80,10,M,,KCB--80x10.step
|
||||
KCB80-10MFA,80,10,M,FA,KCB--80x10.step
|
||||
KCB80-10MFB,80,10,M,FB,KCB--80x10.step
|
||||
KCB80-10MCA,80,10,M,CA,KCB--80x10.step
|
||||
KCB80-10MCB,80,10,M,CB,KCB--80x10.step
|
||||
KCB80-10MLB,80,10,M,LB,KCB--80x10.step
|
||||
KCB80-10MYB,80,10,M,YB,KCB--80x10.step
|
||||
KCB80-20,80,20,,,KCB--80x20.step
|
||||
KCB80-20FA,80,20,,FA,KCB--80x20.step
|
||||
KCB80-20FB,80,20,,FB,KCB--80x20.step
|
||||
KCB80-20CA,80,20,,CA,KCB--80x20.step
|
||||
KCB80-20CB,80,20,,CB,KCB--80x20.step
|
||||
KCB80-20LB,80,20,,LB,KCB--80x20.step
|
||||
KCB80-20YB,80,20,,YB,KCB--80x20.step
|
||||
KCB80-20M,80,20,M,,KCB--80x20.step
|
||||
KCB80-20MFA,80,20,M,FA,KCB--80x20.step
|
||||
KCB80-20MFB,80,20,M,FB,KCB--80x20.step
|
||||
KCB80-20MCA,80,20,M,CA,KCB--80x20.step
|
||||
KCB80-20MCB,80,20,M,CB,KCB--80x20.step
|
||||
KCB80-20MLB,80,20,M,LB,KCB--80x20.step
|
||||
KCB80-20MYB,80,20,M,YB,KCB--80x20.step
|
||||
KCB80-30,80,30,,,KCB--80x30.step
|
||||
KCB80-30FA,80,30,,FA,KCB--80x30.step
|
||||
KCB80-30FB,80,30,,FB,KCB--80x30.step
|
||||
KCB80-30CA,80,30,,CA,KCB--80x30.step
|
||||
KCB80-30CB,80,30,,CB,KCB--80x30.step
|
||||
KCB80-30LB,80,30,,LB,KCB--80x30.step
|
||||
KCB80-30YB,80,30,,YB,KCB--80x30.step
|
||||
KCB80-30M,80,30,M,,KCB--80x30.step
|
||||
KCB80-30MFA,80,30,M,FA,KCB--80x30.step
|
||||
KCB80-30MFB,80,30,M,FB,KCB--80x30.step
|
||||
KCB80-30MCA,80,30,M,CA,KCB--80x30.step
|
||||
KCB80-30MCB,80,30,M,CB,KCB--80x30.step
|
||||
KCB80-30MLB,80,30,M,LB,KCB--80x30.step
|
||||
KCB80-30MYB,80,30,M,YB,KCB--80x30.step
|
||||
KCB80-50,80,50,,,KCB--80x50.step
|
||||
KCB80-50FA,80,50,,FA,KCB--80x50.step
|
||||
KCB80-50FB,80,50,,FB,KCB--80x50.step
|
||||
KCB80-50CA,80,50,,CA,KCB--80x50.step
|
||||
KCB80-50CB,80,50,,CB,KCB--80x50.step
|
||||
KCB80-50LB,80,50,,LB,KCB--80x50.step
|
||||
KCB80-50YB,80,50,,YB,KCB--80x50.step
|
||||
KCB80-50M,80,50,M,,KCB--80x50.step
|
||||
KCB80-50MFA,80,50,M,FA,KCB--80x50.step
|
||||
KCB80-50MFB,80,50,M,FB,KCB--80x50.step
|
||||
KCB80-50MCA,80,50,M,CA,KCB--80x50.step
|
||||
KCB80-50MCB,80,50,M,CB,KCB--80x50.step
|
||||
KCB80-50MLB,80,50,M,LB,KCB--80x50.step
|
||||
KCB80-50MYB,80,50,M,YB,KCB--80x50.step
|
||||
KCB80-75,80,75,,,KCB--80x75.step
|
||||
KCB80-75FA,80,75,,FA,KCB--80x75.step
|
||||
KCB80-75FB,80,75,,FB,KCB--80x75.step
|
||||
KCB80-75CA,80,75,,CA,KCB--80x75.step
|
||||
KCB80-75CB,80,75,,CB,KCB--80x75.step
|
||||
KCB80-75LB,80,75,,LB,KCB--80x75.step
|
||||
KCB80-75YB,80,75,,YB,KCB--80x75.step
|
||||
KCB80-75M,80,75,M,,KCB--80x75.step
|
||||
KCB80-75MFA,80,75,M,FA,KCB--80x75.step
|
||||
KCB80-75MFB,80,75,M,FB,KCB--80x75.step
|
||||
KCB80-75MCA,80,75,M,CA,KCB--80x75.step
|
||||
KCB80-75MCB,80,75,M,CB,KCB--80x75.step
|
||||
KCB80-75MLB,80,75,M,LB,KCB--80x75.step
|
||||
KCB80-75MYB,80,75,M,YB,KCB--80x75.step
|
||||
KCB80-100,80,100,,,KCB--80x100.step
|
||||
KCB80-100FA,80,100,,FA,KCB--80x100.step
|
||||
KCB80-100FB,80,100,,FB,KCB--80x100.step
|
||||
KCB80-100CA,80,100,,CA,KCB--80x100.step
|
||||
KCB80-100CB,80,100,,CB,KCB--80x100.step
|
||||
KCB80-100LB,80,100,,LB,KCB--80x100.step
|
||||
KCB80-100YB,80,100,,YB,KCB--80x100.step
|
||||
KCB80-100M,80,100,M,,KCB--80x100.step
|
||||
KCB80-100MFA,80,100,M,FA,KCB--80x100.step
|
||||
KCB80-100MFB,80,100,M,FB,KCB--80x100.step
|
||||
KCB80-100MCA,80,100,M,CA,KCB--80x100.step
|
||||
KCB80-100MCB,80,100,M,CB,KCB--80x100.step
|
||||
KCB80-100MLB,80,100,M,LB,KCB--80x100.step
|
||||
KCB80-100MYB,80,100,M,YB,KCB--80x100.step
|
||||
KCB100-10,100,10,,,KCB--100x10.step
|
||||
KCB100-10FA,100,10,,FA,KCB--100x10.step
|
||||
KCB100-10FB,100,10,,FB,KCB--100x10.step
|
||||
KCB100-10CA,100,10,,CA,KCB--100x10.step
|
||||
KCB100-10CB,100,10,,CB,KCB--100x10.step
|
||||
KCB100-10LB,100,10,,LB,KCB--100x10.step
|
||||
KCB100-10YB,100,10,,YB,KCB--100x10.step
|
||||
KCB100-10M,100,10,M,,KCB--100x10.step
|
||||
KCB100-10MFA,100,10,M,FA,KCB--100x10.step
|
||||
KCB100-10MFB,100,10,M,FB,KCB--100x10.step
|
||||
KCB100-10MCA,100,10,M,CA,KCB--100x10.step
|
||||
KCB100-10MCB,100,10,M,CB,KCB--100x10.step
|
||||
KCB100-10MLB,100,10,M,LB,KCB--100x10.step
|
||||
KCB100-10MYB,100,10,M,YB,KCB--100x10.step
|
||||
KCB100-20,100,20,,,KCB--100x20.step
|
||||
KCB100-20FA,100,20,,FA,KCB--100x20.step
|
||||
KCB100-20FB,100,20,,FB,KCB--100x20.step
|
||||
KCB100-20CA,100,20,,CA,KCB--100x20.step
|
||||
KCB100-20CB,100,20,,CB,KCB--100x20.step
|
||||
KCB100-20LB,100,20,,LB,KCB--100x20.step
|
||||
KCB100-20YB,100,20,,YB,KCB--100x20.step
|
||||
KCB100-20M,100,20,M,,KCB--100x20.step
|
||||
KCB100-20MFA,100,20,M,FA,KCB--100x20.step
|
||||
KCB100-20MFB,100,20,M,FB,KCB--100x20.step
|
||||
KCB100-20MCA,100,20,M,CA,KCB--100x20.step
|
||||
KCB100-20MCB,100,20,M,CB,KCB--100x20.step
|
||||
KCB100-20MLB,100,20,M,LB,KCB--100x20.step
|
||||
KCB100-20MYB,100,20,M,YB,KCB--100x20.step
|
||||
KCB100-30,100,30,,,KCB--100x30.step
|
||||
KCB100-30FA,100,30,,FA,KCB--100x30.step
|
||||
KCB100-30FB,100,30,,FB,KCB--100x30.step
|
||||
KCB100-30CA,100,30,,CA,KCB--100x30.step
|
||||
KCB100-30CB,100,30,,CB,KCB--100x30.step
|
||||
KCB100-30LB,100,30,,LB,KCB--100x30.step
|
||||
KCB100-30YB,100,30,,YB,KCB--100x30.step
|
||||
KCB100-30M,100,30,M,,KCB--100x30.step
|
||||
KCB100-30MFA,100,30,M,FA,KCB--100x30.step
|
||||
KCB100-30MFB,100,30,M,FB,KCB--100x30.step
|
||||
KCB100-30MCA,100,30,M,CA,KCB--100x30.step
|
||||
KCB100-30MCB,100,30,M,CB,KCB--100x30.step
|
||||
KCB100-30MLB,100,30,M,LB,KCB--100x30.step
|
||||
KCB100-30MYB,100,30,M,YB,KCB--100x30.step
|
||||
KCB100-50,100,50,,,KCB--100x50.step
|
||||
KCB100-50FA,100,50,,FA,KCB--100x50.step
|
||||
KCB100-50FB,100,50,,FB,KCB--100x50.step
|
||||
KCB100-50CA,100,50,,CA,KCB--100x50.step
|
||||
KCB100-50CB,100,50,,CB,KCB--100x50.step
|
||||
KCB100-50LB,100,50,,LB,KCB--100x50.step
|
||||
KCB100-50YB,100,50,,YB,KCB--100x50.step
|
||||
KCB100-50M,100,50,M,,KCB--100x50.step
|
||||
KCB100-50MFA,100,50,M,FA,KCB--100x50.step
|
||||
KCB100-50MFB,100,50,M,FB,KCB--100x50.step
|
||||
KCB100-50MCA,100,50,M,CA,KCB--100x50.step
|
||||
KCB100-50MCB,100,50,M,CB,KCB--100x50.step
|
||||
KCB100-50MLB,100,50,M,LB,KCB--100x50.step
|
||||
KCB100-50MYB,100,50,M,YB,KCB--100x50.step
|
||||
KCB100-75,100,75,,,KCB--100x75.step
|
||||
KCB100-75FA,100,75,,FA,KCB--100x75.step
|
||||
KCB100-75FB,100,75,,FB,KCB--100x75.step
|
||||
KCB100-75CA,100,75,,CA,KCB--100x75.step
|
||||
KCB100-75CB,100,75,,CB,KCB--100x75.step
|
||||
KCB100-75LB,100,75,,LB,KCB--100x75.step
|
||||
KCB100-75YB,100,75,,YB,KCB--100x75.step
|
||||
KCB100-75M,100,75,M,,KCB--100x75.step
|
||||
KCB100-75MFA,100,75,M,FA,KCB--100x75.step
|
||||
KCB100-75MFB,100,75,M,FB,KCB--100x75.step
|
||||
KCB100-75MCA,100,75,M,CA,KCB--100x75.step
|
||||
KCB100-75MCB,100,75,M,CB,KCB--100x75.step
|
||||
KCB100-75MLB,100,75,M,LB,KCB--100x75.step
|
||||
KCB100-75MYB,100,75,M,YB,KCB--100x75.step
|
||||
KCB100-100,100,100,,,KCB--100x100.step
|
||||
KCB100-100FA,100,100,,FA,KCB--100x100.step
|
||||
KCB100-100FB,100,100,,FB,KCB--100x100.step
|
||||
KCB100-100CA,100,100,,CA,KCB--100x100.step
|
||||
KCB100-100CB,100,100,,CB,KCB--100x100.step
|
||||
KCB100-100LB,100,100,,LB,KCB--100x100.step
|
||||
KCB100-100YB,100,100,,YB,KCB--100x100.step
|
||||
KCB100-100M,100,100,M,,KCB--100x100.step
|
||||
KCB100-100MFA,100,100,M,FA,KCB--100x100.step
|
||||
KCB100-100MFB,100,100,M,FB,KCB--100x100.step
|
||||
KCB100-100MCA,100,100,M,CA,KCB--100x100.step
|
||||
KCB100-100MCB,100,100,M,CB,KCB--100x100.step
|
||||
KCB100-100MLB,100,100,M,LB,KCB--100x100.step
|
||||
KCB100-100MYB,100,100,M,YB,KCB--100x100.step
|
||||
KCB125-10,125,10,,,KCB--125x10.step
|
||||
KCB125-10FA,125,10,,FA,KCB--125x10.step
|
||||
KCB125-10FB,125,10,,FB,KCB--125x10.step
|
||||
KCB125-10CA,125,10,,CA,KCB--125x10.step
|
||||
KCB125-10CB,125,10,,CB,KCB--125x10.step
|
||||
KCB125-10LB,125,10,,LB,KCB--125x10.step
|
||||
KCB125-10YB,125,10,,YB,KCB--125x10.step
|
||||
KCB125-10M,125,10,M,,KCB--125x10.step
|
||||
KCB125-10MFA,125,10,M,FA,KCB--125x10.step
|
||||
KCB125-10MFB,125,10,M,FB,KCB--125x10.step
|
||||
KCB125-10MCA,125,10,M,CA,KCB--125x10.step
|
||||
KCB125-10MCB,125,10,M,CB,KCB--125x10.step
|
||||
KCB125-10MLB,125,10,M,LB,KCB--125x10.step
|
||||
KCB125-10MYB,125,10,M,YB,KCB--125x10.step
|
||||
KCB125-20,125,20,,,KCB--125x20.step
|
||||
KCB125-20FA,125,20,,FA,KCB--125x20.step
|
||||
KCB125-20FB,125,20,,FB,KCB--125x20.step
|
||||
KCB125-20CA,125,20,,CA,KCB--125x20.step
|
||||
KCB125-20CB,125,20,,CB,KCB--125x20.step
|
||||
KCB125-20LB,125,20,,LB,KCB--125x20.step
|
||||
KCB125-20YB,125,20,,YB,KCB--125x20.step
|
||||
KCB125-20M,125,20,M,,KCB--125x20.step
|
||||
KCB125-20MFA,125,20,M,FA,KCB--125x20.step
|
||||
KCB125-20MFB,125,20,M,FB,KCB--125x20.step
|
||||
KCB125-20MCA,125,20,M,CA,KCB--125x20.step
|
||||
KCB125-20MCB,125,20,M,CB,KCB--125x20.step
|
||||
KCB125-20MLB,125,20,M,LB,KCB--125x20.step
|
||||
KCB125-20MYB,125,20,M,YB,KCB--125x20.step
|
||||
KCB125-30,125,30,,,KCB--125x30.step
|
||||
KCB125-30FA,125,30,,FA,KCB--125x30.step
|
||||
KCB125-30FB,125,30,,FB,KCB--125x30.step
|
||||
KCB125-30CA,125,30,,CA,KCB--125x30.step
|
||||
KCB125-30CB,125,30,,CB,KCB--125x30.step
|
||||
KCB125-30LB,125,30,,LB,KCB--125x30.step
|
||||
KCB125-30YB,125,30,,YB,KCB--125x30.step
|
||||
KCB125-30M,125,30,M,,KCB--125x30.step
|
||||
KCB125-30MFA,125,30,M,FA,KCB--125x30.step
|
||||
KCB125-30MFB,125,30,M,FB,KCB--125x30.step
|
||||
KCB125-30MCA,125,30,M,CA,KCB--125x30.step
|
||||
KCB125-30MCB,125,30,M,CB,KCB--125x30.step
|
||||
KCB125-30MLB,125,30,M,LB,KCB--125x30.step
|
||||
KCB125-30MYB,125,30,M,YB,KCB--125x30.step
|
||||
KCB125-50,125,50,,,KCB--125x50.step
|
||||
KCB125-50FA,125,50,,FA,KCB--125x50.step
|
||||
KCB125-50FB,125,50,,FB,KCB--125x50.step
|
||||
KCB125-50CA,125,50,,CA,KCB--125x50.step
|
||||
KCB125-50CB,125,50,,CB,KCB--125x50.step
|
||||
KCB125-50LB,125,50,,LB,KCB--125x50.step
|
||||
KCB125-50YB,125,50,,YB,KCB--125x50.step
|
||||
KCB125-50M,125,50,M,,KCB--125x50.step
|
||||
KCB125-50MFA,125,50,M,FA,KCB--125x50.step
|
||||
KCB125-50MFB,125,50,M,FB,KCB--125x50.step
|
||||
KCB125-50MCA,125,50,M,CA,KCB--125x50.step
|
||||
KCB125-50MCB,125,50,M,CB,KCB--125x50.step
|
||||
KCB125-50MLB,125,50,M,LB,KCB--125x50.step
|
||||
KCB125-50MYB,125,50,M,YB,KCB--125x50.step
|
||||
KCB125-75,125,75,,,KCB--125x75.step
|
||||
KCB125-75FA,125,75,,FA,KCB--125x75.step
|
||||
KCB125-75FB,125,75,,FB,KCB--125x75.step
|
||||
KCB125-75CA,125,75,,CA,KCB--125x75.step
|
||||
KCB125-75CB,125,75,,CB,KCB--125x75.step
|
||||
KCB125-75LB,125,75,,LB,KCB--125x75.step
|
||||
KCB125-75YB,125,75,,YB,KCB--125x75.step
|
||||
KCB125-75M,125,75,M,,KCB--125x75.step
|
||||
KCB125-75MFA,125,75,M,FA,KCB--125x75.step
|
||||
KCB125-75MFB,125,75,M,FB,KCB--125x75.step
|
||||
KCB125-75MCA,125,75,M,CA,KCB--125x75.step
|
||||
KCB125-75MCB,125,75,M,CB,KCB--125x75.step
|
||||
KCB125-75MLB,125,75,M,LB,KCB--125x75.step
|
||||
KCB125-75MYB,125,75,M,YB,KCB--125x75.step
|
||||
KCB125-100,125,100,,,KCB--125x100.step
|
||||
KCB125-100FA,125,100,,FA,KCB--125x100.step
|
||||
KCB125-100FB,125,100,,FB,KCB--125x100.step
|
||||
KCB125-100CA,125,100,,CA,KCB--125x100.step
|
||||
KCB125-100CB,125,100,,CB,KCB--125x100.step
|
||||
KCB125-100LB,125,100,,LB,KCB--125x100.step
|
||||
KCB125-100YB,125,100,,YB,KCB--125x100.step
|
||||
KCB125-100M,125,100,M,,KCB--125x100.step
|
||||
KCB125-100MFA,125,100,M,FA,KCB--125x100.step
|
||||
KCB125-100MFB,125,100,M,FB,KCB--125x100.step
|
||||
KCB125-100MCA,125,100,M,CA,KCB--125x100.step
|
||||
KCB125-100MCB,125,100,M,CB,KCB--125x100.step
|
||||
KCB125-100MLB,125,100,M,LB,KCB--125x100.step
|
||||
KCB125-100MYB,125,100,M,YB,KCB--125x100.step
|
||||
|
1513
onebot-data/catalog/csv/KCS.csv
Normal file
1513
onebot-data/catalog/csv/KCS.csv
Normal file
File diff suppressed because it is too large
Load Diff
1513
onebot-data/catalog/csv/KS.csv
Normal file
1513
onebot-data/catalog/csv/KS.csv
Normal file
File diff suppressed because it is too large
Load Diff
4803
onebot-data/catalog/csv/KSB.csv
Normal file
4803
onebot-data/catalog/csv/KSB.csv
Normal file
File diff suppressed because it is too large
Load Diff
1513
onebot-data/catalog/csv/KSU.csv
Normal file
1513
onebot-data/catalog/csv/KSU.csv
Normal file
File diff suppressed because it is too large
Load Diff
4
onebot-data/catalog/csv/LAE.csv
Normal file
4
onebot-data/catalog/csv/LAE.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
model_code,size,step_file
|
||||
LAE140,140,LAE140.stp
|
||||
LAE225,225,LAE225.stp
|
||||
LAE350,350,LAE350.stp
|
||||
|
14401
onebot-data/catalog/csv/M.csv
Normal file
14401
onebot-data/catalog/csv/M.csv
Normal file
File diff suppressed because it is too large
Load Diff
9001
onebot-data/catalog/csv/MAL.csv
Normal file
9001
onebot-data/catalog/csv/MAL.csv
Normal file
File diff suppressed because it is too large
Load Diff
5401
onebot-data/catalog/csv/MALC.csv
Normal file
5401
onebot-data/catalog/csv/MALC.csv
Normal file
File diff suppressed because it is too large
Load Diff
5401
onebot-data/catalog/csv/MS.csv
Normal file
5401
onebot-data/catalog/csv/MS.csv
Normal file
File diff suppressed because it is too large
Load Diff
5401
onebot-data/catalog/csv/MSC.csv
Normal file
5401
onebot-data/catalog/csv/MSC.csv
Normal file
File diff suppressed because it is too large
Load Diff
23
onebot-data/catalog/csv/UAGP.csv
Normal file
23
onebot-data/catalog/csv/UAGP.csv
Normal file
@@ -0,0 +1,23 @@
|
||||
model_code,size,type,step_file
|
||||
UAGP080_W,80,W,UAGP080_W.stp
|
||||
UAGP080_B,80,B,UAGP080_B.stp
|
||||
UAGP120_W,120,W,UAGP120_W.stp
|
||||
UAGP120_B,120,B,UAGP120_B.stp
|
||||
UAGP150_W,150,W,UAGP150_W.stp
|
||||
UAGP150_B,150,B,UAGP150_B.stp
|
||||
UAGP155_W,155,W,UAGP155_W.stp
|
||||
UAGP155_B,155,B,UAGP155_B.stp
|
||||
UAGP170_W,170,W,UAGP170_W.stp
|
||||
UAGP170_B,170,B,UAGP170_B.stp
|
||||
UAGP210_W,210,W,UAGP210_W.stp
|
||||
UAGP210_B,210,B,UAGP210_B.stp
|
||||
UAGP215_W,215,W,UAGP215_W.stp
|
||||
UAGP215_B,215,B,UAGP215_B.stp
|
||||
UAGP300_W,300,W,UAGP300_W.stp
|
||||
UAGP300_B,300,B,UAGP300_B.stp
|
||||
UAGP350_W,350,W,UAGP350_W.stp
|
||||
UAGP350_B,350,B,UAGP350_B.stp
|
||||
UAGP355_W,355,W,UAGP355_W.stp
|
||||
UAGP355_B,355,B,UAGP355_B.stp
|
||||
UAGP605_W,605,W,UAGP605_W.stp
|
||||
UAGP605_B,605,B,UAGP605_B.stp
|
||||
|
7
onebot-data/catalog/csv/UCBM.csv
Normal file
7
onebot-data/catalog/csv/UCBM.csv
Normal file
@@ -0,0 +1,7 @@
|
||||
model_code,size,step_file
|
||||
UCBM25,25,UCBM25.stp
|
||||
UCBM32,32,UCBM32.stp
|
||||
UCBM40,40,UCBM40.stp
|
||||
UCBM50,50,UCBM50.stp
|
||||
UCBM63,63,UCBM63.stp
|
||||
UCBM80,80,UCBM80.stp
|
||||
|
3
onebot-data/catalog/csv/UGP.csv
Normal file
3
onebot-data/catalog/csv/UGP.csv
Normal file
@@ -0,0 +1,3 @@
|
||||
model_code,size,type,step_file
|
||||
UGP40,40,,UGP40.stp
|
||||
UGPS32D,32,SD,UGPS32D.stp
|
||||
|
4
onebot-data/catalog/csv/ULP.csv
Normal file
4
onebot-data/catalog/csv/ULP.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
model_code,size,step_file
|
||||
ULP32,32,ULP32.stp
|
||||
ULP50,50,ULP50.stp
|
||||
ULP63,63,ULP63.stp
|
||||
|
4
onebot-data/catalog/csv/USP.csv
Normal file
4
onebot-data/catalog/csv/USP.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
model_code,size,step_file
|
||||
USP32,32,USP32.stp
|
||||
USP50,50,USP50.stp
|
||||
USP63,63,USP63.stp
|
||||
|
12
onebot-data/catalog/parametric-vectors.json
Normal file
12
onebot-data/catalog/parametric-vectors.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"note": "参数化引擎双端对拍向量 (桌面 selftest 与网页无头 E2E 同源; 2026-08-25)。case 字段: series/params 必填; expectCode+expectStandard 或 expectError 二选一; expectNearest 可选。",
|
||||
"cases": [
|
||||
{"series": "KC", "params": {"type": "00", "bore": 32, "stroke": 10, "magnet": "", "mount": ""}, "expectCode": "KC0032-10", "expectStandard": true},
|
||||
{"series": "KC", "params": {"type": "00", "bore": 32, "stroke": 10, "magnet": "M", "mount": "FA"}, "expectCode": "KC0032-10MFA", "expectStandard": true},
|
||||
{"series": "KC", "params": {"type": "02", "bore": 63, "stroke": 100, "magnet": "", "mount": "CB"}, "expectCode": "KC0263-100CB", "expectStandard": true},
|
||||
{"series": "KC", "params": {"type": "00", "bore": 32, "stroke": 87, "magnet": "", "mount": ""}, "expectCode": "KC0032-87", "expectStandard": false, "expectNearest": "KC0032-75"},
|
||||
{"series": "KC", "params": {"type": "00", "bore": 32, "stroke": 90, "magnet": "", "mount": ""}, "expectCode": "KC0032-90", "expectStandard": false, "expectNearest": "KC0032-100"},
|
||||
{"series": "KC", "params": {"type": "00", "bore": 160, "stroke": 50, "magnet": "", "mount": "YB"}, "expectError": "rule"},
|
||||
{"series": "KC", "params": {"type": "00", "bore": 32, "stroke": 999, "magnet": "", "mount": ""}, "expectError": "domain"}
|
||||
]
|
||||
}
|
||||
1
onebot-data/catalog/series/KC.meta.json
Normal file
1
onebot-data/catalog/series/KC.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KC", "mode": "parametric", "modelCodeTemplate": "KC{type}{bore}-{stroke}{magnet}{mount}", "nameZh": "KC 系列标准气缸 (ISO15552)", "nameEn": "KC Series Standard Cylinder (ISO15552)", "keywords": "kc iso15552 biaozhun qigang", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "keywords": "type", "unit": "", "type": "enum", "values": ["00", "02", "03"], "display": {}}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "keywords": "bore", "unit": "mm", "type": "number", "values": [32, 40, 50, 63, 80, 100, 125, 160, 200, 250, 320], "display": {}}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "keywords": "stroke", "unit": "mm", "type": "range", "values": [10, 20, 30, 50, 75, 100], "min": 10, "max": 200, "step": 1, "gridValues": [10, 20, 30, 50, 75, 100], "display": {}}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "keywords": "magnet", "unit": "", "type": "enum", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "keywords": "mount", "unit": "", "type": "enum", "values": ["", "FA", "FB", "CA", "CB", "LB", "YB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [{"If": {"Param": "mount", "Op": "eq", "Value": "YB"}, "Then": {"Param": "bore", "Op": "in", "Value": [32, 40, 50, 63, 80, 100, 125]}}], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KC/p02.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p03.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p04.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p05.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p06.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p11.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KC/p12.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KC/KC_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/KCB.meta.json
Normal file
1
onebot-data/catalog/series/KCB.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KCB", "nameZh": "KCB 系列倍力气缸", "nameEn": "KCB Series Tandem Cylinder", "keywords": "kcb beili qigang tandem", "parameters": [{"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [32, 40, 50, 63, 80, 100, 125]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "FA", "FB", "CA", "CB", "LB", "YB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KCB/p09.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KCB/p10.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KCB/KCB_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/KCS.meta.json
Normal file
1
onebot-data/catalog/series/KCS.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KCS", "nameZh": "KCS 系列超经济型标准气缸", "nameEn": "KCS Series Economy Standard Cylinder", "keywords": "kcs chaojingji economy", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "unit": "", "type": "enum", "keywords": "type", "values": ["00", "02", "03"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [32, 40, 50, 63, 80, 100]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "FA", "FB", "CA", "CB", "LB", "YB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KCS/p13.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KCS/KCS_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/KS.meta.json
Normal file
1
onebot-data/catalog/series/KS.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KS", "nameZh": "KS 系列拉杆式标准气缸", "nameEn": "KS Series Tie-rod Standard Cylinder", "keywords": "ks lagan tie-rod", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "unit": "", "type": "enum", "keywords": "type", "values": ["00", "02", "03"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [32, 40, 50, 63, 80, 100, 125]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "FA", "FB", "CA", "CB", "LB", "TC", "TC-M"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [{"If": {"Param": "type", "Op": "in", "Value": ["02", "03"]}, "Then": {"Param": "mount", "Op": "in", "Value": ["FA", "FB", "LB", "TC", "TC-M"]}}], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KS/p14.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KS/p15.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KS/KS_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/KSB.meta.json
Normal file
1
onebot-data/catalog/series/KSB.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KSB", "nameZh": "KSB 系列多位置气缸", "nameEn": "KSB Series Multi-position Cylinder", "keywords": "ksb duoweizhi multi-position", "parameters": [{"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [32, 40, 50, 63, 80, 100, 125]}, {"code": "stroke1", "nameZh": "行程1", "nameEn": "Stroke 1", "unit": "mm", "type": "number", "keywords": "stroke1", "values": [0, 10, 20, 30, 50, 75, 100]}, {"code": "stroke2", "nameZh": "行程2", "nameEn": "Stroke 2", "unit": "mm", "type": "number", "keywords": "stroke2", "values": [0, 10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "FA", "FB", "CA", "CB", "LB", "YB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KSB/p16.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KSB/p17.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KSB/KSB_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/KSU.meta.json
Normal file
1
onebot-data/catalog/series/KSU.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "KSU", "nameZh": "KSU 系列拉杆内藏式标准气缸", "nameEn": "KSU Series Concealed Tie-rod Cylinder", "keywords": "ksu lagan neicang concealed", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "unit": "", "type": "enum", "keywords": "type", "values": ["00", "02", "03"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [32, 40, 50, 63, 80, 100, 125]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "FA", "FB", "CA", "CB", "LB", "TC", "TC-M"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}], "rules": [{"If": {"Param": "type", "Op": "in", "Value": ["02", "03"]}, "Then": {"Param": "mount", "Op": "in", "Value": ["FA", "FB", "LB", "TC", "TC-M"]}}], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/KSU/p14.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/KSU/p15.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/KSU/KSU_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/LAE.meta.json
Normal file
1
onebot-data/catalog/series/LAE.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "LAE", "nameZh": "LAE 系列电动气缸", "nameEn": "LAE Series Electric Cylinder", "keywords": "lae diandong electric servo", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [140, 225, 350], "display": {}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/LAE/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/LAE/LAE_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/M.meta.json
Normal file
1
onebot-data/catalog/series/M.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "M", "nameZh": "M 系列不锈钢迷你缸 (ISO6432)", "nameEn": "M Series Stainless Mini Cylinder (ISO6432)", "keywords": "m iso6432 minigang stainless mini", "parameters": [{"code": "action", "nameZh": "动作形式", "nameEn": "Action", "unit": "", "type": "enum", "keywords": "action", "values": ["N", "S", "T", "ND", "NJ"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [8, 10, 12, 16, 20, 25, 32, 40]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "rod", "nameZh": "活塞杆材质", "nameEn": "Rod Material", "unit": "", "type": "enum", "keywords": "rod", "values": ["E", ""], "display": {"": "碳钢", "E": "不锈钢 E"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "LB", "FA", "FB", "SDB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}, {"code": "cap", "nameZh": "后盖形式", "nameEn": "Cap Type", "unit": "", "type": "enum", "keywords": "cap", "values": ["", "U", "CM"], "display": {"": "标准摆尾型", "U": "标准平尾型 U", "CM": "标准圆尾型 CM"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/M/p22.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/M/p23.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/M/p24.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/M/p25.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/M/p26.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/M/p27.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/M/M_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/MAL.meta.json
Normal file
1
onebot-data/catalog/series/MAL.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "MAL", "nameZh": "MAL 系列铝合金迷你缸", "nameEn": "MAL Series Aluminium Mini Cylinder", "keywords": "mal lvhejin minigang aluminium mini", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "unit": "", "type": "enum", "keywords": "type", "values": ["MAL", "MSAL", "MTAL", "MALD", "MALJ"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [16, 20, 25, 32, 40]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "rod", "nameZh": "活塞杆材质", "nameEn": "Rod Material", "unit": "", "type": "enum", "keywords": "rod", "values": ["E", ""], "display": {"": "碳钢", "E": "不锈钢 E"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "LB", "FA", "FB", "SDB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}, {"code": "cap", "nameZh": "后盖形式", "nameEn": "Cap Type", "unit": "", "type": "enum", "keywords": "cap", "values": ["", "U", "CM"], "display": {"": "标准摆尾型", "U": "标准平尾型 U", "CM": "标准圆尾型 CM"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/MAL/p36.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MAL/p37.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MAL/p38.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MAL/p39.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MAL/p40.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/MAL/MAL_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/MALC.meta.json
Normal file
1
onebot-data/catalog/series/MALC.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "MALC", "nameZh": "MALC 系列铝合金迷你缸", "nameEn": "MALC Series Aluminium Mini Cylinder", "keywords": "malc lvhejin minigang aluminium mini", "parameters": [{"code": "type", "nameZh": "型号", "nameEn": "Type", "unit": "", "type": "enum", "keywords": "type", "values": ["MALC", "MALCD", "MALCJ"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [16, 20, 25, 32, 40]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "rod", "nameZh": "活塞杆材质", "nameEn": "Rod Material", "unit": "", "type": "enum", "keywords": "rod", "values": ["E", ""], "display": {"": "碳钢", "E": "不锈钢 E"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "LB", "FA", "FB", "SDB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}, {"code": "cap", "nameZh": "后盖形式", "nameEn": "Cap Type", "unit": "", "type": "enum", "keywords": "cap", "values": ["", "U", "CM"], "display": {"": "标准摆尾型", "U": "标准平尾型 U", "CM": "标准圆尾型 CM"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/MALC/p41.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MALC/p42.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MALC/p43.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/MALC/MALC_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/MS.meta.json
Normal file
1
onebot-data/catalog/series/MS.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "MS", "nameZh": "MS 系列不锈钢迷你缸 (ISO6432)", "nameEn": "MS Series Stainless Mini Cylinder (ISO6432)", "keywords": "ms iso6432 minigang stainless mini", "parameters": [{"code": "action", "nameZh": "动作形式", "nameEn": "Action", "unit": "", "type": "enum", "keywords": "action", "values": ["N", "D", "J"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [16, 20, 25, 32, 40]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "rod", "nameZh": "活塞杆材质", "nameEn": "Rod Material", "unit": "", "type": "enum", "keywords": "rod", "values": ["E", ""], "display": {"": "碳钢", "E": "不锈钢 E"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "LB", "FA", "FB", "SDB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}, {"code": "cap", "nameZh": "后盖形式", "nameEn": "Cap Type", "unit": "", "type": "enum", "keywords": "cap", "values": ["", "U", "CM"], "display": {"": "标准摆尾型", "U": "标准平尾型 U", "CM": "标准圆尾型 CM"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/MS/p28.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MS/p29.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MS/p30.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MS/p31.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MS/p32.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/MS/MS_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/MSC.meta.json
Normal file
1
onebot-data/catalog/series/MSC.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "MSC", "nameZh": "MSC 系列不锈钢迷你缸 (ISO6432)", "nameEn": "MSC Series Stainless Mini Cylinder (ISO6432)", "keywords": "msc iso6432 minigang stainless mini", "parameters": [{"code": "action", "nameZh": "动作形式", "nameEn": "Action", "unit": "", "type": "enum", "keywords": "action", "values": ["C", "D", "J"]}, {"code": "bore", "nameZh": "缸径", "nameEn": "Bore", "unit": "mm", "type": "number", "keywords": "bore", "values": [16, 20, 25, 32, 40]}, {"code": "stroke", "nameZh": "行程", "nameEn": "Stroke", "unit": "mm", "type": "number", "keywords": "stroke", "values": [10, 20, 30, 50, 75, 100]}, {"code": "magnet", "nameZh": "磁石", "nameEn": "Magnet", "unit": "", "type": "enum", "keywords": "magnet", "values": ["", "M"], "display": {"": "不附磁石", "M": "附磁石 M"}}, {"code": "rod", "nameZh": "活塞杆材质", "nameEn": "Rod Material", "unit": "", "type": "enum", "keywords": "rod", "values": ["E", ""], "display": {"": "碳钢", "E": "不锈钢 E"}}, {"code": "mount", "nameZh": "固定形式", "nameEn": "Mounting", "unit": "", "type": "enum", "keywords": "mount", "values": ["", "LB", "FA", "FB", "SDB"], "display": {"FA": "前盖固定型 FA", "YB": "后盖支座固定型 YB", "TC": "中间摇摆式 TC", "CA": "后盖单耳固定型 CA", "LB": "前后固定型 LB", "CB": "后盖双耳固定型 CB", "TC-M": "摇摆式附脚座 TC-M", "FB": "后盖固定型 FB", "SDB": "后盖摇摆式 SDB", "": "基本型"}}, {"code": "cap", "nameZh": "后盖形式", "nameEn": "Cap Type", "unit": "", "type": "enum", "keywords": "cap", "values": ["", "U", "CM"], "display": {"": "标准摆尾型", "U": "标准平尾型 U", "CM": "标准圆尾型 CM"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/MSC/p33.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MSC/p34.png", "model": null}, {"kind": "manual", "lang": "", "source": "manual/MSC/p35.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/MSC/MSC_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/UAGP.meta.json
Normal file
1
onebot-data/catalog/series/UAGP.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "UAGP", "nameZh": "UAGP 系列气动翻转缸", "nameEn": "UAGP Series Pneumatic Flip Cylinder", "keywords": "uagp fanzhuan flip rotary", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [80, 120, 150, 155, 170, 210, 215, 300, 350, 355, 605], "display": {}}, {"code": "type", "nameZh": "型式", "nameEn": "Type", "keywords": "type xingshi", "unit": "", "type": "enum", "values": ["W", "B"], "display": {"W": "标准型", "B": "带制动"}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/UAGP/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/UAGP/UAGP_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/UCBM.meta.json
Normal file
1
onebot-data/catalog/series/UCBM.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "UCBM", "nameZh": "UCBM 系列气动夹紧缸", "nameEn": "UCBM Series Pneumatic Clamping Cylinder", "keywords": "ucbm jiajin jingang clamping", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [25, 32, 40, 50, 63, 80], "display": {}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/UCBM/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/UCBM/UCBM_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/UGP.meta.json
Normal file
1
onebot-data/catalog/series/UGP.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "UGP", "nameZh": "UGP 系列气动夹爪缸", "nameEn": "UGP Series Pneumatic Gripper Cylinder", "keywords": "ugp jiazhua gripper", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [40, 32], "display": {}}, {"code": "type", "nameZh": "型式", "nameEn": "Type", "keywords": "type xingshi", "unit": "", "type": "enum", "values": ["", "SD"], "display": {"": "标准型", "SD": "特殊型 SD"}}], "rules": [{"If": {"Param": "type", "Op": "eq", "Value": ""}, "Then": {"Param": "size", "Op": "in", "Value": [40]}}, {"If": {"Param": "type", "Op": "eq", "Value": "SD"}, "Then": {"Param": "size", "Op": "in", "Value": [32]}}], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/UGP/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/UGP/UGP_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/ULP.meta.json
Normal file
1
onebot-data/catalog/series/ULP.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "ULP", "nameZh": "ULP 系列气动可伸缩定位销", "nameEn": "ULP Series Pneumatic Retractable Locating Pin", "keywords": "ulp shensuo dingweixiao pin", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [32, 50, 63], "display": {}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/ULP/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/ULP/ULP_manual.pdf", "model": null}]}
|
||||
1
onebot-data/catalog/series/USP.meta.json
Normal file
1
onebot-data/catalog/series/USP.meta.json
Normal file
@@ -0,0 +1 @@
|
||||
{"series": {"code": "USP", "nameZh": "USP 系列气动勾销缸", "nameEn": "USP Series Pneumatic Hook Pin Cylinder", "keywords": "usp gouxiao hook pin", "parameters": [{"code": "size", "nameZh": "规格", "nameEn": "Size", "keywords": "size guige", "unit": "", "type": "number", "values": [32, 50, 63], "display": {}}], "rules": [], "naming": {"stepNameTemplate": "{model}.step"}, "attachments": [], "variants": []}, "attachments": [{"kind": "manual", "lang": "", "source": "manual/USP/p01.png", "model": null}, {"kind": "datasheet", "lang": "", "source": "manual/USP/USP_manual.pdf", "model": null}]}
|
||||
16
onebot-data/genserver-config.json
Normal file
16
onebot-data/genserver-config.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"note": "NX 按需生成服务配置 (A 版, 2026-08-25)。dataDir 指向目录数据源 (与唯一数据源同目录, 读取 series 规则与 csv 网格, 服务端二次校验用)。上线时把本文件 + masters.json + catalog-masters\\ 一并部署到服务器, apiKey 务必更换。",
|
||||
"port": 8899,
|
||||
"apiKey": "onebot-gen-local-dev",
|
||||
"dataDir": "onebot-data\\catalog",
|
||||
"mastersJson": "onebot-data\\masters.json",
|
||||
"mastersDir": "catalog-masters",
|
||||
"outputDir": "output",
|
||||
"jobsDir": "jobs",
|
||||
"workDir": "work",
|
||||
"queueLimit": 200,
|
||||
"batchLimit": 50,
|
||||
"ratePerMin": 10,
|
||||
"workTtlHours": 2,
|
||||
"jobArchiveHours": 24
|
||||
}
|
||||
20
onebot-data/masters.json
Normal file
20
onebot-data/masters.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"note": "NX 按需生成服务母模配置 (服务器侧, 不进客户包)。expressionMap: 目录参数代码 → NX 母模表达式名 (须与母模实际表达式一字不差, 由建模工程师确认)。switchRules: [参数代码, 参数值, NX表达式名, 表达式值] 枚举开关 (驱动按表达式抑制的特征, 同 nx-batch-export.vb 语义)。exports: 每个型号导出的格式 (step 固定导出, 其余 true 才导)。",
|
||||
"KC": {
|
||||
"masterPart": "KC_master.prt",
|
||||
"expressionMap": { "bore": "bore", "stroke": "stroke" },
|
||||
"switchRules": [
|
||||
["magnet", "", "magOn", "0"],
|
||||
["magnet", "M", "magOn", "1"],
|
||||
["mount", "", "mountIdx", "0"],
|
||||
["mount", "FA", "mountIdx", "1"],
|
||||
["mount", "FB", "mountIdx", "2"],
|
||||
["mount", "CA", "mountIdx", "3"],
|
||||
["mount", "CB", "mountIdx", "4"],
|
||||
["mount", "LB", "mountIdx", "5"],
|
||||
["mount", "YB", "mountIdx", "6"]
|
||||
],
|
||||
"exports": { "step": "214", "iges": true, "prt": true },
|
||||
"timeoutSec": 300
|
||||
}
|
||||
}
|
||||
132
onebot-data/tools/gen-manual-placeholders.py
Normal file
132
onebot-data/tools/gen-manual-placeholders.py
Normal file
@@ -0,0 +1,132 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
gen-manual-placeholders.py —— 为新系列生成手册占位文件夹与占位图片 (尺寸图窗口占位用)
|
||||
|
||||
背景: 老 11 个系列有手册拆页 (catalog\\manual\\<系列>\\pXX.png), 新 6 个系列
|
||||
(UCBM/ULP/USP/UGP/UAGP/LAE) 暂无手册 → 尺寸图窗口空白。
|
||||
本脚本为每个新系列生成一张占位 PNG (A4 比例, 灰框+系列代码大字) 并写入
|
||||
series\\<系列>.meta.json 的 manual 附件引用。真实手册到货后用
|
||||
render-manual-pages.py 重新拆页覆盖 p01.png 即可。
|
||||
|
||||
纯标准库实现 (zlib+struct 写 PNG, 5x7 点阵字体), 无任何第三方依赖。
|
||||
用法: python gen-manual-placeholders.py
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import struct
|
||||
import zlib
|
||||
|
||||
BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
MANUAL_DIR = os.path.join(BASE, 'catalog', 'manual')
|
||||
SERIES_DIR = os.path.join(BASE, 'catalog', 'series')
|
||||
|
||||
NEW_SERIES = ['UCBM', 'ULP', 'USP', 'UGP', 'UAGP', 'LAE']
|
||||
|
||||
# 5x7 点阵字体 (每字符 7 字节, 位=像素)
|
||||
FONT = {
|
||||
'A': [0x0E, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11], 'B': [0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E],
|
||||
'C': [0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E], 'D': [0x1C, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1C],
|
||||
'E': [0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F], 'F': [0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x10],
|
||||
'G': [0x0E, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0F], 'H': [0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11],
|
||||
'I': [0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E], 'J': [0x07, 0x02, 0x02, 0x02, 0x12, 0x12, 0x0C],
|
||||
'K': [0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11], 'L': [0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F],
|
||||
'M': [0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11], 'N': [0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x11],
|
||||
'O': [0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], 'P': [0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10],
|
||||
'Q': [0x0E, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0D], 'R': [0x1E, 0x11, 0x11, 0x1E, 0x14, 0x12, 0x11],
|
||||
'S': [0x0F, 0x10, 0x10, 0x0E, 0x01, 0x01, 0x1E], 'T': [0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04],
|
||||
'U': [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], 'V': [0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04],
|
||||
'W': [0x11, 0x11, 0x11, 0x15, 0x15, 0x1B, 0x11], 'X': [0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11],
|
||||
'Y': [0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04], 'Z': [0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F],
|
||||
'0': [0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E], '1': [0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E],
|
||||
'2': [0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F], '3': [0x1F, 0x02, 0x04, 0x06, 0x01, 0x11, 0x0E],
|
||||
'4': [0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02], '5': [0x1F, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E],
|
||||
'6': [0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E], '7': [0x1F, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08],
|
||||
'8': [0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E], '9': [0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C],
|
||||
'/': [0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10], '-': [0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00],
|
||||
'.': [0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C], ':': [0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00],
|
||||
' ': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
|
||||
}
|
||||
|
||||
W, H = 794, 1123 # A4 @96dpi 近似
|
||||
|
||||
|
||||
def draw_text(buf, text, x0, y0, scale, color):
|
||||
"""把 text 按 5x7 点阵放大 scale 倍画进 buf (0xFFFFFF 背景)"""
|
||||
for ch in text:
|
||||
glyph = FONT.get(ch.upper(), FONT[' '])
|
||||
for row in range(7):
|
||||
bits = glyph[row]
|
||||
for col in range(5):
|
||||
if bits & (0x10 >> col):
|
||||
for dy in range(scale):
|
||||
for dx in range(scale):
|
||||
px = (x0 + col * scale + dx) * 3
|
||||
py = y0 + row * scale + dy
|
||||
buf[py * W * 3 + px] = color[0]
|
||||
buf[py * W * 3 + px + 1] = color[1]
|
||||
buf[py * W * 3 + px + 2] = color[2]
|
||||
x0 += 6 * scale
|
||||
|
||||
|
||||
def make_png(path, series):
|
||||
buf = bytearray([0xF5, 0xF6, 0xF8] * (W * H)) # 浅灰底
|
||||
gray = (0x9A, 0xA2, 0xAC)
|
||||
dark = (0x3A, 0x45, 0x52)
|
||||
# 图纸外框 + 四角标
|
||||
for x in range(40, W - 40):
|
||||
for y in (38, 39, H - 40, H - 39):
|
||||
i = (y * W + x) * 3
|
||||
buf[i], buf[i + 1], buf[i + 2] = gray
|
||||
for y in range(38, H - 38):
|
||||
for x in (40, 41, W - 42, W - 41):
|
||||
i = (y * W + x) * 3
|
||||
buf[i], buf[i + 1], buf[i + 2] = gray
|
||||
draw_text(buf, series, 60, 90, 10, dark) # 系列代码大字
|
||||
draw_text(buf, 'DRAWING PENDING', 60, 230, 3, gray) # 占位说明
|
||||
draw_text(buf, 'SERIES: ' + series, 60, 270, 2, gray)
|
||||
draw_text(buf, 'REPLACE THIS PAGE', 60, 300, 2, gray)
|
||||
draw_text(buf, 'WITH REAL MANUAL', 60, 324, 2, gray)
|
||||
# 对角辅助线 (工程图纸感)
|
||||
for t in range(0, 300):
|
||||
for x in (t, t + 1):
|
||||
i = ((90 + t) * W + 60 + x) * 3
|
||||
buf[i], buf[i + 1], buf[i + 2] = 0xE2, 0xE6, 0xEA
|
||||
# 写 PNG (无压缩优化, 标准库)
|
||||
def chunk(tag, data):
|
||||
c = struct.pack('>I', len(data)) + tag + data
|
||||
c += struct.pack('>I', zlib.crc32(tag + data) & 0xFFFFFFFF)
|
||||
return c
|
||||
raw = b''.join(b'\x00' + bytes(buf[y * W * 3:(y + 1) * W * 3]) for y in range(H))
|
||||
png = (b'\x89PNG\r\n\x1a\n'
|
||||
+ chunk(b'IHDR', struct.pack('>IIBBBBB', W, H, 8, 2, 0, 0, 0))
|
||||
+ chunk(b'IDAT', zlib.compress(raw, 6))
|
||||
+ chunk(b'IEND', b''))
|
||||
with open(path, 'wb') as f:
|
||||
f.write(png)
|
||||
|
||||
|
||||
def update_meta(series):
|
||||
meta_path = os.path.join(SERIES_DIR, series + '.meta.json')
|
||||
with open(meta_path, 'r', encoding='utf-8') as f:
|
||||
obj = json.load(f)
|
||||
obj['attachments'] = [{'kind': 'manual', 'lang': '', 'source': 'manual/%s/p01.png' % series, 'model': None}]
|
||||
with open(meta_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(obj, f, ensure_ascii=False)
|
||||
|
||||
|
||||
def main():
|
||||
made = 0
|
||||
for s in NEW_SERIES:
|
||||
d = os.path.join(MANUAL_DIR, s)
|
||||
if not os.path.isdir(d):
|
||||
os.makedirs(d)
|
||||
make_png(os.path.join(d, 'p01.png'), s)
|
||||
update_meta(s)
|
||||
made += 1
|
||||
print('OK %s: manual/%s/p01.png + meta 附件引用' % (s, s))
|
||||
print('完成 %d 个系列' % made)
|
||||
print('提示: 真实手册到货后跑 render-manual-pages.py 覆盖, 或直接替换 p01.png 同名文件')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
85
onebot-data/tools/gen-mesh-preview.py
Normal file
85
onebot-data/tools/gen-mesh-preview.py
Normal file
@@ -0,0 +1,85 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
gen-mesh-preview.py —— 生成占位 STL 网格 (窗口内 3D 预览用, 开源 Helix Toolkit 渲染)
|
||||
|
||||
用途: 真实数模导出前, 为每个型号生成一个简单圆柱占位网格,
|
||||
放在 onebot-data\\catalog\\mesh\\ 下 (与 step\\ 同名, .stl 后缀)。
|
||||
桌面软件发现 mesh 侧车文件后, 直接在窗口内渲染, 不再弹浏览器。
|
||||
|
||||
真实网格来源: NX journal (nx-batch-export.vb) 导出 STEP 时同步导出 STL 到 mesh\\,
|
||||
本脚本只在"还没拿到真实网格"时充当占位。
|
||||
|
||||
用法: python gen-mesh-preview.py
|
||||
"""
|
||||
import os
|
||||
import struct
|
||||
import math
|
||||
|
||||
MESH_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'catalog', 'mesh')
|
||||
|
||||
# 型号 → (半径 mm, 高度 mm): 按型号里的规格数字粗略缩放, 仅占位用
|
||||
MODELS = [
|
||||
('UCBM25', 12.5, 60), ('UCBM32', 16, 75), ('UCBM40', 20, 90),
|
||||
('UCBM50', 25, 110), ('UCBM63', 31.5, 135), ('UCBM80', 40, 170),
|
||||
('ULP32', 16, 90), ('ULP50', 25, 120), ('ULP63', 31.5, 140),
|
||||
('USP32', 16, 90), ('USP50', 25, 120), ('USP63', 31.5, 140),
|
||||
('UGP40', 20, 100), ('UGPS32D', 16, 100),
|
||||
('LAE140', 30, 140), ('LAE225', 40, 225), ('LAE350', 55, 350),
|
||||
('UAGP080_W', 40, 80), ('UAGP080_B', 40, 80), ('UAGP120_W', 50, 120),
|
||||
('UAGP120_B', 50, 120), ('UAGP150_W', 50, 150), ('UAGP150_B', 50, 150),
|
||||
('UAGP155_W', 50, 155), ('UAGP155_B', 50, 155), ('UAGP170_W', 62.5, 170),
|
||||
('UAGP170_B', 62.5, 170), ('UAGP210_W', 62.5, 210), ('UAGP210_B', 62.5, 210),
|
||||
('UAGP215_W', 62.5, 215), ('UAGP215_B', 62.5, 215), ('UAGP300_W', 80, 300),
|
||||
('UAGP300_B', 80, 300), ('UAGP350_W', 80, 350), ('UAGP350_B', 80, 350),
|
||||
('UAGP355_W', 80, 355), ('UAGP355_B', 80, 355), ('UAGP605_W', 100, 600),
|
||||
('UAGP605_B', 100, 600),
|
||||
('KC-00-32x10', 16, 100), # KC 试点真实型号: 网格预览样例
|
||||
]
|
||||
|
||||
|
||||
def cylinder_tris(r, h, n=24):
|
||||
"""圆柱体三角网格: (法线, 顶点) 三元组列表, 轴为 Z, 底面 z=0, 顶面 z=h"""
|
||||
tris = []
|
||||
top, bot = [], []
|
||||
for i in range(n):
|
||||
a0, a1 = 2 * math.pi * i / n, 2 * math.pi * (i + 1) / n
|
||||
x0, y0 = r * math.cos(a0), r * math.sin(a0)
|
||||
x1, y1 = r * math.cos(a1), r * math.sin(a1)
|
||||
# 顶面 (z=h, 法线 +Z)
|
||||
tris.append(((0, 0, 1), ((0, 0, h), (x0, y0, h), (x1, y1, h))))
|
||||
# 底面 (z=0, 法线 -Z)
|
||||
tris.append(((0, 0, -1), ((0, 0, 0), (x1, y1, 0), (x0, y0, 0))))
|
||||
# 侧面 (两块三角, 法线径向)
|
||||
nx0, ny0 = math.cos(a0), math.sin(a0)
|
||||
nx1, ny1 = math.cos(a1), math.sin(a1)
|
||||
tris.append(((nx0, ny0, 0), ((x0, y0, 0), (x0, y0, h), (x1, y1, h))))
|
||||
tris.append(((nx1, ny1, 0), ((x0, y0, 0), (x1, y1, h), (x1, y1, 0))))
|
||||
return tris
|
||||
|
||||
|
||||
def write_stl(path, tris):
|
||||
with open(path, 'wb') as f:
|
||||
f.write(b'ONEBOT mesh preview'.ljust(80, b'\0'))
|
||||
f.write(struct.pack('<I', len(tris)))
|
||||
for (nx, ny, nz), (p0, p1, p2) in tris:
|
||||
f.write(struct.pack('<12f', nx, ny, nz,
|
||||
p0[0], p0[1], p0[2],
|
||||
p1[0], p1[1], p1[2],
|
||||
p2[0], p2[1], p2[2]))
|
||||
f.write(struct.pack('<H', 0))
|
||||
|
||||
|
||||
def main():
|
||||
if not os.path.isdir(MESH_DIR):
|
||||
os.makedirs(MESH_DIR)
|
||||
made = 0
|
||||
for name, r, h in MODELS:
|
||||
path = os.path.join(MESH_DIR, name + '.stl')
|
||||
write_stl(path, cylinder_tris(r, h))
|
||||
made += 1
|
||||
print('已生成 %d 个占位 STL → %s' % (made, MESH_DIR))
|
||||
print('提示: 真实网格由 NX journal 导出 STEP 时同步生成, 同名 .stl 覆盖本占位即可')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
487
onebot-data/tools/gen-onebot-source.ps1
Normal file
487
onebot-data/tools/gen-onebot-source.ps1
Normal file
@@ -0,0 +1,487 @@
|
||||
# ONEBOT 直线气缸目录【源数据生成器】(统一路线, 2026-08-22):
|
||||
# 系列定义 meta JSON + 参数表 CSV + 简化几何 STEP → 目录源目录 onebot-data\catalog\
|
||||
# .opc 打包改由 C# 统一内核完成: 维护窗口【重建全量目录】或 CLI:
|
||||
# OnebotCatalog\bin\OnebotCatalog.exe --buildfull onebot-data\catalog sample\OnebotCatalog_<版本>.opc
|
||||
# 数据来源: 《ONEBOT - 直线气缸 - 中文.pdf》订购码与规格参数表 (2026-08 提取)
|
||||
# 说明:
|
||||
# - STEP 为简化圆柱组合占位模型 (尺寸随缸径/行程缩放), 待 NX 母模批量导出后替换同名文件即可
|
||||
# - 相同几何的型号组合共用同一 STEP (磁石/固定形式/杆材/后盖不改变简化几何)
|
||||
# - 行程取标准档位 10/20/30/50/75/100; 手册标注"可调行程 25~1000mm"属参数化二期
|
||||
# - 本脚本只负责【生成/刷新源数据】(几何+CSV+系列定义); 目录打包/发布走 C# 统一路线
|
||||
# 用法: powershell -NoProfile -ExecutionPolicy Bypass -File onebot-data\tools\gen-onebot-source.ps1
|
||||
param(
|
||||
[string]$OutDir = (Join-Path $PSScriptRoot '..\catalog')
|
||||
)
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
$inv = [System.Globalization.CultureInfo]::InvariantCulture
|
||||
|
||||
$stepDir = Join-Path $OutDir 'step'
|
||||
$csvDir = Join-Path $OutDir 'csv'
|
||||
$seriesDir = Join-Path $OutDir 'series'
|
||||
$manDir = Join-Path $OutDir 'manual'
|
||||
New-Item -ItemType Directory -Force -Path $stepDir | Out-Null
|
||||
New-Item -ItemType Directory -Force -Path $csvDir | Out-Null
|
||||
New-Item -ItemType Directory -Force -Path $seriesDir | Out-Null
|
||||
|
||||
# ==================== 系列与分类定义 ====================
|
||||
$SERIES = New-Object System.Collections.Generic.List[object]
|
||||
$SERIES.Add(@{ code='KC'; cat='AUT'; zh='KC 系列标准气缸 (ISO15552)'; en='KC Series Standard Cylinder (ISO15552)'; kw='kc iso15552 biaozhun qigang' })
|
||||
$SERIES.Add(@{ code='KCB'; cat='AUT'; zh='KCB 系列倍力气缸'; en='KCB Series Tandem Cylinder'; kw='kcb beili qigang tandem' })
|
||||
$SERIES.Add(@{ code='KSB'; cat='AUT'; zh='KSB 系列多位置气缸'; en='KSB Series Multi-position Cylinder'; kw='ksb duoweizhi multi-position' })
|
||||
$SERIES.Add(@{ code='KCS'; cat='AUT'; zh='KCS 系列超经济型标准气缸'; en='KCS Series Economy Standard Cylinder'; kw='kcs chaojingji economy' })
|
||||
$SERIES.Add(@{ code='KS'; cat='AUT'; zh='KS 系列拉杆式标准气缸'; en='KS Series Tie-rod Standard Cylinder'; kw='ks lagan tie-rod' })
|
||||
$SERIES.Add(@{ code='KSU'; cat='AUT'; zh='KSU 系列拉杆内藏式标准气缸'; en='KSU Series Concealed Tie-rod Cylinder'; kw='ksu lagan neicang concealed' })
|
||||
$SERIES.Add(@{ code='M'; cat='MIN'; zh='M 系列不锈钢迷你缸 (ISO6432)'; en='M Series Stainless Mini Cylinder (ISO6432)'; kw='m iso6432 minigang stainless mini' })
|
||||
$SERIES.Add(@{ code='MS'; cat='MIN'; zh='MS 系列不锈钢迷你缸 (ISO6432)'; en='MS Series Stainless Mini Cylinder (ISO6432)'; kw='ms iso6432 minigang stainless mini' })
|
||||
$SERIES.Add(@{ code='MSC'; cat='MIN'; zh='MSC 系列不锈钢迷你缸 (ISO6432)'; en='MSC Series Stainless Mini Cylinder (ISO6432)'; kw='msc iso6432 minigang stainless mini' })
|
||||
$SERIES.Add(@{ code='MAL'; cat='ALU'; zh='MAL 系列铝合金迷你缸'; en='MAL Series Aluminium Mini Cylinder'; kw='mal lvhejin minigang aluminium mini' })
|
||||
$SERIES.Add(@{ code='MALC'; cat='ALU'; zh='MALC 系列铝合金迷你缸'; en='MALC Series Aluminium Mini Cylinder'; kw='malc lvhejin minigang aluminium mini' })
|
||||
$CATS = New-Object System.Collections.Generic.List[object]
|
||||
$CATS.Add(@{ code='AUT'; zh='汽车行业气缸 Automotive'; en='Automotive Cylinders' })
|
||||
$CATS.Add(@{ code='MIN'; zh='不锈钢迷你缸 (ISO6432)'; en='Stainless Mini Cylinders (ISO6432)' })
|
||||
$CATS.Add(@{ code='ALU'; zh='铝合金迷你缸'; en='Aluminium Mini Cylinders' })
|
||||
$MOUNT_DISP = @{ ''='基本型'; FA='前盖固定型 FA'; FB='后盖固定型 FB'; CA='后盖单耳固定型 CA'; CB='后盖双耳固定型 CB'; LB='前后固定型 LB'; YB='后盖支座固定型 YB'; TC='中间摇摆式 TC'; 'TC-M'='摇摆式附脚座 TC-M'; SDB='后盖摇摆式 SDB' }
|
||||
$MAGNET_DISP = @{ ''='不附磁石'; M='附磁石 M' }
|
||||
$ROD_DISP = @{ ''='碳钢'; E='不锈钢 E' }
|
||||
$CAP_DISP = @{ ''='标准摆尾型'; U='标准平尾型 U'; CM='标准圆尾型 CM' }
|
||||
$STROKES = @(10, 20, 30, 50, 75, 100)
|
||||
$STROKES_KSB = @(0, 10, 20, 30, 50, 75, 100)
|
||||
$BORE_STD = @(32, 40, 50, 63, 80, 100, 125)
|
||||
$BORE_KC = @(32, 40, 50, 63, 80, 100, 125, 160, 200, 250, 320)
|
||||
$BORE_KCS = @(32, 40, 50, 63, 80, 100)
|
||||
$BORE_M = @(8, 10, 12, 16, 20, 25, 32, 40)
|
||||
$BORE_MINI = @(16, 20, 25, 32, 40)
|
||||
$MOUNT_STD = @('', 'FA', 'FB', 'CA', 'CB', 'LB', 'YB')
|
||||
$MOUNT_TIE = @('', 'FA', 'FB', 'CA', 'CB', 'LB', 'TC', 'TC-M')
|
||||
$MOUNT_MINI = @('', 'LB', 'FA', 'FB', 'SDB')
|
||||
|
||||
# 每系列: 参数定义 (code/zh/en/unit/type/values) + 变体组合规则
|
||||
function Get-SeriesSpec([string]$code) {
|
||||
switch ($code) {
|
||||
'KC' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('00', '02', '03')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_KC),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_STD)
|
||||
)
|
||||
$rules = @()
|
||||
$rules += @{ if=@{param='mount'; op='eq'; value='YB'}; then=@{param='bore'; op='in'; values=@(32,40,50,63,80,100,125)} }
|
||||
return @{ params=$params; rules=$rules; twin=$false }
|
||||
}
|
||||
'KCB' {
|
||||
$params = @(
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_STD),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_STD)
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'KSB' {
|
||||
$params = @(
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_STD),
|
||||
@('stroke1', '行程1', 'Stroke 1', 'number', $STROKES_KSB),
|
||||
@('stroke2', '行程2', 'Stroke 2', 'number', $STROKES_KSB),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_STD)
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'KCS' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('00', '02', '03')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_KCS),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_STD)
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'KS' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('00', '02', '03')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_STD),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_TIE)
|
||||
)
|
||||
$rules = @()
|
||||
$rules += @{ if=@{param='type'; op='in'; values=@('02','03')}; then=@{param='mount'; op='in'; values=@('FA','FB','LB','TC','TC-M')} }
|
||||
return @{ params=$params; rules=$rules; twin=$false }
|
||||
}
|
||||
'KSU' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('00', '02', '03')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_STD),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_TIE)
|
||||
)
|
||||
$rules = @()
|
||||
$rules += @{ if=@{param='type'; op='in'; values=@('02','03')}; then=@{param='mount'; op='in'; values=@('FA','FB','LB','TC','TC-M')} }
|
||||
return @{ params=$params; rules=$rules; twin=$false }
|
||||
}
|
||||
'M' {
|
||||
$params = @(
|
||||
@('action', '动作形式', 'Action', 'enum', @('N', 'S', 'T', 'ND', 'NJ')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_M),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('rod', '活塞杆材质', 'Rod Material', 'enum', @('E', '')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_MINI),
|
||||
@('cap', '后盖形式', 'Cap Type', 'enum', @('', 'U', 'CM'))
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'MS' {
|
||||
$params = @(
|
||||
@('action', '动作形式', 'Action', 'enum', @('N', 'D', 'J')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_MINI),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('rod', '活塞杆材质', 'Rod Material', 'enum', @('E', '')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_MINI),
|
||||
@('cap', '后盖形式', 'Cap Type', 'enum', @('', 'U', 'CM'))
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'MSC' {
|
||||
$params = @(
|
||||
@('action', '动作形式', 'Action', 'enum', @('C', 'D', 'J')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_MINI),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('rod', '活塞杆材质', 'Rod Material', 'enum', @('E', '')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_MINI),
|
||||
@('cap', '后盖形式', 'Cap Type', 'enum', @('', 'U', 'CM'))
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'MAL' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('MAL', 'MSAL', 'MTAL', 'MALD', 'MALJ')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_MINI),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('rod', '活塞杆材质', 'Rod Material', 'enum', @('E', '')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_MINI),
|
||||
@('cap', '后盖形式', 'Cap Type', 'enum', @('', 'U', 'CM'))
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
'MALC' {
|
||||
$params = @(
|
||||
@('type', '型号', 'Type', 'enum', @('MALC', 'MALCD', 'MALCJ')),
|
||||
@('bore', '缸径', 'Bore', 'number', $BORE_MINI),
|
||||
@('stroke', '行程', 'Stroke', 'number', $STROKES),
|
||||
@('magnet', '磁石', 'Magnet', 'enum', @('', 'M')),
|
||||
@('rod', '活塞杆材质', 'Rod Material', 'enum', @('E', '')),
|
||||
@('mount', '固定形式', 'Mounting', 'enum', $MOUNT_MINI),
|
||||
@('cap', '后盖形式', 'Cap Type', 'enum', @('', 'U', 'CM'))
|
||||
)
|
||||
return @{ params=$params; rules=@(); twin=$false }
|
||||
}
|
||||
default { return @{ params=@(); rules=@(); twin=$false } }
|
||||
}
|
||||
}
|
||||
|
||||
# ==================== STEP 几何生成 (简化圆柱组合) ====================
|
||||
function Format-Num([double]$v) { return $v.ToString('0.###', $inv) }
|
||||
|
||||
function New-CylinderEntities([int]$id, [double]$x, [double]$y, [double]$z, [double]$r, [double]$len) {
|
||||
$X = Format-Num $x; $Y = Format-Num $y; $Z = Format-Num $z
|
||||
$ZT = Format-Num ($z + $len); $R = Format-Num $r
|
||||
$VY = Format-Num ($y + $r)
|
||||
$e = @(
|
||||
"#$($id)=DIRECTION('',(0.,0.,1.));",
|
||||
"#$($id+1)=CARTESIAN_POINT('',($X,$Y,$Z));",
|
||||
"#$($id+2)=CARTESIAN_POINT('',($X,$Y,$ZT));",
|
||||
"#$($id+3)=DIRECTION('',(1.,0.,0.));",
|
||||
"#$($id+4)=AXIS2_PLACEMENT_3D('',#$($id+1),#$($id),#$($id+3));",
|
||||
"#$($id+5)=CARTESIAN_POINT('',($X,$VY,$Z));",
|
||||
"#$($id+6)=CARTESIAN_POINT('',($X,$VY,$ZT));",
|
||||
"#$($id+7)=VERTEX_POINT('',#$($id+5));",
|
||||
"#$($id+8)=VERTEX_POINT('',#$($id+6));",
|
||||
"#$($id+9)=CIRCLE('',#$($id+4),$R);",
|
||||
"#$($id+10)=EDGE_CURVE('',#$($id+7),#$($id+7),#$($id+9),.T.);",
|
||||
"#$($id+11)=CYLINDRICAL_SURFACE('',#$($id+4),$R);",
|
||||
"#$($id+12)=PLANE('',#$($id+4));",
|
||||
"#$($id+13)=DIRECTION('',(0.,0.,1.));",
|
||||
"#$($id+14)=AXIS2_PLACEMENT_3D('',#$($id+2),#$($id+13),#$($id+3));",
|
||||
"#$($id+15)=PLANE('',#$($id+14));",
|
||||
"#$($id+16)=CIRCLE('',#$($id+14),$R);",
|
||||
"#$($id+17)=EDGE_CURVE('',#$($id+8),#$($id+8),#$($id+16),.T.);",
|
||||
"#$($id+18)=DIRECTION('',(0.,0.,1.));",
|
||||
"#$($id+19)=VECTOR('',#$($id+18),1.);",
|
||||
"#$($id+20)=LINE('',#$($id+5),#$($id+19));",
|
||||
"#$($id+21)=EDGE_CURVE('',#$($id+7),#$($id+8),#$($id+20),.T.);",
|
||||
"#$($id+22)=ORIENTED_EDGE('',*,*,#$($id+10),.T.);",
|
||||
"#$($id+23)=ORIENTED_EDGE('',*,*,#$($id+17),.T.);",
|
||||
"#$($id+24)=ORIENTED_EDGE('',*,*,#$($id+21),.T.);",
|
||||
"#$($id+25)=ORIENTED_EDGE('',*,*,#$($id+17),.T.);",
|
||||
"#$($id+26)=ORIENTED_EDGE('',*,*,#$($id+21),.F.);",
|
||||
"#$($id+27)=ORIENTED_EDGE('',*,*,#$($id+10),.F.);",
|
||||
"#$($id+28)=EDGE_LOOP('',(#$($id+22)));",
|
||||
"#$($id+29)=EDGE_LOOP('',(#$($id+23)));",
|
||||
"#$($id+30)=EDGE_LOOP('',(#$($id+24),#$($id+25),#$($id+26),#$($id+27)));",
|
||||
"#$($id+31)=ADVANCED_FACE('',(#$($id+30)),#$($id+11),.T.);",
|
||||
"#$($id+32)=ADVANCED_FACE('',(#$($id+28)),#$($id+12),.F.);",
|
||||
"#$($id+33)=ADVANCED_FACE('',(#$($id+29)),#$($id+15),.T.);",
|
||||
"#$($id+34)=CLOSED_SHELL('',(#$($id+31),#$($id+32),#$($id+33)));",
|
||||
"#$($id+35)=MANIFOLD_SOLID_BREP('',#$($id+34));"
|
||||
)
|
||||
return $e
|
||||
}
|
||||
|
||||
function Write-StepFile([string]$path, [double]$bore, [double]$stroke, [bool]$twin, [bool]$mini) {
|
||||
# 尺寸 (占位近似, 真实尺寸待 NX 母模导出替换)
|
||||
$wall = if ($mini) { 2.0 } else { 3.0 }
|
||||
$bodyR = $bore / 2.0 + $wall
|
||||
$capR = $bore / 2.0 + $(if ($mini) { 3.5 } else { 6.0 })
|
||||
$capLen = if ($mini) { 6.0 } else { 8.0 }
|
||||
$fcapLen = if ($mini) { 8.0 } else { 10.0 }
|
||||
$bodyLen = $stroke + $bore * 1.1 + $(if ($mini) { 20.0 } else { 30.0 })
|
||||
$rodR = [Math]::Max($bore / $(if ($mini) { 6.0 } else { 7.0 }), $(if ($mini) { 2.0 } else { 4.0 }))
|
||||
$rodBot = $bodyLen - $(if ($mini) { 8.0 } else { 12.0 })
|
||||
$rodLen = $stroke + $(if ($mini) { 20.0 } else { 26.0 })
|
||||
$rodOff = if ($twin) { $rodR * 2.0 } else { 0.0 }
|
||||
|
||||
$lines = New-Object System.Collections.Generic.List[string]
|
||||
$lines.Add('ISO-10303-21;')
|
||||
$lines.Add('HEADER;')
|
||||
$lines.Add("FILE_DESCRIPTION(('ONEBOT simplified sample geometry'),'2;1');")
|
||||
$lines.Add("FILE_NAME('$(Split-Path $path -Leaf)','2026-08-22T00:00:00',('ONEBOT'),('ONEBOT'),'','','');")
|
||||
$lines.Add("FILE_SCHEMA(('CONFIG_CONTROL_DESIGN'));")
|
||||
$lines.Add('ENDSEC;')
|
||||
$lines.Add('DATA;')
|
||||
|
||||
$ids = New-Object System.Collections.Generic.List[int]
|
||||
$nextId = 1
|
||||
$cyls = New-Object System.Collections.Generic.List[object]
|
||||
$cyls.Add(@{ x = 0.0; y = 0.0; z = -$capLen; r = $capR; len = $capLen })
|
||||
$cyls.Add(@{ x = 0.0; y = 0.0; z = 0.0; r = $bodyR; len = $bodyLen })
|
||||
$cyls.Add(@{ x = 0.0; y = 0.0; z = $bodyLen; r = $capR; len = $fcapLen })
|
||||
$cyls.Add(@{ x = -$rodOff; y = 0.0; z = $rodBot; r = $rodR; len = $rodLen })
|
||||
if ($twin) { $cyls.Add(@{ x = $rodOff; y = 0.0; z = $rodBot; r = $rodR; len = $rodLen }) }
|
||||
foreach ($cyl in $cyls) {
|
||||
[string[]]$entities = New-CylinderEntities -id $nextId -x $cyl['x'] -y $cyl['y'] -z $cyl['z'] -r $cyl['r'] -len $cyl['len']
|
||||
$lines.AddRange($entities)
|
||||
$ids.Add($nextId + 35)
|
||||
$nextId += 36
|
||||
}
|
||||
# 尾部共享实体: 注入 STYLED_ITEM 颜色 (occt-import-js 对无颜色模型会崩)
|
||||
$styledIds = New-Object System.Collections.Generic.List[string]
|
||||
$c = $nextId
|
||||
foreach ($s in $ids) {
|
||||
$lines.Add("#$c=COLOUR_RGB('',0.65,0.72,0.85);")
|
||||
$lines.Add("#$($c+1)=FILL_AREA_STYLE_COLOUR('',#$c);")
|
||||
$lines.Add("#$($c+2)=SURFACE_STYLE_FILL_AREA(#$($c+1));")
|
||||
$lines.Add("#$($c+3)=SURFACE_SIDE_STYLE('',(#$($c+2)));")
|
||||
$lines.Add("#$($c+4)=SURFACE_STYLE_USAGE(.BOTH.,#$($c+3));")
|
||||
$lines.Add("#$($c+5)=PRESENTATION_STYLE_ASSIGNMENT((#$($c+4)));")
|
||||
$lines.Add("#$($c+6)=STYLED_ITEM('',(#$($c+5)),#$s);")
|
||||
$styledIds.Add("#$($c+6)")
|
||||
$c += 7
|
||||
}
|
||||
$items = (($ids | ForEach-Object { "#$_" }) + $styledIds) -join ','
|
||||
$lines.Add("#$c=SHAPE_REPRESENTATION('',($items),#$($c+1));")
|
||||
$lines.Add("#$($c+1)=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#$($c+2)))GLOBAL_UNIT_ASSIGNED_CONTEXT((#$($c+3),#$($c+4),#$($c+5)))REPRESENTATION_CONTEXT('',''));")
|
||||
$lines.Add("#$($c+2)=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-06),#$($c+3),'');")
|
||||
$lines.Add("#$($c+3)=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));")
|
||||
$lines.Add("#$($c+4)=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));")
|
||||
$lines.Add("#$($c+5)=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());")
|
||||
$lines.Add("#$($c+6)=PRODUCT('ONEBOT','ONEBOT','',(#$($c+7)));")
|
||||
$lines.Add("#$($c+7)=PRODUCT_CONTEXT('',#$($c+8),'mechanical');")
|
||||
$lines.Add("#$($c+8)=APPLICATION_CONTEXT('configuration controlled 3d designs of mechanical parts and assemblies');")
|
||||
$lines.Add("#$($c+9)=PRODUCT_DEFINITION_FORMATION('','',#$($c+6));")
|
||||
$lines.Add("#$($c+10)=PRODUCT_DEFINITION('design','',#$($c+9),#$($c+11));")
|
||||
$lines.Add("#$($c+11)=PRODUCT_DEFINITION_CONTEXT('part definition',#$($c+8),'design');")
|
||||
$lines.Add("#$($c+12)=PRODUCT_DEFINITION_SHAPE('','',#$($c+10));")
|
||||
$lines.Add("#$($c+13)=SHAPE_DEFINITION_REPRESENTATION(#$($c+12),#$c);")
|
||||
$lines.Add('ENDSEC;')
|
||||
$lines.Add('END-ISO-10303-21;')
|
||||
|
||||
$enc = New-Object System.Text.UTF8Encoding($false)
|
||||
[System.IO.File]::WriteAllLines($path, $lines.ToArray(), $enc)
|
||||
}
|
||||
|
||||
# 双轴型号判定 (两根活塞杆)
|
||||
function Is-TwinType([string]$code, [string]$type) {
|
||||
if ($code -eq 'M') { return ($type -eq 'ND' -or $type -eq 'NJ') }
|
||||
if ($code -eq 'MS') { return ($type -eq 'D' -or $type -eq 'J') }
|
||||
if ($code -eq 'MSC') { return ($type -eq 'D' -or $type -eq 'J') }
|
||||
if ($code -eq 'MAL') { return ($type -eq 'MALD' -or $type -eq 'MALJ') }
|
||||
if ($code -eq 'MALC') { return ($type -eq 'MALCD' -or $type -eq 'MALCJ') }
|
||||
return ($type -eq '02' -or $type -eq '03')
|
||||
}
|
||||
|
||||
# 规则求值 (与 C# Configurator 同语义: 违反规则的组合不生成)
|
||||
function Cond-Matches($cond, $combo) {
|
||||
if (-not $combo.ContainsKey($cond['param'])) { return $false }
|
||||
$val = [string]$combo[$cond['param']]
|
||||
switch ($cond['op']) {
|
||||
'eq' { return ([string]$val -eq [string]$cond['value']) }
|
||||
'ne' { return ([string]$val -ne [string]$cond['value']) }
|
||||
'in' { foreach ($v in $cond['values']) { if ([string]$val -eq [string]$v) { return $true } } return $false }
|
||||
default { return $false }
|
||||
}
|
||||
}
|
||||
function Rule-Violated($rules, $combo) {
|
||||
foreach ($r in $rules) {
|
||||
if ((Cond-Matches $r['if'] $combo) -and -not (Cond-Matches $r['then'] $combo)) { return $true }
|
||||
}
|
||||
return $false
|
||||
}
|
||||
function Cond-ToJson($c) {
|
||||
if ($c['op'] -eq 'in') {
|
||||
$vals = ($c['values'] | ForEach-Object { '"' + $_ + '"' }) -join ','
|
||||
return '{"Param":"' + $c['param'] + '","Op":"in","Value":[' + $vals + ']}'
|
||||
}
|
||||
return '{"Param":"' + $c['param'] + '","Op":"' + $c['op'] + '","Value":"' + $c['value'] + '"}'
|
||||
}
|
||||
function Rule-ToJson($r) {
|
||||
return '{"If":' + (Cond-ToJson $r['if']) + ',"Then":' + (Cond-ToJson $r['then']) + '}'
|
||||
}
|
||||
|
||||
# ==================== 主流程 ====================
|
||||
$seriesJsonList = New-Object System.Collections.Generic.List[string]
|
||||
$stepNames = New-Object System.Collections.Generic.HashSet[string]
|
||||
$totalVariants = 0
|
||||
$totalSteps = 0
|
||||
|
||||
foreach ($s in $SERIES) {
|
||||
$code = $s.code
|
||||
$spec = Get-SeriesSpec $code
|
||||
$mini = ($s.cat -eq 'MIN' -or $s.cat -eq 'ALU')
|
||||
|
||||
# 变体组合: 参数值笛卡尔积
|
||||
$combos = New-Object System.Collections.Generic.List[object]
|
||||
$combos.Add(@{})
|
||||
foreach ($p in $spec.params) {
|
||||
$next = New-Object System.Collections.Generic.List[object]
|
||||
foreach ($c in $combos) {
|
||||
foreach ($v in $p[4]) {
|
||||
$nc = @{}
|
||||
foreach ($k in $c.Keys) { $nc[$k] = $c[$k] }
|
||||
$nc[$p[0]] = $v
|
||||
$next.Add($nc)
|
||||
}
|
||||
}
|
||||
$combos = $next
|
||||
}
|
||||
|
||||
# CSV 行 + 变体 JSON + STEP (按 几何键: 系列+型号段+缸径+行程)
|
||||
$csvLines = New-Object System.Collections.Generic.List[string]
|
||||
$headerCols = @('model_code')
|
||||
foreach ($p in $spec.params) { $headerCols += $p[0] }
|
||||
$headerCols += 'step_file'
|
||||
$csvLines.Add(($headerCols -join ','))
|
||||
$varJson = New-Object System.Collections.Generic.List[string]
|
||||
$geoCodes = New-Object System.Collections.Generic.HashSet[string]
|
||||
|
||||
foreach ($c in $combos) {
|
||||
# 规则过滤: 违反手册约束的组合不生成 (如 大缸径+YB、双轴型+受限固定形式)
|
||||
if (Rule-Violated $spec.rules $c) { continue }
|
||||
$typeSeg = ''
|
||||
if ($spec.params[0][0] -eq 'type' -or $spec.params[0][0] -eq 'action') { $typeSeg = [string]$c[$spec.params[0][0]] }
|
||||
$bore = [double]$c['bore']
|
||||
$stroke = if ($c.ContainsKey('stroke')) { [double]$c['stroke'] } else { [double]$c['stroke1'] }
|
||||
|
||||
# 型号编码
|
||||
$model = ''
|
||||
if ($code -eq 'KSB') {
|
||||
$model = "KSB$($c['bore'])-$($c['stroke1'])x$($c['stroke2'])$($c['magnet'])$($c['mount'])"
|
||||
} elseif ($s.cat -eq 'MIN' -or $code -eq 'MAL' -or $code -eq 'MALC') {
|
||||
$model = "$typeSeg$($c['bore'])-$($c['stroke'])$($c['magnet'])$($c['rod'])$($c['mount'])$($c['cap'])"
|
||||
} else {
|
||||
$model = "$code$typeSeg$($c['bore'])-$($c['stroke'])$($c['magnet'])$($c['mount'])"
|
||||
}
|
||||
|
||||
# 几何 STEP (共用)
|
||||
$geoKey = "$code-$typeSeg-${bore}x$stroke"
|
||||
$stepName = "$code-$typeSeg-${bore}x$stroke.step"
|
||||
if (-not $geoCodes.Contains($geoKey)) {
|
||||
[void]$geoCodes.Add($geoKey)
|
||||
if (-not $stepNames.Contains($stepName)) {
|
||||
Write-StepFile (Join-Path $stepDir $stepName) $bore $stroke (Is-TwinType $code $typeSeg) $mini
|
||||
[void]$stepNames.Add($stepName)
|
||||
$totalSteps++
|
||||
}
|
||||
}
|
||||
|
||||
# 变体 JSON 与 CSV
|
||||
$paramsJson = New-Object System.Collections.Generic.List[string]
|
||||
foreach ($p in $spec.params) {
|
||||
$v = $c[$p[0]]
|
||||
if ($p[3] -eq 'number') { $paramsJson.Add('"' + $p[0] + '":' + [string]$v) }
|
||||
else { $paramsJson.Add('"' + $p[0] + '":"' + $v + '"') }
|
||||
}
|
||||
$varJson.Add('{"modelCode":"' + $model + '","params":{' + ($paramsJson -join ',') + '},"step":"step/' + $stepName + '"}')
|
||||
$rowVals = @($model)
|
||||
foreach ($p in $spec.params) { $rowVals += [string]$c[$p[0]] }
|
||||
$rowVals += $stepName
|
||||
$csvLines.Add(($rowVals -join ','))
|
||||
$totalVariants++
|
||||
}
|
||||
|
||||
# 系列 meta JSON (series\<code>.meta.json, 与向导保存配置同构; 变体不存, 构建时从 CSV 读)
|
||||
$paramsJson = New-Object System.Collections.Generic.List[string]
|
||||
foreach ($p in $spec.params) {
|
||||
$display = ''
|
||||
if ($p[0] -eq 'mount') {
|
||||
$entries = New-Object System.Collections.Generic.List[string]
|
||||
foreach ($k in $MOUNT_DISP.Keys) { $entries.Add('"' + $k + '":"' + $MOUNT_DISP[$k] + '"') }
|
||||
$display = '"display":{' + ($entries -join ',') + '}'
|
||||
} elseif ($p[0] -eq 'magnet') {
|
||||
$display = '"display":{"":"不附磁石","M":"附磁石 M"}'
|
||||
} elseif ($p[0] -eq 'rod') {
|
||||
$display = '"display":{"":"碳钢","E":"不锈钢 E"}'
|
||||
} elseif ($p[0] -eq 'cap') {
|
||||
$display = '"display":{"":"标准摆尾型","U":"标准平尾型 U","CM":"标准圆尾型 CM"}'
|
||||
}
|
||||
$vals = New-Object System.Collections.Generic.List[string]
|
||||
foreach ($v in $p[4]) {
|
||||
if ($p[3] -eq 'number') { $vals.Add([string]$v) }
|
||||
else { $vals.Add('"' + $v + '"') }
|
||||
}
|
||||
$paramsJson.Add('{"code":"' + $p[0] + '","nameZh":"' + $p[1] + '","nameEn":"' + $p[2] + '","unit":"' + $(if ($p[3] -eq 'number') { 'mm' } else { '' }) + '","type":"' + $p[3] + '","keywords":"' + $p[0] + '","values":[' + ($vals -join ',') + ']' + $(if ($display) { ',' + $display } else { '' }) + '}')
|
||||
}
|
||||
$rulesJson = (($spec.rules | ForEach-Object { Rule-ToJson $_ }) -join ',')
|
||||
# 手册页附件 (尺寸图窗口对照用): catalog\manual\<系列>\pXX.png → source 相对路径
|
||||
$manAtt = New-Object System.Collections.Generic.List[string]
|
||||
if (Test-Path (Join-Path $manDir $code)) {
|
||||
foreach ($mf in (Get-ChildItem (Join-Path $manDir $code) -Filter '*.png' | Sort-Object Name)) {
|
||||
$manAtt.Add('{"kind":"manual","lang":"","source":"manual/' + $code + '/' + $mf.Name + '","model":null}')
|
||||
}
|
||||
}
|
||||
$sjson = '{"code":"' + $code + '","nameZh":"' + $s.zh + '","nameEn":"' + $s.en + '","keywords":"' + $s.kw + '",' +
|
||||
'"parameters":[' + ($paramsJson -join ',') + '],' +
|
||||
'"rules":[' + $rulesJson + '],' +
|
||||
'"naming":{"stepNameTemplate":"{model}.step"},' +
|
||||
'"attachments":[],"variants":[]}'
|
||||
$metaJson = '{"series":' + $sjson + ',"attachments":[' + ($manAtt -join ',') + ']}'
|
||||
[System.IO.File]::WriteAllText((Join-Path $seriesDir ($code + '.meta.json')), $metaJson, (New-Object System.Text.UTF8Encoding($false)))
|
||||
|
||||
# 写 CSV
|
||||
[System.IO.File]::WriteAllLines((Join-Path $csvDir ($code + '.csv')), $csvLines.ToArray(), (New-Object System.Text.UTF8Encoding($true)))
|
||||
Write-Output ("系列 " + $code + ": " + $combos.Count + " 个变体, 几何 STEP " + $geoCodes.Count + " 个")
|
||||
}
|
||||
|
||||
# catalog.json (源目录: 目录级定义 + 分类系列列表; series 定义在 series\*.meta.json)
|
||||
$catJson = New-Object System.Collections.Generic.List[string]
|
||||
foreach ($c in $CATS) {
|
||||
$codes = ($SERIES | Where-Object { $_.cat -eq $c.code } | ForEach-Object { '"' + $_.code + '"' }) -join ','
|
||||
$catJson.Add('{"code":"' + $c.code + '","nameZh":"' + $c.zh + '","nameEn":"' + $c.en + '","keywords":"","series":[' + $codes + ']}')
|
||||
}
|
||||
$catalogJson = '{"schemaVersion":"1.0","catalogName":"ONEBOT 气动元件目录","catalogNameEn":"ONEBOT Pneumatic Catalog",' +
|
||||
'"catalogVersion":"2026.08","defaultLang":"zh","langs":["zh","en"],' +
|
||||
'"categories":[' + ($catJson -join ',') + '],' +
|
||||
'"series":[]}'
|
||||
[System.IO.File]::WriteAllText((Join-Path $OutDir 'catalog.json'), $catalogJson, (New-Object System.Text.UTF8Encoding($false)))
|
||||
|
||||
Write-Output ""
|
||||
Write-Output ("完成: " + $SERIES.Count + " 个系列, " + $totalVariants + " 个变体, " + $totalSteps + " 个几何 STEP")
|
||||
Write-Output ("源目录: " + $OutDir + " (catalog.json + series\*.meta.json + csv\ + step\)")
|
||||
Write-Output ("下一步打包 (C# 统一内核): OnebotCatalog\bin\OnebotCatalog.exe --buildfull <源目录> <输出.opc>")
|
||||
90
onebot-data/tools/jelpc-crossref.py
Normal file
90
onebot-data/tools/jelpc-crossref.py
Normal file
@@ -0,0 +1,90 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# 从佳尔灵英文目录 PDF 生成平替对照表 (JELPC → 我方型号)
|
||||
# 原理: 系列对照 (SQ↔KCS, SI↔KC, SIB↔KCB, SC/SU↔KS/KSU, SCT↔KSB, MAL/MALC 同名)
|
||||
# + 抽取 PDF 中的 系列+缸径x行程 组合 → 构造我方基础型型号 → 必须存在于我方 CSV 才写入
|
||||
# 输出: OnebotCatalog\onebot-data\catalog\crossref.csv
|
||||
# 用法: python tools\jelpc-crossref.py
|
||||
import fitz, re, os, sys
|
||||
|
||||
# 路径基于脚本自身位置 (OnebotCatalog\onebot-data\tools\ → 上溯两级到 OnebotCatalog)
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
PDF = os.path.join(ROOT, '4_JELPC_E-Catalog_EN.pdf')
|
||||
CSV_DIR = os.path.join(ROOT, 'onebot-data', 'catalog', 'csv')
|
||||
OUT = os.path.join(ROOT, 'onebot-data', 'catalog', 'crossref.csv')
|
||||
|
||||
# 佳尔灵系列 → (我方系列, 我方基础型号段, 是否双轴字母映射)
|
||||
# 我方型号构造规则 (与 build-onebot 一致):
|
||||
# KC类: <我方系列><type><缸径>-<行程> type: 00 标准 / 02 双轴 / 03 双轴可调
|
||||
# MAL类: <type段><缸径>-<行程> type段: MAL / MALC
|
||||
SERIES_MAP = {
|
||||
"SI": ("KC", "00"),
|
||||
"SIB": ("KCB", ""),
|
||||
"SQ": ("KCS", "00"),
|
||||
"SC": ("KS", "00"),
|
||||
"SU": ("KSU", "00"),
|
||||
"SCT": ("KSB", ""),
|
||||
"MAL": ("MAL", "MAL"),
|
||||
"MALC": ("MALC", "MALC"),
|
||||
}
|
||||
|
||||
def main():
|
||||
# 1) 我方型号集合 (CSV 第 1 列)
|
||||
ours = set()
|
||||
for fn in os.listdir(CSV_DIR):
|
||||
if not fn.endswith('.csv'):
|
||||
continue
|
||||
with open(os.path.join(CSV_DIR, fn), encoding='utf-8-sig') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line or line.startswith('model_code'):
|
||||
continue
|
||||
code = line.split(',')[0].strip()
|
||||
if code:
|
||||
ours.add(code)
|
||||
|
||||
# 2) 佳尔灵 PDF 全文本
|
||||
doc = fitz.open(PDF)
|
||||
full = '\n'.join(doc[i].get_text() for i in range(doc.page_count))
|
||||
doc.close()
|
||||
|
||||
# 3) 抽取 系列+型号段+缸径-行程 组合
|
||||
rows = [] # (jpc_code, our_code)
|
||||
seen = set()
|
||||
for jseries, (oseries, otype) in SERIES_MAP.items():
|
||||
# 型号段字母: 标准(无)/D(双轴)/J(双轴可调) 等
|
||||
pat = re.compile(r'\b' + jseries + r'([A-Z]?)(\d{1,3})-(\d{1,4})\b')
|
||||
for m in pat.finditer(full):
|
||||
seg = m.group(1)
|
||||
bore = m.group(2)
|
||||
stroke = m.group(3)
|
||||
if len(stroke) > 3: # 过滤表格数字误匹配 (行程一般 1~3 位)
|
||||
continue
|
||||
jpc_code = m.group(0)
|
||||
# 构造我方型号
|
||||
if oseries in ("MAL", "MALC"):
|
||||
our = otype + bore + '-' + stroke
|
||||
elif oseries == "KSB":
|
||||
our = oseries + bore + '-0x' + stroke # 双行程: 行程1=0 行程2=stroke (占位)
|
||||
else:
|
||||
t = {"": "00", "D": "02", "J": "03"}.get(seg, "00")
|
||||
our = oseries + t + bore + '-' + stroke
|
||||
if our not in ours:
|
||||
continue
|
||||
key = (jpc_code, our)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
rows.append((jpc_code, our))
|
||||
|
||||
rows.sort(key=lambda x: (x[1], x[0]))
|
||||
print(f'生成对照 {len(rows)} 行 (我方型号已校验存在)')
|
||||
|
||||
# 4) 写 crossref.csv (覆盖; 其余品牌行请自行追加)
|
||||
with open(OUT, 'w', encoding='utf-8-sig', newline='') as f:
|
||||
f.write('brand,foreign_model,our_model,note\n')
|
||||
for jpc, our in rows:
|
||||
f.write(f'JELPC,{jpc},{our},基础型平替(待核对)\n')
|
||||
print('已写:', OUT)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
176
onebot-data/tools/manual-pages-to-pdf.py
Normal file
176
onebot-data/tools/manual-pages-to-pdf.py
Normal file
@@ -0,0 +1,176 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
manual-pages-to-pdf.py —— 把各系列手册页 PNG 打包成 PDF (供"下载数据表 PDF"用)
|
||||
|
||||
背景: 尺寸图窗口显示的手册页是 PNG (manual\\<系列>\\pXX.png)。客户还需要能
|
||||
下载 PDF 文档 → 本脚本把每个系列的手册页按序合成一个 PDF, 输出
|
||||
manual\\<系列>\\<系列>_manual.pdf, 并把 datasheet 附件写进 series\\<系列>.meta.json
|
||||
(软件里【下载数据表 PDF】按钮直接可用, 网页/桌面两端一致)。
|
||||
|
||||
纯标准库实现 (zlib 解/压缩 PNG + 手写 PDF), 无任何第三方依赖。
|
||||
真实手册替换 pXX.png 后重跑本脚本即可更新 PDF。
|
||||
|
||||
用法: python manual-pages-to-pdf.py
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import struct
|
||||
import zlib
|
||||
|
||||
BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
MANUAL_DIR = os.path.join(BASE, 'catalog', 'manual')
|
||||
SERIES_DIR = os.path.join(BASE, 'catalog', 'series')
|
||||
|
||||
# A4 页面 (pt)
|
||||
PAGE_W, PAGE_H = 595.28, 841.89
|
||||
|
||||
|
||||
def parse_png(path):
|
||||
"""解析 PNG → (width, height, RGB 字节串)。支持 8bit 灰度/RGB/RGBA, 非隔行。"""
|
||||
with open(path, 'rb') as f:
|
||||
data = f.read()
|
||||
assert data[:8] == b'\x89PNG\r\n\x1a\n', '非 PNG: %s' % path
|
||||
pos, idat, w, h, bd, ct, interlace = 8, b'', 0, 0, 0, 0, 0
|
||||
while pos < len(data):
|
||||
(length,) = struct.unpack('>I', data[pos:pos + 4])
|
||||
typ = data[pos + 4:pos + 8]
|
||||
chunk = data[pos + 8:pos + 8 + length]
|
||||
if typ == b'IHDR':
|
||||
w, h, bd, ct, _, _, interlace = struct.unpack('>IIBBBBB', chunk)
|
||||
elif typ == b'IDAT':
|
||||
idat += chunk
|
||||
elif typ == b'IEND':
|
||||
break
|
||||
pos += 12 + length
|
||||
assert bd == 8 and interlace == 0, '仅支持 8bit 非隔行 PNG'
|
||||
channels = {0: 1, 2: 3, 4: 2, 6: 4}.get(ct)
|
||||
assert channels, '不支持的色彩类型 %d' % ct
|
||||
raw = zlib.decompress(idat)
|
||||
bpp = channels
|
||||
stride = w * bpp
|
||||
out = bytearray()
|
||||
prev = bytearray(stride)
|
||||
for y in range(h):
|
||||
f = raw[y * (stride + 1)]
|
||||
line = bytearray(raw[y * (stride + 1) + 1:(y + 1) * (stride + 1)])
|
||||
if f == 1: # Sub
|
||||
for i in range(bpp, stride):
|
||||
line[i] = (line[i] + line[i - bpp]) & 0xFF
|
||||
elif f == 2: # Up
|
||||
for i in range(stride):
|
||||
line[i] = (line[i] + prev[i]) & 0xFF
|
||||
elif f == 3: # Average
|
||||
for i in range(stride):
|
||||
a = line[i - bpp] if i >= bpp else 0
|
||||
line[i] = (line[i] + ((a + prev[i]) >> 1)) & 0xFF
|
||||
elif f == 4: # Paeth
|
||||
for i in range(stride):
|
||||
a = line[i - bpp] if i >= bpp else 0
|
||||
b = prev[i]
|
||||
c = prev[i - bpp] if i >= bpp else 0
|
||||
p = a + b - c
|
||||
pa, pb, pc = abs(p - a), abs(p - b), abs(p - c)
|
||||
pr = a if (pa <= pb and pa <= pc) else (b if pb <= pc else c)
|
||||
line[i] = (line[i] + pr) & 0xFF
|
||||
if channels == 4: # RGBA → RGB (白底合成)
|
||||
rgb = bytearray(w * 3)
|
||||
for i in range(w):
|
||||
a4 = line[i * 4 + 3]
|
||||
for k in range(3):
|
||||
rgb[i * 3 + k] = (line[i * 4 + k] * a4 + 255 * (255 - a4)) // 255
|
||||
out += rgb
|
||||
elif channels == 1: # 灰度 → RGB
|
||||
rgb = bytearray(w * 3)
|
||||
for i in range(w):
|
||||
rgb[i * 3] = rgb[i * 3 + 1] = rgb[i * 3 + 2] = line[i]
|
||||
out += rgb
|
||||
else:
|
||||
out += line
|
||||
prev = line
|
||||
return w, h, bytes(out)
|
||||
|
||||
|
||||
def build_pdf(images):
|
||||
"""images: [(w, h, rgb_bytes)] → PDF 字节串 (每图一页 A4 等比铺满)"""
|
||||
objs = [] # (num, bytes)
|
||||
kids = []
|
||||
|
||||
def add(body):
|
||||
objs.append((len(objs) + 1, body))
|
||||
return len(objs)
|
||||
|
||||
for (w, h, rgb) in images:
|
||||
# 等比缩放铺满 A4
|
||||
scale = min(PAGE_W / w, PAGE_H / h)
|
||||
dw, dh = w * scale, h * scale
|
||||
x0, y0 = (PAGE_W - dw) / 2.0, (PAGE_H - dh) / 2.0
|
||||
stream = b'q %f 0 0 %f %f %f cm /Im0 Do Q' % (dw, dh, x0, y0)
|
||||
img_num = add(b'<< /Type /XObject /Subtype /Image /Width %d /Height %d '
|
||||
b'/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode '
|
||||
b'/Length %d >>\nstream\n' % (w, h, len(zlib.compress(rgb, 6)))
|
||||
+ zlib.compress(rgb, 6) + b'\nendstream')
|
||||
content_num = add(b'<< /Length %d >>\nstream\n' % len(stream) + stream + b'\nendstream')
|
||||
page_num = add(b'<< /Type /Page /Parent %d 0 R /MediaBox [0 0 %f %f] '
|
||||
b'/Resources << /XObject << /Im0 %d 0 R >> >> /Contents %d 0 R >>\n'
|
||||
% (0, PAGE_W, PAGE_H, img_num, content_num))
|
||||
kids.append(page_num)
|
||||
|
||||
pages_num = len(objs) + 1
|
||||
kids_ref = b' '.join(b'%d 0 R' % k for k in kids)
|
||||
pages_obj = (b'<< /Type /Pages /Kids [%s] /Count %d >>' % (kids_ref, len(kids)))
|
||||
objs.append((pages_num, pages_obj))
|
||||
catalog_num = pages_num + 1
|
||||
objs.append((catalog_num, b'<< /Type /Catalog /Pages %d 0 R >>' % pages_num))
|
||||
# 修正 page 里的 Parent 引用
|
||||
for i, (n, body) in enumerate(objs):
|
||||
if b'/Parent 0 0 R' in body:
|
||||
objs[i] = (n, body.replace(b'/Parent 0 0 R', b'/Parent %d 0 R' % pages_num))
|
||||
|
||||
out = bytearray(b'%PDF-1.4\n%\xe2\xe3\xcf\xd3\n')
|
||||
offsets = []
|
||||
for n, body in objs:
|
||||
offsets.append(len(out))
|
||||
out += b'%d 0 obj\n' % n + body + b'\nendobj\n'
|
||||
xref_pos = len(out)
|
||||
out += b'xref\n0 %d\n' % (len(objs) + 1)
|
||||
out += b'0000000000 65535 f \n'
|
||||
for off in offsets:
|
||||
out += b'%010d 00000 n \n' % off
|
||||
out += b'trailer\n<< /Size %d /Root %d 0 R >>\nstartxref\n%d\n%%%%EOF\n' % (len(objs) + 1, catalog_num, xref_pos)
|
||||
return bytes(out)
|
||||
|
||||
|
||||
def update_meta(series, pdf_name):
|
||||
meta_path = os.path.join(SERIES_DIR, series + '.meta.json')
|
||||
with open(meta_path, 'r', encoding='utf-8') as f:
|
||||
obj = json.load(f)
|
||||
atts = list(obj.get('attachments', []))
|
||||
atts = [a for a in atts if a.get('kind') != 'datasheet']
|
||||
atts.append({'kind': 'datasheet', 'lang': '', 'source': 'manual/%s/%s' % (series, pdf_name), 'model': None})
|
||||
obj['attachments'] = atts
|
||||
with open(meta_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(obj, f, ensure_ascii=False)
|
||||
|
||||
|
||||
def main():
|
||||
made = 0
|
||||
for series in sorted(os.listdir(MANUAL_DIR)):
|
||||
d = os.path.join(MANUAL_DIR, series)
|
||||
if not os.path.isdir(d):
|
||||
continue
|
||||
pngs = sorted(f for f in os.listdir(d) if f.lower().endswith('.png'))
|
||||
if not pngs:
|
||||
continue
|
||||
images = [parse_png(os.path.join(d, p)) for p in pngs]
|
||||
pdf_name = series + '_manual.pdf'
|
||||
with open(os.path.join(d, pdf_name), 'wb') as f:
|
||||
f.write(build_pdf(images))
|
||||
update_meta(series, pdf_name)
|
||||
made += 1
|
||||
print('OK %s: %d 页 → %s' % (series, len(images), pdf_name))
|
||||
print('完成 %d 个系列 PDF' % made)
|
||||
print('提示: 替换手册页 PNG 后重跑本脚本更新 PDF, 再【重建全量目录】+ 发布')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
50
onebot-data/tools/render-manual-pages.py
Normal file
50
onebot-data/tools/render-manual-pages.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# 把 ONEBOT 手册 PDF 的系列页拆出渲染成图片 (供目录软件"尺寸图"窗口对照查看)
|
||||
# 用法:
|
||||
# python tools\render-manual-pages.py # 渲染全部系列
|
||||
# python tools\render-manual-pages.py KC # 只渲染一个系列
|
||||
# 输出: OnebotCatalog\onebot-data\catalog\manual\<系列>\p<物理页码>.png (灰度 PNG 110dpi, 源目录布局)
|
||||
import fitz, os, sys
|
||||
|
||||
PDF = r"OnebotCatalog\ONEBOT - 直线气缸 - 中文.pdf"
|
||||
OUT = r"OnebotCatalog\onebot-data\catalog\manual"
|
||||
DPI = 110
|
||||
|
||||
# 系列 → 手册物理页码 (1-based, 含首尾); 依据: 手册印刷页码 = 物理页码 - 1
|
||||
SERIES_PAGES = {
|
||||
"KC": [2, 3, 4, 5, 6, 11, 12], # KC 全缸径: 32~125 (p2-6) + 125~320 (p11-12)
|
||||
"KCB": [9, 10],
|
||||
"KSB": [16, 17],
|
||||
"KCS": [13],
|
||||
"KS": [14, 15],
|
||||
"KSU": [14, 15],
|
||||
"M": [22, 23, 24, 25, 26, 27],
|
||||
"MS": [28, 29, 30, 31, 32],
|
||||
"MSC": [33, 34, 35],
|
||||
"MAL": [36, 37, 38, 39, 40],
|
||||
"MALC": [41, 42, 43],
|
||||
}
|
||||
|
||||
def main():
|
||||
only = sys.argv[1] if len(sys.argv) > 1 else None
|
||||
doc = fitz.open(PDF)
|
||||
todo = {k: v for k, v in SERIES_PAGES.items()} if only is None else {only: SERIES_PAGES.get(only, [])}
|
||||
total = 0
|
||||
for series, pages in todo.items():
|
||||
if not pages:
|
||||
print(f"[warn] 未知系列: {only}")
|
||||
continue
|
||||
d = os.path.join(OUT, series)
|
||||
os.makedirs(d, exist_ok=True)
|
||||
for p in pages:
|
||||
out = os.path.join(d, f"p{p:02d}.png")
|
||||
pix = doc[p - 1].get_pixmap(dpi=DPI, colorspace=fitz.csGRAY)
|
||||
pix.save(out)
|
||||
kb = os.path.getsize(out) // 1024
|
||||
total += kb
|
||||
print(f"{series} p{p:02d} -> {kb} KB")
|
||||
doc.close()
|
||||
print(f"完成, 共 {total // 1024} MB")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
40
onebot-data/tools/scan-manual-pages.py
Normal file
40
onebot-data/tools/scan-manual-pages.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# 扫描 ONEBOT 手册 PDF: 定位每个系列的章节页范围 + 参数/尺寸关键词页
|
||||
# 用法: python tools\scan-manual-pages.py
|
||||
import fitz, os, re, sys
|
||||
|
||||
pdf = r"OnebotCatalog\ONEBOT - 直线气缸 - 中文.pdf"
|
||||
doc = fitz.open(pdf)
|
||||
DIGITS = {0xF6B1 + i: str(i) for i in range(10)}
|
||||
|
||||
def dec(text):
|
||||
return "".join(DIGITS.get(ord(ch), ch) for ch in text)
|
||||
|
||||
# 系列代码 → 显示名 (来自 build-onebot-catalog.ps1)
|
||||
SERIES = ["KC", "KCB", "KSB", "KCS", "KS", "KSU", "M", "MS", "MSC", "MAL", "MALC"]
|
||||
KEYWORDS = ["订购", "规格", "参数", "外形尺寸", "符号", "特性", "理论出力", "重量", "结构"]
|
||||
|
||||
print("总页数:", doc.page_count)
|
||||
pages = []
|
||||
for i in range(doc.page_count):
|
||||
t = dec(doc[i].get_text())
|
||||
pages.append(t)
|
||||
|
||||
# 1) 每页出现的系列码标题 (页首大字号? 简化: 整页文本匹配)
|
||||
hits = {}
|
||||
for i, t in enumerate(pages):
|
||||
found = set()
|
||||
for s in SERIES:
|
||||
# 系列标题一般单独成行, 如 "KC 系列" / "KC系列"
|
||||
if re.search(r"(?m)^\s*" + s + r"\s*系列", t) or re.search(r"(?m)^\s*" + s + r"系列", t):
|
||||
found.add(s)
|
||||
if found:
|
||||
hits[i + 1] = sorted(found)
|
||||
kw = [k for k in KEYWORDS if k in t]
|
||||
print(f"p{i+1:3d} 系列: {found} 关键词: {kw[:4]}")
|
||||
|
||||
print("\n--- 每页系列线索 (含页码的系列码出现) ---")
|
||||
for i, t in enumerate(pages):
|
||||
for s in SERIES:
|
||||
if re.search(r"(?m)^\s*" + s + r"\s*$", t): # 整页只有系列码的目录页可能
|
||||
print(f"p{i+1:3d} 独立行: {s}")
|
||||
93
onebot-data/tools/simplify-stl.py
Normal file
93
onebot-data/tools/simplify-stl.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
simplify-stl.py —— 简化过大的 STL 网格 (窗口内 3D 预览用, 纯 numpy 顶点聚类, 零额外依赖)
|
||||
|
||||
用途: 屏幕预览不需要几十 MB 的精细网格; 本脚本把 mesh\\ 里 > 阈值的 STL
|
||||
按网格边长 (GRID_MM) 做顶点聚类, 体积缩小 3~10 倍, 外形基本不变。
|
||||
|
||||
用法: python simplify-stl.py (处理 mesh\\ 下所有 > 5MB 的 .stl, 就地覆盖)
|
||||
"""
|
||||
import os
|
||||
import re
|
||||
import struct
|
||||
|
||||
import numpy as np
|
||||
|
||||
BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
MESH_DIR = os.path.join(BASE, 'catalog', 'mesh')
|
||||
SIZE_MIN = 2 * 1024 * 1024 # 只处理 2MB 以上的网格 (控制窗口内渲染内存)
|
||||
GRID_MM = 0.75 # 聚类网格边长 (mm): 越大越简 (0.5~1.0 预览合适)
|
||||
|
||||
|
||||
def read_stl(path):
|
||||
"""自动识别二进制/ASCII STL, 返回 (N,3,3) 三角顶点数组"""
|
||||
with open(path, 'rb') as f:
|
||||
head = f.read(5)
|
||||
if head[:5] == b'solid':
|
||||
# ASCII STL: 正则抽出所有 vertex 行
|
||||
with open(path, 'r', errors='ignore') as f:
|
||||
txt = f.read()
|
||||
arr = np.array(re.findall(r'vertex\s+([-\deE+.]+)\s+([-\deE+.]+)\s+([-\deE+.]+)', txt),
|
||||
dtype=np.float32)
|
||||
return arr.reshape(-1, 3, 3)
|
||||
with open(path, 'rb') as f:
|
||||
f.read(80)
|
||||
(n,) = struct.unpack('<I', f.read(4))
|
||||
raw = np.frombuffer(f.read(n * 50), dtype=np.uint8).reshape(n, 50)
|
||||
# 每条记录 50 字节: 12 个 float (48B) + 2B 属性; 截取前 48B 再按 float 视图
|
||||
f32 = np.ascontiguousarray(raw[:, :48]).view('<f4').reshape(n, 12)
|
||||
return f32[:, 3:].reshape(n, 3, 3)
|
||||
|
||||
|
||||
def write_binary_stl(path, tris):
|
||||
n = len(tris)
|
||||
with open(path, 'wb') as f:
|
||||
f.write(b'ONEBOT simplified mesh'.ljust(80, b'\0'))
|
||||
f.write(struct.pack('<I', n))
|
||||
for tri in tris:
|
||||
p0, p1, p2 = tri[0], tri[1], tri[2]
|
||||
nrm = np.cross(p1 - p0, p2 - p0)
|
||||
norm = np.linalg.norm(nrm)
|
||||
nrm = nrm / norm if norm > 1e-12 else np.array([0.0, 0.0, 1.0])
|
||||
f.write(struct.pack('<12f', nrm[0], nrm[1], nrm[2],
|
||||
p0[0], p0[1], p0[2], p1[0], p1[1], p1[2], p2[0], p2[1], p2[2]))
|
||||
f.write(struct.pack('<H', 0))
|
||||
|
||||
|
||||
def simplify(path):
|
||||
tris = read_stl(path)
|
||||
n_in = len(tris)
|
||||
verts = tris.reshape(-1, 3)
|
||||
# 顶点聚类: 落到同一网格单元的顶点合并为均值点
|
||||
cell = np.floor(verts / GRID_MM).astype(np.int64)
|
||||
_, inv, counts = np.unique(cell, axis=0, return_inverse=True, return_counts=True)
|
||||
sums = np.zeros((counts.shape[0], 3))
|
||||
np.add.at(sums, inv, verts)
|
||||
new_verts = sums / counts[:, None]
|
||||
# 重映射三角形, 丢弃退化 (两顶点落入同一单元)
|
||||
idx = inv.reshape(-1, 3)
|
||||
keep = (idx[:, 0] != idx[:, 1]) & (idx[:, 1] != idx[:, 2]) & (idx[:, 0] != idx[:, 2])
|
||||
out = new_verts[idx[keep]]
|
||||
write_binary_stl(path, out)
|
||||
return n_in, len(out)
|
||||
|
||||
|
||||
def main():
|
||||
if not os.path.isdir(MESH_DIR):
|
||||
print('mesh 目录不存在')
|
||||
return
|
||||
for name in sorted(os.listdir(MESH_DIR)):
|
||||
if not name.lower().endswith('.stl'):
|
||||
continue
|
||||
p = os.path.join(MESH_DIR, name)
|
||||
size_in = os.path.getsize(p)
|
||||
if size_in < SIZE_MIN:
|
||||
continue
|
||||
n_in, n_out = simplify(p)
|
||||
print('%s: %d → %d 三角面 (%.1fMB → %.1fMB)' % (
|
||||
name, n_in, n_out, size_in / 1048576.0, os.path.getsize(p) / 1048576.0))
|
||||
print('完成')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
74
onebot-data/tools/step-to-stl.py
Normal file
74
onebot-data/tools/step-to-stl.py
Normal file
@@ -0,0 +1,74 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
step-to-stl.py —— 真实 STEP 批量转 STL 网格 (桌面软件窗口内 3D 预览用)
|
||||
|
||||
内核: OpenCASCADE 的 Python 绑定 (cadquery/OCP, 开源 LGPL)。
|
||||
用途: 把 catalog\\step\\ 里的真实数模 (体积 > 20KB 的 .step/.stp, 占位几何 ~7KB 自动跳过)
|
||||
转成 catalog\\mesh\\ 下同名 .stl 网格。桌面 3D 标签页发现有网格就在窗口内直渲。
|
||||
|
||||
断点续跑: 同名 STL 已存在且不比 STEP 旧 → 跳过。
|
||||
以后新增真实 STEP 后重跑本脚本即可 (或用 NX journal 的 exportStl 自动导出)。
|
||||
|
||||
用法: python step-to-stl.py
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
|
||||
BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
STEP_DIR = os.path.join(BASE, 'catalog', 'step')
|
||||
MESH_DIR = os.path.join(BASE, 'catalog', 'mesh')
|
||||
REAL_MIN_BYTES = 20 * 1024 # 20KB 以上算真实数模 (占位几何 ~7KB)
|
||||
LIN_DEFLECTION = 1.5 # 网格线性偏差 (mm): 越小越精细、文件越大 (1.5mm 屏幕预览足够, 保证流畅旋转)
|
||||
|
||||
|
||||
def convert(step_path, stl_path):
|
||||
from cadquery.occ_impl.shapes import Shape
|
||||
from OCP.STEPControl import STEPControl_Reader
|
||||
from OCP.StlAPI import StlAPI_Writer
|
||||
from OCP.BRepMesh import BRepMesh_IncrementalMesh
|
||||
from OCP.IFSelect import IFSelect_RetDone
|
||||
|
||||
reader = STEPControl_Reader()
|
||||
if reader.ReadFile(str(step_path)) != IFSelect_RetDone:
|
||||
raise RuntimeError('STEP 读取失败: %s' % step_path)
|
||||
reader.TransferRoots()
|
||||
shape = Shape(reader.OneShape())
|
||||
BRepMesh_IncrementalMesh(shape.wrapped, LIN_DEFLECTION, False, 0.5, True).Perform()
|
||||
writer = StlAPI_Writer()
|
||||
writer.SetASCIIMode(False) # 二进制 STL (比 ASCII 小 ~3 倍)
|
||||
if not writer.Write(shape.wrapped, str(stl_path)):
|
||||
raise RuntimeError('STL 写出失败: %s' % stl_path)
|
||||
|
||||
|
||||
def main():
|
||||
if not os.path.isdir(MESH_DIR):
|
||||
os.makedirs(MESH_DIR)
|
||||
step_files = [f for f in os.listdir(STEP_DIR)
|
||||
if f.lower().endswith(('.step', '.stp'))]
|
||||
done = skip = 0
|
||||
errors = []
|
||||
for name in sorted(step_files):
|
||||
step_path = os.path.join(STEP_DIR, name)
|
||||
if os.path.getsize(step_path) < REAL_MIN_BYTES:
|
||||
continue # 占位几何, 不转
|
||||
stl_path = os.path.join(MESH_DIR, os.path.splitext(name)[0] + '.stl')
|
||||
# 跳过条件: STL 存在、比 STEP 新、且不是占位网格 (<50KB 视为占位, 强制重转)
|
||||
if (os.path.exists(stl_path) and os.path.getsize(stl_path) > 50 * 1024
|
||||
and os.path.getmtime(stl_path) >= os.path.getmtime(step_path)):
|
||||
skip += 1
|
||||
continue
|
||||
try:
|
||||
convert(step_path, stl_path)
|
||||
done += 1
|
||||
print(' OK %-24s -> %s (%.1f KB)' % (name, os.path.basename(stl_path),
|
||||
os.path.getsize(stl_path) / 1024.0))
|
||||
except Exception as e:
|
||||
errors.append('%s: %s' % (name, e))
|
||||
print('FAIL %s: %s' % (name, e))
|
||||
print('完成: 转换 %d, 跳过 %d, 失败 %d → %s' % (done, skip, len(errors), MESH_DIR))
|
||||
if errors:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
157
onebot-data/数据维护说明书.md
Normal file
157
onebot-data/数据维护说明书.md
Normal file
@@ -0,0 +1,157 @@
|
||||
# 数据维护说明书(ONEBOT 目录)
|
||||
|
||||
> 适用:欧霓博目录维护人员(不用写代码)。所有改动都在**唯一数据源** `OnebotCatalog\onebot-data\catalog\` 里做,
|
||||
> 然后"重建 → 发布"两步生效。全流程图形界面操作。
|
||||
|
||||
## 一、进入维护界面
|
||||
|
||||
| 方式 | 操作 |
|
||||
| -------- | -------------------------------------- |
|
||||
| 快捷方式 | 工作区根目录双击`ONEBOT目录-维护版` |
|
||||
| bat | 双击`OnebotCatalog\bin\维护入口.bat` |
|
||||
| 密码 | `onebot888`(输错不会进) |
|
||||
|
||||
输完密码,顶栏出现 **【维护入口】** 按钮 → 点它打开维护窗口。
|
||||
|
||||
## 二、维护界面两个窗口
|
||||
|
||||
**维护窗口**(数据包总览):
|
||||
|
||||
- 系列清单表:当前包的系列/变体数/参数/规则/附件
|
||||
- 【校验】:检查 STEP 缺失、编码重复、规则冲突、附件缺失
|
||||
- 【加载数据包】:换用别的 .opc
|
||||
- 【目录制作器】:进入编辑(下面所有场景都在这里做)
|
||||
|
||||
**目录制作器**(编辑主战场):
|
||||
|
||||
- 顶部【数据源目录】:默认已填 `onebot-data\catalog`,不用动
|
||||
- 顶部【系列下拉】:选要编辑的系列(KC/KCB/KSB/…)
|
||||
- 5 个标签页:导入 / 参数 / 编码 / 规则 / 附件与生成
|
||||
- 【保存配置】:把修改写回 `series\<系列>.meta.json`
|
||||
- 【重建全量目录】:把源目录打包成新的 .opc(**核心按钮**)
|
||||
|
||||
## 三、日常维护场景(想做什么 → 怎么做)
|
||||
|
||||
### 1. 改系列定义(参数名/取值/规则/显示名)
|
||||
|
||||
```
|
||||
目录制作器 → 系列下拉选系列 → 改「参数」/「规则」表格
|
||||
→ 【保存配置】→ 【重建全量目录】
|
||||
```
|
||||
|
||||
- 显示名映射列格式:`值:显示,值:显示`(如 `:基本型,M:附磁石`)
|
||||
- 规则示例:条件 `mount eq YB` → 约束 `bore in 32,40,50`(即 YB 固定形式只有这几个缸径)
|
||||
|
||||
### 2. 改型号数据(增删型号/改编码/调参数值)
|
||||
|
||||
```
|
||||
Excel 打开 OnebotCatalog\onebot-data\catalog\csv\<系列>.csv
|
||||
→ 改完另存为 "CSV UTF-8(逗号分隔)"
|
||||
→ 回到制作器 →【重建全量目录】
|
||||
```
|
||||
|
||||
- 第 1 列 `model_code` = 型号编码(必须唯一)
|
||||
- 最后一列 `step_file` = 该型号用的 STEP 文件名(多个型号可指向同一文件)
|
||||
- 数值列不带单位(如缸径写 32 不写 32mm)
|
||||
|
||||
### 3. 换/补数模(STEP 文件)
|
||||
|
||||
```
|
||||
NX 批量导出 (nx-batch-export.vb) 输出到 onebot-data\catalog\step\
|
||||
或手动拷贝单个 STEP 进去
|
||||
→【重建全量目录】(已存在的文件自动跳过, 可断点续跑; 想重导先删该文件)
|
||||
```
|
||||
|
||||
- **文件名(前缀)必须与 CSV 的 step_file 列一致**;后缀 `.step` 和 `.stp` 都行(NX 导出的 .stp 直接放,构建自动识别,无需改名)
|
||||
- **新 6 个系列(UCBM/ULP/USP/UGP/UAGP/LAE)step_file 列已是 `.stp`**:NX 导出的 .stp 拷进 `step\` 同名覆盖占位即可;老 11 个系列列是 `.step`:换 .stp 时同前缀的 .step 占位优先被认,**需先删掉占位 .step 文件**
|
||||
- 只换一部分也行:没换到的档位继续显示占位模型
|
||||
- **窗口内 3D 预览网格**:NX journal 导出 STEP 时同步导出同名 `.stl` 到 `catalog\mesh\`(exportStl 开关,默认开,公差 0.5mm)→ 发布时自动同步到软件旁的 mesh\ 目录 → 桌面 3D 标签页**窗口内直渲**(开源 Helix 渲染),无需浏览器;没有网格的型号自动回退浏览器预览
|
||||
- **已有真实 STEP 批量转网格**(不等 NX):`python onebot-data\tools\step-to-stl.py`(开源 OCP 内核,自动跳过占位、断点续跑)→ 网格 >5MB 会自动被 `simplify-stl.py` 压小(或手动跑:`python onebot-data\tools\simplify-stl.py`)→ 发布同步
|
||||
|
||||
### 4. 新增产品系列(以 ABC 为例,5 步)
|
||||
|
||||
> 💡 **现成模板**:6 个新分类(夹紧缸/可伸缩定位销/勾销缸/夹爪缸/翻转缸/电动气缸)里各已放好一个**样板系列**(UCBM/ULP/USP/UGP/UAGP/LAE,型号取自官网),直接照它的 `csv\*.csv` + `series\*.meta.json` 格式加型号就行;占位 STEP 已按型号命名,NX 导出真实数模**同名替换**后重建即可,CSV 不用动。
|
||||
|
||||
1. **CSV**:新建 `catalog\csv\ABC.csv`(表头 `model_code,参数列...,step_file`)
|
||||
2. **系列定义**:制作器 Step1【选择参数表 CSV】选它 → 顶部填系列代码 ABC、中英文名 → 补参数表 → 【保存配置】
|
||||
3. **挂分类**:编辑 `catalog\catalog.json`,把 `"ABC"` 加进对应分类的 series 数组(系列显示顺序 = 数组顺序)
|
||||
4. **放 STEP**:文件放 `catalog\step\`,文件名与 CSV 一致
|
||||
5. **重建 + 发布**:制作器【重建全量目录】→ 校验通过 → publish
|
||||
|
||||
### 5. 增删分类
|
||||
|
||||
编辑 `catalog\catalog.json` 的 `categories` 数组(code/nameZh/nameEn/series 列表),重建即可。
|
||||
|
||||
### 6. 加附件(尺寸图/数据表/手册页)
|
||||
|
||||
- 尺寸图/数据表:制作器 Step5【+添加附件】选文件(Kind 选 dimDrawing/datasheet)
|
||||
- 手册页:改 `sample-data\tools\render-manual-pages.py` 里 `SERIES_PAGES` 加新系列页码 → `python render-manual-pages.py ABC` → 重建
|
||||
|
||||
### 7. 改目录版本号/目录名
|
||||
|
||||
编辑 `catalog\catalog.json` 的 `catalogVersion` / `catalogName` → 重建 → 发布时用新版本号。
|
||||
|
||||
### 8. 平替对照表(竞品型号 → 我方型号)
|
||||
|
||||
**数据表**:`catalog\crossref.csv`(不存在则无平替功能;4 列):
|
||||
|
||||
```csv
|
||||
brand,foreign_model,our_model,note
|
||||
SMC,CDJ2B16-100,KC0032-100MLB,近似平替
|
||||
JELPC,SQ32-100,KCS0032-100,基础型平替(待核对)
|
||||
```
|
||||
|
||||
- **brand** = 竞品品牌(SMC/亚德客/FESTO/JELPC/...)
|
||||
- **foreign_model** = 竞品型号(客户搜这个)
|
||||
- **our_model** = 我方型号(**必须存在于目录**,构建自动校验,写错会报错拒绝打包)
|
||||
- **note** = 互换程度说明(完全互换/近似平替/需确认)
|
||||
- 改完 Excel 另存 CSV UTF-8 → 【重建全量目录】→ 发布
|
||||
- 客户使用:搜索框直接输竞品型号(如 `SQ32-100`)→ 命中平替结果 → 双击跳转到我方型号;或打开「平替对照」标签页按品牌筛选浏览
|
||||
- 佳尔灵对照自动生成工具:`onebot-data\tools\jelpc-crossref.py`(从英文目录 PDF 抽取基础型对照并校验存在性;完整订购码(含磁石/固定形式)需按各系列订购码页逐页解析,后续可扩展)
|
||||
|
||||
## 四、重建与校验
|
||||
|
||||
```
|
||||
制作器【重建全量目录】 = CLI: bin\OnebotCatalog.exe --buildfull onebot-data\catalog sample\OnebotCatalog_2026.08.opc
|
||||
```
|
||||
|
||||
- 重建自动校验(缺 STEP/编码重复/参数不全会列出错误并拒绝打包)
|
||||
- 结果看 `sample\build.log`;发布门禁自测 31 项看 `sample\selftest.log`
|
||||
|
||||
## 五、发布三份产物
|
||||
|
||||
```
|
||||
1. 关闭正在运行的目录软件 exe 和本地预览服务器 (占用文件会导致失败)
|
||||
2. powershell -NoProfile -File OnebotCatalog\tools\publish.ps1
|
||||
```
|
||||
|
||||
自动产出:
|
||||
|
||||
| 产物 | 位置 | 给谁 |
|
||||
| ---------- | -------------------------------------- | ------------------------------------ |
|
||||
| 客户版目录 | `release\OnebotCatalog_2026.08\` | 压缩成 zip 发给客户(双击 exe 即用) |
|
||||
| 增量更新包 | `release\update_2026.08\catalog.opc` | 老客户只发这一个文件替换 |
|
||||
| 网页站 | `release\web_2026.08\` | 整目录上传到网站服务器 |
|
||||
|
||||
## 六、客户怎么拿到更新
|
||||
|
||||
- **新客户**:发 `OnebotCatalog_2026.08_客户版.zip`(发布后重新压缩一次)
|
||||
- **老客户**:发 `update_2026.08\catalog.opc` → 客户替换程序旁的 catalog.opc → 重启程序即升级
|
||||
|
||||
## 七、常见问题排查
|
||||
|
||||
| 现象 | 原因与处理 |
|
||||
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 网页/桌面看不到新数模 | ① 文件放错目录(只认`onebot-data\catalog\step\`)② 扩展名 .stp≠.step ③ 文件名与 CSV 不一致 ④ 忘了重建/发布 ⑤ 浏览器缓存(刷新即可,页面自动带版本号)⑥ 预览服务器没开(网页打不开/3D 报 Failed to fetch 或 ERR_CONNECTION_REFUSED——别关 serve-web 窗口)⑦ 网页 3D 直接从站点 step\ 取文件(绝对路径),换数模后必须重建**并发布** |
|
||||
| 打开系列失败"找不到 KC.meta.meta.json" | 程序旧版 bug,已修复;更新程序或重启 |
|
||||
| 重建报错 | 看`sample\build.log`,逐条列出缺文件/重复编码 |
|
||||
| 发布失败 | 先关预览服务器(serve-web)和目录软件 exe 再发布 |
|
||||
| 下载 STEP 慢 | 本地预览服务器已 16 并发;生产环境上传后无此问题 |
|
||||
| 桌面 3D 显示提示按钮 | 该型号是真实数模,点【在浏览器中打开 3D 预览】(本机运行不联网);窗口内直接渲染真实模型待 GLB 升级 |
|
||||
| 忘记密码 | 改`src\App\App.cs` 里 `"onebot888"` → 重新编译(见维护手册 §6) |
|
||||
|
||||
## 八、三条红线
|
||||
|
||||
1. **业务文件(报价单/合同)不要放进 OnebotCatalog 目录**——曾因此锁死文件夹、误删发布产物
|
||||
2. **发布前必须关程序**(运行中的 exe 和预览服务器)
|
||||
3. **改完任何中文脚本/代码文件要先跑 `fix-bom.ps1`**(否则中文乱码)
|
||||
Reference in New Issue
Block a user