BambuStudio学习笔记:Measuring测量类

发布于:2025-03-07 ⋅ 阅读:(13) ⋅ 点赞:(0)
# Slic3r_Measure.hpp 代码分析

## 核心功能模块

### 几何特征定义 (SurfaceFeature)
```cpp
enum class SurfaceFeatureType {
    Undef, Point, Edge, Circle, Plane
};

class SurfaceFeature {
    // 存储点、边、圆、平面等几何特征
    // 支持坐标变换、特征克隆、比较操作
    // 包含关联的网格数据指针及变换矩阵
};
  • 数据结构
    • 点:单点坐标
    • 边:起点+终点
    • 圆:中心+法向+半径
    • 平面:法向+基点
  • 关键方法
    • translate() 实现坐标变换
    • operator== 处理浮点精度比较

测量核心类 (Measuring)

class Measuring {
    // 基于三角网格构建测量系统
    // 提供特征提取接口
private:
    std::unique_ptr<MeasuringImpl> priv; // PIMPL模式隐藏实现
};
  • 主要接口
    • get_feature() 根据面索引获取特征
    • get_plane_triangle_indices() 获取平面三角形索引

测量结果结构

struct MeasurementResult {
    std::optional<AngleAndEdges> angle;      // 角度测量
    std::optional<DistAndPoints> distance;    // 距离测量
    // 包含三种距离测量模式:无限延申/严格边界/三维分量
};

支持多类型测量结果存储,适应不同测量需求

关键算法实现

几何关系判断

bool are_parallel(const Vec3d&, const Vec3d&);   // 向量平行判断
bool are_perpendicular(const Vec3d&, const Vec3d&); // 向量垂直判断
  • 使用点积运算结合EPSILON处理浮点精度

测量计算函数

MeasurementResult get_measurement(const SurfaceFeature&, const SurfaceFeature&);
  • 处理不同特征组合的测量逻辑:
    • 点-点:直线距离
    • 边-边:角度/最短距离
    • 平面-平面:夹角/距离

设计亮点

多测量模式支持

测量模式 描述
无限延申距离 忽略物体边界,计算特征间最短距离
严格边界距离 考虑物体实际形状的最近距离
三维分量距离 XYZ轴方向分解距离

装配动作建议

struct AssemblyAction {
    bool can_set_parallel;         // 是否可设为平行
    bool can_set_center_coincide;  // 是否可中心对齐
    Transform3d transform;         // 建议变换矩阵
};

基于测量结果提供智能装配建议,提升用户操作效率

性能优化点

  1. 数据局部性优化

    • SurfaceFeature使用紧凑存储(40字节+可选指针)
    • 特征比较使用快速近似判断
  2. 并行计算准备

    • PIMPL模式隔离实现,便于未来并行化扩展
    • 特征提取算法复杂度O(n)~O(n log n)
  3. 几何计算加速

    inline Vec3d edge_direction(...) // 快速计算边方向向量
    

    使用内联函数避免函数调用开销

典型工作流程

User GUI Measuring Measure 选择测量特征 get_feature() 返回SurfaceFeature get_measurement(A,B) 返回MeasurementResult 显示距离/角度 User GUI Measuring Measure

扩展接口设计

自定义特征支持

通过继承SurfaceFeature实现新几何类型:

class CustomFeature : public SurfaceFeature {
    // 实现新特征类型的序列化/比较/变换方法
};

测量算法扩展

// 添加体积测量功能
std::optional<double> calculate_volume(const SurfaceFeature&);

注意事项

  1. 浮点精度处理

    • 所有几何比较使用EPSILON容差
    • 避免直接浮点相等判断
  2. 内存管理

    • SurfaceFeature包含原始网格指针,需注意生命周期
    • 使用shared_ptr管理共享数据
  3. 线程安全

    • Measuring类非线程安全
    • 多线程访问需加锁或实例复制

潜在改进方向

  1. GPU加速计算

    • 将特征提取移植到CUDA
    • 使用GPU加速矩阵运算
  2. 高级几何分析

    • 曲率测量
    • 质量属性计算(质心/惯性矩)
  3. 交互式测量

    • 实时测量反馈
    • 动态约束系统