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

请注意：我要的是 SolidWorks VBA + SolidWorks API 宏，不是外部 Python，不需要联网，也不要使用 Toolbox 标准件。

请直接输出完整代码，不要只给局部修改代码。

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

运行宏后，通过 UserForm 一次性输入：

1. 模数 m，单位 mm
2. 齿数 z，必须为整数
3. 压力角 α，单位 °
4. 齿宽 b，单位 mm
5. 中心孔直径 d0，单位 mm

默认值：

m = 2
z = 30
α = 20
b = 20
d0 = 15

点击“生成齿轮”后，SolidWorks 自动生成完整的标准直齿圆柱齿轮。

要求生成普通可编辑的 SolidWorks 特征树，而不是一个黑盒实体。

====================
二、齿轮基本理论
====================

按标准全齿高制计算：

分度圆直径：

d = m*z

分度圆半径：

rp = m*z/2

齿顶圆半径：

ra = rp + m

齿根圆半径：

rf = rp - 1.25*m

基圆半径：

rb = rp*cos(α)

压力角需要由度转换成弧度。

渐开线采用真正的参数方程，不允许使用很多小直线段逼近。

标准渐开线：

x(t) = rb*(cos(t) + t*sin(t))

y(t) = rb*(sin(t) - t*cos(t))

渐开线参数：

t = sqrt((r/rb)^2 - 1)

齿顶位置：

tEnd = sqrt((ra/rb)^2 - 1)

如果 rf < rb，则渐开线从基圆开始：

tStart = 0

如果 rf > rb，则：

tStart = sqrt((rf/rb)^2 - 1)

分度圆处半齿厚角：

halfTooth = PI/(2*z)

invAlpha = tan(alpha) - alpha

基圆处半齿角：

gamma = halfTooth + invAlpha

====================
三、非常重要的建模逻辑
====================

不要分别计算左右两条渐开线。

必须采用以下逻辑：

1. 只用 CreateEquationSpline2 生成“一侧”的真实函数渐开线。

2. 建立一条经过齿轮中心的水平构造中心线。

3. 只建立半个轮齿。

4. 使用 SolidWorks 的 SketchMirror / 镜向实体功能，把半个轮齿关于水平中心线镜像。

这样另一侧齿廓必须是第一侧的严格镜像，不能重新计算另一条渐开线。

这么做的目的是避免某些齿数，例如 z=33 时，两条独立方程渐开线产生轻微不对称。

====================
四、齿顶圆弧要求
====================

齿顶圆弧必须是真正齿顶圆的一部分。

所以：

圆心必须固定为：

(0,0)

半径必须等于：

ra

它必须与：

分度圆
基圆
齿根圆
中心孔

完全同心。

绝对不能用局部三点圆弧产生一个“小鼻子”圆弧。

建立半齿齿顶圆弧时：

起点 = 单侧渐开线的真实齿顶端点

终点 = 齿顶圆与水平齿中心线的交点：

(ra,0)

使用 SketchManager.CreateArc：

圆心：(0,0)

为了防止 +1 / -1 方向导致生成接近 360° 的错误长圆弧，请不要写死圆弧方向。

请编写一个函数，例如：

CreateShortConcentricArc

逻辑：

先尝试 Direction = +1

然后读取该草图圆弧的 GetLength。

如果：

ArcLength > PI*ra

说明生成成了长弧。

删除该圆弧，再使用 Direction = -1 重新创建。

最终必须保证生成的是小于半圆的“短齿顶圆弧”。

====================
五、单齿根部逻辑
====================

当前版本主要用于教学，因此暂时不用生成滚刀真实 trochoid 齿根过渡曲线。

如果：

rf < rb

数学渐开线不能延伸到基圆以内。

允许采用简化方案：

齿根圆柱
→ 内部连接线
→ 基圆渐开线

单个轮齿草图可以稍微伸入齿根圆柱内部约：

0.2*m

用于保证拉伸轮齿和齿根圆柱可靠合并。

这条内部封闭线最终位于实体内部，因此不会影响外部齿形。

====================
六、完整建模流程
====================

要求最终设计树大致为：

齿轮基体草图
↓
齿根圆柱
↓
齿轮中心轴
↓
单齿渐开线镜像草图
↓
单个渐开线轮齿
↓
轮齿圆周阵列

具体流程：

第一步：
在前视基准面建立齿根圆和中心孔。

第二步：
拉伸成齿根圆柱，拉伸长度为齿宽 b。

第三步：
利用齿根圆柱外圆柱面建立齿轮中心基准轴。

第四步：
重新在前视基准面建立单齿草图。

第五步：
使用 CreateEquationSpline2 创建唯一的一条真实渐开线。

第六步：
读取渐开线真实根部端点和齿顶端点。

优先使用：

GetStartPoint2
GetEndPoint2

如果当前版本不支持，再使用 GetPoints2。

根据距原点的半径判断：

较小半径 = 渐开线根部
较大半径 = 渐开线齿顶

第七步：
建立半个齿的根部连接线。

第八步：
以齿轮中心 (0,0) 为圆心创建齿顶短圆弧。

第九步：
建立水平构造中心线。

第十步：
选择：

渐开线
齿根连接线
齿根半封闭线
齿顶短圆弧

作为普通镜像实体。

Selection Mark = 1

选择水平构造中心线作为镜像轴。

Selection Mark = 2

调用：

SketchMirror

生成严格对称的完整单齿。

第十一步：
退出草图，拉伸单个轮齿。

要求与齿根圆柱合并为同一实体。

第十二步：
利用齿轮中心轴做圆周阵列。

不要自己：

Round(360/z)

也不要累积：

angle = angle + step

必须直接使用：

总角度 = 2*PI
实例数 = z
EqualSpacing = True

例如使用：

FeatureCircularPattern4

使：

z=23
z=29
z=30
z=33
z=37

等齿数都能够由 SolidWorks 自动进行整圈精确等分。

实例数 z 包括原始单齿。

====================
七、单位问题，非常重要
====================

SolidWorks普通几何 API：

CreateLine
CreateArc
CreateCircleByRadius
拉伸长度
坐标

使用米。

所以用户输入 mm 后，普通几何 API 需要除以1000。

例如：

20 mm → 0.02 m

但是：

CreateEquationSpline2

中的方程字符串按照当前 SolidWorks MMGS 文档中的毫米数值建立。

所以渐开线方程中的 rb：

例如：

rb = 28.19 mm

方程字符串中应该使用：

28.19

不能写成：

0.02819

否则渐开线会缩小1000倍。

请务必区分这两种单位逻辑。

====================
八、UserForm要求
====================

宏包含：

一个普通模块
+
一个名为：

frmGear

的 UserForm。

我希望 UserForm 不需要手动拖控件。

请在：

UserForm_Initialize()

中使用：

Me.Controls.Add

动态创建：

5个Label
5个TextBox
2个CommandButton

输入框变量：

txtM
txtZ
txtAlpha
txtB
txtHole

默认值：

2
30
20
20
15

按钮：

生成齿轮
取消

界面显示：

标准直齿圆柱齿轮生成器

模数 m       [2]    mm
齿数 z       [30]
压力角 α     [20]   °
齿宽 b       [20]   mm
中心孔直径   [15]   mm

生成齿轮
取消

并显示一条教学提示：

标准压力角一般取20°；当前教学版建议 z ≥ 18

点击“生成齿轮”后，将参数传给：

GenerateGear(m, z, alphaDeg, faceWidth, holeD)

====================
九、参数检查
====================

需要判断：

m > 0

z必须为整数

教学版先限制：

z >= 18

alpha：

0 < alpha < 45

建议20°

b > 0

holeD >= 0

且：

holeD/2 < rf

错误时弹出中文提示。

====================
十、成功后的教学提示
====================

齿轮生成完成后弹出 MsgBox：

【输入参数】

m
z
α
b
中心孔直径

【基本尺寸】

d = mz

da = m(z+2)

df = m(z-2.5)

db = d*cosα

并显示：

建模过程：

单侧函数渐开线
→ 同心齿顶短圆弧
→ 镜向实体
→ 单齿拉伸
→ 圆周阵列

====================
十一、代码要求
====================

请直接输出：

第一部分：
普通 Module 的完整 VBA 代码

第二部分：
frmGear UserForm 的完整 VBA 代码

不要只输出局部补丁。

不要让我自己寻找需要替换的代码。

代码必须有中文注释，适合教学。

尽量使用 Object 进行晚绑定，减少 SolidWorks 不同版本引用问题。

避免大量 VBA 行继续符导致：

Too many line continuations

如果某条API调用很长，可以保持在一行。

====================
十二、禁止采用的方案
====================

不要：

1. 用10条、20条小直线离散逼近渐开线。
2. 同时分别计算左右两条渐开线。
3. 用两条独立方程曲线作为左右齿面。
4. 用局部三点圆弧作为齿顶。
5. 让齿顶圆弧圆心偏离齿轮中心。
6. 写死齿顶圆弧一定 +1 或一定 -1。
7. 手工把360/z四舍五入以后阵列。
8. 把30个齿全部直接画在一个巨大草图里。
9. 使用Toolbox直接插入标准齿轮。
10. 用联网API或Python代替SolidWorks VBA。

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

最终代码至少应考虑以下测试参数：

测试1：

m=2
z=30
alpha=20
b=20
hole=15

测试2：

m=2
z=29
alpha=20
b=20
hole=15

测试3：

m=2
z=33
alpha=20
b=20
hole=15

特别检查：

z=33时单个轮齿必须关于径向中心线严格对称。

齿顶圆弧必须是齿顶圆的一小段，并且圆心严格位于齿轮中心。

不能出现：

巨大外圆弧
两个局部小鼓包
左右齿面不对称
渐开线被离散成大量平面
随机缺齿或断线

请在输出代码之前先检查上述建模逻辑是否自洽，然后一次性输出完整代码。