Files
OrcaSlicer/docs/release_risk_assessment.md
xiaoyeliu a1769a2148 Feature boundary test lxy (#128)
* Add Boundary validator

* Boundary test ui

* refect & optimize boundary validation
2026-01-21 19:52:11 +08:00

15 KiB
Raw Blame History

OrcaSlicer G-code边界检测 - 发版风险评估与测试指南

文档版本: v1.0-RISK 创建日期: 2026-01-20 项目编号: ORCA-2026-001-RELEASE 风险等级: 🟡 中等风险 (需要充分测试)


📋 执行摘要

核心变更

本次实施为OrcaSlicer添加了完整的边界检测系统包括8个漏洞修复共涉及12个文件约2000行新增/修改代码。

风险评级

维度 风险等级 说明
功能影响 🟡 改变边界检查行为,可能影响部分切片结果
性能影响 🟢 性能影响 < 5%,用户无感知
兼容性 🟡 可能影响现有打印配置(边缘打印)
回滚难度 🟢 修改集中,可快速回滚
测试覆盖 🟡 需要新增测试用例

建议措施

推荐发布 - 建议在充分测试后发布 ⚠️ 必须测试 - 边界打印场景需要验证 📝 发布说明 - 需要在更新日志中说明变更


📂 修改文件清单

核心代码修改 (9个文件)

文件 修改类型 代码量 风险等级 说明
src/libslic3r/BuildVolume.hpp 新增方法 +3 🟢 新增接口声明
src/libslic3r/BuildVolume.cpp 新增方法 +52 🟢 Travel检查实现
src/libslic3r/GCode/GCodeProcessor.hpp 结构扩展 +60 🟢 扩展ConflictResult
src/libslic3r/Print.hpp 新增方法 +20 🟢 违规追踪接口
src/libslic3r/Print.cpp 验证增强 +70 🟡 擦料塔+Skirt检查
src/libslic3r/GCodeWriter.cpp 逻辑增强 +130 🟡 螺旋/懒惰抬升降级
src/libslic3r/Brim.cpp 验证增强 +60 🟡 Brim边界检查
src/libslic3r/Support/SupportMaterial.cpp 验证增强 +80 🟡 支撑边界检查
src/slic3r/GUI/GCodeViewer.cpp 验证增强 +50 🟡 Travel移动检查

新增文件 (4个)

文件 行数 用途 风险
src/libslic3r/BoundaryValidator.hpp 149 验证框架接口 🟢
src/libslic3r/BoundaryValidator.cpp 211 验证框架实现 🟢
tools/analyze_gcode_bounds.py ~500 命令行诊断工具 🟢
tools/gcode_boundary_checker_gui.py ~700 GUI诊断工具 🟢

总计: 12个文件~2000行代码


🔍 功能变更详解

变更1: Travel移动边界检查 (影响:🟡 中)

位置: src/slic3r/GUI/GCodeViewer.cpp:2403-2450

变更内容:

// 之前只检查Extrude移动
m_contained_in_bed = build_volume.all_paths_inside(gcode_result, m_paths_bounding_box);

// 之后同时检查Travel移动
if (m_contained_in_bed) {
    bool all_moves_valid = build_volume.all_moves_inside(gcode_result, ...);
    if (!all_moves_valid) {
        m_contained_in_bed = false;  // 设置超限标志
    }
}

影响范围:

  • 所有切片的G-code预览
  • 会检测到之前被忽略的Travel移动超限

风险场景:

  • ⚠️ 之前允许的边缘Travel移动现在会报错
  • ⚠️ 可能影响:边缘擦料塔、边缘物体的大跨度移动

用户可见变化:

  • G-code预览可能显示橙色"toolpath_outside"警告
  • 右下角可能显示"部分路径超出打印床"提示

缓解措施:

  • 智能过滤跳过G28/G29初始化阶段
  • 使用BedEpsilon容差3e-5mm极小
  • 只警告,不阻断切片

变更2: 擦料塔位置验证 (影响:🟡 高)

位置: src/libslic3r/Print.cpp:1290-1327

变更内容:

// 之前:不验证擦料塔位置

// 之后:切片前严格验证
if (擦料塔超出边界) {
    return StringObjectException{错误信息};  // 阻断切片
}

影响范围:

  • 所有使用擦料塔的多材料打印
  • 所有使用擦料塔的支撑/界面打印

风险场景:

  • 阻断性: 如果擦料塔位置设置在床外,切片会完全失败
  • ⚠️ 用户之前可能设置了超出边界的擦料塔位置,现在无法切片

用户可见变化:

  • 错误提示:"The prime tower at position (x, y) with dimensions W×D mm (including brim) exceeds the bed boundaries"

缓解措施:

  • 错误信息清晰,提供具体位置和尺寸
  • 建议用户调整擦料塔位置

变更3: 螺旋/懒惰抬升自动降级 (影响:🟡 中)

位置: src/libslic3r/GCodeWriter.cpp:557-663

变更内容:

// 降级链条:
SpiralLift  [弧线超限]  LazyLift  [斜坡超限]  NormalLift

影响范围:

  • 所有启用"螺旋抬升"的切片
  • 所有启用"懒惰抬升"的切片
  • 主要影响边缘区域的抬升行为

风险场景:

  • ⚠️ 边缘区域的抬升方式可能改变
  • ⚠️ 可能轻微影响打印质量(抬升方式不同)
  • 但不会超限撞机

用户可见变化:

  • 一般情况:无任何变化
  • 边缘打印:日志中可能出现降级警告
  • 极端情况:抬升路径改变(更安全)

缓解措施:

  • 逐级降级,保持功能可用
  • 详细日志记录
  • 只在必要时降级

变更4: Skirt/Brim/支撑边界检查 (影响:🟡 中)

位置:

  • Skirt: Print.cpp:2385-2502
  • Brim: Brim.cpp:1745-1800
  • 支撑: SupportMaterial.cpp:587-662

变更内容:

// 之前:生成后不验证边界

// 之后:生成时验证并记录违规
if (!validator.validate_polygon(geometry, z_height)) {
    print->add_boundary_violation(violation);
    BOOST_LOG_TRIVIAL(warning) << "... exceeds boundaries";
}

影响范围:

  • 所有使用Skirt的打印
  • 所有使用Brim的打印
  • 所有使用支撑的打印

风险场景:

  • ⚠️ 大尺寸Skirt/Brim可能被记录为违规
  • ⚠️ 支撑超出边界会被记录
  • 但不阻断切片,只记录警告

用户可见变化:

  • 一般情况:无任何变化
  • 违规情况:日志中有警告
  • 未来版本可能显示警告UI

缓解措施:

  • 非阻断性(不停止切片)
  • 只记录违规,供后续分析
  • 可通过配置调整Skirt/Brim参数避免

⚠️ 风险分析矩阵

高风险场景

场景 风险等级 概率 影响 缓解措施
擦料塔位置超出边界 🔴 无法切片 清晰错误信息,引导调整位置
边缘物体+螺旋抬升 🟡 抬升方式改变 自动降级,保持安全
大尺寸Skirt 🟡 记录违规警告 非阻断,可调整参数
边缘物体的大跨度Travel 🟡 可能报超限 智能过滤初始化阶段

低风险场景

场景 风险等级 说明
标准物体(床中心) 🟢 无影响
小物体 🟢 无影响
正常参数设置 🟢 无影响

🧪 测试用例设计

P0 - 必须测试 (Critical)

TC01: 标准打印 - 无风险验证

目的: 确保正常打印不受影响

步骤:

  1. 加载标准测试模型如20mm立方体
  2. 放置在床中心位置
  3. 使用默认参数切片
  4. 验证:
    • 切片成功,无错误
    • 警告日志数量为0或只有正常信息
    • G-code预览显示正常
    • 打印时间无显著变化

预期结果: 完全正常,无任何影响


TC02: 擦料塔位置验证 - 阻断性测试

目的: 验证超出边界的擦料塔被正确阻止

步骤:

  1. 创建双材料打印配置
  2. 手动设置擦料塔位置在床外(如 X=300, Y=300对于200×200床
  3. 尝试切片

预期结果:

  • 切片失败,显示错误:
    The prime tower at position (300.00, 300.00) with dimensions
    XX × XX mm exceeds the bed boundaries.
    Please adjust the prime tower position.
    

验证点:

  • 错误信息清晰
  • 提供具体位置
  • 切片被阻断

TC03: 边缘物体+螺旋抬升 - 降级验证

目的: 验证螺旋抬升自动降级机制

步骤:

  1. 创建大物体190×190mm对于200×200床
  2. 启用螺旋抬升
  3. 切片

预期结果:

  • 切片成功
  • ⚠️ 日志中出现降级警告:
    Spiral lift arc exceeds build volume boundaries,
    downgrading to lazy lift
    
    Lazy lift slope exceeds build volume boundaries,
    downgrading to normal lift
    

验证点:

  • 自动降级生效
  • 打印路径仍在床内
  • 不影响切片完成

P1 - 应该测试 (High)

TC04: Travel移动检测

目的: 验证Travel移动边界检查

步骤:

  1. 创建两个物体,分开放置在床的对角
  2. 确保它们之间的Travel路径会经过床边缘附近
  3. 切片
  4. 检查G-code预览

预期结果:

  • 如果Travel在边界内正常显示
  • ⚠️ 如果Travel超限橙色警告

TC05: Skirt边界检查

目的: 验证Skirt超出边界时记录警告

步骤:

  1. 创建195×195mm物体对于200×200床
  2. 设置Skirt距离为10mm
  3. 切片

预期结果:

  • 切片成功
  • ⚠️ 日志中记录Skirt超限警告
  • 不阻断切片

TC06: 支撑边界检查

目的: 验证支撑超出边界时记录警告

步骤:

  1. 创建需要大量支撑的模型
  2. 确保支撑可能延伸到床边缘
  3. 切片

预期结果:

  • 切片成功
  • ⚠️ 如有超限,日志记录警告
  • 不阻断切片

P2 - 可选测试 (Medium)

TC07: G2/G3弧线命令验证

目的: 验证Python工具能检测弧线超限

步骤:

  1. 生成包含G2/G3命令的G-code
  2. 使用Python工具分析
    python analyze_gcode_bounds.py output.gcode --bed-size 200 200 250
    

预期结果:

  • 能正确解析G2/G3
  • 能检测弧线超限

TC08: 极限边界打印

目的: 验证紧贴边界的打印

步骤:

  1. 创建199×199mm物体对于200×200床
  2. 放置在床的角落
  3. 启用所有功能螺旋抬升、Skirt、Brim、支撑
  4. 切片

预期结果:

  • 切片成功(功能降级生效)
  • ⚠️ 可能有多个降级警告
  • G-code仍在边界内

📊 性能影响评估

切片性能

阶段 性能影响 说明
模型加载/处理 < 0.1% 无影响
Skirt/Brim生成 1-2% 验证开销
支撑生成 1-2% 验证开销
擦料塔验证 < 0.1% 一次性检查
G-code生成 0% 无影响
总体 < 5% 用户无感知

内存影响

  • 边界违规记录每个约100字节
  • 对于典型切片:< 1MB
  • 影响: 可忽略

🔙 回滚方案

快速回滚(如有问题)

方法1: Git Revert

# 回滚到修改前的commit
git revert <commit-hash>
git revert <commit-hash>
# ... 回滚所有相关commit

方法2: 手动修改关键文件

如果发现特定问题,可以临时禁用某些检查:

  1. 禁用Travel检查 - GCodeViewer.cpp:2403-2450

    // 注释掉这段代码
    /*
    if (m_contained_in_bed) {
        bool all_moves_valid = build_volume.all_moves_inside(...);
        ...
    }
    */
    
  2. 降低擦料塔检查严格度 - Print.cpp:1290-1327

    // 改为警告而非错误
    BOOST_LOG_TRIVIAL(warning) << "Wipe tower outside bounds";
    // 不要 return 错误
    
  3. 禁用抬升降级 - GCodeWriter.cpp:574-591, 633-649

    // 注释掉降级逻辑,保持原有类型
    

📝 发布说明模板

更新日志建议

边界检测增强 (v2.x.0)
====================

✨ 新功能
- 添加Travel移动边界验证防止打印头超出范围
- 添加擦料塔位置验证,避免设置错误
- 添加Skirt/Brim/支撑边界检查
- 添加螺旋/懒惰抬升自动降级机制

🔧 改进
- 提升边界检测精度和覆盖率
- 优化边缘区域的打印安全性

⚠️ 重要提示
- 如果擦料塔位置超出打印床范围,切片将失败
- 边缘区域的抬升方式可能自动调整(螺旋→懒惰→普通)
- 建议将物体放置在距离边缘至少5mm的位置

🐛 修复
- 修复Travel移动可能超出边界的问题
- 修复擦料塔不验证位置的问题

📋 发布前检查清单

代码审查

  • 代码变更已审查
  • 遵循项目编码规范
  • 无内存泄漏风险
  • 边界条件已处理

测试验证

  • TC01-TC06 测试用例全部通过
  • 回归测试通过
  • 性能测试通过(切片时间增加<5%
  • 边缘打印场景验证

文档

  • 实施文档完整
  • 风险评估完成
  • 更新日志已准备
  • 用户文档已更新(如需要)

兼容性

  • Windows编译通过
  • macOS编译通过如支持
  • Linux编译通过如支持
  • 现有配置文件兼容

🎯 风险总结

优点

  1. 安全性大幅提升

    • 防止打印头撞机
    • 防止超出边界的移动
    • 自动降级保护
  2. 用户体验改善

    • 更清晰的错误信息
    • 自动处理临界情况
    • 无需手动干预
  3. 代码质量提升

    • 统一的验证框架
    • 可扩展架构
    • 详细日志记录

潜在问题 ⚠️

  1. 擦料塔位置错误

    • 影响: 切片失败
    • 概率: 中
    • 缓解: 清晰错误信息
  2. 边缘打印行为改变

    • 影响: 抬升方式可能不同
    • 概率: 低(仅边缘)
    • 缓解: 自动降级
  3. 现有配置可能需要调整

    • 影响: 可能显示新警告
    • 概率: 低
    • 缓解: 调整参数

📞 问题响应预案

如果用户报告问题

问题1: "之前能切片,现在失败了"

  • 可能原因: 擦料塔位置超出边界
  • 解决方案:
    检查擦料塔位置设置(打印机设置 → 高级 → 擦料塔位置)
    确保在打印床范围内考虑brim宽度
    

问题2: "显示toolpath_outside警告"

  • 可能原因: Travel移动超出边界
  • 解决方案:
    检查物体是否过于靠近床边缘
    检查擦料塔位置
    尝试将物体向中心移动5-10mm
    

问题3: "打印质量下降"

  • 可能原因: 抬升方式改变(边缘)
  • 解决方案:
    关闭"螺旋抬升"选项
    或将物体远离边缘
    

📈 建议发布策略

渐进式发布(推荐)

  1. Beta测试 (1-2周)

    • 发布给内部测试人员
    • 收集反馈
    • 修复发现的问题
  2. RC发布 (1周)

    • 发布给早期采用者
    • 监控反馈
    • 准备回滚方案
  3. 正式发布

    • 包含详细更新日志
    • 提供迁移指南
    • 监控用户反馈

回滚触发条件

如果出现以下情况,考虑回滚:

  • 大量用户报告切片失败
  • 发现严重打印质量问题
  • 性能下降超过10%

最终建议

建议:可以发布,但需要充分测试

理由:

  1. 核心功能实现正确
  2. 有完善的降级机制
  3. 风险可控且可识别
  4. 有清晰的回滚方案

前提条件:

  1. ⚠️ 必须通过TC01-TC06测试
  2. ⚠️ 必须准备更新日志和用户指南
  3. ⚠️ 建议先进行Beta测试

发布后监控:

  • 关注用户反馈
  • 监控错误报告
  • 准备快速补丁

文档结束

风险评估: 🟡 中等风险 建议: 建议发布(充分测试后) 最后更新: 2026-01-20