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

我要的是：

SolidWorks VBA + SolidWorks API

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

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

最终至少包含：

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

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


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

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

1. 模数 m，单位 mm
2. 压力角 α，单位 °
3. 生成齿数 n，必须为整数
4. 齿宽 b，单位 mm
5. 基体高度 H，单位 mm

默认参数：

m = 2
α = 20°
n = 20
b = 20 mm
H = 10 mm

点击：

“生成齿条”

之后，SolidWorks 自动完成完整标准直齿条建模。

要求：

最终生成普通、可编辑的 SolidWorks 草图和实体特征，不是黑盒模型。


==================================================
二、宏的核心定位
==================================================

这个宏主要用于：

教学
快速建模
参数演示
标准齿轮齿条啮合准备

优先级：

稳定性 > 花哨功能
简单 > 复杂
教学可解释 > 黑箱建模

最终操作必须尽量傻瓜：

打开宏
↓
输入5个参数
↓
点击“生成齿条”
↓
自动完成


==================================================
三、齿条基本理论
==================================================

采用标准全齿高制直齿条。

输入：

模数 m
压力角 α

齿距：

p = PI * m

分度线上的齿厚：

s = p / 2

分度线上的半齿厚：

s/2 = p/4

齿顶高：

ha = m

齿根高：

hf = 1.25*m

因此：

分度线：

y = 0

齿顶线：

y = +m

齿根线：

y = -1.25*m

齿条底面：

y = -(1.25*m + H)

其中：

H

表示“从齿根线向下到底面的基体高度”。

所以齿条从齿顶到底面的总高度为：

Htotal = H + 2.25*m


==================================================
四、压力角和齿廓计算
==================================================

压力角 α 输入单位为度。

程序内部转换：

alpha = alphaDeg * PI / 180

齿条齿面是直线。

如果分度线水平，则齿面相对竖直方向倾斜压力角 α。

分度线上半齿厚：

pitchHalf = p/4

齿顶处半齿厚：

topHalf = p/4 - ha*tan(alpha)

即：

topHalf = p/4 - m*tan(alpha)

齿根处半齿厚：

rootHalf = p/4 + hf*tan(alpha)

即：

rootHalf = p/4 + 1.25*m*tan(alpha)

必须检查：

topHalf > 0

否则提示：

“当前参数导致齿顶宽度小于或等于0，请检查模数和压力角。”

还必须检查相邻齿根不能相互重叠：

rootGap = p - 2*rootHalf

要求：

rootGap > 0

否则停止生成并提示。


==================================================
五、单齿几何定义
==================================================

假设某一个齿的中心位于：

xc

则该齿四个主要点为：

左齿根点：

xRootL = xc - rootHalf
yRoot  = -hf

左齿顶点：

xTopL = xc - topHalf
yTop  = +ha

右齿顶点：

xTopR = xc + topHalf
yTop  = +ha

右齿根点：

xRootR = xc + rootHalf
yRoot  = -hf

一个标准齿依次由：

左齿面
↓
齿顶线
↓
右齿面

构成。

相邻两个齿之间，用齿根水平直线连接。


==================================================
六、不要采用线性阵列方案
==================================================

为了提高稳定性：

不要先建一个单齿实体，再调用 SolidWorks Linear Pattern。

不要依赖：

线性阵列数量
阵列距离
Pattern API

请直接利用数学坐标，一次性生成整段齿条的完整二维闭合轮廓。

即：

For i = 0 To n-1

依次计算每一个齿中心位置：

xc = xLeft + p/2 + i*p

然后直接创建：

齿根平线
左齿面
齿顶
右齿面

这样整个齿条所有齿都是同一个数学公式生成。

优点：

1. 不存在阵列失败
2. 不存在阵列距离误差
3. 不存在单齿实体合并问题
4. 改变齿数只改变循环次数
5. 特别适合教学


==================================================
七、齿条总长度
==================================================

生成 n 个完整齿距。

齿条有效长度：

L = n*p

要求整个齿条关于草图原点左右对称。

所以：

xLeft = -L/2

xRight = +L/2

第一个齿中心：

xc1 = xLeft + p/2

第 i 个齿中心：

xc = xLeft + p/2 + i*p


==================================================
八、完整二维齿条轮廓
==================================================

完整齿条轮廓必须是一个闭合草图。

顶部轮廓：

左边界齿根
↓
第1齿
↓
齿根平线
↓
第2齿
↓
……
↓
第n齿
↓
右边界齿根

然后：

右侧竖边
↓
底边
↓
左侧竖边

回到起点。

因此完整轮廓大致为：

             ┌──┐        ┌──┐
            /    \      /    \
___________/      \____/      \___________
|                                         |
|                                         |
|                                         |
|_________________________________________|

必须保证：

没有重复线
没有零长度线
没有断点
没有开放轮廓
没有自交


==================================================
九、必须单独生成“分度线草图”
==================================================

教学用必须额外创建一个独立草图：

名称：

“齿条分度线草图”

分度线：

y = 0

从：

(xLeft,0)

到：

(xRight,0)

最好设置成构造线。

这个草图不能参与齿条实体拉伸。

它只用于：

教学展示
齿轮齿条啮合定位
解释模数和齿距


==================================================
十、最终设计树
==================================================

最终设计树尽量保持简单：

齿条分度线草图
↓
齿条轮廓草图
↓
标准直齿条

不要创建大量多余特征。

不要一个齿对应一个特征。

不要建立20个或30个单独实体。


==================================================
十一、拉伸逻辑
==================================================

整个完整二维齿条轮廓只进行一次凸台拉伸。

拉伸长度：

b

即齿宽。

特征名称：

“标准直齿条”

要求：

整个齿条最终为一个实体。


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

非常重要。

用户输入和公式计算：

统一使用 mm。

但是 SolidWorks 普通几何 API：

CreateLine
CreateCircle
CreateArc
FeatureExtrusion
坐标

使用“米”。

所以在实际 API 调用时：

所有坐标必须：

/1000

例如：

20 mm → 0.02 m

建议写一个辅助函数，例如：

SafeCreateLineMM

输入：

x1,y1,x2,y2

全部单位为 mm。

该函数内部自动除以1000，再调用：

SketchManager.CreateLine

并检查返回对象是否为 Nothing。


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

必须创建一个：

frmRack

UserForm。

UserForm设计界面可以完全空白。

运行时通过：

UserForm_Initialize()

使用：

Me.Controls.Add

动态生成全部控件。

不要让我手动拖：

Label
TextBox
CommandButton

窗口显示：

标准直齿条生成器

模数 m           [2]    mm
压力角 α         [20]   °
生成齿数 n       [20]
齿宽 b           [20]   mm
基体高度 H       [10]   mm

[生成齿条]   [取消]

教学提示：

标准全齿高制：
ha=m
hf=1.25m
p=πm


==================================================
十四、输入框变量
==================================================

建议使用：

txtM
txtAlpha
txtTeeth
txtB
txtBodyH

按钮：

btnGenerate
btnCancel


==================================================
十五、输入参数防呆
==================================================

必须检查：

m > 0

0 < α < 45°

n >= 1

n必须是整数

b > 0

H > 0

同时检查：

topHalf > 0

rootGap > 0

如果参数不合理：

不要继续建模。

直接弹中文错误提示。


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

请设置：

Private gStage As String

在每一个主要阶段更新：

gStage = "检查输入参数"

gStage = "计算齿条参数"

gStage = "检查齿形几何"

gStage = "创建齿条分度线草图"

gStage = "创建齿条二维轮廓"

gStage = "获取齿条轮廓草图"

gStage = "拉伸标准齿条"

如果发生错误：

MsgBox必须显示：

宏运行错误

失败阶段：
xxxx

详细信息：
xxxx

不要只提示：

对象变量未设置

这种没有定位价值的信息。


==================================================
十七、完整轮廓生成方式
==================================================

请写一个函数，例如：

DrawCompleteRackProfile

输入：

pitch
nTeeth
topHalf
rootHalf
xLeft
xRight
yTop
yRoot
yBottom

内部通过：

For i = 0 To nTeeth-1

依次生成全部齿。

每个齿中心：

xc = xLeft + pitch/2 + i*pitch

然后：

xRootL = xc-rootHalf

xTopL = xc-topHalf

xTopR = xc+topHalf

xRootR = xc+rootHalf

依次创建：

上一齿结束位置 → 当前左根点
当前左根点 → 当前左顶点
当前左顶点 → 当前右顶点
当前右顶点 → 当前右根点

循环完成后：

补最后齿根平线

然后：

右侧边
底边
左侧边

闭合整个草图。


==================================================
十八、避免零长度线
==================================================

在创建水平齿根线之前，必须判断：

Abs(x2-x1) > tolerance

例如：

0.0000001 mm

如果两个点已经相同：

不要再创建零长度线。

否则某些参数下 SolidWorks CreateLine 可能失败。


==================================================
十九、完成后的教学提示
==================================================

生成成功以后，弹出MsgBox显示：

【输入参数】

模数 m
压力角 α
生成齿数 n
齿宽 b
基体高度 H


【齿条参数】

齿距：

p = πm

分度线齿厚：

s = p/2

齿顶高：

ha = m

齿根高：

hf = 1.25m

有效长度：

L = n*p

还可以显示：

总高度：

Htotal = H + 2.25m


最后显示：

建模过程：

标准参数
→ 分度线
→ 完整齿形轮廓
→ 一次拉伸


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

不要：

1. 使用大量小线段近似本来就是直线的齿面。

2. 使用一个单齿实体 + SolidWorks线性阵列作为主方案。

3. 一个齿建立一个单独特征。

4. 生成多个独立实体后再合并。

5. 使用Toolbox直接插入齿条。

6. 使用Python代替SolidWorks VBA。

7. 依赖联网API。

8. 手工逐齿输入坐标。

9. 把分度线放到实体轮廓草图中参与拉伸。

10. 创建零长度线。

11. 允许开放草图直接尝试拉伸。

12. 用固定长度代替 n*πm 的参数计算。


==================================================
二十一、重点测试参数
==================================================

测试1：

m = 2
α = 20°
n = 20
b = 20
H = 10

理论值：

p = 6.283185... mm

s = 3.141593... mm

ha = 2 mm

hf = 2.5 mm

有效长度：

L ≈ 125.664 mm

总高度：

Htotal = 14.5 mm


测试2：

m = 1
α = 20°
n = 10
b = 10
H = 6


测试3：

m = 3
α = 20°
n = 30
b = 25
H = 15

要求：

不同模数、不同齿数时全部使用同一个完整轮廓算法。


==================================================
二十二、最终输出要求
==================================================

请先自行检查：

数学公式
坐标逻辑
SolidWorks API单位
轮廓闭合
UserForm控件名称
错误处理

是否自洽。

然后一次性输出：

第一部分：
完整Module VBA代码

第二部分：
完整frmRack UserForm代码

不要只给局部补丁。

不要让我自己从旧代码中寻找替换位置。

代码尽量有中文注释。

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

Too many line continuations

整体风格要求：

稳定
傻瓜
教学清楚
结构简单
方便以后放到SolidWorks自定义CommandManager工具栏中。