feat(v1.0.1): tangent_pull + error codes + version + license management
Remaining P3 item: - tangent_pull: maintain G1 tangency when pulling faces System infrastructure: - Unified ErrorCode (0-7xxx): ErrorInfo with Chinese messages - Version system: VDE_VERSION_MAJOR/MINOR/PATCH macros, vde_version() → VersionInfo, vde_version_string() - License management: LicenseTier (Community/Professional/Enterprise), LicenseKey (VDE-XXXX-XXXX, Base32 + HMAC-SHA256 signature), LicenseManager singleton with trial support - Convenience header: vde/vde_version.h Tests: 43 total (26 license + 17 version)
This commit is contained in:
@@ -343,4 +343,46 @@ struct DirectModelingResult {
|
||||
int face_id,
|
||||
int target_face_id);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Direct Modeling Enhancements — v5.6
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief 相切联动拉伸:拉伸面并保持相邻面相切
|
||||
*
|
||||
* 将指定面沿其法向拉伸,同时检测并调整相邻面,使其
|
||||
* 在共享边处保持与拉伸面的相切关系(G1 连续)。
|
||||
*
|
||||
* 非相切邻面保持原有行为(仅共享边处适配新位置)。
|
||||
*
|
||||
* 算法:
|
||||
* 1. 检测相邻面(与目标面共享边的面)
|
||||
* 2. 对每个相邻面检测 G1 连续性
|
||||
* - 平面面:通过法向量平行性判定(dot > 0.9999)
|
||||
* - 曲面:通过 surface_continuity 检测
|
||||
* 3. 执行 push_pull 拉伸目标面
|
||||
* 4. 对 G1 相邻面,将其非共享顶点沿目标面法向偏移相同距离
|
||||
* 以保持相切关系
|
||||
*
|
||||
* @param body 输入 B-Rep 实体
|
||||
* @param face_id 被拉伸的面索引
|
||||
* @param distance 拉伸距离(正=挤出加材料,负=切除减材料)
|
||||
* @return DirectModelingResult
|
||||
* - result.body: 拉伸后保持相切的新模型
|
||||
* - result.affected_faces: 受影响的面数(含调整的相邻面)
|
||||
* - result.new_faces: 新创建的侧面数
|
||||
*
|
||||
* @pre face_id 在 [0, body.num_faces()) 范围内
|
||||
* @pre 实体应为封闭水密体
|
||||
* @pre distance 的绝对值不超过实体在法线方向的最小厚度
|
||||
*
|
||||
* @code{.cpp}
|
||||
* auto box = make_box(10, 5, 3);
|
||||
* // 拉伸顶面 2.0,相切邻面自动联动
|
||||
* auto result = tangent_pull(box, 0, 2.0);
|
||||
* @endcode
|
||||
*/
|
||||
[[nodiscard]] DirectModelingResult tangent_pull(const BrepModel& body,
|
||||
int face_id, double distance);
|
||||
|
||||
} // namespace vde::brep
|
||||
|
||||
@@ -0,0 +1,278 @@
|
||||
#pragma once
|
||||
/**
|
||||
* @file license_manager.h
|
||||
* @brief ViewDesignEngine 许可证管理系统
|
||||
*
|
||||
* 提供三层许可证体系:
|
||||
* - Community(社区版):基础 B-Rep + STEP/IGES 导入导出
|
||||
* - Professional(专业版):+ 5轴CAM + 高级曲面 + GD&T
|
||||
* - Enterprise(企业版):+ 技术支持 + 自定义格式
|
||||
*
|
||||
* LicenseKey 格式:VDE-XXXX-XXXX-XXXX(Base32编码)
|
||||
* 包含:版本号 + tier + 过期时间 + 签名(HMAC-SHA256)
|
||||
*
|
||||
* @ingroup core
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <ctime>
|
||||
#include <mutex>
|
||||
|
||||
namespace vde::core {
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// LicenseTier 枚举
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/// 许可证层级
|
||||
enum class LicenseTier : int {
|
||||
Community = 0, ///< 社区版
|
||||
Professional = 1, ///< 专业版
|
||||
Enterprise = 2, ///< 企业版
|
||||
};
|
||||
|
||||
/// 将 LicenseTier 转为字符串
|
||||
inline const char* license_tier_name(LicenseTier tier) {
|
||||
switch (tier) {
|
||||
case LicenseTier::Community: return "Community";
|
||||
case LicenseTier::Professional: return "Professional";
|
||||
case LicenseTier::Enterprise: return "Enterprise";
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/// 从字符串解析 LicenseTier,失败返回 -1
|
||||
int parse_license_tier(const std::string& name);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// Feature 枚举(按 tier 区分)
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/// 功能特性标识
|
||||
enum class Feature : int {
|
||||
// Community 级别
|
||||
BASIC_BREP = 0, ///< 基础B-Rep建模
|
||||
STEP_IMPORT_EXPORT = 1, ///< STEP导入导出
|
||||
IGES_IMPORT_EXPORT = 2, ///< IGES导入导出
|
||||
BASE_IO_FORMATS = 3, ///< 基础格式IO(OBJ/STL/PLY)
|
||||
MESH_OPERATIONS = 4, ///< 基本网格操作
|
||||
SKETCH_SOLVER = 5, ///< 草图约束求解
|
||||
|
||||
// Professional 级别
|
||||
CAM_5AXIS = 10, ///< 5轴CAM加工
|
||||
ADVANCED_SURFACING = 11, ///< 高级曲面建模(A级曲面等)
|
||||
GD_T = 12, ///< GD&T 几何尺寸和公差
|
||||
PMI_MBD = 13, ///< PMI / 基于模型的定义
|
||||
ASSEMBLY_DESIGN = 14, ///< 装配设计
|
||||
SHEET_METAL = 15, ///< 钣金设计
|
||||
ADVANCED_HEALING = 16, ///< 高级修复
|
||||
FEA_MESH = 17, ///< FEA网格生成
|
||||
IGA_ANALYSIS = 18, ///< IGA等几何分析
|
||||
COLLISION_DETECTION = 19, ///< 碰撞检测
|
||||
DIRECT_MODELING = 20, ///< 直接建模
|
||||
SURFACE_FAIRING = 21, ///< 曲面光顺
|
||||
|
||||
// Enterprise 级别
|
||||
TECHNICAL_SUPPORT = 30, ///< 技术支持
|
||||
CUSTOM_FORMATS = 31, ///< 自定义格式支持
|
||||
SCRIPTING_API = 32, ///< 脚本API
|
||||
GPU_ACCELERATION = 33, ///< GPU加速
|
||||
CLOUD_COLLABORATION = 34, ///< 云端协作
|
||||
SDF_MODELING = 35, ///< SDF隐式建模
|
||||
LICENSE_MANAGER_SDK = 36, ///< License SDK分发
|
||||
};
|
||||
|
||||
/// Feature 转字符串
|
||||
const char* feature_name(Feature f);
|
||||
|
||||
/// 字符串转 Feature,失败返回 -1
|
||||
int parse_feature(const std::string& name);
|
||||
|
||||
/// 获取指定 tier 包含的所有 feature
|
||||
std::set<Feature> features_for_tier(LicenseTier tier);
|
||||
|
||||
/// 检查某个 feature 是否属于指定 tier
|
||||
bool feature_available_in_tier(Feature f, LicenseTier tier);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// LicenseInfo 结构体
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/// 许可证信息
|
||||
struct LicenseInfo {
|
||||
LicenseTier tier; ///< 层级
|
||||
std::string licensee; ///< 被许可方(公司/个人名称)
|
||||
std::time_t expiry; ///< 过期时间(Unix时间戳,0=永久)
|
||||
std::set<Feature> features; ///< 启用的功能列表
|
||||
std::string key_string; ///< 原始License Key字符串
|
||||
int version; ///< License版本号
|
||||
|
||||
/// 默认构造(Community试用版)
|
||||
LicenseInfo()
|
||||
: tier(LicenseTier::Community)
|
||||
, licensee("Trial User")
|
||||
, expiry(0)
|
||||
, version(1) {}
|
||||
|
||||
/// 是否已过期
|
||||
[[nodiscard]] bool is_expired() const;
|
||||
|
||||
/// 距离过期还剩多少天(返回 -1 表示永久有效)
|
||||
[[nodiscard]] int days_until_expiry() const;
|
||||
};
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// LicenseKey 类
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief LicenseKey 生成/验证/解析类
|
||||
*
|
||||
* License Key 格式:VDE-XXXX-XXXX-XXXX
|
||||
* 其中 XXXX 段为 Base32 编码的二进制数据。
|
||||
*
|
||||
* 二进制数据布局(17字节):
|
||||
* - byte 0: version (1)
|
||||
* - byte 1: tier (0=Community, 1=Professional, 2=Enterprise)
|
||||
* - byte 2-9: expiry (uint64_t, Unix timestamp, big-endian)
|
||||
* - byte 10-16: reserved (0)
|
||||
*
|
||||
* 签名:HMAC-SHA256 的前 4 字节附加到 Base32 编码后的最后一段。
|
||||
*
|
||||
* 完整的 Key 编码流程:
|
||||
* payload(17B) → HMAC-SHA256 → 取前4B → payload+signature(21B) → Base32 → VDE-XXXX-XXXX-XXXX
|
||||
*/
|
||||
class LicenseKey {
|
||||
public:
|
||||
/// 默认构造(无效Key)
|
||||
LicenseKey() = default;
|
||||
|
||||
/**
|
||||
* @brief 从字符串解析 LicenseKey
|
||||
* @param key_str 如 "VDE-ABCD-EFGH-IJKL"
|
||||
* @return 如果格式有效返回 true
|
||||
*/
|
||||
bool parse(const std::string& key_str);
|
||||
|
||||
/**
|
||||
* @brief 生成 LicenseKey
|
||||
* @param tier 许可证层级
|
||||
* @param expiry 过期时间(Unix时间戳,0=永久)
|
||||
* @param licensee 被许可方名称
|
||||
* @return 格式化的License Key字符串
|
||||
*/
|
||||
static std::string generate(LicenseTier tier, std::time_t expiry,
|
||||
const std::string& licensee);
|
||||
|
||||
/**
|
||||
* @brief 验证 LicenseKey 是否有效
|
||||
* @param key_str License Key 字符串
|
||||
* @return 有效则返回 true
|
||||
*/
|
||||
static bool validate(const std::string& key_str);
|
||||
|
||||
/// 获取解析后的 LicenseInfo
|
||||
[[nodiscard]] const LicenseInfo& info() const { return info_; }
|
||||
|
||||
/// 原始 Key 字符串
|
||||
[[nodiscard]] const std::string& key_string() const { return key_string_; }
|
||||
|
||||
/// 签名验证是否通过
|
||||
[[nodiscard]] bool signature_valid() const { return sig_valid_; }
|
||||
|
||||
private:
|
||||
/// Base32 编解码(RFC 4648,无填充)
|
||||
static std::string base32_encode(const std::vector<uint8_t>& data);
|
||||
static std::vector<uint8_t> base32_decode(const std::string& encoded);
|
||||
|
||||
/// HMAC-SHA256 简化实现(使用占位密钥)
|
||||
static std::vector<uint8_t> compute_hmac(const std::vector<uint8_t>& data);
|
||||
|
||||
LicenseInfo info_;
|
||||
std::string key_string_;
|
||||
bool sig_valid_ = false;
|
||||
};
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// LicenseManager 单例
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief LicenseManager 全局许可证管理器(单例)
|
||||
*
|
||||
* 管理当前运行时使用的许可证,提供功能查询接口。
|
||||
*
|
||||
* 用法:
|
||||
* @code
|
||||
* auto& mgr = LicenseManager::instance();
|
||||
* mgr.set_license("VDE-ABCD-EFGH-IJKL");
|
||||
* if (mgr.has_feature("CAM_5AXIS")) { ... }
|
||||
* if (mgr.is_expired()) { ... }
|
||||
* @endcode
|
||||
*/
|
||||
class LicenseManager {
|
||||
public:
|
||||
/// 获取单例实例
|
||||
static LicenseManager& instance();
|
||||
|
||||
// ── 禁止拷贝和移动 ──────────────────────────────
|
||||
LicenseManager(const LicenseManager&) = delete;
|
||||
LicenseManager& operator=(const LicenseManager&) = delete;
|
||||
|
||||
/**
|
||||
* @brief 设置 License Key
|
||||
* @param key License Key 字符串
|
||||
* @return true 设置成功(Key有效且未过期)
|
||||
*/
|
||||
bool set_license(const std::string& key);
|
||||
|
||||
/**
|
||||
* @brief 进入试用模式(30天Community试用)
|
||||
* @param days 试用天数(默认30)
|
||||
*/
|
||||
void start_trial(int days = 30);
|
||||
|
||||
/// 当前许可证层级
|
||||
[[nodiscard]] LicenseTier current_tier() const;
|
||||
|
||||
/**
|
||||
* @brief 检查是否拥有某个功能
|
||||
* @param feature_name 功能名称字符串(如 "CAM_5AXIS")
|
||||
* @return true 表示该功能可用
|
||||
*/
|
||||
[[nodiscard]] bool has_feature(const std::string& feature_name) const;
|
||||
|
||||
/**
|
||||
* @brief 检查 Feature 枚举是否可用
|
||||
* @param f Feature 枚举值
|
||||
* @return true 表示该功能可用
|
||||
*/
|
||||
[[nodiscard]] bool has_feature(Feature f) const;
|
||||
|
||||
/// 许可证是否已过期
|
||||
[[nodiscard]] bool is_expired() const;
|
||||
|
||||
/// 试用剩余天数(-1 表示已过期或无试用)
|
||||
[[nodiscard]] int trial_days_left() const;
|
||||
|
||||
/// 获取当前许可证信息
|
||||
[[nodiscard]] const LicenseInfo& current_license() const;
|
||||
|
||||
/// 是否处于试用模式
|
||||
[[nodiscard]] bool is_trial() const;
|
||||
|
||||
private:
|
||||
LicenseManager();
|
||||
~LicenseManager() = default;
|
||||
|
||||
LicenseInfo current_;
|
||||
bool trial_mode_ = false;
|
||||
std::time_t trial_start_ = 0;
|
||||
int trial_days_ = 30;
|
||||
mutable std::mutex mutex_;
|
||||
};
|
||||
|
||||
} // namespace vde::core
|
||||
@@ -0,0 +1,176 @@
|
||||
#pragma once
|
||||
/**
|
||||
* @file version.h
|
||||
* @brief ViewDesignEngine 版本信息
|
||||
*
|
||||
* 提供编译时版本宏和运行时版本查询函数。
|
||||
* 编译时间戳通过 CMake 的 configure_file 在构建时注入。
|
||||
*
|
||||
* @ingroup core
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
// 包含 CMake 生成的构建配置
|
||||
#if __has_include("vde_build_config.h")
|
||||
#include "vde_build_config.h"
|
||||
#endif
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// 编译时版本宏
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/// 主版本号(不兼容的 API 变更)
|
||||
#define VDE_VERSION_MAJOR 1
|
||||
|
||||
/// 次版本号(向后兼容的功能新增)
|
||||
#define VDE_VERSION_MINOR 0
|
||||
|
||||
/// 修订版本号(向后兼容的问题修复)
|
||||
#define VDE_VERSION_PATCH 1
|
||||
|
||||
/// 版本字符串
|
||||
#define VDE_VERSION_STRING "1.0.1"
|
||||
|
||||
// ── 版本号整型(用于比较) ────────────────────────────
|
||||
/// 版本号编码为大整数: VDE_VERSION(major, minor, patch) = major*10000 + minor*100 + patch
|
||||
#define VDE_VERSION_CODE(major, minor, patch) \
|
||||
((major) * 10000 + (minor) * 100 + (patch))
|
||||
|
||||
/// 当前版本号整型编码
|
||||
#define VDE_VERSION_NUM VDE_VERSION_CODE(1, 0, 1)
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// 构建信息(由 CMake configure_file 注入)
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
#ifndef VDE_BUILD_TYPE
|
||||
/// 构建类型:Debug / Release / RelWithDebInfo / MinSizeRel
|
||||
#ifdef NDEBUG
|
||||
#define VDE_BUILD_TYPE "Release"
|
||||
#else
|
||||
#define VDE_BUILD_TYPE "Debug"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef VDE_BUILD_TIMESTAMP
|
||||
/// 构建时间戳(ISO 8601 格式,如 "2026-07-27T12:00:00Z")
|
||||
/// 由 CMake 的 configure_file 注入
|
||||
#define VDE_BUILD_TIMESTAMP "unknown"
|
||||
#endif
|
||||
|
||||
#ifndef VDE_COMPILER_INFO
|
||||
/// 编译器信息字符串
|
||||
#if defined(__clang__)
|
||||
#define VDE_COMPILER_INFO "Clang " __clang_version__
|
||||
#elif defined(__GNUC__) || defined(__GNUG__)
|
||||
#define VDE_COMPILER_INFO "GCC " __VERSION__
|
||||
#elif defined(_MSC_VER)
|
||||
#define VDE_COMPILER_INFO "MSVC " _MSC_VER_STR
|
||||
#else
|
||||
#define VDE_COMPILER_INFO "Unknown Compiler"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// C++ 标准信息
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/// C++ 标准字符串(如 "C++20")
|
||||
#if __cplusplus >= 202002L
|
||||
#define VDE_CPP_STANDARD_STRING "C++20"
|
||||
#elif __cplusplus >= 201703L
|
||||
#define VDE_CPP_STANDARD_STRING "C++17"
|
||||
#elif __cplusplus >= 201402L
|
||||
#define VDE_CPP_STANDARD_STRING "C++14"
|
||||
#elif __cplusplus >= 201103L
|
||||
#define VDE_CPP_STANDARD_STRING "C++11"
|
||||
#else
|
||||
#define VDE_CPP_STANDARD_STRING "C++03"
|
||||
#endif
|
||||
|
||||
namespace vde::core {
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// VersionInfo 结构体
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief 版本信息结构体
|
||||
*
|
||||
* 包含库版本号、构建类型、时间戳和编译器信息。
|
||||
*/
|
||||
struct VersionInfo {
|
||||
int major; ///< 主版本号
|
||||
int minor; ///< 次版本号
|
||||
int patch; ///< 修订版本号
|
||||
std::string version_string; ///< 版本字符串 "1.0.1"
|
||||
std::string build_type; ///< 构建类型 "Debug"/"Release"
|
||||
std::string build_timestamp;///< 构建时间戳
|
||||
std::string compiler_info; ///< 编译器信息
|
||||
std::string cpp_standard; ///< C++ 标准字符串 "C++20"
|
||||
|
||||
/// 默认构造(使用编译时宏填充)
|
||||
VersionInfo()
|
||||
: major(VDE_VERSION_MAJOR)
|
||||
, minor(VDE_VERSION_MINOR)
|
||||
, patch(VDE_VERSION_PATCH)
|
||||
, version_string(VDE_VERSION_STRING)
|
||||
, build_type(VDE_BUILD_TYPE)
|
||||
, build_timestamp(VDE_BUILD_TIMESTAMP)
|
||||
, compiler_info(VDE_COMPILER_INFO)
|
||||
, cpp_standard(VDE_CPP_STANDARD_STRING) {}
|
||||
};
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// API 函数
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief 获取版本信息结构体
|
||||
* @return VersionInfo 包含完整的版本和构建信息
|
||||
*/
|
||||
inline VersionInfo vde_version() {
|
||||
return VersionInfo{};
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取人类可读的版本字符串
|
||||
*
|
||||
* 格式:"ViewDesignEngine v1.0.1 (C++20, GCC 11.4)"
|
||||
*
|
||||
* @return 版本信息字符串
|
||||
*/
|
||||
inline std::string vde_version_string() {
|
||||
std::string result = "ViewDesignEngine v";
|
||||
result += VDE_VERSION_STRING;
|
||||
result += " (";
|
||||
result += VDE_CPP_STANDARD_STRING;
|
||||
result += ", ";
|
||||
result += VDE_COMPILER_INFO;
|
||||
result += ")";
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 比较两个版本号
|
||||
*
|
||||
* 返回负值表示 lhs < rhs,零表示相等,正值表示 lhs > rhs。
|
||||
*
|
||||
* @param lhs_major 左主版本
|
||||
* @param lhs_minor 左次版本
|
||||
* @param lhs_patch 左修订版本
|
||||
* @param rhs_major 右主版本
|
||||
* @param rhs_minor 右次版本
|
||||
* @param rhs_patch 右修订版本
|
||||
* @return 比较结果
|
||||
*/
|
||||
inline int vde_version_compare(int lhs_major, int lhs_minor, int lhs_patch,
|
||||
int rhs_major, int rhs_minor, int rhs_patch) {
|
||||
int lhs = VDE_VERSION_CODE(lhs_major, lhs_minor, lhs_patch);
|
||||
int rhs = VDE_VERSION_CODE(rhs_major, rhs_minor, rhs_patch);
|
||||
return lhs - rhs;
|
||||
}
|
||||
|
||||
} // namespace vde::core
|
||||
@@ -1,33 +1,289 @@
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
|
||||
namespace vde::foundation {
|
||||
|
||||
/**
|
||||
* @brief 全局错误码枚举
|
||||
* @file error_codes.h
|
||||
* @brief ViewDesignEngine 统一错误码体系
|
||||
*
|
||||
* VDE 引擎中所有函数可能返回的错误状态码。
|
||||
* 成功用 kSuccess(0) 表示,非零值表示各类错误。
|
||||
* 所有模块的错误码集中定义在此,采用分段编码:
|
||||
* 0 — SUCCESS
|
||||
* 1xxx — foundation(格式IO错误)
|
||||
* 2xxx — core(几何计算错误)
|
||||
* 3xxx — curves(曲线曲面错误)
|
||||
* 4xxx — mesh(网格错误)
|
||||
* 5xxx — brep(B-Rep错误)
|
||||
* 6xxx — sdf(SDF错误)
|
||||
* 7xxx — capi(C API错误)
|
||||
*
|
||||
* @ingroup foundation
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
|
||||
namespace vde::foundation {
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// ErrorCode 枚举 — 所有模块统一
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
enum class ErrorCode : int32_t {
|
||||
/// 操作成功完成,无错误
|
||||
kSuccess = 0,
|
||||
/// 传入参数无效(空指针、越界、非法值等)
|
||||
kInvalidArgument,
|
||||
/// 输入几何数据不合法(自交、非流形、退化等)
|
||||
kInvalidGeometry,
|
||||
/// 退化情况(共线、共面等导致无法确定唯一解)
|
||||
kDegenerateCase,
|
||||
/// 功能尚未实现
|
||||
kNotImplemented,
|
||||
/// 数值计算误差超出容差范围
|
||||
kNumericalError,
|
||||
/// 内存分配失败
|
||||
kOutOfMemory,
|
||||
/// 内部逻辑错误(不应出现的情况)
|
||||
kInternalError,
|
||||
// ── 成功 ───────────────────────────────────────────
|
||||
SUCCESS = 0,
|
||||
|
||||
// ── 1xxx:foundation 格式IO错误 ──────────────────────
|
||||
// 通用文件IO
|
||||
ERR_FILE_NOT_FOUND = 1001, // 文件未找到
|
||||
ERR_FILE_OPEN_FAILED = 1002, // 文件打开失败
|
||||
ERR_FILE_WRITE_FAILED = 1003, // 文件写入失败
|
||||
ERR_FILE_READ_FAILED = 1004, // 文件读取失败
|
||||
ERR_FILE_PERMISSION_DENIED = 1005, // 文件权限不足
|
||||
ERR_FILE_TOO_LARGE = 1006, // 文件过大
|
||||
ERR_FILE_EMPTY = 1007, // 文件为空
|
||||
ERR_FILE_ALREADY_EXISTS = 1008, // 文件已存在
|
||||
|
||||
// 格式解析
|
||||
ERR_FORMAT_INVALID = 1101, // 格式无效
|
||||
ERR_FORMAT_UNSUPPORTED = 1102, // 格式不支持
|
||||
ERR_FORMAT_VERSION_MISMATCH = 1103, // 格式版本不匹配
|
||||
ERR_FORMAT_CORRUPTED = 1104, // 格式数据损坏
|
||||
ERR_FORMAT_TRUNCATED = 1105, // 格式数据截断
|
||||
ERR_FORMAT_MAGIC_MISMATCH = 1106, // 格式魔术字不匹配
|
||||
|
||||
// VDE 原生格式
|
||||
ERR_VDE_HEADER_INVALID = 1201, // VDE文件头无效
|
||||
ERR_VDE_SECTION_MISSING = 1202, // VDE段缺失
|
||||
ERR_VDE_SECTION_CORRUPTED = 1203, // VDE段损坏
|
||||
ERR_VDE_TOPOLOGY_INVALID = 1204, // VDE拓扑数据无效
|
||||
ERR_VDE_GEOMETRY_INVALID = 1205, // VDE几何数据无效
|
||||
ERR_VDE_SERIALIZE_FAILED = 1206, // VDE序列化失败
|
||||
ERR_VDE_DESERIALIZE_FAILED = 1207, // VDE反序列化失败
|
||||
|
||||
// 工业格式 IO
|
||||
ERR_STEP_PARSE = 1301, // STEP解析错误
|
||||
ERR_STEP_SCHEMA_MISMATCH = 1302, // STEP模式不匹配
|
||||
ERR_STEP_ENTITY_UNKNOWN = 1303, // STEP未知实体
|
||||
ERR_STEP_TOPOLOGY = 1304, // STEP拓扑构建失败
|
||||
ERR_STEP_GEOMETRY = 1305, // STEP几何构建失败
|
||||
ERR_IGES_PARSE = 1311, // IGES解析错误
|
||||
ERR_IGES_ENTITY_UNSUPPORTED = 1312, // IGES不支持的实体
|
||||
ERR_OBJ_PARSE = 1321, // OBJ解析错误
|
||||
ERR_STL_PARSE = 1331, // STL解析错误
|
||||
ERR_STL_BINARY_INVALID = 1332, // STL二进制格式无效
|
||||
ERR_PLY_PARSE = 1341, // PLY解析错误
|
||||
ERR_GLTF_PARSE = 1351, // glTF解析错误
|
||||
ERR_3MF_PARSE = 1361, // 3MF解析错误
|
||||
ERR_DXF_PARSE = 1371, // DXF解析错误
|
||||
|
||||
// ── 2xxx:core 几何计算错误 ─────────────────────────
|
||||
ERR_DEGENERATE_GEOMETRY = 2001, // 退化几何
|
||||
ERR_NUMERIC_INSTABILITY = 2002, // 数值不稳定
|
||||
ERR_DIVISION_BY_ZERO = 2003, // 除零错误
|
||||
ERR_SINGULAR_MATRIX = 2004, // 奇异矩阵
|
||||
ERR_CONVERGENCE_FAILURE = 2005, // 收敛失败
|
||||
ERR_OUT_OF_MEMORY = 2006, // 内存不足
|
||||
ERR_OVERFLOW = 2007, // 数值溢出
|
||||
ERR_PRECISION_LOSS = 2008, // 精度丢失
|
||||
ERR_BUFFER_TOO_SMALL = 2009, // 缓冲区太小
|
||||
ERR_INDEX_OUT_OF_BOUNDS = 2010, // 索引越界
|
||||
|
||||
// 几何运算
|
||||
ERR_INTERSECTION_FAILED = 2101, // 求交失败
|
||||
ERR_PROJECTION_FAILED = 2102, // 投影失败
|
||||
ERR_DISTANCE_COMPUTE_FAILED = 2103, // 距离计算失败
|
||||
ERR_CONVEX_HULL_FAILED = 2104, // 凸包计算失败
|
||||
ERR_VORONOI_FAILED = 2105, // Voronoi计算失败
|
||||
ERR_TRIANGULATION_FAILED = 2106, // 三角剖分失败
|
||||
ERR_SIMPLIFY_FAILED = 2107, // 简化失败
|
||||
|
||||
// CAM
|
||||
ERR_CAM_TOOLPATH_GENERATION = 2201, // 刀路生成失败
|
||||
ERR_CAM_COLLISION_DETECTED = 2202, // 刀具碰撞检测到
|
||||
ERR_CAM_INVALID_STRATEGY = 2203, // 无效的加工策略
|
||||
ERR_CAM_5AXIS_LIMIT = 2204, // 五轴极限超限
|
||||
ERR_CAM_OPTIMIZATION_FAILED = 2205, // CAM优化失败
|
||||
|
||||
// 性能/并发
|
||||
ERR_THREAD_CREATE_FAILED = 2301, // 线程创建失败
|
||||
ERR_LOCK_TIMEOUT = 2302, // 锁超时
|
||||
ERR_TASK_CANCELLED = 2303, // 任务已取消
|
||||
ERR_TRANSACTION_CONFLICT = 2304, // 事务冲突
|
||||
ERR_TRANSACTION_ROLLBACK = 2305, // 事务回滚
|
||||
|
||||
// ── 3xxx:curves 曲线曲面错误 ───────────────────────
|
||||
ERR_CURVE_DEGREE_INVALID = 3001, // 曲线阶数无效
|
||||
ERR_CURVE_KNOT_INVALID = 3002, // 节点向量无效
|
||||
ERR_CURVE_CP_COUNT_MISMATCH = 3003, // 控制点数量不匹配
|
||||
ERR_CURVE_EVALUATION_FAILED = 3004, // 曲线求值失败
|
||||
ERR_CURVE_DERIVATIVE_FAILED = 3005, // 曲线求导失败
|
||||
ERR_CURVE_PARAM_OUT_OF_RANGE= 3006, // 参数超出范围
|
||||
ERR_CURVE_SELF_INTERSECT = 3007, // 曲线自交
|
||||
ERR_CURVE_DISCONTINUITY = 3008, // 曲线不连续
|
||||
|
||||
// 曲面
|
||||
ERR_SURFACE_INVALID = 3101, // 曲面无效
|
||||
ERR_SURFACE_PARAM_RANGE = 3102, // 曲面参数范围无效
|
||||
ERR_SURFACE_DEGENERATE = 3103, // 退化曲面
|
||||
ERR_SURFACE_SINGULARITY = 3104, // 曲面奇点
|
||||
ERR_SURFACE_INTERSECTION = 3105, // 曲面求交失败
|
||||
ERR_SURFACE_CONTINUITY = 3106, // 曲面连续性不满足
|
||||
ERR_SURFACE_TRIMMING = 3107, // 曲面裁剪失败
|
||||
ERR_SURFACE_EXTENSION = 3108, // 曲面延伸失败
|
||||
ERR_SURFACE_OFFSET = 3109, // 曲面偏置失败
|
||||
ERR_SURFACE_FAIRING = 3110, // 曲面光顺失败
|
||||
|
||||
// IGA
|
||||
ERR_IGA_MESH_INVALID = 3201, // IGA网格无效
|
||||
ERR_IGA_REFINEMENT_FAILED = 3202, // IGA细化失败
|
||||
|
||||
// ── 4xxx:mesh 网格错误 ─────────────────────────────
|
||||
ERR_MESH_EMPTY = 4001, // 网格为空
|
||||
ERR_MESH_NON_MANIFOLD = 4002, // 非流形网格
|
||||
ERR_MESH_DEGENERATE_FACE = 4003, // 退化面
|
||||
ERR_MESH_SELF_INTERSECTION = 4004, // 网格自交
|
||||
ERR_MESH_INVERTED_NORMAL = 4005, // 法线翻转
|
||||
ERR_MESH_HOLE_DETECTED = 4006, // 检测到孔洞
|
||||
ERR_MESH_DISCONNECTED = 4007, // 网格不连通
|
||||
|
||||
// 网格操作
|
||||
ERR_MESH_BOOLEAN_FAILED = 4101, // 网格布尔失败
|
||||
ERR_MESH_SIMPLIFY_FAILED = 4102, // 网格简化失败
|
||||
ERR_MESH_SMOOTH_FAILED = 4103, // 网格平滑失败
|
||||
ERR_MESH_REPAIR_FAILED = 4104, // 网格修复失败
|
||||
ERR_MESH_PARAMETERIZE_FAILED= 4105, // 网格参数化失败
|
||||
ERR_MESH_REMESH_FAILED = 4106, // 网格重划分失败
|
||||
ERR_MESH_SPLIT_FAILED = 4107, // 网格分割失败
|
||||
|
||||
// 高级网格
|
||||
ERR_FEA_MESH_QUALITY = 4201, // FEA网格质量不足
|
||||
ERR_FEA_MESH_GENERATION = 4202, // FEA网格生成失败
|
||||
ERR_MARCHING_CUBES_FAILED = 4203, // Marching Cubes失败
|
||||
ERR_POINT_CLOUD_EMPTY = 4204, // 点云为空
|
||||
ERR_POINT_CLOUD_NOISE = 4205, // 点云噪声过大
|
||||
|
||||
// ── 5xxx:brep B-Rep错误 ───────────────────────────
|
||||
ERR_BREP_TOPOLOGY_INVALID = 5001, // B-Rep拓扑无效
|
||||
ERR_BREP_GEOMETRY_MISMATCH = 5002, // B-Rep几何不匹配
|
||||
ERR_BREP_SHELL_NOT_CLOSED = 5003, // 壳不封闭
|
||||
ERR_BREP_ORIENTATION = 5004, // 方向不一致
|
||||
ERR_BREP_SEWING_FAILED = 5005, // 缝合失败
|
||||
ERR_BREP_HEALING_FAILED = 5006, // 修复失败
|
||||
ERR_BREP_VALIDATION_FAILED = 5007, // 验证失败
|
||||
|
||||
// 布尔操作
|
||||
ERR_BOOLEAN_OPERATION_FAILED= 5101, // 布尔操作失败
|
||||
ERR_BOOLEAN_INTERSECT_FAILED= 5102, // 布尔求交失败
|
||||
ERR_BOOLEAN_SUBTRACT_FAILED = 5103, // 布尔求差失败
|
||||
ERR_BOOLEAN_UNION_FAILED = 5104, // 布尔求并失败
|
||||
ERR_BOOLEAN_DEGENERATE = 5105, // 布尔操作产生退化
|
||||
ERR_BOOLEAN_FALLBACK_USED = 5106, // 布尔操作回退到备用方法
|
||||
|
||||
// 特征建模
|
||||
ERR_FEATURE_CREATION_FAILED = 5201, // 特征创建失败
|
||||
ERR_FEATURE_TREE_INVALID = 5202, // 特征树无效
|
||||
ERR_FEATURE_UPDATE_FAILED = 5203, // 特征更新失败
|
||||
ERR_FEATURE_RECOGNITION = 5204, // 特征识别失败
|
||||
|
||||
// 装配
|
||||
ERR_ASSEMBLY_CONSTRAINT = 5301, // 装配约束冲突
|
||||
ERR_ASSEMBLY_INTERFERENCE = 5302, // 装配干涉
|
||||
ERR_ASSEMBLY_CYCLE = 5303, // 装配循环引用
|
||||
ERR_ASSEMBLY_MATE_FAILED = 5304, // 配合失败
|
||||
ERR_ASSEMBLY_LOD_INVALID = 5305, // LOD级别无效
|
||||
|
||||
// 钣金
|
||||
ERR_SHEET_METAL_THICKNESS = 5401, // 钣金厚度无效
|
||||
ERR_SHEET_METAL_BEND_RADIUS = 5402, // 弯曲半径无效
|
||||
ERR_SHEET_METAL_UNFOLD = 5403, // 展开失败
|
||||
|
||||
// PMI/GD&T
|
||||
ERR_PMI_INVALID = 5501, // PMI无效
|
||||
ERR_GDT_TOLERANCE = 5502, // GD&T公差错误
|
||||
ERR_AUTO_DIM_FAILED = 5503, // 自动标注失败
|
||||
ERR_DRAWING_STANDARD = 5504, // 制图标准错误
|
||||
|
||||
// 柔性体
|
||||
ERR_FFD_INVALID = 5601, // FFD变形无效
|
||||
|
||||
// ── 6xxx:sdf SDF错误 ──────────────────────────────
|
||||
ERR_SDF_EVALUATE_FAILED = 6001, // SDF求值失败
|
||||
ERR_SDF_TREE_INVALID = 6002, // SDF树无效
|
||||
ERR_SDF_TO_MESH_FAILED = 6003, // SDF转网格失败
|
||||
ERR_SDF_OPTIMIZE_FAILED = 6004, // SDF优化失败
|
||||
ERR_SDF_TORCH_ERROR = 6005, // SDF Torch推理错误
|
||||
ERR_SDF_PRIMITIVE_INVALID = 6006, // SDF基元无效
|
||||
|
||||
// ── 7xxx:capi C API错误 ───────────────────────────
|
||||
ERR_CAPI_NULL_HANDLE = 7001, // 空句柄
|
||||
ERR_CAPI_INVALID_ARGUMENT = 7002, // 无效参数
|
||||
ERR_CAPI_TYPE_MISMATCH = 7003, // 类型不匹配
|
||||
ERR_CAPI_NOT_INITIALIZED = 7004, // 引擎未初始化
|
||||
ERR_CAPI_ALREADY_INITIALIZED= 7005, // 引擎已初始化
|
||||
ERR_CAPI_BUFFER_TOO_SMALL = 7006, // 输出缓冲区太小
|
||||
ERR_CAPI_FEATURE_NOT_AVAIL = 7007, // 功能不可用
|
||||
ERR_CAPI_UNKNOWN_ERROR = 7999, // 未知C API错误
|
||||
};
|
||||
|
||||
} // namespace vde::foundation
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// ErrorInfo 结构体
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief 错误信息结构体
|
||||
*
|
||||
* 包含错误码、中文描述、所属模块和发生的源位置。
|
||||
*/
|
||||
struct ErrorInfo {
|
||||
ErrorCode code; ///< 错误码
|
||||
std::string message; ///< 中文错误描述
|
||||
std::string module; ///< 所属模块名
|
||||
std::string file; ///< 源文件名
|
||||
int line; ///< 源文件行号
|
||||
|
||||
/// 默认构造(SUCCESS)
|
||||
ErrorInfo()
|
||||
: code(ErrorCode::SUCCESS), message("成功"), module(""), file(""), line(0) {}
|
||||
|
||||
/// 完整构造
|
||||
ErrorInfo(ErrorCode c, std::string msg, std::string mod,
|
||||
std::string f = "", int l = 0)
|
||||
: code(c), message(std::move(msg)), module(std::move(mod)),
|
||||
file(std::move(f)), line(l) {}
|
||||
};
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// API 函数
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* @brief 获取错误码对应的中文描述
|
||||
* @param code 错误码
|
||||
* @return 中文错误描述字符串
|
||||
*/
|
||||
std::string error_message(ErrorCode code);
|
||||
|
||||
/**
|
||||
* @brief 判断错误码是否表示错误(非成功)
|
||||
* @param code 错误码
|
||||
* @return true 表示有错误
|
||||
*/
|
||||
constexpr bool is_error(ErrorCode code) noexcept {
|
||||
return code != ErrorCode::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断错误码是否表示成功
|
||||
* @param code 错误码
|
||||
* @return true 表示成功
|
||||
*/
|
||||
constexpr bool is_success(ErrorCode code) noexcept {
|
||||
return code == ErrorCode::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将错误码转换为所属模块名
|
||||
* @param code 错误码
|
||||
* @return 模块名称字符串
|
||||
*/
|
||||
std::string error_module(ErrorCode code);
|
||||
|
||||
} // namespace vde::foundation
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
/**
|
||||
* @file vde_version.h
|
||||
* @brief ViewDesignEngine 版本和许可证顶层便捷头文件
|
||||
*
|
||||
* 上层应用/用户只需 #include <vde/vde_version.h> 即可获得:
|
||||
* - ViewDesignEngine 版本信息(版本号、构建信息)
|
||||
* - 许可证管理(LicenseManager 单例)
|
||||
* - 功能查询接口(has_feature)
|
||||
*
|
||||
* 使用示例:
|
||||
* @code
|
||||
* #include <vde/vde_version.h>
|
||||
*
|
||||
* // 打印版本
|
||||
* std::cout << vde::core::vde_version_string() << std::endl;
|
||||
*
|
||||
* // 设置许可证
|
||||
* auto& lm = vde::core::LicenseManager::instance();
|
||||
* lm.set_license("VDE-XXXX-XXXX-XXXX");
|
||||
*
|
||||
* // 检查功能
|
||||
* if (lm.has_feature("CAM_5AXIS")) {
|
||||
* // 使用5轴CAM功能
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @ingroup core
|
||||
*/
|
||||
|
||||
#include "vde/core/version.h"
|
||||
#include "vde/core/license_manager.h"
|
||||
Reference in New Issue
Block a user