Skip to content

Latest commit

 

History

History
181 lines (143 loc) · 6.24 KB

File metadata and controls

181 lines (143 loc) · 6.24 KB

Liuvis 项目 STL 导入功能实现总结

任务目标

为Liuvis项目的Design Studio增加导入STL文件的功能,支持直接导入STL文件在界面展示,并通过自然语言继续让LLM进行修改。

实现的功能

1. STL解析器 (StlImporter)

文件: src/Liuvis.Generation/Importers/StlImporter.cs

功能:

  • 支持ASCII和二进制STL格式解析
  • 提取顶点(vertices)、法线(normals)和三角形数量
  • 将STL数据转换为Model3D实体
  • 添加元数据(三角形数量、顶点数量、源格式)
  • 添加标签(imported, stl)

关键方法:

  • ImportAsync(Stream stream, string modelName): 主导入方法
  • ParseStlAsync(Stream stream, CancellationToken cancellationToken): 解析STL文件
  • IsBinaryStlAsync(Stream stream): 检测STL格式
  • ParseBinaryStlAsync(Stream stream, CancellationToken cancellationToken): 解析二进制STL
  • ParseAsciiStlAsync(Stream stream, CancellationToken cancellationToken): 解析ASCII STL

2. 文件上传API端点 (ImportController)

文件: src/Liuvis.Web/Controllers/ImportController.cs

端点:

  • POST /api/import/stl: 上传并导入STL文件

功能:

  • 接收STL文件上传
  • 验证文件扩展名
  • 调用StlImporter解析文件
  • 保存原始STL文件到存储
  • 保存模型元数据到数据库
  • 返回模型ID和文件URL

依赖:

  • StlImporter: STL解析器
  • IObjectStorageService: 文件存储服务
  • ModelRepository: 模型数据访问

3. 前端上传界面 (DesignStudio.razor)

文件: src/Liuvis.Web/Components/Pages/DesignStudio.razor

功能:

  • 添加"Import STL"按钮
  • 文件选择输入框(接受.stl文件)
  • 上传进度指示
  • 集成到现有的聊天界面
  • 显示导入结果

关键更改:

  • 添加了文件上传UI元素
  • 实现了UploadStlAsync方法处理文件上传
  • 使用JavaScript interop调用API
  • 更新ModelViewer组件以传递IsStl参数

4. 3D渲染支持 (three-module.js)

文件: src/Liuvis.Web/wwwroot/js/three-module.js

功能:

  • loadStlModel(stlUrl)函数:加载并在场景中显示STL文件
  • 使用STLLoader解析STL文件
  • 创建Phong材质网格
  • 自动调整相机位置以适应模型
  • 支持阴影

关键特性:

  • 验证几何体有效性
  • 移除之前的模型
  • 更新组件映射
  • 适合相机的边界框计算

5. 模型查看器更新 (ModelViewer.razor)

文件: src/Liuvis.Web/Components/ModelViewer.razor

功能:

  • 添加IsStl参数标识STL文件
  • 根据文件类型调用不同的加载函数
  • 支持GLB和STL两种格式

6. 状态管理 (DesignStudioState.cs)

文件: src/Liuvis.Web/Services/DesignStudioState.cs

更新:

  • 添加IsStl属性
  • Reset()方法中重置IsStl标志

技术实现细节

数据流

  1. 用户选择STL文件
  2. 前端通过JavaScript interop调用/api/import/stl API
  3. ImportController接收文件,调用StlImporter解析
  4. StlImporter返回Model3D对象
  5. 原始STL文件保存到存储(LocalStorageService)
  6. 模型元数据保存到数据库(ModelRepository)
  7. 返回模型ID和文件URL
  8. 前端更新状态,设置IsStl=true
  9. ModelViewer组件加载STL文件
  10. three-module.js中的loadStlModel函数渲染模型

关键设计决策

  1. 使用ModelRepository而不是IModelRepository: ModelRepository是具体实现类,包含CreateAsync等方法
  2. 使用UploadAsync而不是StoreAsync: IObjectStorageService接口定义的是UploadAsync方法
  3. 使用SetFilePath方法: Model3D的FilePath属性是只读的,必须通过SetFilePath方法设置
  4. 使用label-for而不是JavaScript点击: 避免ElementReference.Click()的问题
  5. 不分离组件: 第一阶段先整体渲染STL模型,将整个模型作为单个组件"MainBody"

编译状态

项目构建成功,没有编译错误。

测试建议

手动测试步骤

  1. 启动Liuvis.Web应用程序
  2. 导航到Design Studio页面
  3. 点击"Import STL"按钮
  4. 选择一个STL文件(可以使用项目根目录下的test-cube.stl)
  5. 验证文件上传成功
  6. 验证模型在3D预览中显示
  7. 验证聊天界面显示导入成功消息
  8. 尝试通过自然语言修改模型(例如:"改变颜色为红色")

测试用例

  1. ASCII STL文件: 上传ASCII格式的STL文件
  2. 二进制STL文件: 上传二进制格式的STL文件
  3. 大文件: 上传超过10MB的STL文件
  4. 无效文件: 上传非STL文件,验证错误处理
  5. 空文件: 上传空文件,验证错误处理

已知限制

第一阶段限制

  1. 不分离组件: STL文件作为单个组件导入,不识别多个部件
  2. 无组件列表: 界面中不显示组件树
  3. 基础渲染: 使用固定的青色材质,不支持自定义材质
  4. 无编辑功能: 不能通过界面编辑STL模型的几何形状

未来增强

  1. 组件分离: 自动识别STL中的多个组件/部件
  2. 组件树界面: 在左侧面板显示组件层次结构
  3. 组件选择: 点击组件高亮显示
  4. 组件编辑: 支持平移、旋转、缩放单个组件
  5. 材质编辑: 支持为每个组件设置不同材质
  6. 导出改进: 导出时保持组件结构

文件清单

新建文件

  1. src/Liuvis.Generation/Importers/StlImporter.cs - STL解析器
  2. src/Liuvis.Web/Controllers/ImportController.cs - 文件上传API
  3. test-cube.stl - 测试用STL文件(简单立方体)

修改文件

  1. src/Liuvis.Web/Components/Pages/DesignStudio.razor - 添加上传界面
  2. src/Liuvis.Web/Components/ModelViewer.razor - 支持STL加载
  3. src/Liuvis.Web/Services/DesignStudioState.cs - 添加IsStl属性
  4. src/Liuvis.Web/wwwroot/js/three-module.js - 添加STL加载函数

依赖和配置

NuGet包

  • Three.js (通过JavaScript加载)
  • STLLoader (Three.js插件)

配置

  • 文件大小限制: 100MB (在ImportController中配置)
  • 存储路径: ./data/models (在appsettings.json中配置)
  • 允许的文件类型: .stl

结论

第一阶段的基础STL导入功能已经实现完成。用户可以:

  • 通过Design Studio界面上传STL文件
  • 在3D预览中查看导入的模型
  • 通过聊天界面看到导入状态

下一步将实现组件分离和组件树界面,以支持多组件STL文件的编辑和修改。