技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
ara3d-sdk【数据与研究】Use when processing AEC/BIM 3D data in .NET 8 — mesh generation and transformation, SIMD-accelerated math, IFC/STEP/PLY to glTF/GLB/VIM conversion, plugin development. Ara3D-SDK: high-performance .NET 3D geometry and BIM library suite.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: ara3d-sdk description: "Use when processing AEC/BIM 3D data in .NET 8 — mesh generation and transformation, SIMD-accelerated math, IFC/STEP/PLY to glTF/GLB/VIM conversion, plugin development. Ara3D-SDK: high-performance .NET 3D geometry and BIM library suite." tags:
项目地址: https://github.com/ara3d/ara3d-sdk
NuGet 元包:
Ara3D.SDK| Ara 3D 官网: https://ara3d.com许可证: MIT | 最新版本:
1.6.1(由仓库Directory.Build.props的Ara3DVersion统一管理,所有包共享同一版本号)| 默认分支:main| 目标框架:net8.0/net8.0-windows
Ara3D-SDK 是面向 AEC / BIM / 数字孪生 / 三维 GIS 场景的高性能 .NET 三维数据处理引擎与 Studio 插件框架。它有两大定位:
Ara3D.Studio.API 编写生成器、修改器、命令与工具,把自研算法接入 Studio 的可视化流程图(Flow Graph)。核心工程亮点:
| 能力 | 说明 |
|---|---|
| 统一高性能内存模型 | Ara3D.Memory 提供 64 字节对齐的非托管缓冲区、ByteSlice、内存映射文件视图,服务 SIMD 与超大数据集 |
| SIMD 加速数学 | Ara3D.F8(AVX 8 宽 float)+ Plato DSL 生成的 Vector3/Matrix4x4/Quaternion/Number/Angle 等数学类型 |
| 不可变几何内核 | TriangleMesh3D/QuadGrid3D 的所有变换均返回新对象,天然适合函数式管线与并行 |
| BIM 开放模式(BOS) | 把 IFC/Revit 数据规约为列式 EAV 结构,可落地为 Parquet / DuckDB / Excel |
| 可插拔 Studio 框架 | 几十行代码写出参数化生成器或网格修改器,实时预览 |
| 零/少外部依赖 | 大多数库零外部 NuGet 依赖,便于审计与集成 |
一句话定位:Ara3D-SDK 是「面向 AEC 的高性能 .NET 三维数据处理引擎 + Studio 插件框架」,代码结构清晰、几乎零外部依赖,也是学习现代高性能 .NET 图形/BIM 工程的范本。
版本提示: Ara3D-SDK 处于活跃开发中,具体类名与方法签名可能随版本演进。请以你实际引用的 NuGet 包版本与源码为准,并让所有 Ara3D 包保持同一版本号。
| 目录 | 职责 |
|---|---|
src/ | 受支持的 SDK 库与 NuGet 元包(跨平台基础、几何、I/O、BIM、Studio API) |
ext/ | Windows 专属扩展:Ara3D.IfcLoader(原生 IFC 加载)、Ara3D.Utils.Wpf(WPF 辅助) |
apps/ | 独立桌面应用(如 BOS Browser) |
examples/ | 示例与用法演示(Workshop 课程、Studio 脚本示例、Tools 工具) |
plugins/ | 宿主插件(Bowerbird 实时脚本、Revit 加载项) |
integrations/ | 可选第三方适配器(如 Assimp) |
tests/ | NUnit 单元测试、回归测试、开发者测试 |
vendor/ | 必需的第三方原生库(如 web-ifc-library.dll) |
toolchain/ | 开发工具(如 IfcTypeGen),IsPackable=false,不打包 |
deprecated/ | 已不再维护的旧项目 |
build/ | 打包清单 packages.txt 与 PackAll.proj |
docs/ | 工作流、包依赖图、发布流程等文档 |
关键原则:只有 src/ 与 ext/ 下的库会被打包成 NuGet(见 build/packages.txt);toolchain/、tests/、apps/、examples/ 等永不进入发布产物。
Ara3D-SDK 提供四个元包(meta-package)——它们不含源码,只捆绑依赖,方便按需选择最小可用集合:
Ara3D.SDK (net8.0-windows — 完整 Windows 技术栈)
├── Ara3D.SDK.Core net8.0 — 跨平台基础(Utils/Logging/Memory/Collections/...)
├── Ara3D.SDK.Geometry net8.0 — 网格、模型、SIMD 数学
├── Ara3D.SDK.IO net8.0-windows — 文件格式、BOS、IFC
├── Ara3D.Studio.API — Studio 插件 API
└── Ara3D.Utils.Wpf — WPF 辅助(ext/)
选择建议:
Ara3D.SDK.Core 或 Ara3D.SDK.Geometry(Linux/macOS 亦可);Ara3D.SDK.IO;Ara3D.SDK。依赖层次(自底向上五层):
Collections、Events、F8、Memory、Utils、WorkItems;Logging→Utils、Utils.Roslyn→Logging、Geometry→Collections+Memory+Utils、PropKit→Geometry+Utils;DataTable→Collections+PropKit、Models→Collections+F8+Memory+Geometry;IO.BFAST→Memory+Utils、IO.G3D→Collections+BFAST、IO.StepParser→Memory+Logging+Utils 等;BimOpenSchema→DataTable+Geometry+Models、IfcLoader→BimOpenSchema+StepParser+Models、BimOpenSchema.IO→BimOpenSchema+IfcLoader。大多数库零外部 NuGet 依赖。少数例外:
Utils.Roslyn(Roslyn 编译器)、IO.GltfExporter(Newtonsoft.Json)、BimOpenSchema.IO(ClosedXML/DuckDB.NET/Parquet.Net),以及IfcLoader携带的原生web-ifc-library.dll。
| 元包 | 主要库 | 说明 |
|---|---|---|
Core (net8.0) | Ara3D.Collections | 只读列表视图、稀疏矩阵、LINQ 辅助 |
Ara3D.DataTable | 列式内存数据接口(struct-of-arrays) | |
Ara3D.Events | 线程安全事件总线 | |
Ara3D.F8 | SIMD(AVX)8 宽 float 数学 | |
Ara3D.Logging | 日志、进度与任务管理 | |
Ara3D.Memory | 对齐缓冲区、切片、内存映射文件视图 | |
Ara3D.PropKit | 运行时属性描述符(UI 绑定) | |
Ara3D.Utils / Ara3D.Utils.Roslyn | 通用工具 / Roslyn 编译辅助 | |
Ara3D.WorkItems | 后台工作项队列 | |
Geometry (net8.0) | Ara3D.Geometry | 网格、拓扑、空间查询、程序化建模、导出 |
Ara3D.Models | 场景模型、实例、渲染缓冲区 | |
Ara3D.F8 + Plato 生成数学 | Vector3/Matrix4x4/Quaternion/Number/Angle(src/Plato.Generated、src/Plato.Intrinsics) | |
IO (net8.0-windows) | Ara3D.IO.BFAST | 数组序列化二进制容器格式 |
Ara3D.IO.G3D | G3D 几何交换格式(基于 BFAST) | |
Ara3D.IO.PLY | PLY 网格导入/导出 | |
Ara3D.IO.GltfExporter / Ara3D.IO.SharpGLTF | glTF/GLB 导出 / 导入操作 | |
Ara3D.IO.VIM | VIM BIM 二进制格式 | |
Ara3D.IO.StepParser | ISO STEP 分词与解析 | |
Ara3D.IO.GeoJson | GeoJSON 与 IMDF 室内地图 | |
| BIM | Ara3D.BimOpenSchema | BIM 开放模式(BOS)对象模型 |
Ara3D.BimOpenSchema.IO | Parquet/DuckDB/Excel 序列化与 IFC 导入 | |
Ara3D.IfcLoader(ext/) | IFC → BOS 转换(原生 web-ifc) | |
| Studio | Ara3D.Studio.API | 流程图、资产与修改器管线类型 |
dotnet --version 输出 8.x);net8.0-windows,Ara3D.IfcLoader 依赖原生 64 位 DLL);CPU 提示:
Ara3D.F8使用 AVX(256 位)指令,Ara3D.Memory按 64 字节对齐以适配 AVX-512。现代 x64 CPU 均支持 AVX,SDK 在不支持时有回退路径,但要获得最佳性能建议使用较新的 x64 处理器。
| 包 | TFM | 原因 |
|---|---|---|
Ara3D.SDK.Core / Ara3D.SDK.Geometry | net8.0 | 跨平台 |
Ara3D.SDK.IO / Ara3D.SDK | net8.0-windows | I/O、BOS、IfcLoader、WPF 需 Windows |
Ara3D.Utils.Wpf / Ara3D.IfcLoader(ext/) | net8.0-windows | WPF / 原生 x64 DLL |
dotnet new console -n MyAra3DApp
cd MyAra3DApp
dotnet add package Ara3D.SDK.Core # 跨平台基础
dotnet add package Ara3D.SDK.Geometry # 或几何栈
dotnet add package Ara3D.SDK # 或完整 Windows 栈(TFM 需改为 net8.0-windows)
对应 .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<!-- 引用 Ara3D.SDK / Ara3D.SDK.IO 时改为 net8.0-windows -->
<TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- F8/SIMD 与部分 IO 使用 unsafe 指针,必须开启 -->
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Ara3D.SDK" Version="1.6.1" />
</ItemGroup>
</Project>
也可只引用单个库以缩小依赖面(请保持版本一致):
<PackageReference Include="Ara3D.Collections" Version="1.6.1" />
<PackageReference Include="Ara3D.Geometry" Version="1.6.1" />
<PackageReference Include="Ara3D.IO.PLY" Version="1.6.1" />
<PackageReference Include="Ara3D.BimOpenSchema.IO" Version="1.6.1" />
Ara3D.IfcLoader需web-ifc-library.dll(来自仓库vendor/)出现在输出目录,通过 NuGet 引用时会随包携带;平台须为 x64 Windows。
仓库提供一组 Windows 批处理脚本(底层即 dotnet build/test/msbuild):
build.bat :: 构建整个解决方案(Debug)
build.bat Release :: Release 构建
test.bat :: 运行完整测试套件(含 Slow)
test.bat fast :: 全部区域,跳过 Slow 的文件 I/O 测试
test.bat geometry :: 只跑某区域(all|sdk|geometry|bim|devtools|knownissues)
pack.bat :: 从 build/packages.txt 打包所有 NuGet(Release)
打出的 .nupkg 写入被 gitignore 的 artifacts/ 目录。在自己的项目引用本地构建包:
dotnet nuget add source /path/to/ara3d-sdk/artifacts --name ara3d-local
dotnet add package Ara3D.SDK --version 1.6.1 --source ara3d-local
using System;
using System.Linq;
// Vector3 定义在 Ara3D.Geometry 命名空间
var asm = typeof(Ara3D.Geometry.Vector3).Assembly;
var types = asm.GetTypes().Where(t => t.IsPublic).OrderBy(t => t.Name).ToList();
Console.WriteLine(quot;Found {types.Count} types in Ara3D.Geometry");
net8.0-windows)using Ara3D.Geometry; // 几何类型
using Ara3D.IO.PLY; // PLY 导入/导出
// PlatonicSolids 提供常见基本体(已三角化的立方体)
TriangleMesh3D cube = PlatonicSolids.TriangulatedCube;
// 所有变换都是不可变的:返回新网格,可链式组合
var transformed = cube
.Scale(new Vector3(2, 1, 1)) // 非均匀缩放
.Rotate(Quaternion.CreateFromAxisAngle(Vector3.UnitY, Angle.Degrees(30)))
.Translate(new Vector3(0, 0, 5));
Console.WriteLine(quot;顶点数: {transformed.Points.Count}, 面数: {transformed.Triangles.Count}");
Console.WriteLine(quot;包围盒: {transformed.Bounds.Min} .. {transformed.Bounds.Max}");
transformed.WritePly("cube.ply"); // WritePly 是 TriangleMesh3D 的扩展方法(Ara3D.IO.PLY)
// GlobalUsings.cs
global using Ara3D.Collections;
global using Ara3D.DataTable;
global using Ara3D.Geometry;
global using Ara3D.Logging;
global using Ara3D.Memory;
global using Ara3D.Models;
global using Ara3D.PropKit;
global using Ara3D.Studio.API;
global using Ara3D.Utils;
var mesh = PlatonicSolids.TriangulatedCube
.Scale(new Vector3(2, 1, 1))
.RotateY(Angle.Degrees(45))
.Translate(new Vector3(0, 0, 5));
Scale/Rotate/RotateY/Translate 均返回新对象(不可变),便于链式与并行。
// 用 Deform 做自定义逐点变形(如扭转)
var twisted = mesh.Deform(p => /* 依据 p 归一化位置返回新位置 */);
// 基本体、曲线、扫掠(Sweep)、旋转成型(Revolve)
var profile = Curves.Circle.RotateX(0.25f.Turns());
var path = Curves.Helix(height: 3, revolutions: 3);
QuadGrid3D tube = profile.Sample(16).Sweep(path.GetTransforms(16), connectU: true, connectV: false);
TriangleMesh3D cylinder = Primitives.Cylinder(sides: 32, radius: 1, height: 3, segments: 1).Triangulate();
常用高层辅助:PlatonicSolids(TriangulatedCube/Icosahedron…)、Primitives.Cylinder(...)、Curves.Circle/Curves.Helix(...)(.Sample(n) 采样、.GetTransforms(n) 生成沿路径坐标系)。
Bounds3D(包围体):mesh.Bounds 提供 Min/Max;model.Meshes.Select(m => m.Bounds) 构建,实现 IAabbTreeQuery 的 struct 后用 tree.Traverse(ref query) 做高性能碰撞/拾取查询。| 场景 | API 示例 |
|---|---|
| 读取 PLY 网格 | PlyImporter.LoadMesh(path) |
| 写出 PLY | mesh.WritePly(path) |
| 导出 glTF/GLB | model.WriteGlb(path)(GltfExporter) |
| 导入 glTF | ModelRoot.Load(path)(Ara3D.IO.SharpGLTF) |
| BFAST/G3D | Ara3D.IO.BFAST / Ara3D.IO.G3D(数组序列化与几何交换) |
| STEP 解析 | Ara3D.IO.StepParser(ISO STEP 分词/解析) |
| VIM / GeoJSON | Ara3D.IO.VIM / Ara3D.IO.GeoJson(含 IMDF 室内地图) |
典型「格式转换器」流程:读 IFC/STEP/PLY → 变换/轻量化 → 写 glTF/GLB。
BIM 开放模式(BOS) 把 IFC/Revit 数据规约为列式 EAV(Entity-Attribute-Value)结构,便于查询与分析:
IBimData 聚合 entities(EntityIndex)、geometry(BimGeometry)、参数(Parameters)、关系(EntityRelation + RelationType:ContainedIn/Contains/HostedBy/Hosts/BoundedBy/AssignedTo/GroupedBy/AggregatedInto/ConnectedTo/FillsVoid/VoidsElement/TypeOf/HasType 等);IfcToBosConverter.Convert()(底层经 Ara3D.IfcLoader + 原生 web-ifc)把 IFC 转为 BOS;ParquetUtils(Parquet)、DuckDbUtils(DuckDB)、ExcelUtils(.xlsx)、DataTableExportUtils,可直接进数据湖/分析引擎。用途:把 Revit/IFC 模型导出为 BOS(Parquet)进 DuckDB/数据湖做批量分析与质检。
用 C# 脚本扩展 Studio:写一个实现特定接口的类,Studio 就把它变成可交互节点/命令,参数自动生成 UI。
public interface IScriptedComponent { FlowObject Eval(EvalContext context, FlowObject input); }
public interface IGenerator : IScriptedComponent { } // 无输入,纯生成
public interface IModifier : IScriptedComponent { } // 修改上游输入
public interface IExporter { void Export(FlowObject obj, string path); }
三种语义:IGenerator(凭空造)、IModifier(改造上游)、ILoader(从外部读),都归约到 IScriptedComponent.Eval。
节点之间传递 FlowObject——把内容、表现、属性、附件打包在一起:
public class FlowObject
{
public FlowObject WithContent(object content);
public FlowObject WithPresentation(PresentationData p);
public FlowObject WithAttributes(IReadOnlyList<FlowAttribute> a);
public FlowObject WithAttachment(FlowAttachment a);
}
public class TorusGenerator : IGenerator
{
// 用属性特性声明可调参数,Studio 自动生成滑块/输入框
public FlowObject Eval(EvalContext ctx, FlowObject input)
{
TriangleMesh3D mesh = /* 用 Primitives/Curves 生成参数化网格 */;
return input.WithContent((IModel3D)mesh);
}
}
常见范式:纯生成器(Generator)、修改器(Modifier)、加载器(Loader)、导出器(Exporter)、命令/工具(Command/Tool)。
IGenerator/IModifier 在 Studio 中生成楼梯、幕墙、屋架、管道等;RenderModelData 的 GPU 就绪缓冲区接入自研渲染器;Ara3D.SDK.Geometry(net8.0);需要文件 I/O、IFC、WPF → Ara3D.SDK/Ara3D.SDK.IO(net8.0-windows,仅 Windows x64)。AllowUnsafeBlocks:F8/Memory/StepParser 使用 unsafe 指针,.csproj 须设 <AllowUnsafeBlocks>true</AllowUnsafeBlocks>。1.6.1),生成代码时不要混用不同版本。Scale/Rotate/Translate/Deform 都返回新对象,务必接收返回值(var m2 = m.Scale(...)),不要期望原地修改。| 问题 | 解答 |
|---|---|
AllowUnsafeBlocks 报错 | F8/Memory/StepParser 使用 unsafe 指针,须在 .csproj 打开 <AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
找不到 web-ifc-library.dll | 使用 Ara3D.IfcLoader 时确保原生 DLL 复制到输出目录,且平台为 x64 Windows(勿用 AnyCPU 32 位) |
net8.0 引用了 Windows 专属包报 TFM 不兼容 | 把 TargetFramework 改为 net8.0-windows |
| 版本冲突 / API 不匹配 | 确保所有 Ara3D 包版本一致(同为 1.6.1) |
| Linux/macOS 想用 IFC/PLY | 这些是 net8.0-windows 目标,无法在非 Windows 直接运行;可仅用 Ara3D.SDK.Geometry 的跨平台能力 |
| 与 Xbim / OCCT 有何区别 | Xbim 专注 .NET BIM/IFC;OCCT 是 C++ 几何内核。Ara3D-SDK 强调高性能海量三维数据处理 + SIMD + BOS + Studio 插件的一体化 .NET 方案 |
docs/ 含工作流、包依赖图、发布流程;examples/Workshop 为入门课程)