feat(v1.0.1): tangent_pull + error codes + version + license management
Build & Test / build-and-test (push) Waiting to run
Build & Test / python-bindings (push) Blocked by required conditions
CI / Build & Test (push) Failing after 39s
CI / Release Build (push) Failing after 33s

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
+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