mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-12 23:13:32 +00:00
260 lines
8.5 KiB
Markdown
260 lines
8.5 KiB
Markdown
# 螺旋抬升边界警告功能文档
|
||
|
||
## 1. 背景
|
||
|
||
### 1.1 问题描述
|
||
|
||
OrcaSlicer 在使用螺旋抬升(Spiral Lift)功能时存在安全风险:当模型靠近打印床边界时,螺旋抬升过程中可能会超出床范围,导致打印头撞击床边缘造成硬件损坏。
|
||
|
||
### 1.2 螺旋抬升原理
|
||
|
||
螺旋抬升是一种平滑的 Z 轴抬升方式,通过螺旋路径避免打印头在抬升时与模型碰撞。其计算公式为:
|
||
|
||
```
|
||
radius = z_hop / (2 × π × tan(travel_slope))
|
||
```
|
||
|
||
**典型参数**:
|
||
- `z_hop`:Z 轴抬升高度,通常为 0.2mm
|
||
- `travel_slope`:移动斜率,通常为 1°-3°
|
||
|
||
**示例计算**(travel_slope=3°, z_hop=0.2mm):
|
||
```
|
||
radius = 0.2 / (2 × π × tan(3°))
|
||
≈ 0.608mm
|
||
螺旋直径 ≈ 1.2mm
|
||
```
|
||
|
||
### 1.3 风险场景
|
||
|
||
1. **模型靠近边界**:螺旋路径可能延伸到床外
|
||
2. **大尺寸模型**:导入或缩放到接近床尺寸的模型
|
||
3. **移动模型**:用户将模型移动到床边缘
|
||
|
||
## 2. 解决方案
|
||
|
||
### 2.1 设计思路
|
||
|
||
在用户移动、导入或缩放模型时,实时检测模型边界与床边界的距离,当距离小于安全阈值时显示警告提示。
|
||
|
||
### 2.2 实现方案
|
||
|
||
#### 2.2.1 架构设计
|
||
|
||
```
|
||
用户操作(移动/导入/缩放)
|
||
↓
|
||
reload_scene() 触发场景刷新
|
||
↓
|
||
check_outside_state() 检测模型状态
|
||
↓
|
||
计算模型边界框与床边界的最小距离
|
||
↓
|
||
判断是否 < 3mm 阈值
|
||
↓
|
||
设置 near_boundary_for_spiral_lift 标志
|
||
↓
|
||
_set_warning_notification() 显示警告
|
||
```
|
||
|
||
#### 2.2.2 核心代码实现
|
||
|
||
**检测逻辑**(`3DScene.cpp`):
|
||
```cpp
|
||
// 螺旋抬升安全余量:3.5mm
|
||
constexpr double SPIRAL_LIFT_SAFETY_MARGIN = 3.5; // mm
|
||
|
||
// 计算模型边界框与床边界的最小距离
|
||
double min_distance_x = std::min({
|
||
std::abs(bb.min.x() - bed_bb.min.x()),
|
||
std::abs(bed_bb.max.x() - bb.max.x())
|
||
});
|
||
double min_distance_y = std::min({
|
||
std::abs(bb.min.y() - bed_bb.min.y()),
|
||
std::abs(bed_bb.max.y() - bb.max.y())
|
||
});
|
||
|
||
double min_distance = std::min({min_distance_x, min_distance_y});
|
||
if (min_distance < SPIRAL_LIFT_SAFETY_MARGIN) {
|
||
volume->near_boundary_for_spiral_lift = true;
|
||
}
|
||
```
|
||
|
||
**警告触发**(`GLCanvas3D.cpp`):
|
||
```cpp
|
||
if (contained_min_one) {
|
||
_set_warning_notification(EWarning::SpiralLiftNearBoundary,
|
||
_is_any_volume_near_boundary_for_spiral_lift());
|
||
}
|
||
```
|
||
|
||
#### 2.2.3 新增数据结构
|
||
|
||
**GLVolume 成员变量**(`3DScene.hpp`):
|
||
```cpp
|
||
bool near_boundary_for_spiral_lift : 1; // 是否靠近边界
|
||
```
|
||
|
||
**EWarning 枚举**(`GLCanvas3D.hpp`):
|
||
```cpp
|
||
enum class EWarning {
|
||
// ... 现有类型
|
||
SpiralLiftNearBoundary // 螺旋抬升靠近边界警告
|
||
};
|
||
```
|
||
|
||
### 2.3 用户界面
|
||
|
||
**警告级别**:`SLICING_SERIOUS_WARNING`(红色/橙色警告)
|
||
|
||
**警告文本**:
|
||
- 英文:"An object is too close to the plate boundary. Spiral lift during printing may exceed the bed and cause a crash. Please move the object away from the edge (recommend keeping at least 3.5mm distance)."
|
||
- 中文:"模型距离打印床边界太近。打印过程中的螺旋抬升可能会超出床范围导致撞机。请将模型移离边缘(建议保持至少3.5mm的距离)。"
|
||
|
||
## 3. 阈值选取依据
|
||
|
||
### 3.1 理论计算
|
||
|
||
| 参数 | 典型值 | 说明 |
|
||
|------|--------|------|
|
||
| travel_slope | 1° - 3° | 移动斜率,角度越小螺旋半径越大 |
|
||
| z_hop | 0.2mm | Z 轴抬升高度 |
|
||
| 螺旋直径(1°) | ≈ 3.6mm | 最不利情况 |
|
||
| 螺旋直径(3°) | ≈ 1.2mm | 常见情况 |
|
||
|
||
### 3.2 阈值选项对比
|
||
|
||
| 选项 | 阈值 | 优点 | 缺点 |
|
||
|------|------|------|------|
|
||
| 2mm | 螺旋直径(1.2mm) + 0.8mm | 覆盖常见情况 | 对于1°斜率不够安全 |
|
||
| 3mm | 更保守的安全距离 | 覆盖大部分配置 | 1°斜率时仍有风险 |
|
||
| **3.5mm** | **最佳平衡点** | **覆盖1°-3°斜率,安全且实用** | **略保守,但合理** |
|
||
| 5mm | 非常保守 | 最大安全范围 | 过于保守,限制用户操作 |
|
||
|
||
### 3.3 最终选择
|
||
|
||
**选择 3.5mm 作为阈值**,理由:
|
||
|
||
1. **安全性**:完全覆盖 travel_slope=1° 的最不利情况(螺旋直径 ≈ 3.6mm)
|
||
2. **实用性**:不会过度限制用户的模型放置空间
|
||
3. **余量充足**:比常见情况(3°斜率,直径1.2mm)多出近3倍的安全距离
|
||
4. **用户体验**:在安全性和可用性之间取得最佳平衡
|
||
|
||
## 4. 风险评估
|
||
|
||
### 4.1 技术风险
|
||
|
||
| 风险项 | 风险等级 | 缓解措施 |
|
||
|--------|----------|----------|
|
||
| 检测精度问题 | 低 | 使用边界框检测,足够准确 |
|
||
| 性能影响 | 低 | 只在模型变化时检测,开销极小 |
|
||
| 误报/漏报 | 低 | 使用 3mm 保守阈值,降低误报 |
|
||
| 圆形床支持 | 中 | 当前仅支持矩形床,未来可扩展 |
|
||
|
||
### 4.2 影响面分析
|
||
|
||
**正面影响**:
|
||
- ✅ 防止打印头撞机,保护硬件
|
||
- ✅ 提升用户体验,提前发现风险
|
||
- ✅ 降低售后成本,减少设备损坏
|
||
|
||
**潜在负面影响**:
|
||
- ⚠️ 可能频繁触发警告,影响用户体验(已通过 3.5mm 阈值缓解)
|
||
- ⚠️ 仅支持 Snapmaker U1 矩形床(已明确限制)
|
||
|
||
### 4.3 使用场景
|
||
|
||
| 场景 | 是否触发 | 说明 |
|
||
|------|----------|------|
|
||
| 移动模型靠近边界 | ✅ 是 | 实时检测,移动时即时提醒 |
|
||
| 导入大尺寸模型 | ✅ 是 | 导入后立即检测 |
|
||
| 缩放模型变大 | ✅ 是 | 缩放后重新检测 |
|
||
| 模型完全在床中心 | ❌ 否 | 距离 ≥ 3.5mm 时不触发 |
|
||
| 模型部分超出边界 | ✅ 是 | 即使超出也会检测 |
|
||
|
||
### 4.4 原点偏移的影响
|
||
|
||
对于 Snapmaker U1,配置了原点偏移(x: -0.5, y: -1),这已经体现在 `printable_area` 中:
|
||
|
||
```json
|
||
"printable_area": [
|
||
"0.5x1", // 左下角(考虑了原点偏移)
|
||
"270.5x1", // 右下角
|
||
"270.5x271", // 右上角
|
||
"0.5x271" // 左上角
|
||
]
|
||
```
|
||
|
||
**实际可打印范围**(U1):
|
||
- X: 0.5 ~ 270.5(宽度 270mm)
|
||
- Y: 1 ~ 271(高度 270mm)
|
||
|
||
**不报警告的安全区域**(距离边界 ≥ 3.5mm):
|
||
- X: **4 ~ 267**
|
||
- Y: **4.5 ~ 267.5**
|
||
|
||
## 5. 技术实现细节
|
||
|
||
### 5.1 修改文件清单
|
||
|
||
| 文件 | 修改内容 |
|
||
|------|----------|
|
||
| `src/slic3r/GUI/GLCanvas3D.hpp` | 添加 EWarning::SpiralLiftNearBoundary 枚举 |
|
||
| `src/slic3r/GUI/GLCanvas3D.cpp` | 添加警告文本和触发逻辑 |
|
||
| `src/slic3r/GUI/3DScene.hpp` | 添加 GLVolume 成员变量 |
|
||
| `src/slic3r/GUI/3DScene.cpp` | 实现距离检测逻辑 |
|
||
| `localization/i18n/Snapmaker_Orca.pot` | 英文翻译 |
|
||
| `localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po` | 中文翻译 |
|
||
|
||
### 5.2 关键函数
|
||
|
||
| 函数 | 位置 | 功能 |
|
||
|------|------|------|
|
||
| `GLVolumeCollection::check_outside_state()` | 3DScene.cpp:1050 | 检测模型状态,计算边界距离 |
|
||
| `GLVolumeCollection::is_any_volume_near_boundary_for_spiral_lift()` | 3DScene.cpp:1218 | 检查是否有模型靠近边界 |
|
||
| `GLCanvas3D::reload_scene()` | GLCanvas3D.cpp:2310 | 场景刷新,触发检测 |
|
||
| `GLCanvas3D::_set_warning_notification()` | GLCanvas3D.cpp:9659 | 显示警告通知 |
|
||
|
||
### 5.3 调试信息
|
||
|
||
如需调试,可以在 `3DScene.cpp:1134` 附近添加日志:
|
||
|
||
```cpp
|
||
if (min_distance < SPIRAL_LIFT_SAFETY_MARGIN) {
|
||
BOOST_LOG_TRIVIAL(warning) << "Volume near boundary: " << volume->name
|
||
<< ", min_distance=" << min_distance
|
||
<< " (threshold=" << SPIRAL_LIFT_SAFETY_MARGIN << ")";
|
||
volume->near_boundary_for_spiral_lift = true;
|
||
}
|
||
```
|
||
|
||
## 6. 未来改进方向
|
||
|
||
### 6.1 短期改进
|
||
|
||
1. **动态阈值计算**:根据当前配置的 `travel_slope` 和 `z_hop` 动态计算阈值
|
||
- 公式:`threshold = z_hop / (π × tan(travel_slope)) + safety_margin`
|
||
- 对于 3° 斜率 + 0.4mm z_hop,阈值可降至约 2.5mm
|
||
2. **配置选项**:允许用户在设置中调整阈值或关闭警告
|
||
3. **可视化指示**:在 3D 视图中用颜色标记靠近边界的模型
|
||
|
||
### 6.2 长期改进
|
||
|
||
1. **圆形床支持**:扩展到支持 Delta 打印机的圆形床
|
||
2. **精确碰撞检测**:使用模型的实际几何而非边界框进行检测
|
||
3. **自动修复建议**:提供一键自动移动模型到安全位置的功能
|
||
|
||
## 7. 总结
|
||
|
||
本次实现通过在模型移动、导入、缩放时实时检测边界距离,当距离小于 **3.5mm** 时显示红色警告,有效预防了螺旋抬升导致的撞机风险。
|
||
|
||
**核心优势**:
|
||
- 被动防御 → 主动预警
|
||
- 事后发现 → 事前提醒
|
||
- 保护硬件,提升用户体验
|
||
|
||
**适用范围**:
|
||
- Snapmaker U1 打印机(矩形床,带原点偏移)
|
||
- 所有使用螺旋抬升功能的场景
|
||
- 覆盖 travel_slope 1°-3° 的配置范围
|