Files
ViewDesignEngine/include/vde/brep/explode_view.h
T
茂之钳 a2b34733bf
CI / Build & Test (push) Failing after 36s
CI / Release Build (push) Failing after 47s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
feat(v4.0): explode view — assembly part decomposition
- explode_view() with auto/manual direction + factor control
- un_explode() for restoring original transforms
- compute_explode_displacement() for per-part displacement
- 12 tests: single part, chain, factor scaling, un-explode, subassembly
2026-07-25 03:19:35 +00:00

106 lines
3.1 KiB
C++

#pragma once
/**
* @file explode_view.h
* @brief 装配体爆炸视图
*
* 将装配体零件沿约束/层级方向展开,生成爆炸视图。
* 每个零件的世界变换被修改以产生分解效果。
*
* @ingroup brep
*/
#include "vde/brep/assembly.h"
#include "vde/core/point.h"
#include <vector>
#include <string>
#include <map>
namespace vde::brep {
/**
* @brief 爆炸视图配置
*/
struct ExplodeConfig {
double factor = 1.0; ///< 爆炸距离系数(越大越分散)
core::Vector3D direction; ///< 全局爆炸方向(世界坐标),零向量 = 自动
bool use_constraint_dirs = true; ///< 是否沿约束方向展开
bool preserve_subassemblies = true; ///< 子装配体内部不分解
};
/**
* @brief 爆炸步信息(用于动画)
*/
struct ExplodeStep {
std::string part_name; ///< 零件名称
core::Transform3D original_transform; ///< 原始变换
core::Transform3D exploded_transform; ///< 爆炸后变换
core::Vector3D displacement; ///< 位移向量
};
/**
* @brief 爆炸视图结果
*/
struct ExplodeResult {
std::vector<ExplodeStep> steps; ///< 各零件爆炸步
core::AABB3D original_bounds; ///< 原始包围盒
core::AABB3D exploded_bounds; ///< 爆炸后包围盒
/// 获取爆炸总位移范围
[[nodiscard]] double max_displacement() const;
};
// ═══════════════════════════════════════════════════════════
// API
// ═══════════════════════════════════════════════════════════
/**
* @brief 生成爆炸视图
*
* 沿装配层级方向展开零件。根部零件居中,子节点沿
* 相对于父节点的位移方向向外扩散。
*
* @param assembly 装配体(会被原地修改零件变换)
* @param config 爆炸配置
* @return 爆炸结果(含各零件位移信息)
*
* @code{.cpp}
* Assembly assy("engine");
* // ... 添加零件 ...
*
* ExplodeConfig cfg;
* cfg.factor = 2.0;
*
* auto result = explode_view(assy, cfg);
* for (auto& step : result.steps) {
* std::cout << step.part_name << " → "
* << step.displacement.norm() << "\n";
* }
* @endcode
*/
[[nodiscard]] ExplodeResult explode_view(
Assembly& assembly, const ExplodeConfig& config = {});
/**
* @brief 取消爆炸(恢复原始变换)
*
* @param assembly 装配体(原地修改)
* @param result 之前 explode_view 返回的结果
*/
void un_explode(Assembly& assembly, const ExplodeResult& result);
/**
* @brief 单零件爆炸位移
*
* 计算一个零件在装配体中的爆炸方向。
*
* @param node 零件节点
* @param parent_tf 父节点世界变换
* @param factor 爆炸系数
* @return 位移向量
*/
[[nodiscard]] core::Vector3D compute_explode_displacement(
const AssemblyNode& node, const core::Transform3D& parent_tf,
double factor);
} // namespace vde::brep