请帮我编写一套完整、可直接运行的 SolidWorks VBA 宏，用于教学演示“ZA型圆柱蜗杆”的参数化自动建模。

我要的是：

SolidWorks VBA + SolidWorks API

不是 Python，不需要联网，不使用 Toolbox，不依赖外部插件。

请一次性输出完整代码，不要只给局部修改。

最终至少包含：

1. 普通 Module 完整 VBA 代码
2. frmWorm UserForm 完整 VBA 代码
3. 所有辅助函数完整代码

不要让我自己从旧代码里寻找应该替换的位置。


==================================================
一、总体目标
==================================================

运行宏以后，弹出一个简单参数窗口，一次性输入：

1. 轴向模数 mx，单位 mm
2. 蜗杆头数 z1，整数
3. 直径系数 q
4. 轴向压力角 αx，单位 °
5. 蜗杆长度 L，单位 mm
6. 轴孔直径，单位 mm
7. 旋向：右旋 / 左旋

默认参数：

mx = 2
z1 = 1
q = 10
αx = 20°
L = 40 mm
轴孔 = 0 mm
旋向 = 右旋

点击：

“生成蜗杆”

之后，SolidWorks 自动完成 ZA 型圆柱蜗杆教学模型。

要求最终生成：

普通可编辑草图
普通可编辑螺旋线
普通扫掠特征
普通圆周阵列

不要生成黑盒实体。


==================================================
二、宏的定位
==================================================

这个宏主要用于：

教学
SolidWorks建模演示
快速参数化生成
后续与蜗轮配对

优先级：

稳定性 > 制造级复杂几何
教学可解释 > 黑箱
傻瓜式操作 > 大量人工步骤

最终操作：

运行宏
↓
输入参数
↓
选择左旋/右旋
↓
点击“生成蜗杆”
↓
自动建模完成


==================================================
三、蜗杆类型
==================================================

当前版本明确做：

ZA型圆柱蜗杆教学版

即：

轴向截面采用直线梯形齿廓。

不要在这一版中引入：

复杂渐开线蜗杆
ZN蜗杆
ZI蜗杆
锥面包络
制造级刀具包络


==================================================
四、基本理论参数
==================================================

输入轴向模数：

mx

轴向齿距：

px = PI * mx

蜗杆头数：

z1

蜗杆导程：

lead = z1 * px

直径系数：

q

分度圆直径：

d1 = q * mx

分度圆半径：

rp = d1 / 2

标准教学版齿顶高：

ha = mx

标准教学版齿根高：

hf = 1.25 * mx

齿顶圆半径：

ra = rp + ha

齿根圆半径：

rf = rp - hf

所以：

齿顶圆直径：

da1 = d1 + 2*mx

齿根圆直径：

df1 = d1 - 2.5*mx


==================================================
五、导程角
==================================================

导程角：

gamma = atan(lead / (PI*d1))

由于：

lead = PI*mx*z1

d1 = q*mx

所以等价：

tan(gamma) = z1 / q

程序完成以后应显示：

导程 lead
导程角 gamma


==================================================
六、螺旋圈数
==================================================

蜗杆长度：

L

螺旋圈数：

revolutions = L / lead

例如：

mx = 2
z1 = 1
q = 10
L = 40

则：

px = 6.283185...

lead = 6.283185...

d1 = 20

gamma ≈ 5.71°

revolutions ≈ 6.366


==================================================
七、蜗杆轴向梯形齿形
==================================================

ZA型蜗杆轴向截面采用直线齿廓。

分度线上齿厚：

sx = px / 2

分度线上半齿厚：

halfPitchThickness = px / 4

轴向压力角：

alphaX

转换成弧度后计算。

齿顶半宽：

topHalf
=
px/4 - ha*tan(alphaX)

即：

topHalf
=
px/4 - mx*tan(alphaX)

理论齿根半宽：

rootHalf
=
px/4 + hf*tan(alphaX)

即：

rootHalf
=
px/4 + 1.25*mx*tan(alphaX)

必须检查：

topHalf > 0

以及：

rootGap = px - 2*rootHalf

必须满足：

rootGap > 0

否则提示参数导致齿根区域重叠。


==================================================
八、非常重要：不要使用短小内部重叠线
==================================================

不要采用这种六边形逻辑：

rJoin
↓
rf
↓
ra
↓
ra
↓
rf
↓
rJoin

也不要建立：

左侧内部重叠短线
右侧内部重叠短线

因为当：

rJoin 很接近 rf

时，这两条短线容易在 SolidWorks 中出现：

CreateLine失败
零长度
几何退化
自动约束冲突

当前稳定方案必须采用：

“四边形隐藏截面”。


==================================================
九、稳定四边形扫掠截面
==================================================

蜗杆单头齿草图使用四边形：

左内点
↓
左齿顶
↓
右齿顶
↓
右内点
↓
回到左内点

两侧齿面直接延伸到齿根圆柱内部。

定义内部重叠半径：

overlap = 0.4 * mx

rJoin = rf - overlap

如果存在轴孔，并且：

rJoin <= boreRadius + 0.15*mx

则自动调整：

rJoin = (rf + boreRadius) / 2

要求：

0 < rJoin < rf

并且：

rJoin > boreRadius


==================================================
十、内部半宽自动反算
==================================================

为了保证两条齿面虽然延长到了 rJoin，但在理论齿根半径 rf 位置仍然经过：

(rf, ±rootHalf)

必须自动计算内部半宽：

innerHalf
=
rootHalf
+
(rf-rJoin)
*
(rootHalf-topHalf)
/
(ra-rf)

这意味着：

从：

(rJoin, innerHalf)

到：

(ra, topHalf)

的直线，

在：

r = rf

处会恰好经过：

(rf, rootHalf)

所以外部有效齿形仍然保持理论轴向梯形齿形。


==================================================
十一、蜗杆齿形草图坐标
==================================================

在适合的基准面上建立蜗杆轴向齿形。

草图局部坐标：

X方向 = 径向
Y方向 = 蜗杆轴向

四个点：

左内点：

x1 = rJoin
y1 = -innerHalf

左齿顶：

x2 = ra
y2 = -topHalf

右齿顶：

x3 = ra
y3 = +topHalf

右内点：

x4 = rJoin
y4 = +innerHalf

依次连接：

左内点 → 左齿顶
左齿顶 → 右齿顶
右齿顶 → 右内点
右内点 → 左内点

得到闭合四边形。

这整个四边形内部靠近rJoin的一部分会埋入齿根圆柱内部。

最终外部显示的有效齿面仍然正确。


==================================================
十二、禁止零长度线
==================================================

写一个辅助函数：

SafeCreateProfileLine

在CreateLine前先计算：

len =
sqrt(
(x2-x1)^2
+
(y2-y1)^2
)

如果：

len < 0.000001 mm

则停止并给出明确错误提示。

不要把零长度线传给SolidWorks。


==================================================
十三、教学用分度圆草图
==================================================

必须额外创建：

“蜗杆分度圆草图”

圆心：

(0,0)

半径：

rp

最好设置成构造圆。

这个草图仅用于：

教学
显示分度圆
解释直径系数q

不要参与实体拉伸。


==================================================
十四、齿根圆柱
==================================================

在前视基准面创建：

齿根圆：

半径 rf

如果轴孔直径 > 0：

同时创建中心孔：

半径 boreD/2

然后一次凸台拉伸：

长度 = L

特征名称：

“蜗杆齿根圆柱”

要求：

最终齿根圆柱是蜗杆主体。


==================================================
十五、中心轴
==================================================

利用齿根圆柱外圆柱面创建：

Reference Axis

命名：

“蜗杆中心轴”

多头蜗杆圆周阵列时使用该轴。


==================================================
十六、螺旋基准圆
==================================================

在前视基准面创建独立草图：

圆心：

(0,0)

半径：

rp

名称：

“蜗杆螺旋基准草图”

该圆用于创建蜗杆螺旋线。


==================================================
十七、螺旋线
==================================================

使用 SolidWorks：

InsertHelix

或兼容的 Helix API。

采用：

Height + Pitch

形式定义。

高度：

wormLength

螺距必须注意：

单头基础螺旋路径的导程：

lead = z1*px

因此用于单个螺纹头的螺旋线：

Pitch = lead

Height = wormLength

圈数：

wormLength / lead

Start Angle：

0

左旋/右旋通过螺旋方向布尔值控制。

右旋：

clockwiseHelix = True

左旋：

clockwiseHelix = False

或根据实际SolidWorks版本方向验证，但必须只通过一个布尔符号控制，不写两套独立代码。


==================================================
十八、螺旋线必须从Profile平面起始
==================================================

螺旋线的起始角和齿形草图所在基准面必须匹配。

要求：

螺旋线起点位于蜗杆齿形草图所在平面。

如果使用：

Start Angle = 0

请选择与这个起点对应的基准面建立蜗杆轴向梯形截面。

不要随意选择一个不穿过螺旋起点的平面，否则Sweep可能失败。


==================================================
十九、扫掠建模
==================================================

蜗杆齿形草图作为：

Profile

Selection Mark = 1

蜗杆螺旋线作为：

Path

Selection Mark = 4

使用 SolidWorks Sweep API。

可以采用：

InsertProtrusionSwept3

或兼容的新Sweep接口。

普通蜗杆螺旋线已经定义了真实空间路径，因此不需要像斜齿轮一样再使用Constant Twist。

Sweep应沿螺旋线直接Follow Path。

要求：

Merge = True

使蜗杆齿和齿根圆柱合并为单一实体。

单头特征名称：

“蜗杆单头齿”


==================================================
二十、多头蜗杆
==================================================

如果：

z1 = 1

则不进行任何阵列。

如果：

z1 > 1

则对“蜗杆单头齿”进行圆周阵列。

阵列轴：

蜗杆中心轴

总角度：

2*PI

实例数：

z1

EqualSpacing = True

例如：

z1=2

两头相差：

180°

z1=3

三头相差：

120°

z1=4

四头相差：

90°

不要自己Round(360/z1)。

直接让SolidWorks整圈等分。


==================================================
二十一、重要说明：导程和多头关系
==================================================

单个螺旋头本身使用：

lead = z1*px

即多头蜗杆的真实导程。

然后通过圆周阵列生成另外的头。

不要错误地用：

Pitch = px

再阵列z1个头。

正确逻辑是：

一个头本身的轴向重复距离就是导程：

lead = z1*px

多头之间通过角向相位错开。


==================================================
二十二、SolidWorks单位问题
==================================================

用户输入和公式：

统一使用 mm。

但是普通 SolidWorks API：

CreateLine
CreateCircleByRadius
FeatureExtrusion
InsertHelix的高度和螺距
几何坐标

一般使用“米”。

所以：

mm → m

必须除以1000。

例如：

40 mm → 0.04 m

6.283 mm → 0.006283 m


==================================================
二十三、UserForm要求
==================================================

必须创建一个：

frmWorm

UserForm。

设计界面可以完全空白。

所有控件在：

UserForm_Initialize()

中通过：

Me.Controls.Add

自动生成。

窗口：

ZA圆柱蜗杆生成器

轴向模数 mx       [2]   mm
蜗杆头数 z1       [1]
直径系数 q        [10]
轴向压力角 αx     [20]  °
蜗杆长度 L        [40]  mm
轴孔直径          [0]   mm
旋向              [右旋▼]

[生成蜗杆]    [取消]

教学提示：

d1=qmx，导程=z1·πmx


==================================================
二十四、UserForm变量
==================================================

建议：

txtMx
txtStarts
txtQ
txtAlphaX
txtLength
txtBore

ComboBox：

cmbHand

按钮：

btnGenerate
btnCancel


==================================================
二十五、防呆检查
==================================================

必须检查：

mx > 0

z1 >= 1

z1必须整数

q > 2.5

0 < αx < 45°

L > 0

boreD >= 0

rf > 0

轴孔半径不能侵入齿根区域

topHalf > 0

rootGap > 0

0 < rJoin < rf

rJoin > boreRadius

innerHalf > rootHalf

所有线段长度不能趋近0


==================================================
二十六、错误定位
==================================================

请设置：

Private gStage As String

主要阶段包括：

获取SolidWorks零件
检查输入参数
计算蜗杆参数
计算蜗杆轴向齿形
创建蜗杆分度圆草图
创建蜗杆齿根圆柱草图
拉伸蜗杆齿根圆柱
创建蜗杆中心轴
创建蜗杆螺旋基准草图
创建蜗杆螺旋线
创建蜗杆梯形齿形
选择蜗杆扫掠截面和螺旋路径
执行蜗杆齿螺旋扫掠
执行多头蜗杆圆周阵列
完成

如果发生错误：

MsgBox显示：

宏运行错误

失败阶段：
xxxx

详细信息：
xxxx

不要只显示：

对象变量未设置


==================================================
二十七、设计树建议
==================================================

最终设计树大致为：

蜗杆分度圆草图
↓
蜗杆齿根圆柱草图
↓
蜗杆齿根圆柱
↓
蜗杆中心轴
↓
蜗杆螺旋基准草图
↓
蜗杆螺旋线
↓
蜗杆轴向梯形齿形草图
↓
蜗杆单头齿

如果 z1 > 1：

↓
蜗杆多头阵列


==================================================
二十八、完成后的教学提示
==================================================

生成成功以后显示：

【输入参数】

轴向模数 mx
头数 z1
直径系数 q
轴向压力角 αx
旋向
蜗杆长度 L
轴孔直径


【基本尺寸】

分度圆直径：

d1 = qmx

齿顶圆直径：

da1 = d1 + 2mx

齿根圆直径：

df1 = d1 - 2.5mx


【螺旋参数】

轴向齿距：

px = πmx

导程：

lead = z1*px

导程角：

gamma = atan(z1/q)

螺旋圈数：

N = L/lead


最后显示：

建模过程：

分度圆
→ 齿根圆柱
→ 螺旋线
→ 梯形齿形
→ 螺旋扫掠
→ 多头阵列


==================================================
二十九、明确禁止的方案
==================================================

不要：

1. 使用两条极短的内部重叠线连接rJoin与rf。

2. 使用六边形扫掠截面作为默认方案。

3. 让左右内部重叠线长度只有0.1~0.3mm而依赖SolidWorks容差。

4. 使用大量小线段近似本来就是直线的ZA蜗杆齿形。

5. 用多次独立扫掠生成每一头蜗杆。

6. 对多头蜗杆使用错误的螺距px作为单头导程。

7. 手工Round(360/z1)。

8. 使用Toolbox直接插入蜗杆。

9. 使用Python代替VBA。

10. 依赖外部联网API。

11. 生成多个不合并的实体。

12. 随意选择不经过螺旋起点的Profile平面。

13. 创建零长度草图线。

14. 把教学用分度圆直接参与实体扫掠或拉伸。


==================================================
三十、重点测试参数
==================================================

测试1：单头右旋

mx = 2
z1 = 1
q = 10
αx = 20°
L = 40
轴孔 = 0
右旋

理论：

d1 = 20 mm

da1 = 24 mm

df1 = 15 mm

px ≈ 6.283 mm

lead ≈ 6.283 mm

gamma ≈ 5.71°


测试2：双头

mx = 2
z1 = 2
q = 10
αx = 20°
L = 40
右旋

要求：

lead ≈ 12.566 mm

两个螺纹头相差180°。


测试3：三头

mx = 2
z1 = 3
q = 10
αx = 20°
L = 40
左旋

要求：

lead ≈18.850 mm

三头相差120°

且旋向与右旋相反。


测试4：

mx = 3
z1 = 1
q = 12
αx = 20°
L = 60

要求：

整个程序仍使用同一套算法。


==================================================
三十一、最终输出要求
==================================================

请先检查：

理论公式
ZA轴向齿廓
多头导程逻辑
SolidWorks单位
Helix方向
Profile所在平面
Sweep selection mark
四边形轮廓闭合
多头阵列

是否自洽。

然后一次性输出：

第一部分：
完整 Module VBA代码

第二部分：
完整 frmWorm UserForm VBA代码

不要只给补丁。

不要让我自己寻找旧代码中要替换的部分。

代码尽量有中文注释。

避免过多VBA续行符“_”导致：

Too many line continuations

整体目标：

稳定
傻瓜
适合教学
结构清晰
参数可解释
方便加入SolidWorks自定义CommandManager工具栏。