为Liuvis项目的Design Studio增加导入STL文件的功能,支持直接导入STL文件在界面展示,并通过自然语言继续让LLM进行修改。
文件: 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): 解析二进制STLParseAsciiStlAsync(Stream stream, CancellationToken cancellationToken): 解析ASCII STL
文件: src/Liuvis.Web/Controllers/ImportController.cs
端点:
POST /api/import/stl: 上传并导入STL文件
功能:
- 接收STL文件上传
- 验证文件扩展名
- 调用StlImporter解析文件
- 保存原始STL文件到存储
- 保存模型元数据到数据库
- 返回模型ID和文件URL
依赖:
StlImporter: STL解析器IObjectStorageService: 文件存储服务ModelRepository: 模型数据访问
文件: src/Liuvis.Web/Components/Pages/DesignStudio.razor
功能:
- 添加"Import STL"按钮
- 文件选择输入框(接受.stl文件)
- 上传进度指示
- 集成到现有的聊天界面
- 显示导入结果
关键更改:
- 添加了文件上传UI元素
- 实现了
UploadStlAsync方法处理文件上传 - 使用JavaScript interop调用API
- 更新
ModelViewer组件以传递IsStl参数
文件: src/Liuvis.Web/wwwroot/js/three-module.js
功能:
loadStlModel(stlUrl)函数:加载并在场景中显示STL文件- 使用STLLoader解析STL文件
- 创建Phong材质网格
- 自动调整相机位置以适应模型
- 支持阴影
关键特性:
- 验证几何体有效性
- 移除之前的模型
- 更新组件映射
- 适合相机的边界框计算
文件: src/Liuvis.Web/Components/ModelViewer.razor
功能:
- 添加
IsStl参数标识STL文件 - 根据文件类型调用不同的加载函数
- 支持GLB和STL两种格式
文件: src/Liuvis.Web/Services/DesignStudioState.cs
更新:
- 添加
IsStl属性 - 在
Reset()方法中重置IsStl标志
- 用户选择STL文件
- 前端通过JavaScript interop调用
/api/import/stlAPI - ImportController接收文件,调用StlImporter解析
- StlImporter返回Model3D对象
- 原始STL文件保存到存储(LocalStorageService)
- 模型元数据保存到数据库(ModelRepository)
- 返回模型ID和文件URL
- 前端更新状态,设置IsStl=true
- ModelViewer组件加载STL文件
- three-module.js中的loadStlModel函数渲染模型
- 使用ModelRepository而不是IModelRepository: ModelRepository是具体实现类,包含CreateAsync等方法
- 使用UploadAsync而不是StoreAsync: IObjectStorageService接口定义的是UploadAsync方法
- 使用SetFilePath方法: Model3D的FilePath属性是只读的,必须通过SetFilePath方法设置
- 使用label-for而不是JavaScript点击: 避免ElementReference.Click()的问题
- 不分离组件: 第一阶段先整体渲染STL模型,将整个模型作为单个组件"MainBody"
✅ 项目构建成功,没有编译错误。
- 启动Liuvis.Web应用程序
- 导航到Design Studio页面
- 点击"Import STL"按钮
- 选择一个STL文件(可以使用项目根目录下的test-cube.stl)
- 验证文件上传成功
- 验证模型在3D预览中显示
- 验证聊天界面显示导入成功消息
- 尝试通过自然语言修改模型(例如:"改变颜色为红色")
- ASCII STL文件: 上传ASCII格式的STL文件
- 二进制STL文件: 上传二进制格式的STL文件
- 大文件: 上传超过10MB的STL文件
- 无效文件: 上传非STL文件,验证错误处理
- 空文件: 上传空文件,验证错误处理
- 不分离组件: STL文件作为单个组件导入,不识别多个部件
- 无组件列表: 界面中不显示组件树
- 基础渲染: 使用固定的青色材质,不支持自定义材质
- 无编辑功能: 不能通过界面编辑STL模型的几何形状
- 组件分离: 自动识别STL中的多个组件/部件
- 组件树界面: 在左侧面板显示组件层次结构
- 组件选择: 点击组件高亮显示
- 组件编辑: 支持平移、旋转、缩放单个组件
- 材质编辑: 支持为每个组件设置不同材质
- 导出改进: 导出时保持组件结构
src/Liuvis.Generation/Importers/StlImporter.cs- STL解析器src/Liuvis.Web/Controllers/ImportController.cs- 文件上传APItest-cube.stl- 测试用STL文件(简单立方体)
src/Liuvis.Web/Components/Pages/DesignStudio.razor- 添加上传界面src/Liuvis.Web/Components/ModelViewer.razor- 支持STL加载src/Liuvis.Web/Services/DesignStudioState.cs- 添加IsStl属性src/Liuvis.Web/wwwroot/js/three-module.js- 添加STL加载函数
Three.js(通过JavaScript加载)STLLoader(Three.js插件)
- 文件大小限制: 100MB (在ImportController中配置)
- 存储路径:
./data/models(在appsettings.json中配置) - 允许的文件类型: .stl
第一阶段的基础STL导入功能已经实现完成。用户可以:
- 通过Design Studio界面上传STL文件
- 在3D预览中查看导入的模型
- 通过聊天界面看到导入状态
下一步将实现组件分离和组件树界面,以支持多组件STL文件的编辑和修改。