约束系统详解
第05章 约束系统详解
5.1 约束系统概述
5.1.1 什么是约束
约束(Constraint)是参数化CAD的核心概念。约束定义了几何实体之间的关系或限制,使得修改一处几何时,其他相关几何能够自动调整以保持这些关系。
约束的作用
- 定义几何关系(如平行、垂直、相切)
- 定义数值参数(如长度、角度、半径)
- 固定位置或方向
- 表达设计意图
5.1.2 自由度 (DOF)
自由度是理解约束系统的关键概念。
基本自由度
- 2D点: 2个自由度 (u, v坐标)
- 3D点: 3个自由度 (x, y, z坐标)
- 2D法线: 0个自由度 (继承自工作平面)
- 3D法线: 3个自由度 (四元数,但有1个约束)
自由度计算
总自由度 = 所有参数的自由度总和 - 约束数量
例如:
2个2D点 = 2 × 2 = 4 DOF
1个距离约束 = -1 DOF
剩余 = 4 - 1 = 3 DOF
约束状态
- 完全约束 (DOF = 0): 几何完全确定,显示绿色
- 欠约束 (DOF > 0): 几何还可以移动,显示白色
- 过约束: 约束冲突或冗余,显示红色
5.1.3 约束分类
几何约束: 定义几何关系
- 重合、平行、垂直、相切、对称、水平、垂直
尺寸约束: 定义数值
- 距离、角度、半径/直径
特殊约束: 特定用途
- 固定位置、等长、等半径
5.2 点约束
5.2.1 重合约束 (Coincident)
使两个点位于完全相同的位置。
快捷键: 选择两点后自动提示,或使用约束菜单
用法
- 选择两个点
- 菜单:
约束 → 重合或点击约束工具
适用对象
- 两个点
- 点和线的端点
- 点和弧的端点
约束效果
- 移除2个自由度(2D)
- 移除3个自由度(3D)
5.2.2 点在线上 (Point on Line)
使点位于一条线上。
快捷键: O
用法
- 选择一个点和一条线
- 按
O或选择菜单约束
约束效果
- 2D: 移除1个自由度
- 3D: 移除2个自由度
注意: 点可以在线的延长线上,不限于线段范围内
5.2.3 点在圆上 (Point on Circle)
使点位于圆或弧的圆周上。
快捷键: 通过约束菜单
用法
- 选择一个点和一个圆/弧
- 应用约束
3D特性: 实际上约束点在圆的圆柱面上(向圆法线方向延伸)
5.2.4 点在平面上 (Point in Plane)
使点位于指定平面上。
用法
- 选择一个3D点
- 选择一个工作平面
- 应用约束
约束效果: 移除1个自由度
5.2.5 点到面距离 (Point Face Distance)
设置点到平面的距离。
用法
- 选择一个点和一个平面
- 设置距离值
特性
- 正值: 点在平面法线方向
- 负值: 点在反方向
- 零值: 等同于点在平面上
5.3 线约束
5.3.1 水平约束 (Horizontal)
使线段水平(平行于工作平面的U轴)。
快捷键: H
用法
- 选择一条线段或两个点
- 按
H
适用对象
- 单条线段
- 两个点(使连线水平)
- 多个点(3.2新增,使所有点水平对齐)
- 多条线段(3.2新增)
5.3.2 垂直约束 (Vertical)
使线段垂直(平行于工作平面的V轴)。
快捷键: V
用法: 同水平约束
5.3.3 平行约束 (Parallel)
使两条线平行。
快捷键: /
用法
- 选择两条线
- 按
/或菜单选择
约束效果
- 2D: 移除1个自由度
- 3D: 移除2个自由度
5.3.4 垂直于约束 (Perpendicular)
使两条线垂直(成90°角)。
快捷键: ]
用法: 同平行约束
特性: 等同于角度约束设为90°
5.3.5 中点约束 (Midpoint)
使点位于线段的中点。
快捷键: M
用法
- 选择一个点和一条线段
- 按
M
约束效果: 移除2个自由度(点的位置完全由线段决定)
5.4 距离和尺寸约束
5.4.1 点到点距离 (Point-Point Distance)
设置两点之间的距离。
快捷键: D
用法
- 选择两个点
- 按
D - 输入距离值
特性
- 无符号距离,值必须为正
- 可以在工作平面内测量(投影距离)
5.4.2 点到线距离 (Point-Line Distance)
设置点到线的垂直距离。
快捷键: D (自动识别)
用法
- 选择一个点和一条线
- 按
D - 输入距离值
2D特性
- 有符号距离
- 正值: 点在线的上方
- 负值: 点在线的下方
3D特性
- 无符号距离,值必须为正
5.4.3 投影距离 (Projected Distance)
沿指定方向测量距离。
用法
- 选择两个点和一条线(定义方向)
- 应用投影距离约束
- 设置值
特性: 有符号距离,测量沿线方向的分量
5.4.4 直径/半径约束 (Diameter)
设置圆或弧的直径。
快捷键: D (选择圆/弧时)
用法
- 选择一个圆或弧
- 按
D - 输入直径值
半径模式
- 在配置中启用"使用半径代替直径"
- 或在属性浏览器中切换
- 弧默认使用半径(3.2新增)
5.5 角度约束
5.5.1 角度约束 (Angle)
设置两条线之间的夹角。
快捷键: N
用法
- 选择两条线
- 按
N - 输入角度值(度数)
约束方程
(A·B)/(|A||B|) = cos(θ)
other参数
- false: 使用角度θ
- true: 使用补角(180°-θ)
注意: 角度有方向性,±θ可能产生相同结果
5.5.2 等角约束 (Equal Angle)
使两对线的夹角相等。
快捷键: N (3.2版本,选择4条线时)
用法
- 选择四条线(两对)
- 按
N
other参数
- false: θ1 = θ2
- true: θ1 = 180° - θ2(补角相等)
5.5.3 方向相同约束 (Same Orientation)
使两个法线具有相同的方向。
用法
- 选择两个法线
- 应用约束
约束效果: 移除3个自由度
5.6 对称约束
5.6.1 关于平面对称 (Symmetric)
使两点关于一个平面对称。
快捷键: S
用法
- 选择两个点
- 选择对称平面
- 按
S
对称条件
- 两点在平面两侧
- 到平面距离相等
- 连线垂直于平面
5.6.2 水平对称 (Symmetric Horizontal)
使两点关于工作平面的垂直轴对称。
快捷键: S (在2D中,自动识别)
用法
- 选择两个点
- 应用约束
5.6.3 垂直对称 (Symmetric Vertical)
使两点关于工作平面的水平轴对称。
5.6.4 关于线对称 (Symmetric Line)
使两点关于一条线对称。
用法
- 选择两个点和一条线
- 应用对称约束
5.7 等式约束
5.7.1 等长约束 (Equal Length)
使多条线段长度相等。
快捷键: Q
用法
- 选择两条或更多线段
- 按
Q
3.2新功能
- 支持三条或更多线段
- 快捷键从
E改为Q
5.7.2 等半径约束 (Equal Radius)
使多个圆或弧半径相等。
快捷键: E
用法
- 选择两个或更多圆/弧
- 按
E
5.7.3 长度比约束 (Length Ratio)
设置两条线长度的比值。
用法
- 选择两条线
- 应用长度比约束
- 设置比值
公式: length(A) / length(B) = 比值
5.7.4 长度差约束 (Length Difference)
设置两条线长度的差。
快捷键: J
用法
- 选择两条线
- 按
J - 设置差值
公式: length(A) - length(B) = 差值
5.7.5 弧长相关约束 (3.1新增)
弧-弧长度比: 两个弧的弧长比
弧-线长度比: 弧长与线长的比
弧-弧长度差: 两个弧的弧长差
弧-线长度差: 弧长与线长的差
5.8 相切约束
5.8.1 弧-线相切 (Arc-Line Tangent)
使弧与线在端点处相切。
快捷键: [
用法
- 选择一个弧和一条线
- 按
[
other参数
- false: 在弧的起点相切
- true: 在弧的终点相切
注意: 3.2版本允许不在端点的相切
5.8.2 曲线-曲线相切 (Curve-Curve Tangent)
使两条曲线(弧或贝塞尔曲线)相切。
用法
- 选择两条曲线
- 应用相切约束
参数
- other: 指定第一条曲线的相切端
- other2: 指定第二条曲线的相切端
5.8.3 贝塞尔-线相切 (Cubic-Line Tangent)
使贝塞尔曲线与线相切。
5.9 特殊约束
5.9.1 固定约束 (Where Dragged)
将点锁定在当前位置。
用法
- 选择一个点
- 应用固定约束
约束效果
- 2D: 移除2个自由度
- 3D: 移除3个自由度
警告: 可能导致过约束
5.9.2 点到点等距约束 (Equal Point-Line Distance)
使点A到线的距离等于线段B的长度。
用法
- 选择一个点、一条参考线、一条线段
- 应用约束
5.9.3 平行面约束 (3.2新增)
使两个面平行。
用法
- 选择两个面
- 应用平行约束
5.9.4 垂直面约束 (3.2新增)
使两个面垂直。
5.10 约束管理
5.10.1 参考约束
参考约束显示测量值但不参与求解。
创建参考约束
Shift+D: 创建参考距离Shift+N: 创建参考角度- 或: 选择约束后在属性浏览器中设为参考
用途
- 显示计算结果
- 检查几何属性
- 避免过约束
5.10.2 约束显示控制
显示/隐藏约束
- 工具栏按钮切换
- 属性浏览器中单独控制
显示模式(3.2新增)
- 显示所有约束
- 仅显示尺寸
- 隐藏所有约束
5.10.3 约束编辑
修改约束值
- 双击约束标签
- 输入新值
- 按回车确认
表达式支持
- 数学运算:
50*2,100/3 - 三角函数:
sin(45),cos(60) - 常量:
pi - 数字分组:
1_000(表示1000)
5.10.4 约束诊断
自由度显示
- 菜单:
分析 → 显示自由度 - 高亮显示欠约束的点
约束问题检测
- 红色标记冲突约束
- 属性浏览器显示冗余约束
冗余约束设置
- 可以允许冗余约束(降低求解稳定性)
- 配置超时以避免UI冻结
5.11 约束求解
5.11.1 求解过程
SolveSpace使用基于牛顿-拉夫森方法的非线性约束求解器:
1. 收集所有参数(点坐标、尺寸值等)
2. 构建约束方程组
3. 计算雅可比矩阵
4. 迭代求解直到收敛或失败
5.11.2 求解结果
OKAY: 所有约束满足
INCONSISTENT: 约束冲突,无解
DIDNT_CONVERGE: 求解器未能收敛
TOO_MANY_UNKNOWNS: 参数过多
REDUNDANT_OKAY: 有冗余约束但求解成功
5.11.3 拖动行为
拖动实体时:
- 计算拖动位置
- 设置为"dragged"参数
- 求解器优先保持dragged参数
- 调整其他参数满足约束
标记拖动: 可以手动标记某些参数为"dragged"以影响求解行为
5.12 最佳实践
5.12.1 约束策略
- 先固定原点: 约束一个点到原点
- 由内向外: 从核心几何开始约束
- 先几何后尺寸: 先建立几何关系,再添加尺寸
- 避免过约束: 使用参考约束显示不需要参与求解的尺寸
5.12.2 常见问题解决
欠约束
- 检查自由度显示
- 添加缺失的约束
- 考虑固定约束
过约束
- 识别冲突约束
- 删除或改为参考
- 检查隐式约束
求解失败
- 调整初始几何
- 简化约束
- 分步添加约束
5.13 总结
本章详细介绍了SolveSpace的约束系统:
- 基础概念: 约束、自由度、约束分类
- 点约束: 重合、在线上、在圆上、在平面上
- 线约束: 水平、垂直、平行、垂直于、中点
- 尺寸约束: 距离、角度、直径
- 对称约束: 平面对称、轴对称、线对称
- 等式约束: 等长、等半径、比值、差值
- 相切约束: 各种曲线相切
- 约束管理: 参考约束、显示控制、诊断
- 求解原理: 非线性求解过程
掌握约束系统是进行参数化设计的关键。下一章将介绍三维建模基础。
导航
- 上一章: 第04章 - 草图绘制基础
- 下一章: 第06章 - 三维建模基础

浙公网安备 33010602011771号