# Model.hpp 核心模型结构说明
## 文件概述
该头文件定义了3D打印数据处理的核心数据结构,包含模型对象、体积、实例、材料等关键类。主要功能包括:
- 三维模型数据存储与管理
- 模型变换操作(平移/旋转/缩放)
- 打印参数配置
- 多材料支持
- 支撑结构处理
## 核心类结构
### Model (顶层模型容器)
```cpp
class Model : public ObjectBase {
ModelMaterialMap materials; // 材料集合
ModelObjectPtrs objects; // 模型对象集合
ModelWipeTower wipe_tower; // 擦料塔配置
// ... 其他成员
};
ModelObject (可打印对象)
class ModelObject : public ObjectBase {
std::string name;
ModelVolumePtrs volumes;
ModelInstancePtrs instances;
ModelConfigObject config;
};
ModelVolume (体积组件)
class ModelVolume : public ObjectBase {
enum class ModelVolumeType {
MODEL_PART,
NEGATIVE_VOLUME,
SUPPORT_ENFORCER,
SUPPORT_BLOCKER
};
TriangleMesh mesh;
ModelVolumeType type;
};
ModelInstance (对象实例)
class ModelInstance : public ObjectBase {
Geometry::Transformation transform;
ModelObject* object;
};
关键功能详解
几何变换系统
struct Transformation {
Vec3d offset;
Vec3d rotation;
Vec3d scaling;
Vec3d mirror;
};
void ModelVolume::transform_mesh(TriangleMesh* mesh) {
}
支撑结构处理
struct SupportPoint {
Vec3f position;
float head_diameter;
};
void ModelObject::process_supports() {
}
打印参数配置
class LayerConfig {
double layer_height;
int extruder_id;
double temperature;
};
ModelConfigObject -> ModelConfig -> DynamicPrintConfig
重要枚举类型
体积类型
enum ModelVolumeType {
MODEL_PART,
NEGATIVE_VOLUME,
PARAMETER_MODIFIER,
SUPPORT_ENFORCER,
SUPPORT_BLOCKER
};
实例打印状态
enum ModelInstanceEPrintVolumeState {
INSIDE,
PARTLY_OUTSIDE,
FULLY_OUTSIDE
};
核心方法速查
模型操作
方法 | 功能 |
---|
Model::add_object() | 创建新模型对象 |
ModelObject::add_volume() | 添加体积组件 |
ModelInstance::apply_transform() | 应用变换矩阵 |
几何计算
方法 | 描述 |
---|
bounding_box() | 计算对象包围盒 |
convex_hull_2d() | 生成2D投影凸包 |
mesh() | 获取三角网格数据 |
文件IO
Model Model::read_from_file(const std::string& filename) {
}
数据结构关系
使用示例
创建简单模型
Model model;
ModelObject* obj = model.add_object();
obj->name = "Cube";
ModelVolume* vol = obj->add_volume(TriangleMesh::make_cube(10,10,10));
vol->set_type(ModelVolumeType::MODEL_PART);
ModelInstance* inst = obj->add_instance();
inst->set_offset(Vec3d(20, 20, 0));
执行模型切割
std::array<Vec3d, 4> plane_points = {...};
ModelObjectPtrs cut_objects = original_obj->cut(0, plane_points);
for (auto* obj : cut_objects) {
model.add_object(obj);
}
性能注意事项
- 大模型处理:使用
raw_mesh()
获取未变换网格提升计算效率 - 内存优化:共享
TriangleMesh
指针减少内存复制 - 批量操作:优先使用
transform_mesh()
替代逐顶点计算 - 缓存机制:利用
bounding_box_valid
标志避免重复计算 - 多线程安全:避免同时修改同一对象的几何属性