feat(v1.0.1): tangent_pull + error codes + version + license management
CI / Build & Test (push) Failing after 39s
CI / Release Build (push) Failing after 33s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled

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:
茂之钳
2026-07-27 21:54:46 +08:00
parent 4b90438315
commit 5bfcbcb8e9
14 changed files with 2355 additions and 24 deletions
+42
View File
@@ -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
+278
View File
@@ -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-XXXXBase32编码)
* 包含:版本号 + 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, ///< 基础格式IOOBJ/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
+176
View File
@@ -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
+280 -24
View File
@@ -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 — brepB-Rep错误)
* 6xxx — sdfSDF错误)
* 7xxx — capiC 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,
// ── 1xxxfoundation 格式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, // 点云噪声过大
// ── 5xxxbrep 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基元无效
// ── 7xxxcapi 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
+32
View File
@@ -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"