首次提交: OnebotCatalog 项目代码与文档(含 NX 按需生成服务二期、后台、一键启动)

This commit is contained in:
wangruiguo
2026-09-03 17:55:45 +08:00
commit fafa86d3a6
241 changed files with 78656 additions and 0 deletions

View File

@@ -0,0 +1,230 @@
# 欧霓博 SC 系列示例数据生成器STEP 变体文件 + params.csv
# 用法: powershell -NoProfile -ExecutionPolicy Bypass -File tools\gen-step.ps1
# 说明: 以极简封闭 B-rep 圆柱MANIFOLD_SOLID_BREP组合出简化气缸模型
# (后盖 + 缸体 + 前盖 + 活塞杆 4 个实体), 尺寸随缸径/行程参数变化。
param(
[string]$OutDir = (Join-Path $PSScriptRoot '..\onb-sc')
)
$inv = [System.Globalization.CultureInfo]::InvariantCulture
$stepDir = Join-Path $OutDir 'step'
$csvPath = Join-Path $OutDir 'params.csv'
New-Item -ItemType Directory -Force -Path $stepDir | Out-Null
function Format-Num([double]$v) { return $v.ToString('0.###', $inv) }
# 单个圆柱实体的实体行 (OCCT 兼容拓扑: 顶点在圆周上+全圆闭边+接缝边, 共 36 个实体)
# 约定: 圆心点 = (x, 0, z) 是仅有的 y=0 点 (供解析器识别); 顶点 = (x, r, z) 在 +Y 方向
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) # 顶点在圆周 +Y 处 (y=0 留给圆心供解析)
$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
}
# 尾部共享实体: 每个实体注入 STYLED_ITEM 颜色 (occt-import-js 对无颜色模型会崩)
# 从 $id 开始: 每实体 7 个颜色实体 + 14 个尾部实体
function New-TailEntities([int]$id, [int[]]$solidIds) {
$t = New-Object System.Collections.Generic.List[string]
$styled = New-Object System.Collections.Generic.List[string]
$c = $id
foreach ($s in $solidIds) {
$t.Add("#$c=COLOUR_RGB('',0.65,0.72,0.85);")
$t.Add("#$($c+1)=FILL_AREA_STYLE_COLOUR('',#$c);")
$t.Add("#$($c+2)=SURFACE_STYLE_FILL_AREA(#$($c+1));")
$t.Add("#$($c+3)=SURFACE_SIDE_STYLE('',(#$($c+2)));")
$t.Add("#$($c+4)=SURFACE_STYLE_USAGE(.BOTH.,#$($c+3));")
$t.Add("#$($c+5)=PRESENTATION_STYLE_ASSIGNMENT((#$($c+4)));")
$t.Add("#$($c+6)=STYLED_ITEM('',(#$($c+5)),#$s);")
$styled.Add("#$($c+6)")
$c += 7
}
$items = (($solidIds | ForEach-Object { "#$_" }) + $styled) -join ','
$t.Add("#$c=SHAPE_REPRESENTATION('',($items),#$($c+1));")
$t.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('',''));")
$t.Add("#$($c+2)=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-06),#$($c+3),'');")
$t.Add("#$($c+3)=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));")
$t.Add("#$($c+4)=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));")
$t.Add("#$($c+5)=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());")
$t.Add("#$($c+6)=PRODUCT('OUNIBO_SC','OUNIBO_SC','',(#$($c+7)));")
$t.Add("#$($c+7)=PRODUCT_CONTEXT('',#$($c+8),'mechanical');")
$t.Add("#$($c+8)=APPLICATION_CONTEXT('configuration controlled 3d designs of mechanical parts and assemblies');")
$t.Add("#$($c+9)=PRODUCT_DEFINITION_FORMATION('','',#$($c+6));")
$t.Add("#$($c+10)=PRODUCT_DEFINITION('design','',#$($c+9),#$($c+11));")
$t.Add("#$($c+11)=PRODUCT_DEFINITION_CONTEXT('part definition',#$($c+8),'design');")
$t.Add("#$($c+12)=PRODUCT_DEFINITION_SHAPE('','',#$($c+10));")
$t.Add("#$($c+13)=SHAPE_DEFINITION_REPRESENTATION(#$($c+12),#$c);")
return $t
}
# ---- 型号与规则定义 (见 coding-rules.md) ----
# 缸径 16: 行程仅 25/50, 无磁石; 磁石 S 要求缸径>=25; 中摆 CB 要求行程<=75
$bores = @(16, 25, 32, 40)
$strokesAll = @(25, 50, 75, 100)
$mountsAll = @('FA', 'LB', 'CB')
$encNoBom = New-Object System.Text.UTF8Encoding($false)
$encBom = New-Object System.Text.UTF8Encoding($true)
$csvLines = New-Object System.Collections.Generic.List[string]
$csvLines.Add('model_code,bore,stroke,magnet,mount,step_file')
$count = 0
foreach ($bore in $bores) {
$strokes = if ($bore -eq 16) { @(25, 50) } else { $strokesAll }
$magnets = if ($bore -eq 16) { @('') } else { @('', 'S') }
foreach ($stroke in $strokes) {
$mounts = if ($stroke -gt 75) { @('FA', 'LB') } else { $mountsAll }
foreach ($magnet in $magnets) {
foreach ($mount in $mounts) {
$model = "SC$bore`x$stroke$magnet-$mount"
$stepFile = "$model.step"
# ---- 简化气缸尺寸 (mm): 后盖 + 缸体 + 前盖 + 活塞杆, 沿 Z 轴 ----
$bodyR = $bore / 2.0 + 2.0 # 缸体外径
$bodyLen = $stroke + 60.0 # 缸体长度(随行程)
$capR = $bore / 2.0 + 5.0 # 端盖外径
$capLen = 8.0 # 后盖厚度
$fcapLen = 10.0 # 前盖厚度
$rodR = [Math]::Max($bore / 5.0, 3.0)
$rodBot = $bodyLen - 14.0 # 活塞杆埋入缸体
$rodLen = $stroke + 34.0
$lines = New-Object System.Collections.Generic.List[string]
$lines.Add('ISO-10303-21;')
$lines.Add('HEADER;')
$lines.Add("FILE_DESCRIPTION(('OUNIBO SC series sample part $model'),'2;1');")
$lines.Add("FILE_NAME('$stepFile','2026-06-02T00:00:00',('OUNIBO'),('OUNIBO'),'','','');")
$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(@{ z = -$capLen; r = $capR; len = $capLen }) # 后盖
$cyls.Add(@{ z = 0.0; r = $bodyR; len = $bodyLen }) # 缸体
$cyls.Add(@{ z = $bodyLen; r = $capR; len = $fcapLen }) # 前盖
$cyls.Add(@{ z = $rodBot; r = $rodR; len = $rodLen }) # 活塞杆
foreach ($cyl in $cyls) {
[string[]]$entities = New-CylinderEntities -id $nextId -x 0 -y 0 -z $cyl['z'] -r $cyl['r'] -len $cyl['len']
$lines.AddRange($entities)
$ids.Add($nextId + 35) # MANIFOLD_SOLID_BREP 实体号
$nextId += 36
}
[string[]]$tail = New-TailEntities -id $nextId -solidIds $ids.ToArray()
$lines.AddRange($tail)
$lines.Add('ENDSEC;')
$lines.Add('END-ISO-10303-21;')
[System.IO.File]::WriteAllLines((Join-Path $stepDir $stepFile), $lines.ToArray(), $encNoBom)
$csvLines.Add("$model,$bore,$stroke,$magnet,$mount,$stepFile")
$count++
}
}
}
}
# ---- MAQ 迷你气缸系列 (多系列演示): 缸径 6/10/16, 行程 10/20/30/40 ----
# 规则: 缸径 6 仅行程 10/20 且无磁石; 安装仅 FA/LB
$csvLinesM = New-Object System.Collections.Generic.List[string]
$csvLinesM.Add('model_code,bore,stroke,magnet,mount,step_file')
$countM = 0
foreach ($bore in @(6, 10, 16)) {
$strokes = if ($bore -eq 6) { @(10, 20) } else { @(10, 20, 30, 40) }
$magnets = if ($bore -eq 6) { @('') } else { @('', 'S') }
foreach ($stroke in $strokes) {
foreach ($magnet in $magnets) {
foreach ($mount in @('FA', 'LB')) {
$model = "MAQ$bore`x$stroke$magnet-$mount"
$stepFile = "$model.step"
$bodyR = $bore / 2.0 + 1.5
$bodyLen = $stroke + 40.0
$capR = $bore / 2.0 + 4.0
$capLen = 6.0
$fcapLen = 8.0
$rodR = [Math]::Max($bore / 5.0, 2.0)
$rodBot = $bodyLen - 10.0
$rodLen = $stroke + 24.0
$lines = New-Object System.Collections.Generic.List[string]
$lines.Add('ISO-10303-21;')
$lines.Add('HEADER;')
$lines.Add("FILE_DESCRIPTION(('OUNIBO MAQ series sample part $model'),'2;1');")
$lines.Add("FILE_NAME('$stepFile','2026-06-02T00:00:00',('OUNIBO'),('OUNIBO'),'','','');")
$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(@{ z = -$capLen; r = $capR; len = $capLen })
$cyls.Add(@{ z = 0.0; r = $bodyR; len = $bodyLen })
$cyls.Add(@{ z = $bodyLen; r = $capR; len = $fcapLen })
$cyls.Add(@{ z = $rodBot; r = $rodR; len = $rodLen })
foreach ($cyl in $cyls) {
[string[]]$entities = New-CylinderEntities -id $nextId -x 0 -y 0 -z $cyl['z'] -r $cyl['r'] -len $cyl['len']
$lines.AddRange($entities)
$ids.Add($nextId + 35)
$nextId += 36
}
[string[]]$tail = New-TailEntities -id $nextId -solidIds $ids.ToArray()
$lines.AddRange($tail)
$lines.Add('ENDSEC;')
$lines.Add('END-ISO-10303-21;')
[System.IO.File]::WriteAllLines((Join-Path $stepDir $stepFile), $lines.ToArray(), $encNoBom)
$csvLinesM.Add("$model,$bore,$stroke,$magnet,$mount,$stepFile")
$countM++
}
}
}
}
[System.IO.File]::WriteAllLines($csvPath, $csvLines.ToArray(), $encBom)
[System.IO.File]::WriteAllLines((Join-Path $OutDir 'params_maq.csv'), $csvLinesM.ToArray(), $encBom)
Write-Output "生成完成: SC $count 个 + MAQ $countM 个 STEP 文件 -> $stepDir"
Write-Output "参数表: $csvPath / params_maq.csv"