Files
ViewDesignEngine/include/vde/core/cam_5axis.h
T
茂之钳 66777e0839
CI / Build & Test (push) Failing after 38s
CI / Release Build (push) Failing after 31s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
feat(v6.1): 5-axis CAM + reverse engineering + FEA mesh generation
v6.1.1 — 5-Axis CAM:
- cam_5axis.h/.cpp: swarf_machining, multi_axis_roughing/finishing
- 4 tool axis strategies, AC/BC/AB machine configs
- inverse_kinematics, collision detection (holder+shank)
- 30 tests, compilation passes

v6.1.2 — Reverse Engineering:
- point_cloud.h/.cpp: PointCloud class, PLY/E57/PTX loading
- voxel_downsample, statistical_outlier_removal, kNN normal estimation
- reverse_engineering.h/.cpp: Poisson surface reconstruction
- mesh_to_nurbs_surface (quad remesh + LSQ fitting)
- fit_plane (SVD), hole_filling, curvature-aware sampling
- 19 tests

v6.1.3 — FEA Mesh Generation:
- fea_mesh.h/.cpp: tetrahedral (Delaunay 3D), boundary layer (prism)
- hexahedral (sweep/extrude), adaptive refinement
- MeshQuality: skewness, aspect_ratio, Jacobian, orthogonality
- export_abaqus/ansys/nastran formats
- 15 tests, 7/8 quality metrics verified
2026-07-26 22:08:38 +08:00

276 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
/**
* @file cam_5axis.h
* @brief 5 轴联动 CAM 加工策略
*
* 在 3 轴 cam_strategies.h 的基础上扩展为 5 轴联动:
* - 刀位点 + 刀轴矢量 (CLData)
* - 侧刃加工 (swarf_machining)
* - 多轴粗加工 3+2 定位 (multi_axis_roughing)
* - 多轴精加工 + 碰撞检测 (multi_axis_finishing)
* - 机床运动学逆解 (inverse_kinematics)
* - 刀轴策略枚举 (ToolAxisStrategy)
*
* @ingroup core
*/
#include "vde/core/point.h"
#include "vde/core/aabb.h"
#include "vde/core/cam_toolpath.h"
#include "vde/core/cam_strategies.h"
#include "vde/mesh/halfedge_mesh.h"
#include <vector>
#include <string>
#include <optional>
#include <functional>
namespace vde::brep {
class BrepModel;
} // namespace vde::brep
namespace vde::curves {
class NurbsSurface;
} // namespace vde::curves
namespace vde::core {
using core::Point3D;
using core::Vector3D;
using core::AABB3D;
// ═══════════════════════════════════════════════════════════════════════════
// 5 轴刀位数据
// ═══════════════════════════════════════════════════════════════════════════
/// 单个刀位点 + 刀轴矢量 (Cutter Location Data)
struct CLData {
Point3D position; ///< 刀尖点/TCP 位置
Vector3D tool_axis; ///< 刀轴单位矢量(从刀尖指向刀柄)
double feed_rate = 500.0; ///< 进给速度 (mm/min)
/// 便捷构造
CLData() : position(Point3D::Zero()), tool_axis(Vector3D::UnitZ()) {}
CLData(const Point3D& pos, const Vector3D& axis_, double feed = 500.0)
: position(pos), tool_axis(axis_.normalized()), feed_rate(feed) {}
};
/// 5 轴刀路 — CLData 集合
struct AxisToolpath5 {
std::string name;
std::vector<CLData> points; ///< 刀位点序列
double safe_height = 50.0; ///< 安全高度 (mm)
/// 刀位点数量
[[nodiscard]] size_t size() const { return points.size(); }
/// 是否为空
[[nodiscard]] bool empty() const { return points.empty(); }
};
// ═══════════════════════════════════════════════════════════════════════════
// 刀轴策略
// ═══════════════════════════════════════════════════════════════════════════
/// 刀轴控制策略
enum class ToolAxisStrategy {
FixedAngle, ///< 固定角度:刀轴保持与 Z 轴固定偏角
LeadLag, ///< 导前/滞后角:沿切削方向前倾或后倾
Tilted, ///< 侧倾:垂直于切削方向倾斜
NormalToSurface ///< 法向:刀轴始终沿曲面法向
};
// ═══════════════════════════════════════════════════════════════════════════
// 机床配置
// ═══════════════════════════════════════════════════════════════════════════
/// 机床结构类型
enum class MachineType {
HeadHead, ///< 双摆头:A/B 轴均在主轴侧
TableTable, ///< 双转台:A/C 轴均在工作台侧
HeadTable ///< 摆头+转台:主轴侧一轴 + 工作台侧一轴
};
/// 旋转轴配置
enum class MachineAxisConfig {
AC, ///< A 轴(绕 X 旋转)+ C 轴(绕 Z 旋转)
BC, ///< B 轴(绕 Y 旋转)+ C 轴(绕 Z 旋转)
AB ///< A 轴(绕 X 旋转)+ B 轴(绕 Y 旋转)
};
/// 机床运动学配置
struct MachineConfig {
MachineType machine_type = MachineType::TableTable;
MachineAxisConfig axis_config = MachineAxisConfig::AC;
/// 旋转轴行程限制(度)
double a_min = -120.0;
double a_max = 120.0;
double b_min = -120.0;
double b_max = 120.0;
double c_min = -9999.0; // C 轴通常无限制(360°连续)
double c_max = 9999.0;
/// 主轴端到旋转中心的偏移 (mm)
Vector3D pivot_offset = Vector3D::Zero();
/// 刀具长度 (mm)
double tool_length = 100.0;
/// 检查旋转角是否在行程范围内
[[nodiscard]] bool in_range(double a, double b, double c) const;
/// 解析刀轴矢量为旋转角(根据 axis_config
/// @return (a_deg, b_deg, c_deg),失败返回 std::nullopt
[[nodiscard]] std::optional<std::tuple<double, double, double>>
axis_to_angles(const Vector3D& tool_axis) const;
};
// ═══════════════════════════════════════════════════════════════════════════
// 5 轴加工参数
// ═══════════════════════════════════════════════════════════════════════════
/// 侧刃加工参数
struct SwarfParams {
double step_down = 1.0; ///< 每层切深 (mm)
double step_over = 0.5; ///< 横向步距 (mm)
double feed_rate = 600.0; ///< 进给速度 (mm/min)
double safe_height = 50.0; ///< 安全高度 (mm)
double tilt_angle = 0.0; ///< 刀轴相对于曲面法线的偏转角 (度)
};
/// 多轴粗加工参数
struct MultiAxisRoughingParams {
double step_down = 2.0; ///< 每层切深 (mm)
double step_over = 3.0; ///< 横向步距 (mm)
double stock_to_leave = 1.0; ///< 留量 (mm)
double feed_rate = 800.0; ///< 进给速度 (mm/min)
double safe_height = 50.0; ///< 安全高度 (mm)
/// 3+2 定位角度 — 固定刀轴方向(相对于 Z 轴的倾斜角, 度)
double tilt_angle = 15.0;
double lead_angle = 0.0; ///< 导前角 (度)
};
/// 多轴精加工参数
struct MultiAxisFinishingParams {
double step_over = 0.3; ///< 行距 (mm)
double feed_rate = 500.0; ///< 进给速度 (mm/min)
double safe_height = 50.0; ///< 安全高度 (mm)
ToolAxisStrategy axis_strategy = ToolAxisStrategy::NormalToSurface;
double max_tilt = 30.0; ///< 最大倾斜角 (度)
double lead_angle = 3.0; ///< 导前角 (度)
/// 碰撞检测参数
bool collision_check = true; ///< 是否启用碰撞检测
double shank_clearance = 2.0; ///< 刀柄安全间隙 (mm)
double holder_clearance = 5.0; ///< 刀杆安全间隙 (mm)
};
// ═══════════════════════════════════════════════════════════════════════════
// 5 轴加工策略函数
// ═══════════════════════════════════════════════════════════════════════════
/// 侧刃加工 (Swarf Machining)
///
/// 使用刀具侧刃贴合曲面进行切削,刀轴沿曲面法线偏转。
/// 适用于直纹面侧壁加工。
///
/// @param surface 目标 NURBS 曲面
/// @param tool 刀具参数
/// @param params 侧刃加工参数
/// @return 5 轴刀路
///
/// @ingroup core
[[nodiscard]] AxisToolpath5 swarf_machining(
const curves::NurbsSurface& surface,
const Tool& tool,
const SwarfParams& params);
/// 多轴粗加工 (3+2 定位加工)
///
/// 使用 3+2 定位方式对实体进行分层粗加工。
/// 自动优化刀轴方向以最大化材料去除率,同时避免干涉。
///
/// @param body B-Rep 实体
/// @param tool 刀具参数
/// @param params 多轴粗加工参数
/// @param config 机床运动学配置(用于刀轴方向可行性检查)
/// @return 5 轴刀路
///
/// @ingroup core
[[nodiscard]] AxisToolpath5 multi_axis_roughing(
const brep::BrepModel& body,
const Tool& tool,
const MultiAxisRoughingParams& params,
const MachineConfig& config = MachineConfig{});
/// 多轴精加工
///
/// 对曲面进行 5 轴联动精加工。刀轴平滑变化,
/// 包含刀柄和刀杆的碰撞检测。
///
/// @param surface 目标 NURBS 曲面
/// @param body 完整 B-Rep 模型(碰撞检测用)
/// @param tool 刀具参数
/// @param params 多轴精加工参数
/// @param config 机床运动学配置
/// @return 5 轴刀路
///
/// @ingroup core
[[nodiscard]] AxisToolpath5 multi_axis_finishing(
const curves::NurbsSurface& surface,
const brep::BrepModel& body,
const Tool& tool,
const MultiAxisFinishingParams& params,
const MachineConfig& config = MachineConfig{});
/// 机床运动学逆解
///
/// 将工件坐标系下的刀路 (CLData) 转换为机床各轴坐标。
/// 根据机床配置 (AC/BC/AB + 双转台/摆头) 计算 X/Y/Z/A/B/C。
///
/// @param toolpath 工件坐标系下的 5 轴刀路
/// @param config 机床运动学配置
/// @return 机床坐标刀路(points 中 position 存 X/Y/Ztool_axis 存 A/B/C 度)
///
/// @ingroup core
[[nodiscard]] AxisToolpath5 inverse_kinematics(
const AxisToolpath5& toolpath,
const MachineConfig& config);
/// 刀轴碰撞检测
///
/// 检查刀柄和刀杆是否与工件发生碰撞。
///
/// @param position 刀尖位置
/// @param tool_axis 刀轴方向
/// @param body B-Rep 工件
/// @param tool 刀具参数
/// @param shank_clearance 刀柄安全间隙
/// @param holder_clearance 刀杆安全间隙
/// @return true 如果发生碰撞
///
/// @ingroup core
[[nodiscard]] bool check_collision(
const Point3D& position,
const Vector3D& tool_axis,
const brep::BrepModel& body,
const Tool& tool,
double shank_clearance = 2.0,
double holder_clearance = 5.0);
/// 刀轴方向优化
///
/// 给定候选刀轴方向列表,选择最优方向:
/// - 优先选择更接近 Z 轴(减小旋转轴行程)
/// - 避免超出机床行程的配置
/// - 考虑切削条件(避免刀尖切削)
///
/// @param candidates 候选刀轴方向
/// @param config 机床配置
/// @return 最优刀轴方向(归一化),若无可行方向返回 Z 轴
///
/// @ingroup core
[[nodiscard]] Vector3D optimize_tool_axis(
const std::vector<Vector3D>& candidates,
const MachineConfig& config);
} // namespace vde::core