跳至内容
返回

lib3mf 集成系列(一):编译与示例测试

发布于:  at  05:20 下午

背景

学习flutter有半个月了, 看Flutter实战看得看不下去了, 打算写点东西练练手. 又不想写基础的UI界面, 所以想试试Flutter FFI, 以及和安卓原生的交互, 再牵涉到一些OpenGL的渲染. 于是就有了此文. 本文是系列文章的一部分, 主要记录如何编译lib3mf, 以及基础用法. 为保证环境一致, 编译时基于9ada20e4287fec118a29d5643f5714ea68302e21 (master分支当时的最新提交)

3mf文件介绍

3MF(3D Manufacturing Format)是一种专为3D打印设计的开放式、基于XML的文档格式,旨在解决STL等传统格式信息缺失的问题。它能在一个压缩文件中完整描述模型几何形状、颜色、材质、支撑和打印参数,2025年已成为国际标准(ISO/IEC 25422:2025)。

lib3mf介绍

lib3mf 是一个开源的 C++ 库,用于读写 3MF 文件。它提供了 3MF 文件的完整实现,包括 3MF 核心规范以及所有相关的扩展。

准备工作

下载源码

git clone https://github.com/3MFConsortium/lib3mf.git
git submodule update

编译

mkdir build
cd build
cmake ..
make

成功编译后, 生成的文件位于build目录下, 包含lib3mf.2.dylib等依赖库.

编译SDK/EXample/CPP

lib3mf 的 C++ 示例程序涵盖了从基础几何体生成到高级扩展(如点阵、切片、加密)的应用场景。

直接编译会提示缺少头文件和库文件, 需要修复CMakeLists.txt文件.

修复CMakeLists.txt内路径错误

主要是路径错误, 直接编译报找不到lib3mf_implicit.hpp和lib3mf库找不到问题, 需要手动修复include_directorieslink_directories等路径. 后面我编译的是CPP目录下的Example, 所以路径修改如下:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Bindings/Cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../Autogenerated/Bindings/Cpp)

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Bin)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../build)

add_custom_command(TARGET ${MyTarget} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../../Bin/lib3mf.${LSUFFIX}" $<TARGET_FILE_DIR:${MyTarget}>/lib3mf${LSUFFIXOUT})

add_custom_command(TARGET ${MyTarget} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../../../build/lib3mf.${LSUFFIX}" $<TARGET_FILE_DIR:${MyTarget}>/lib3mf${LSUFFIXOUT})

再次编译

再次make得到可执行文件

❯ ls
CMakeCache.txt             Example_Components         Example_SecureCube         GenerateVS2017.bat         lib3mf.2.dylib
CMakeFiles                 Example_Converter          Example_Slice              GenerateVS2019.bat
CMakeLists.txt             Example_Cube               Example_TextureCube        Makefile
Example_BeamLattice        Example_ExtractInfo        GenerateMake.sh            Source
Example_ColorCube          Example_FillMeshWithGyroid GenerateVS2015.bat         cmake_install.cmake

运行Example_ColorCube得到了一个colorcube.3mf, 原来这是生成3mf文件的例子 使用Bambu Studio打开后预览模型 Color Cube Preview 发现不是立方体, 但是不知道为啥例子叫做Cube, 而且没有颜色. 为了验证颜色, 使用MeshLab打开正确识别到了颜色 Color Cube Preview

lib3mf 示例程序 (CPP) 运行报告

前面步骤编译出了所有的Example可执行文件, 索性在这里记录下所有的Example的功能, 以及在不同查看器中的表现.

1. 基础模型与转换

示例名称功能描述兼容性与备注预览图
Cube普通长方体模型最基础的几何体生成示例。
ColorCube彩色长方体演示如何为模型添加颜色属性。
Components对象复用特性生成多个不同位置的长方体,支持导出 STL/3MF。
Converter格式转换实现 3MF ↔ STL 的双向转换。-
ExtractInfo信息提取从 3MF 文件中读取并打印模型元数据。-

2. 复杂结构与兼容性分析

针对 3MF 高级扩展(Lattice)的专项测试:

示例名称核心原理查看器表现 (Bambu Studio/ MeshLab / 3mfViewer)预览图
BeamLattice基于“梁”单元(Beam Lattice)的框架。Bambu Studio打不开;MeshLab仅显轮廓;3mfViewer支持良好。
FillMeshGyroid数学公式生成的 Gyroid 陀螺面点阵。Bambu Studio/3mfViewer均无法打开。-

3MF 并非单一标准,它由 Core Spec 和多个 Extensions 组成, 不同切片软件可能会按需实现Extensions。


3. 功能扩展示例

为 Flutter FFI 做准备

在进入下一篇之前,我们需要确认编译出的动态库是否符合 FFI 调用要求。

检查导出符号

使用 nm -gU lib3mf.2.dylib 检查。lib3mf 提供了专门的 C-Wrapper,这对于 Flutter(仅能直接调用 C 风格接口)至关重要。

 nm -gU lib3mf.2.dylib
00000000001abe30 T _lib3mf_accessright_getconsumer
00000000001ac8ec T _lib3mf_accessright_getdigestmethod
00000000001ac54c T _lib3mf_accessright_getmgfalgorithm
00000000001ac1b4 T _lib3mf_accessright_getwrappingalgorithm
00000000001e09fc T _lib3mf_acquire
000000000016c3fc T _lib3mf_attachment_getpath
...

Handle 机制

lib3mf 使用句柄(Handle)管理对象,这意味着在 Flutter 侧我们需要维护一套指针映射,防止内存泄漏。

总结

本文完成了 lib3mf 的环境搭建与功能验证。虽然部分高级扩展在商用切片软件中兼容性不佳,但 lib3mf 强大的 C-API 为我们在 Flutter 中操作 3D 模型提供了坚实基础。


在以下平台分享此文章: