BambuStudio学习笔记:ModelArrange
# ModelArrange.hpp 解析
## 文件概述
该头文件实现了3D打印模型的自动排列算法,用于在打印床范围内高效布局多个模型实例。主要功能包括:
- 多对象自动排列
- 模型复制与布局
- 打印床形状适配
- 布局参数配置
## 核心组件
### 主要数据结构
```cpp
// 排列多边形,描述单个模型的布局信息
struct ArrangePolygon {
    Polygon contour;     // 投影轮廓
    Vec2d position;      // 布局位置
    double rotation;      // 旋转角度
    // ... 其他布局属性
};
// 布局参数配置
struct ArrangeParams {
    double spacing;       // 对象间距
    bool allow_rotations; // 是否允许旋转
    // ... 其他参数
};
 
关键函数接口
布局数据获取
// 获取模型中所有实例的排列数据
ArrangePolygons get_arrange_polys(const Model &model, ModelInstancePtrs &instances);
// 获取单个模型的排列数据
ArrangePolygon get_arrange_poly(const Model &model);
 
布局应用
// 将排列结果应用到模型实例
bool apply_arrange_polys(ArrangePolygons &polys, ModelInstancePtrs &instances, VirtualBedFn);
 
对象复制
// 复制模型实例并进行布局
void duplicate(Model &model, ArrangePolygons &copies, VirtualBedFn);
 
模板方法
// 通用排列模板
template<class TBed>
bool arrange_objects(Model &model, const TBed &bed, const ArrangeParams ¶ms);
 
功能实现详解
1. 打印床类型支持
支持多种打印床类型:
// 无限大床(用于理论计算)
struct InfiniteBed;
// 圆形打印床
struct CircleBed {
    double diameter; // 直径
};
// 矩形打印床
struct RectangleBed {
    Vec2d size; // 尺寸
};
 
2. 布局算法流程
典型调用顺序:
- 获取模型布局数据
 - 执行排列算法
 - 应用布局结果
 
3. 错误处理机制
// 当对象无法适配打印床时抛出异常
[[noreturn]] void throw_if_out_of_bed() {
    throw RuntimeError("Objects could not fit on the bed");
}
 
4. 高级功能
模型复制布局
// 创建指定数量的模型副本并进行自动排列
template<class TBed>
void duplicate_objects(Model &model, size_t copies_num, const TBed &bed);
 
虚拟打印床处理
// 自定义虚拟床处理回调
using VirtualBedFn = std::function<void(ArrangePolygon&)>;
// 示例:强制Y轴对齐
auto alignY = [](ArrangePolygon& ap) {
    ap.position.y() = std::round(ap.position.y()); 
};
 
使用示例
基本排列操作
Model model = load_model("cat.stl");
CircleBed bed{200}; // 直径200mm圆床
ArrangeParams params{
    .spacing = 5, 
    .allow_rotations = true
};
if (arrange_objects(model, bed, params)) {
    save_arranged_model(model);
} else {
    handle_error();
}
 
批量复制排列
// 创建5个副本并在矩形床上排列
RectangleBed bed{Vec2d{200, 200}};
duplicate_objects(model, 5, bed, ArrangeParams{});
 
性能优化策略
- 空间索引加速:使用R-Tree管理布局空间
 - 近似计算:采用凸包简化复杂几何
 - 并行计算:多线程处理独立对象
 - 缓存重用:存储中间计算结果
 
应用场景
| 场景 | 解决方案 | 
|---|---|
| 多零件打印 | 自动紧凑排列 | 
| 批量生产 | 阵列复制+优化布局 | 
| 异形打印床 | 自定义虚拟床处理 | 
| 混合尺寸对象 | 分级排列策略 | 
注意事项
- 模型需预先进行支撑生成处理
 - 复杂几何建议先简化再排列
 - 实际布局需考虑热床温度分布
 - 留有足够边缘安全间距
 
                