feat: 插件化 API 架构 — C API + 模块独立 + 外部集成示例
CI / Build & Test (push) Failing after 37s
CI / Release Build (push) Failing after 35s

核心设计:
- include/vde/vde.h: 统一 C API(50+ 函数,6 种不透明句柄)
  - 上下文管理 / I/O / Mesh / 曲线 / 碰撞 / 约束求解 / B-Rep / 序列化
- src/capi/vde_capi.cpp: 完整 C API 实现 (240行)
- examples/07_capi_integration: C 语言外部调用示例
- CMake: 添加 vde_capi 库 + install 导出支持

模块架构(每个独立 .a):
  vde_foundation → vde_core → vde_curves → vde_mesh
  → vde_spatial → vde_boolean / vde_collision
  → vde_brep / vde_sketch → vde_capi
This commit is contained in:
ViewDesignEngine
2026-07-23 09:06:18 +00:00
parent f174fd5101
commit 352ee39f53
8 changed files with 415 additions and 26 deletions
@@ -0,0 +1,2 @@
add_executable(capi_demo main.c)
target_link_libraries(capi_demo PRIVATE vde_capi)
+33
View File
@@ -0,0 +1,33 @@
#include "vde/vde.h"
#include <stdio.h>
int main(void) {
VdeHandle ctx = vde_create();
printf("ViewDesignEngine %s\n", vde_version());
/* GJK spheres */
int hit = vde_collision_gjk_spheres(ctx, 0,0,0, 1.0, 1.5,0,0, 1.0);
printf("Spheres overlap: %s\n", hit ? "yes" : "no");
/* Constraint solver */
VdeSolverHandle s = vde_solver_create();
int p0 = vde_solver_add_point(s, 0,0,1);
int p1 = vde_solver_add_point(s, 3,0.5,0);
int l0 = vde_solver_add_line(s, p0, p1);
vde_solver_add_horizontal(s, l0);
vde_solver_add_distance_constraint(s, p0, p1, 5.0);
printf("Solver: %s\n", vde_solver_solve(s,100,1e-6) ? "ok" : "fail");
double x,y; vde_solver_get_point(s,p1,&x,&y);
printf(" P1=(%.4f,%.4f)\n", x, y);
vde_solver_free(s);
/* B-Rep box */
VdeBodyHandle box = vde_body_create_box(ctx, 2,2,2);
VdeMeshHandle m = vde_body_to_mesh(ctx, box, 0.01);
printf("Box: %zu faces\n", vde_mesh_num_faces(m));
vde_mesh_free(m);
vde_body_free(box);
vde_destroy(ctx);
return 0;
}
+41
View File
@@ -0,0 +1,41 @@
#include <stdio.h>
#include "vde/vde.h"
int main(void) {
VdeHandle ctx = vde_create();
printf("ViewDesignEngine %s\n", vde_version());
/* ── Mesh I/O ── */
// VdeMeshHandle mesh = vde_load_mesh(ctx, "bunny.obj");
// printf("Loaded mesh: %zu vertices, %zu faces\n",
// vde_mesh_num_vertices(mesh), vde_mesh_num_faces(mesh));
/* ── Collision: GJK spheres ── */
int hit = vde_collision_gjk_spheres(ctx, 0,0,0, 1.0, 1.5,0,0, 1.0);
printf("Spheres overlap: %s\n", hit ? "yes" : "no");
/* ── Sketch constraint solver ── */
VdeSolverHandle solver = vde_solver_create();
int p0 = vde_solver_add_point(solver, 0.0, 0.0, 1); /* fixed */
int p1 = vde_solver_add_point(solver, 3.0, 0.5, 0);
int l0 = vde_solver_add_line(solver, p0, p1);
vde_solver_add_horizontal(solver, l0);
vde_solver_add_distance_constraint(solver, p0, p1, 5.0);
int ok = vde_solver_solve(solver, 100, 1e-6);
printf("Solver converged: %s\n", ok ? "yes" : "no");
double x, y;
vde_solver_get_point(solver, p1, &x, &y);
printf("Point 1 after solve: (%.4f, %.4f)\n", x, y);
vde_solver_free(solver);
/* ── B-Rep: create box ── */
VdeBodyHandle box = vde_body_create_box(ctx, 2.0, 2.0, 2.0);
VdeMeshHandle box_mesh = vde_body_to_mesh(ctx, box, 0.01);
printf("Box mesh: %zu faces\n", vde_mesh_num_faces(box_mesh));
vde_mesh_free(box_mesh);
vde_body_free(box);
vde_destroy(ctx);
printf("Done.\n");
return 0;
}
+1
View File
@@ -4,3 +4,4 @@ add_subdirectory(03_mesh)
add_subdirectory(04_delaunay)
add_subdirectory(05_boolean)
add_subdirectory(06_collision)
add_subdirectory(07_capi_integration)