dsh-engineering-ui 0.0.0-stage → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +772 -3
- package/engineering/plugins/dsh-engineering-ui/cordis.patch.yml +5 -0
- package/engineering/plugins/dsh-engineering-ui/icon.svg +14 -0
- package/engineering/plugins/dsh-engineering-ui/lib/client.js +8259 -0
- package/engineering/plugins/dsh-engineering-ui/lib/defense-sign.js +1552 -0
- package/engineering/plugins/dsh-engineering-ui/lib/index.js +5633 -0
- package/engineering/plugins/dsh-engineering-ui/lib/job-wait-guard.js +236 -0
- package/engineering/plugins/dsh-engineering-ui/lib/mem-guard.js +331 -0
- package/engineering/plugins/dsh-engineering-ui/lib/webots.js +114 -0
- package/engineering/plugins/dsh-engineering-ui/locale/en.json +6 -0
- package/engineering/plugins/dsh-engineering-ui/locale/zh.json +6 -0
- package/engineering/plugins/dsh-engineering-ui/preset-engineering.patch.yml +601 -0
- package/engineering/skills/assembly-orchestration/SKILL.md +651 -0
- package/engineering/skills/cad-workflow/SKILL.md +132 -0
- package/engineering/skills/mode-selection/SKILL.md +660 -0
- package/engineering/skills/physics-in-loop/SKILL.md +238 -0
- package/engineering/skills/physics-in-loop/references/feadocs.md +142 -0
- package/engineering/skills/solidworks-bridge/SKILL.md +445 -0
- package/engineering/skills/sw-design/SKILL.md +112 -0
- package/engineering/skills/sw-design/references/autocad-workflow.md +81 -0
- package/engineering/skills/sw-design/references/gbt-drafting.md +71 -0
- package/engineering/skills/sw-to-cad/SKILL.md +121 -0
- package/engineering/skills/webots-simulation/SKILL.md +58 -0
- package/engineering/tools/LICENSE.Auto-SolidWorks +21 -0
- package/engineering/tools/_plugin_paths.py +93 -0
- package/engineering/tools/_root.py +330 -0
- package/engineering/tools/_store.py +446 -0
- package/engineering/tools/ac_bridge.py +459 -0
- package/engineering/tools/ac_rules.json +21 -0
- package/engineering/tools/ac_validate.py +699 -0
- package/engineering/tools/ask_user.py +887 -0
- package/engineering/tools/build_arm1.py +46 -0
- package/engineering/tools/build_assembly.py +94 -0
- package/engineering/tools/build_base.py +57 -0
- package/engineering/tools/build_housing.py +70 -0
- package/engineering/tools/build_structural.py +43 -0
- package/engineering/tools/build_transmission.py +69 -0
- package/engineering/tools/cadx.lsp +128 -0
- package/engineering/tools/choice_contract.py +61 -0
- package/engineering/tools/conn_state.py +1671 -0
- package/engineering/tools/defense_gate.py +3374 -0
- package/engineering/tools/drawing_input.py +314 -0
- package/engineering/tools/env_check.py +467 -0
- package/engineering/tools/examples/build_axis.py +142 -0
- package/engineering/tools/examples/build_cup.py +56 -0
- package/engineering/tools/examples/build_plate.py +58 -0
- package/engineering/tools/examples/build_sphere.py +30 -0
- package/engineering/tools/examples/build_transition_duct.py +381 -0
- package/engineering/tools/gate_integrity.py +401 -0
- package/engineering/tools/mode2_flow.py +3589 -0
- package/engineering/tools/mode_checker.py +77 -0
- package/engineering/tools/mode_gate.py +8013 -0
- package/engineering/tools/part_registry.py +4266 -0
- package/engineering/tools/physics/__init__.py +50 -0
- package/engineering/tools/physics/_compat.py +12 -0
- package/engineering/tools/physics/design_state.py +142 -0
- package/engineering/tools/physics/domain_validator.py +751 -0
- package/engineering/tools/physics/fatigue.py +489 -0
- package/engineering/tools/physics/fea_solver.py +1163 -0
- package/engineering/tools/physics/feapy_solver.py +314 -0
- package/engineering/tools/physics/gb_materials.json +1228 -0
- package/engineering/tools/physics/geometry_gate.py +337 -0
- package/engineering/tools/physics/load_case.py +951 -0
- package/engineering/tools/physics/material_db.py +874 -0
- package/engineering/tools/physics/mesh_adapter.py +321 -0
- package/engineering/tools/physics/refine_rules.py +272 -0
- package/engineering/tools/physics/rules/gb_base_rules.json +377 -0
- package/engineering/tools/physics/rules/gb_drafting_rules.json +57 -0
- package/engineering/tools/physics/rules/gb_electrical_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_fasteners_rules.json +73 -0
- package/engineering/tools/physics/rules/gb_housing_rules.json +41 -0
- package/engineering/tools/physics/rules/gb_manufacturing_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_material_verify_rules.json +72 -0
- package/engineering/tools/physics/rules/gb_materials_rules.json +377 -0
- package/engineering/tools/physics/rules/gb_safety_rules.json +89 -0
- package/engineering/tools/physics/rules/gb_springs_rules.json +41 -0
- package/engineering/tools/physics/rules/gb_standards_registry.json +1646 -0
- package/engineering/tools/physics/rules/gb_structural_rules.json +201 -0
- package/engineering/tools/physics/rules/gb_surface_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_transmission_rules.json +233 -0
- package/engineering/tools/physics/rules/housing_rules.json +48 -0
- package/engineering/tools/physics/rules/manifest.json +54 -0
- package/engineering/tools/physics/rules/mold_rules.json +48 -0
- package/engineering/tools/physics/rules/structural_rules.json +56 -0
- package/engineering/tools/physics/rules/transmission_rules.json +48 -0
- package/engineering/tools/physics/simulation_report.py +829 -0
- package/engineering/tools/physics_bridge.py +2685 -0
- package/engineering/tools/profile-manifest.ps1 +72 -0
- package/engineering/tools/run_regression.py +109 -0
- package/engineering/tools/settings.py +419 -0
- package/engineering/tools/solidworks-modeling.md +519 -0
- package/engineering/tools/sw_bridge.py +8215 -0
- package/engineering/tools/sw_guard.py +1066 -0
- package/engineering/tools/sw_surface.py +87 -0
- package/engineering/tools/swapi.py +14766 -0
- package/engineering/tools/verify_sync.py +218 -0
- package/engineering/tools/visual_check.py +2589 -0
- package/engineering/tools/webots_env.py +121 -0
- package/engineering/tools/webots_mcp/__init__.py +3 -0
- package/engineering/tools/webots_mcp/__main__.py +3 -0
- package/engineering/tools/webots_mcp/assembly.py +391 -0
- package/engineering/tools/webots_mcp/bootstrap.py +55 -0
- package/engineering/tools/webots_mcp/controller_worker.py +124 -0
- package/engineering/tools/webots_mcp/evidence.py +288 -0
- package/engineering/tools/webots_mcp/fake_worker.py +69 -0
- package/engineering/tools/webots_mcp/fault_resources.py +121 -0
- package/engineering/tools/webots_mcp/host.py +45 -0
- package/engineering/tools/webots_mcp/ledger.py +73 -0
- package/engineering/tools/webots_mcp/owned_job.py +70 -0
- package/engineering/tools/webots_mcp/physical_gate.py +187 -0
- package/engineering/tools/webots_mcp/physics.py +152 -0
- package/engineering/tools/webots_mcp/pipeline.py +108 -0
- package/engineering/tools/webots_mcp/recipes.py +129 -0
- package/engineering/tools/webots_mcp/repair.py +132 -0
- package/engineering/tools/webots_mcp/repair_trial.py +375 -0
- package/engineering/tools/webots_mcp/runtime.py +311 -0
- package/engineering/tools/webots_mcp/server.py +217 -0
- package/engineering/tools/webots_mcp/sw_export.py +509 -0
- package/engineering/tools/webots_mcp/transport.py +156 -0
- package/engineering/tools/workflow_gate.py +6134 -0
- package/package.json +64 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import swapi
|
|
3
|
+
|
|
4
|
+
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "DSH_大臂.sldprt")
|
|
5
|
+
|
|
6
|
+
m = swapi.new_part()
|
|
7
|
+
|
|
8
|
+
# ---------- Step 1: 外箱 100(W) x 70(H) x 450(L) ----------
|
|
9
|
+
m.begin_sketch("Front Plane")
|
|
10
|
+
m.rect(0, 0, 100, 70)
|
|
11
|
+
m.end_sketch()
|
|
12
|
+
m.extrude(450) # z: 0 -> 450
|
|
13
|
+
|
|
14
|
+
# ---------- Step 2: 抽空成箱型梁,两端留 30 端壁 ----------
|
|
15
|
+
# 从 z=0 面内切 深度420 -> 保留 z=420..450 实心端壁
|
|
16
|
+
m.begin_sketch_on_face(0, 0, 0)
|
|
17
|
+
m.rect(0, 0, 76, 46) # 内腔 76x46
|
|
18
|
+
m.end_sketch()
|
|
19
|
+
m.cut(depth=420, through=False)
|
|
20
|
+
|
|
21
|
+
# 从 z=450 面内切 深度30 -> 保留 z=0..30 实心端壁 (中心空腔 30..420)
|
|
22
|
+
m.begin_sketch_on_face(0, 0, 450)
|
|
23
|
+
m.rect(0, 0, 76, 46)
|
|
24
|
+
m.end_sketch()
|
|
25
|
+
m.cut(depth=30, through=False)
|
|
26
|
+
|
|
27
|
+
# ---------- Step 3: 中央关节轴孔 Φ40 沿臂长(Z)贯穿 (两端同轴) ----------
|
|
28
|
+
m.begin_sketch_on_face(0, 0, 0)
|
|
29
|
+
m.circle(0, 0, 20) # R20 (Φ40)
|
|
30
|
+
m.end_sketch()
|
|
31
|
+
m.cut(through=True)
|
|
32
|
+
|
|
33
|
+
# ---------- Step 4: 关节端加强圆角/倒角 ----------
|
|
34
|
+
m.fillet(8, [(0, 50, 0)]) # 角部圆角
|
|
35
|
+
m.fillet(8, [(50, 0, 0)])
|
|
36
|
+
m.fillet(8, [(0, 50, 450)])
|
|
37
|
+
m.fillet(8, [(-50, 0, 450)])
|
|
38
|
+
# 端壁孔口倒角
|
|
39
|
+
m.chamfer(2, [(0, 20, 0)], 45)
|
|
40
|
+
|
|
41
|
+
m.rebuild()
|
|
42
|
+
m.bring_to_front()
|
|
43
|
+
m.set_view_iso()
|
|
44
|
+
m.screenshot(os.path.join(os.path.dirname(os.path.abspath(__file__)), "DSH_大臂_preview.png"))
|
|
45
|
+
res = m.save(OUT)
|
|
46
|
+
print("SAVE:", res)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""真实情景装配:机械臂 9 零件 + 关节轴/电机壳/夹爪,含干涉检查。"""
|
|
3
|
+
import os
|
|
4
|
+
import swapi
|
|
5
|
+
|
|
6
|
+
BASE = os.path.dirname(os.path.abspath(__file__))
|
|
7
|
+
OUT = os.path.join(BASE, "DSH_机械臂总装.sldasm")
|
|
8
|
+
|
|
9
|
+
# 零件路径
|
|
10
|
+
P = {
|
|
11
|
+
"底座法兰": os.path.join(BASE, "DSH_底座法兰.sldprt"),
|
|
12
|
+
"底座立柱": os.path.join(BASE, "DSH_底座立柱.sldprt"),
|
|
13
|
+
"回转台": os.path.join(BASE, "DSH_回转台.sldprt"),
|
|
14
|
+
"关节轴1": os.path.join(BASE, "DSH_关节轴.sldprt"),
|
|
15
|
+
"大臂": os.path.join(BASE, "DSH_大臂.sldprt"),
|
|
16
|
+
"关节轴2": os.path.join(BASE, "DSH_关节轴.sldprt"),
|
|
17
|
+
"小臂": os.path.join(BASE, "DSH_小臂.sldprt"),
|
|
18
|
+
"关节轴3": os.path.join(BASE, "DSH_关节轴.sldprt"),
|
|
19
|
+
"腕法兰": os.path.join(BASE, "DSH_腕法兰.sldprt"),
|
|
20
|
+
"关节电机壳": os.path.join(BASE, "DSH_关节电机壳.sldprt"),
|
|
21
|
+
"夹爪": os.path.join(BASE, "DSH_夹爪.sldprt"),
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# 新建装配体
|
|
25
|
+
asm = swapi.new_assembly()
|
|
26
|
+
print("装配体已建:", asm.model.GetTitle if hasattr(asm.model, "GetTitle") else "ok")
|
|
27
|
+
|
|
28
|
+
added = {}
|
|
29
|
+
def place(name, x, y, z):
|
|
30
|
+
r = asm.add_component(P[name], x, y, z)
|
|
31
|
+
ok = bool(r.get("ok"))
|
|
32
|
+
print(" + %-12s ok=%s 实际位置=%s" % (name, ok, r.get("actual_position_mm", r.get("position_mm"))))
|
|
33
|
+
added[name] = r.get("component")
|
|
34
|
+
return r
|
|
35
|
+
|
|
36
|
+
# ── 定位(包围盒中心坐标,单位 mm)──
|
|
37
|
+
# 底座法兰厚度40 -> 中心 z=20
|
|
38
|
+
place("底座法兰", 0, 0, 20)
|
|
39
|
+
# 立柱高170,底坐法兰顶z=40 -> 立柱中心 z=40+85=125
|
|
40
|
+
place("底座立柱", 0, 0, 125)
|
|
41
|
+
# 回转台厚30,顶面立柱顶z=210 -> 中心 z=210+15=225
|
|
42
|
+
place("回转台", 0, 0, 225)
|
|
43
|
+
# 关节轴1 长60(沿Z) 穿过回转台与立柱接合处 中心z=210
|
|
44
|
+
place("关节轴1", 0, 0, 210)
|
|
45
|
+
# 大臂: 箱梁沿X 320长, 根在回转台上方 z=240, 沿X正方向伸展 -> 中心 x=160 z=240
|
|
46
|
+
place("大臂", 160, 0, 240)
|
|
47
|
+
# 关节轴2 长70(沿Y) 穿大臂根 -> 中心 (0,0,240)
|
|
48
|
+
place("关节轴2", 0, 0, 240)
|
|
49
|
+
# 小臂: 260长, 铰接大臂末端 x=320附近 -> 中心 x=320+130=450 z=240
|
|
50
|
+
place("小臂", 450, 0, 240)
|
|
51
|
+
# 关节轴3 长60(沿Y) 穿小臂根 -> 中心 (450,0,240)
|
|
52
|
+
place("关节轴3", 450, 0, 240)
|
|
53
|
+
# 腕法兰 厚20 在小臂末端 x=580 -> 中心 x=580 z=240
|
|
54
|
+
place("腕法兰", 580, 0, 240)
|
|
55
|
+
# 关节电机壳 Φ90 管 套关节2处 -> 中心 (0,0,240)
|
|
56
|
+
place("关节电机壳", 0, 0, 240)
|
|
57
|
+
# 夹爪 在小臂末端 x=580 z=250
|
|
58
|
+
place("夹爪", 580, 0, 255)
|
|
59
|
+
|
|
60
|
+
# SW2025 下 GetComponentCount() 需参数,安全读组件数
|
|
61
|
+
try:
|
|
62
|
+
_n = asm.model.GetComponentCount(False)
|
|
63
|
+
except Exception:
|
|
64
|
+
try:
|
|
65
|
+
_comps = asm.model.GetComponents(False) or []
|
|
66
|
+
_n = len(list(_comps))
|
|
67
|
+
except Exception:
|
|
68
|
+
_n = "?"
|
|
69
|
+
print("组件总数:", _n)
|
|
70
|
+
|
|
71
|
+
# ── 干涉检查 ──
|
|
72
|
+
print("=== 干涉检查 ===")
|
|
73
|
+
inter = asm.check_interference(include_multibody=True, treat_coincident=True)
|
|
74
|
+
print(" 干涉检查可用:", inter.get("available"))
|
|
75
|
+
print(" 干涉数量:", inter.get("count"))
|
|
76
|
+
if inter.get("interferences"):
|
|
77
|
+
for it in inter["interferences"][:10]:
|
|
78
|
+
print(" 干涉:", it)
|
|
79
|
+
else:
|
|
80
|
+
print(" 无干涉 ✅")
|
|
81
|
+
|
|
82
|
+
# 保存装配体
|
|
83
|
+
asm.rebuild()
|
|
84
|
+
res = asm.save_as(OUT)
|
|
85
|
+
print("SAVE 装配体:", res)
|
|
86
|
+
|
|
87
|
+
# 截图
|
|
88
|
+
try:
|
|
89
|
+
asm.set_view_iso()
|
|
90
|
+
asm.screenshot(os.path.join(BASE, "DSH_机械臂总装_preview.png"))
|
|
91
|
+
except Exception as e:
|
|
92
|
+
print("截图失败(非致命):", repr(e)[:80])
|
|
93
|
+
|
|
94
|
+
print("ASSEMBLY_DONE")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import os, math
|
|
2
|
+
import swapi
|
|
3
|
+
|
|
4
|
+
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "DSH_基座.sldprt")
|
|
5
|
+
|
|
6
|
+
m = swapi.new_part()
|
|
7
|
+
|
|
8
|
+
# ---------- Step 1: 底部安装法兰 Φ420 x 30 ----------
|
|
9
|
+
m.begin_sketch("Front Plane")
|
|
10
|
+
m.circle(0, 0, 210) # 法兰半径 210 (Φ420)
|
|
11
|
+
m.end_sketch()
|
|
12
|
+
m.extrude(30) # z: 0 -> 30
|
|
13
|
+
|
|
14
|
+
# ---------- Step 2: 主体空心筒 外径Φ340 内径Φ300 高280 ----------
|
|
15
|
+
# 在法兰顶面 z=30 开草图,画同心双圆(环) 拉伸成筒
|
|
16
|
+
m.begin_sketch_on_face(0, 0, 30)
|
|
17
|
+
m.circle(0, 0, 170) # 外 R170 (Φ340)
|
|
18
|
+
m.circle(0, 0, 150) # 内 R150 (Φ300) -> 壁厚20
|
|
19
|
+
m.end_sketch()
|
|
20
|
+
m.extrude(280) # z: 30 -> 310
|
|
21
|
+
|
|
22
|
+
# ---------- Step 3: 顶盖 厚25 (实心盘, 外径Φ340) ----------
|
|
23
|
+
m.begin_sketch_on_face(0, 0, 310)
|
|
24
|
+
m.circle(0, 0, 170)
|
|
25
|
+
m.end_sketch()
|
|
26
|
+
m.extrude(25) # z: 310 -> 335
|
|
27
|
+
|
|
28
|
+
# ---------- Step 4: 顶部回转轴承座沉孔 Φ200 深15 (盲孔) ----------
|
|
29
|
+
m.begin_sketch_on_face(0, 0, 335)
|
|
30
|
+
m.circle(0, 0, 100) # 轴承座 R100 (Φ200)
|
|
31
|
+
m.end_sketch()
|
|
32
|
+
m.cut(depth=15, through=False) # 盲孔深15
|
|
33
|
+
|
|
34
|
+
# ---------- Step 5: 4×M16 地脚螺栓过孔 Φ18 均布 Φ360 ----------
|
|
35
|
+
# 在法兰顶面 z=30 画四孔, 完全贯穿
|
|
36
|
+
m.begin_sketch_on_face(0, 0, 30)
|
|
37
|
+
Rb = 180.0 # 螺栓圆 Φ360
|
|
38
|
+
for ang in [0, 90, 180, 270]:
|
|
39
|
+
a = math.radians(ang)
|
|
40
|
+
m.circle(Rb*math.cos(a), Rb*math.sin(a), 9.0) # Φ18
|
|
41
|
+
m.end_sketch()
|
|
42
|
+
m.cut(through=True)
|
|
43
|
+
|
|
44
|
+
# ---------- Step 6: 圆角 降应力集中 ----------
|
|
45
|
+
# 内壁顶缘 R10 (0,150,310)
|
|
46
|
+
m.fillet(10, [(0, 150, 310)])
|
|
47
|
+
# 外壁顶缘 R15 (0,170,310)
|
|
48
|
+
m.fillet(15, [(0, 170, 310)])
|
|
49
|
+
# 法兰-主体过渡 R10 (0,170,30)
|
|
50
|
+
m.fillet(10, [(0, 170, 30)])
|
|
51
|
+
|
|
52
|
+
m.rebuild()
|
|
53
|
+
m.bring_to_front()
|
|
54
|
+
m.set_view_iso()
|
|
55
|
+
m.screenshot(os.path.join(os.path.dirname(os.path.abspath(__file__)), "DSH_基座_preview.png"))
|
|
56
|
+
res = m.save(OUT)
|
|
57
|
+
print("SAVE:", res)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
import os, math
|
|
3
|
+
import swapi
|
|
4
|
+
|
|
5
|
+
BASE = os.path.dirname(os.path.abspath(__file__))
|
|
6
|
+
|
|
7
|
+
# 壳体机架: 底座法兰 + 底座立柱 + 回转台 + 末端夹爪
|
|
8
|
+
# 避开 revolve/cut 选中bug: 全部用 "双圆 extrude 空心盘/筒" (已验证可靠)
|
|
9
|
+
|
|
10
|
+
# ============ 底座法兰盘 (Φ260外 Φ50内, 厚40) ============
|
|
11
|
+
m = swapi.new_part()
|
|
12
|
+
m.begin_sketch("Front Plane")
|
|
13
|
+
m.circle(0, 0, 130) # 外 R130
|
|
14
|
+
m.circle(0, 0, 25) # 内 R25 (Φ50 中心回转孔)
|
|
15
|
+
m.end_sketch()
|
|
16
|
+
m.extrude(40)
|
|
17
|
+
m.fillet(4, [(130, 0, 20), (-130, 0, 20)])
|
|
18
|
+
m.rebuild()
|
|
19
|
+
m.set_view_iso()
|
|
20
|
+
m.screenshot(os.path.join(BASE, "DSH_底座法兰_preview.png"))
|
|
21
|
+
res1 = m.save(os.path.join(BASE, "DSH_底座法兰.sldprt"))
|
|
22
|
+
print("SAVE 底座法兰:", res1)
|
|
23
|
+
|
|
24
|
+
# ============ 底座立柱 (Φ100外 Φ50内, 高170) ============
|
|
25
|
+
m1 = swapi.new_part()
|
|
26
|
+
m1.begin_sketch("Front Plane")
|
|
27
|
+
m1.circle(0, 0, 50) # 外 R50
|
|
28
|
+
m1.circle(0, 0, 25) # 内 R25
|
|
29
|
+
m1.end_sketch()
|
|
30
|
+
m1.extrude(170)
|
|
31
|
+
m1.fillet(3, [(50, 0, 85), (-50, 0, 85)])
|
|
32
|
+
m1.rebuild()
|
|
33
|
+
m1.set_view_iso()
|
|
34
|
+
m1.screenshot(os.path.join(BASE, "DSH_底座立柱_preview.png"))
|
|
35
|
+
res1b = m1.save(os.path.join(BASE, "DSH_底座立柱.sldprt"))
|
|
36
|
+
print("SAVE 底座立柱:", res1b)
|
|
37
|
+
|
|
38
|
+
# ============ 回转台 (J1 偏航盘 Φ120, 厚30, 中心孔Φ50) ============
|
|
39
|
+
m2 = swapi.new_part()
|
|
40
|
+
m2.begin_sketch("Front Plane")
|
|
41
|
+
m2.circle(0, 0, 60) # 外 R60
|
|
42
|
+
m2.circle(0, 0, 25) # 内 R25 (Φ50)
|
|
43
|
+
m2.end_sketch()
|
|
44
|
+
m2.extrude(30)
|
|
45
|
+
m2.rebuild()
|
|
46
|
+
m2.set_view_iso()
|
|
47
|
+
m2.screenshot(os.path.join(BASE, "DSH_回转台_preview.png"))
|
|
48
|
+
res2 = m2.save(os.path.join(BASE, "DSH_回转台.sldprt"))
|
|
49
|
+
print("SAVE 回转台:", res2)
|
|
50
|
+
|
|
51
|
+
# ============ 末端二指夹爪 ============
|
|
52
|
+
m3 = swapi.new_part()
|
|
53
|
+
m3.begin_sketch("Front Plane")
|
|
54
|
+
m3.rect(0, 0, 60, 40)
|
|
55
|
+
m3.end_sketch()
|
|
56
|
+
m3.extrude(20)
|
|
57
|
+
m3.begin_sketch_on_face(0, 0, 20)
|
|
58
|
+
m3.rect(-24, 0, 12, 30) # 左指
|
|
59
|
+
m3.end_sketch()
|
|
60
|
+
m3.extrude(30)
|
|
61
|
+
m3.begin_sketch_on_face(0, 0, 20)
|
|
62
|
+
m3.rect(12, 0, 12, 30) # 右指
|
|
63
|
+
m3.end_sketch()
|
|
64
|
+
m3.extrude(30)
|
|
65
|
+
m3.rebuild()
|
|
66
|
+
m3.set_view_iso()
|
|
67
|
+
m3.screenshot(os.path.join(BASE, "DSH_夹爪_preview.png"))
|
|
68
|
+
res3 = m3.save(os.path.join(BASE, "DSH_夹爪.sldprt"))
|
|
69
|
+
print("SAVE 夹爪:", res3)
|
|
70
|
+
print("HOUSING_DONE")
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
import os
|
|
3
|
+
import swapi
|
|
4
|
+
|
|
5
|
+
BASE = os.path.dirname(os.path.abspath(__file__))
|
|
6
|
+
|
|
7
|
+
# BUG绕行: swapi.cut() 同一零件第2次调用必失败 -> 每个零件只调用1次cut。
|
|
8
|
+
# 关节通轴孔在臂中心轴线上, 故一次贯穿(从近端 z=0 面切)即可打通近端+远端。
|
|
9
|
+
|
|
10
|
+
# ============ 大臂 (实心箱梁 320mm, 70x80) ============
|
|
11
|
+
m = swapi.new_part()
|
|
12
|
+
m.begin_sketch("Front Plane")
|
|
13
|
+
m.polyline([(-35, -40), (35, -40), (35, 40), (-35, 40), (-35, -40)])
|
|
14
|
+
m.end_sketch()
|
|
15
|
+
m.extrude(320)
|
|
16
|
+
# 中心通轴孔 Φ40:从近端 z=0 面一次贯穿打穿两端
|
|
17
|
+
m.begin_sketch_on_face(0, 0, 0)
|
|
18
|
+
m.circle(0, 0, 20)
|
|
19
|
+
m.cut(through=True)
|
|
20
|
+
m.fillet(6, [(35, 40, 160), (-35, 40, 160), (35, -40, 160), (-35, -40, 160)])
|
|
21
|
+
m.rebuild()
|
|
22
|
+
m.set_view_iso()
|
|
23
|
+
m.screenshot(os.path.join(BASE, "DSH_大臂_preview.png"))
|
|
24
|
+
res1 = m.save(os.path.join(BASE, "DSH_大臂.sldprt"))
|
|
25
|
+
print("SAVE 大臂:", res1)
|
|
26
|
+
|
|
27
|
+
# ============ 小臂 (实心箱梁 260mm, 56x64) ============
|
|
28
|
+
m2 = swapi.new_part()
|
|
29
|
+
m2.begin_sketch("Front Plane")
|
|
30
|
+
m2.polyline([(-28, -32), (28, -32), (28, 32), (-28, 32), (-28, -32)])
|
|
31
|
+
m2.end_sketch()
|
|
32
|
+
m2.extrude(260)
|
|
33
|
+
# 中心通轴孔 Φ40:近端 z=0 一次贯穿
|
|
34
|
+
m2.begin_sketch_on_face(0, 0, 0)
|
|
35
|
+
m2.circle(0, 0, 20)
|
|
36
|
+
m2.cut(through=True)
|
|
37
|
+
m2.fillet(5, [(28, 32, 130), (-28, 32, 130), (28, -32, 130), (-28, -32, 130)])
|
|
38
|
+
m2.rebuild()
|
|
39
|
+
m2.set_view_iso()
|
|
40
|
+
m2.screenshot(os.path.join(BASE, "DSH_小臂_preview.png"))
|
|
41
|
+
res2 = m2.save(os.path.join(BASE, "DSH_小臂.sldprt"))
|
|
42
|
+
print("SAVE 小臂:", res2)
|
|
43
|
+
print("STRUCTURAL_DONE")
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
import os, math
|
|
3
|
+
import swapi
|
|
4
|
+
|
|
5
|
+
BASE = os.path.dirname(os.path.abspath(__file__))
|
|
6
|
+
|
|
7
|
+
# 传动机构: 用旋转(revolve)特征建旋转体, 自带中心孔, 绕开 cut bug
|
|
8
|
+
# 关节轴承 GE40(内径40)匹配; 轴/轴承套/腕法兰/电机筒
|
|
9
|
+
|
|
10
|
+
# ============ 关节轴 (阶梯轴, 总长340) ============
|
|
11
|
+
m = swapi.new_part()
|
|
12
|
+
m.begin_sketch("Front Plane")
|
|
13
|
+
# 旋转轮廓 (绕X轴: x=轴向, y=半径), y>=0
|
|
14
|
+
m.polyline([
|
|
15
|
+
(0, 0), (340, 0), # 轴线
|
|
16
|
+
(340, 18), # 端轴肩 R18
|
|
17
|
+
(300, 18),
|
|
18
|
+
(300, 20), # 轴承位 R20 (GE40 内径40 -> 轴径40, 取 R20)
|
|
19
|
+
(40, 20),
|
|
20
|
+
(40, 18),
|
|
21
|
+
(0, 18), # 左端轴肩
|
|
22
|
+
(0, 0),
|
|
23
|
+
])
|
|
24
|
+
m.centerline(0, 0, 340, 0)
|
|
25
|
+
m.end_sketch()
|
|
26
|
+
m.revolve(360)
|
|
27
|
+
m.fillet(2, [(40, 20, 0), (300, 20, 0)])
|
|
28
|
+
m.rebuild()
|
|
29
|
+
m.set_view_iso()
|
|
30
|
+
m.screenshot(os.path.join(BASE, "DSH_关节轴_preview.png"))
|
|
31
|
+
res1 = m.save(os.path.join(BASE, "DSH_关节轴.sldprt"))
|
|
32
|
+
print("SAVE 关节轴:", res1)
|
|
33
|
+
|
|
34
|
+
# ============ 腕部法兰 (Φ80, 厚20, 中心孔Φ30) ============
|
|
35
|
+
m2 = swapi.new_part()
|
|
36
|
+
m2.begin_sketch("Front Plane")
|
|
37
|
+
m2.polyline([
|
|
38
|
+
(0, 0), (20, 0),
|
|
39
|
+
(20, 40), (15, 40),
|
|
40
|
+
(15, 0), (0, 0), # 退化为环? 需闭合环形截面
|
|
41
|
+
])
|
|
42
|
+
# 上面写法错误, 改用标准环形轮廓:
|
|
43
|
+
m2.end_sketch()
|
|
44
|
+
m2 = swapi.new_part()
|
|
45
|
+
m2.begin_sketch("Front Plane")
|
|
46
|
+
m2.circle(0, 0, 40) # 外 R40
|
|
47
|
+
m2.circle(0, 0, 15) # 内 R15 (腕部孔 Φ30)
|
|
48
|
+
m2.end_sketch()
|
|
49
|
+
m2.extrude(20) # 法兰厚20; 这里环形轮廓 extrude 得空心环
|
|
50
|
+
m2.rebuild()
|
|
51
|
+
m2.set_view_iso()
|
|
52
|
+
m2.screenshot(os.path.join(BASE, "DSH_腕法兰_preview.png"))
|
|
53
|
+
res2 = m2.save(os.path.join(BASE, "DSH_腕法兰.sldprt"))
|
|
54
|
+
print("SAVE 腕法兰:", res2)
|
|
55
|
+
|
|
56
|
+
# ============ 关节电机壳 (Φ90 筒, 长110, 中心孔Φ40) ============
|
|
57
|
+
m3 = swapi.new_part()
|
|
58
|
+
m3.begin_sketch("Front Plane")
|
|
59
|
+
m3.circle(0, 0, 45) # 外 R45
|
|
60
|
+
m3.circle(0, 0, 20) # 内 R20 (轴孔 Φ40)
|
|
61
|
+
m3.end_sketch()
|
|
62
|
+
m3.extrude(110)
|
|
63
|
+
m3.fillet(3, [(45, 0, 55), (-45, 0, 55)])
|
|
64
|
+
m3.rebuild()
|
|
65
|
+
m3.set_view_iso()
|
|
66
|
+
m3.screenshot(os.path.join(BASE, "DSH_关节电机壳_preview.png"))
|
|
67
|
+
res3 = m3.save(os.path.join(BASE, "DSH_关节电机壳.sldprt"))
|
|
68
|
+
print("SAVE 关节电机壳:", res3)
|
|
69
|
+
print("TRANSMISSION_DONE")
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
;;; ================================================================
|
|
2
|
+
;;; CADX.LSP — AutoLISP commands for CADX AI-Driven CAD Validator
|
|
3
|
+
;;; Load in AutoCAD: (load "C:/Users/reddy/OneDrive/Desktop/CADX/cadx.lsp")
|
|
4
|
+
;;; Commands: CADX, CADXFIX, CADXCLEAR, CADXDESIGN
|
|
5
|
+
;;; ================================================================
|
|
6
|
+
|
|
7
|
+
;;; ------------------------------------------------------------------
|
|
8
|
+
;;; Helper: Call CADX backend API
|
|
9
|
+
;;; ------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
(defun cadx-api-call (endpoint method data / url cmd result)
|
|
12
|
+
(setq url (strcat "http://localhost:8001" endpoint))
|
|
13
|
+
;; Use PowerShell to make HTTP calls (portable on Windows)
|
|
14
|
+
(if (= method "GET")
|
|
15
|
+
(setq cmd (strcat "powershell -Command \"(Invoke-RestMethod -Uri '" url "' -Method Get) | ConvertTo-Json\""))
|
|
16
|
+
(setq cmd (strcat "powershell -Command \"Invoke-RestMethod -Uri '" url
|
|
17
|
+
"' -Method Post -ContentType 'application/json' -Body '"
|
|
18
|
+
data "' | ConvertTo-Json\""))
|
|
19
|
+
)
|
|
20
|
+
(startapp "cmd" (strcat "/C " cmd))
|
|
21
|
+
(princ "\n[CADX] Request sent to backend.")
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
;;; ------------------------------------------------------------------
|
|
25
|
+
;;; CADX — Validate current drawing
|
|
26
|
+
;;; ------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
(defun c:CADX (/ dxfpath)
|
|
29
|
+
(princ "\n[CADX] Starting design validation...")
|
|
30
|
+
(princ "\n[CADX] Exporting DXF for analysis...")
|
|
31
|
+
|
|
32
|
+
;; Save current drawing as DXF to temp location
|
|
33
|
+
(setq dxfpath (strcat (getenv "TEMP") "\\cadx_validate.dxf"))
|
|
34
|
+
(command "._DXFOUT" dxfpath "V" "R2018" "16" "")
|
|
35
|
+
|
|
36
|
+
(princ (strcat "\n[CADX] DXF exported to: " dxfpath))
|
|
37
|
+
(princ "\n[CADX] Sending to validation engine...")
|
|
38
|
+
(princ "\n[CADX] Open CADX dashboard at http://localhost:8501 for results.")
|
|
39
|
+
(princ "\n[CADX] Or run validation via: http://localhost:8001/validate")
|
|
40
|
+
|
|
41
|
+
;; Trigger validation via API
|
|
42
|
+
(cadx-api-call "/validate" "POST"
|
|
43
|
+
(strcat "{\"dxf_path\":\"" (vl-string-translate "\\" "/" dxfpath) "\",\"rules_file\":\"residential.json\"}"))
|
|
44
|
+
|
|
45
|
+
(princ "\n[CADX] Validation triggered. Check dashboard for results.")
|
|
46
|
+
(princ)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
;;; ------------------------------------------------------------------
|
|
50
|
+
;;; CADXFIX — Fix all issues found by validation
|
|
51
|
+
;;; ------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
(defun c:CADXFIX ()
|
|
54
|
+
(princ "\n[CADX] Requesting AI fixes for all issues...")
|
|
55
|
+
(cadx-api-call "/fix-all" "POST" "{}")
|
|
56
|
+
(princ "\n[CADX] Fix commands sent. Check AutoCAD for changes.")
|
|
57
|
+
(command "._REGEN")
|
|
58
|
+
(princ)
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
;;; ------------------------------------------------------------------
|
|
62
|
+
;;; CADXCLEAR — Remove all validation markers
|
|
63
|
+
;;; ------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
(defun c:CADXCLEAR ()
|
|
66
|
+
(princ "\n[CADX] Clearing validation markers...")
|
|
67
|
+
(command "._-LAYDEL" "N" "CADX_VALIDATION" "" "Y")
|
|
68
|
+
(command "._REGEN")
|
|
69
|
+
(princ "\n[CADX] Validation layer cleared.")
|
|
70
|
+
(princ)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
;;; ------------------------------------------------------------------
|
|
74
|
+
;;; CADXDESIGN — Generate a design via AI prompt
|
|
75
|
+
;;; ------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
(defun c:CADXDESIGN (/ prompt)
|
|
78
|
+
(setq prompt (getstring T "\n[CADX] Describe the design: "))
|
|
79
|
+
(if (= prompt "")
|
|
80
|
+
(progn
|
|
81
|
+
(princ "\n[CADX] No prompt provided. Cancelled.")
|
|
82
|
+
(princ)
|
|
83
|
+
)
|
|
84
|
+
(progn
|
|
85
|
+
(princ (strcat "\n[CADX] Generating design: " prompt))
|
|
86
|
+
(cadx-api-call "/design" "POST"
|
|
87
|
+
(strcat "{\"prompt\":\"" prompt "\"}"))
|
|
88
|
+
(princ "\n[CADX] Design request sent. Check AutoCAD for new entities.")
|
|
89
|
+
(princ)
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
;;; ------------------------------------------------------------------
|
|
95
|
+
;;; CADXCHAT — Ask the AI a question
|
|
96
|
+
;;; ------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
(defun c:CADXCHAT (/ msg)
|
|
99
|
+
(setq msg (getstring T "\n[CADX] Ask AI: "))
|
|
100
|
+
(if (/= msg "")
|
|
101
|
+
(progn
|
|
102
|
+
(cadx-api-call "/chat" "POST"
|
|
103
|
+
(strcat "{\"message\":\"" msg "\"}"))
|
|
104
|
+
(princ "\n[CADX] Response sent to dashboard.")
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
(princ)
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
;;; ------------------------------------------------------------------
|
|
111
|
+
;;; Auto-load message
|
|
112
|
+
;;; ------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
(princ "\n")
|
|
115
|
+
(princ "â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”")
|
|
116
|
+
(princ "\n CADX — AI-Driven CAD Validation Agent")
|
|
117
|
+
(princ "\nâ”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”")
|
|
118
|
+
(princ "\n Commands:")
|
|
119
|
+
(princ "\n CADX — Validate current drawing")
|
|
120
|
+
(princ "\n CADXFIX — AI fix all issues")
|
|
121
|
+
(princ "\n CADXCLEAR — Remove validation markers")
|
|
122
|
+
(princ "\n CADXDESIGN — Generate design from prompt")
|
|
123
|
+
(princ "\n CADXCHAT — Ask the AI a question")
|
|
124
|
+
(princ "\n")
|
|
125
|
+
(princ "\n Dashboard: http://localhost:8501")
|
|
126
|
+
(princ "\n API: http://localhost:8001/docs")
|
|
127
|
+
(princ "\nâ”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”")
|
|
128
|
+
(princ)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""choice_contract —— 搭建方式与并行策略的【固定两问】(代码级强制)
|
|
3
|
+
|
|
4
|
+
══ 为什么要单独成模块 ═══════════════════════════════════════════════════════
|
|
5
|
+
旧实现把「搭建方式 A/B/C」与「并行策略 D/E」交给 question_contract 管理,
|
|
6
|
+
并设 max_per_call=1(每次只许问一题)。问题在于:这两问本就是【两件独立的事】,
|
|
7
|
+
却被当成"同一批必须拆分的题"来判 —— 于是"连着问两次"反而落入
|
|
8
|
+
"题数与期望不符 / 单次超限"这类规则,经常误判为违规。
|
|
9
|
+
|
|
10
|
+
用户决定:把这两问【写死在代码里】,流程强制要求它们各自被系统问题问过,
|
|
11
|
+
不再使用会误判的"分批提问"规则。
|
|
12
|
+
|
|
13
|
+
══ 本模块职责(已简化) ═══════════════════════════════════════════════════
|
|
14
|
+
· 只提供这两个【固定题面】(问题与选项由代码给出,模型不可改写);
|
|
15
|
+
· 门禁把题面回传给模型,模型用 ask_user_question 原样询问用户;
|
|
16
|
+
· 用户的最终选择由 workflow_gate.py 的 select 参数校验(A/B/C 与 D/E)。
|
|
17
|
+
|
|
18
|
+
══ 已移除的机制 ═══════════════════════════════════════════════════════════
|
|
19
|
+
曾经还有一套「系统提问账本」用于核对"题目是否问全"。
|
|
20
|
+
用户反馈它实用价值低且反复造成流程卡顿(记录不全就被判定"没问"),
|
|
21
|
+
已连同宿主侧写入一并移除。因此本模块【不再读写任何账本文件】。
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import json
|
|
25
|
+
import os
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
29
|
+
|
|
30
|
+
# ── 固定问题 1:搭建方式(A/B/C)────────────────────────────────────────────
|
|
31
|
+
BUILD_MODE_QUESTION = {
|
|
32
|
+
"id": "build_mode",
|
|
33
|
+
"header": "搭建方式",
|
|
34
|
+
"question": "请选择搭建方式(A / B / C)",
|
|
35
|
+
"options": [
|
|
36
|
+
{"label": "A", "description": "完全自主搭建:AI 自主决策,按门禁波次调度"},
|
|
37
|
+
{"label": "B", "description": "部分自主搭建:关键节点询问"},
|
|
38
|
+
{"label": "C", "description": "步步确认:每个零件参数表逐件确认后再建模"},
|
|
39
|
+
],
|
|
40
|
+
"multi_select": False,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# ── 固定问题 2:并行策略(D/E)─────────────────────────────────────────────
|
|
44
|
+
PARALLEL_MODE_QUESTION = {
|
|
45
|
+
"id": "parallel_mode",
|
|
46
|
+
"header": "并行策略",
|
|
47
|
+
"question": "请选择并行策略(D / E)",
|
|
48
|
+
"options": [
|
|
49
|
+
{"label": "D", "description": "部分小屋并行:按波次分批启动"},
|
|
50
|
+
{"label": "E", "description": "单小屋串联:一次一个房间,完成后开下一个"},
|
|
51
|
+
],
|
|
52
|
+
"multi_select": False,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#: 强制顺序:先问搭建方式,再问并行策略(两个独立问题)
|
|
56
|
+
MANDATORY_QUESTIONS = (BUILD_MODE_QUESTION, PARALLEL_MODE_QUESTION)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def questions_payload():
|
|
60
|
+
"""返回两个固定问题(供门禁回传给模型,原样提问)。"""
|
|
61
|
+
return [dict(q) for q in MANDATORY_QUESTIONS]
|