From 2c06163575a7b66dd4c298c60c74f9a28aa0e521 Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Mon, 11 May 2026 20:23:00 +0800 Subject: [PATCH] fix(cad): make FEXPORT default to single asset export --- autocad-plugin/FurnitureExporter/Commands.cs | 36 ++++++-- .../CommandRegistrationTests.cs | 42 +++++++++ autocad-plugin/README.md | 87 +++++++++---------- autocad-plugin/build-installer.ps1 | 14 +-- autocad-plugin/build.cmd | 3 +- autocad-plugin/build.ps1 | 3 +- .../PackageContents.xml | 4 +- autocad-plugin/installer/install.ps1 | 2 +- autocad-plugin/installer/使用说明.txt | 8 +- 9 files changed, 128 insertions(+), 71 deletions(-) create mode 100644 autocad-plugin/FurnitureExporter/FurnitureExporter.Tests/CommandRegistrationTests.cs diff --git a/autocad-plugin/FurnitureExporter/Commands.cs b/autocad-plugin/FurnitureExporter/Commands.cs index e28f128c..f43bfc95 100644 --- a/autocad-plugin/FurnitureExporter/Commands.cs +++ b/autocad-plugin/FurnitureExporter/Commands.cs @@ -30,12 +30,13 @@ public class FurnitureExporterApp : IExtensionApplication doc?.Editor.WriteMessage($"║ 家具导出插件 v{PluginVersion} 已加载 ║\n"); doc?.Editor.WriteMessage("║ ║\n"); doc?.Editor.WriteMessage("║ 命令: ║\n"); - doc?.Editor.WriteMessage("║ FEXPORT - 整套家具兼容导出 ║\n"); - doc?.Editor.WriteMessage("║ FEXPORTASSET - 单资产导出到资产中心 ║\n"); + doc?.Editor.WriteMessage("║ FEXPORT - 单资产导出到资产中心 ║\n"); + doc?.Editor.WriteMessage("║ FEXPORTASSET - 单资产导出别名 ║\n"); + doc?.Editor.WriteMessage("║ FEXPORTPRODUCT - 整套家具兼容导出 ║\n"); doc?.Editor.WriteMessage("║ FINFO - 查看选中实体信息 ║\n"); doc?.Editor.WriteMessage("║ ║\n"); doc?.Editor.WriteMessage($"║ v{PluginVersion} 新功能: ║\n"); - doc?.Editor.WriteMessage("║ · 新增资产中心单资产导出模式 ║\n"); + doc?.Editor.WriteMessage("║ · 默认进入资产中心单资产导出 ║\n"); doc?.Editor.WriteMessage("║ · 新增 assembly 装配语义导出层 ║\n"); doc?.Editor.WriteMessage("║ · 语义优先用孔位/五金/配合面推导 ║\n"); doc?.Editor.WriteMessage("║ · 安装顺序仍保留给 Web 端人工设定 ║\n"); @@ -372,7 +373,7 @@ public class Commands /// /// 主导出命令 - 导出板材 GLB + 五金件位置 JSON /// - [CommandMethod("FEXPORT")] + [CommandMethod("FEXPORTPRODUCT")] public void ExportFurniture() { var doc = AcApp.DocumentManager.MdiActiveDocument; @@ -414,7 +415,7 @@ public class Commands ed.WriteMessage(" 1. 输入命令 UNITS 打开单位设置\n"); ed.WriteMessage(" 2. 将 '插入时的缩放单位' 改为 '毫米'\n"); ed.WriteMessage(" 3. 点击确定\n"); - ed.WriteMessage(" 4. 重新运行 FEXPORT 命令\n"); + ed.WriteMessage(" 4. 重新运行 FEXPORTPRODUCT 命令\n"); ed.WriteMessage("\n"); // 询问是否继续(仅供高级用户) @@ -454,7 +455,7 @@ public class Commands panelIds = FilterSolids(panelIds, db); if (panelIds.Length == 0) { - ed.WriteMessage(" ⚠️ 无法恢复板材(可能图纸已变更/实体被删除)。已清除会话,请重新运行 FEXPORT。\n"); + ed.WriteMessage(" ⚠️ 无法恢复板材(可能图纸已变更/实体被删除)。已清除会话,请重新运行 FEXPORTPRODUCT。\n"); ExportSessionManager.Clear(docKey); return; } @@ -555,7 +556,7 @@ public class Commands ed.WriteMessage($" ✓ 已记录 {panelIds.Length} 个板材\n"); ed.WriteMessage("\n 你现在可以自由调整图层显示/冻结/隔离等操作。\n"); - ed.WriteMessage(" 调整完成后,再次运行 FEXPORT 继续第 2 步(选五金并导出)。\n"); + ed.WriteMessage(" 调整完成后,再次运行 FEXPORTPRODUCT 继续第 2 步(选五金并导出)。\n"); var proceedOpt = new PromptKeywordOptions( "\n是否现在直接继续第 2 步? [继续(C)/稍后(R)]", @@ -567,7 +568,7 @@ public class Commands if (proceedResult.Status != PromptStatus.OK || proceedResult.StringResult != "Continue") { - ed.WriteMessage("\n已暂停导出。提示:再次运行 FEXPORT 继续;运行 FEXPORTRESET 可清除暂存。\n"); + ed.WriteMessage("\n已暂停导出。提示:再次运行 FEXPORTPRODUCT 继续;运行 FEXPORTRESET 可清除暂存。\n"); return; } } @@ -857,8 +858,25 @@ public class Commands } } + [CommandMethod("FEXPORTBUNDLE")] + public void ExportFurnitureBundle() + { + ExportFurniture(); + } + + [CommandMethod("FEXPORT")] + public void ExportAssetDefault() + { + ExportSingleAssetCore(); + } + [CommandMethod("FEXPORTASSET")] public void ExportSingleAsset() + { + ExportSingleAssetCore(); + } + + private void ExportSingleAssetCore() { var doc = AcApp.DocumentManager.MdiActiveDocument; if (doc == null) @@ -1116,7 +1134,7 @@ public class Commands var ed = doc.Editor; var docKey = string.IsNullOrWhiteSpace(doc.Name) ? "Untitled" : doc.Name; ExportSessionManager.Clear(docKey); - ed.WriteMessage("\n已清除 FEXPORT 暂存会话。请重新运行 FEXPORT。\n"); + ed.WriteMessage("\n已清除整套兼容导出暂存会话。请重新运行 FEXPORTPRODUCT。\n"); } private static List GetEntityHandles(Database db, ObjectId[] ids) diff --git a/autocad-plugin/FurnitureExporter/FurnitureExporter.Tests/CommandRegistrationTests.cs b/autocad-plugin/FurnitureExporter/FurnitureExporter.Tests/CommandRegistrationTests.cs new file mode 100644 index 00000000..7d4f0be9 --- /dev/null +++ b/autocad-plugin/FurnitureExporter/FurnitureExporter.Tests/CommandRegistrationTests.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; + +namespace FurnitureExporter.Tests +{ + public class CommandRegistrationTests + { + [Fact] + public void Fexport_DefaultsToSingleAssetExport() + { + var source = ReadCommandsSource(); + + Assert.Matches(CommandMethodPattern("FEXPORT", "ExportAssetDefault"), source); + Assert.Matches(CommandMethodPattern("FEXPORTASSET", "ExportSingleAsset"), source); + Assert.DoesNotMatch(CommandMethodPattern("FEXPORT", "ExportFurniture"), source); + } + + [Fact] + public void LegacyProductBundleExport_UsesExplicitCompatibilityCommands() + { + var source = ReadCommandsSource(); + + Assert.Matches(CommandMethodPattern("FEXPORTPRODUCT", "ExportFurniture"), source); + Assert.Matches(CommandMethodPattern("FEXPORTBUNDLE", "ExportFurnitureBundle"), source); + } + + private static string ReadCommandsSource() + { + var path = Path.GetFullPath( + Path.Combine(AppContext.BaseDirectory, @"..\..\..\..\Commands.cs")); + return File.ReadAllText(path); + } + + private static Regex CommandMethodPattern(string commandName, string methodName) + { + return new Regex( + $@"\[CommandMethod\(""{Regex.Escape(commandName)}""\)\]\s+public\s+void\s+{Regex.Escape(methodName)}\s*\(", + RegexOptions.Multiline); + } + } +} diff --git a/autocad-plugin/README.md b/autocad-plugin/README.md index d73a8737..a9df00e1 100644 --- a/autocad-plugin/README.md +++ b/autocad-plugin/README.md @@ -1,13 +1,13 @@ # AutoCAD 家具导出插件 -用于 AutoCAD 2024 的家具 3D 模型导出插件。导出板材模型和五金件安装位置,用于 Web 端 3D 展示和安装视频生成。 +用于 AutoCAD 2024 的家具 3D 模型导出插件。当前主流程是按资产中心口径导出单板材、单组件或单五金件,用于后续辅助装配和规格款入库。 ## 功能特点 -- **只导出板材模型** - 五金件使用位置引用,文件体积小(1-3MB vs 30-50MB) -- **自动分组五金件** - 按几何特征自动识别相同类型的五金件 -- **精确位置记录** - 记录每个五金件的安装位置和旋转角度 -- **服务端自动匹配** - 上传后自动匹配五金件库 +- **单资产导出** - `FEXPORT` 默认导出单板材、单组件或单五金件 +- **板材语义保留** - 导出孔位、孔组、吸附图样和吸附面,供辅助装配使用 +- **五金规格提取** - 单五金模式保留几何签名、图层类型和实例信息 +- **整套兼容保留** - 旧整套家具导出迁移到 `FEXPORTPRODUCT` ## 系统要求 @@ -20,7 +20,7 @@ ### 方法 1:手动安装发版包(推荐给产品/实施) 1. 完全关闭 AutoCAD 2024 -2. 解压 `dist/家具导出插件-v2.3.1-一键安装版.zip` +2. 解压 `dist/家具导出插件-v2.6.0-一键安装版.zip` 3. 将整个 `FurnitureExporter.bundle` 文件夹复制到: ```text @@ -39,7 +39,7 @@ ### 方法 2:一键安装 -双击 `dist/家具导出插件-v2.3.1-一键安装版/安装.bat` +双击 `dist/家具导出插件-v2.6.0-一键安装版/安装.bat` 脚本会自动: 1. 复制插件到 `%AppData%\Autodesk\ApplicationPlugins\FurnitureExporter.bundle` @@ -90,7 +90,7 @@ dotnet build -c Release ## 使用方法 -### FEXPORT - 导出家具模型 +### FEXPORT - 导出单资产到资产中心 ``` 命令: FEXPORT @@ -98,13 +98,21 @@ dotnet build -c Release **操作步骤:** -1. **选择板材** - 框选所有板材实体,按 Enter 确认 -2. **选择五金件** - 框选所有五金件,按 Enter 确认(可跳过) -3. **保存文件** - 选择保存位置 +1. **选择资产类型** - 板材 / 组件 / 五金 +2. **选择实体** - 框选该单资产包含的 3D Solid 或图块,按 Enter 确认 +3. **保存文件** - 选择 ZIP 保存位置 -**输出文件:** `xxx_export.zip`,包含: -- `model.glb` - 板材 3D 模型 -- `hardware.json` - 五金件位置数据 +**输出文件:** `xxx_board_asset.zip` / `xxx_component_asset.zip` / `xxx_hardware_asset.zip`,包含: +- `model.obj` - 单资产模型 +- `hardware.json` - 单资产结构化数据,包含 `exportMode: "single_asset"` 与 `assetTypeHint` + +### FEXPORTPRODUCT - 整套家具兼容导出 + +``` +命令: FEXPORTPRODUCT +``` + +仅用于旧产品链路兼容。新资产中心和辅助装配测试请优先使用 `FEXPORT`。 ### FINFO - 查看实体信息 @@ -120,36 +128,19 @@ dotnet build -c Release ```json { - "version": "1.0", - "exportedAt": "2024-01-15T10:30:00Z", - "sourceFile": "衣柜.dwg", + "version": "2.6", + "exportedAt": "2026-05-11T10:30:00Z", + "sourceFile": "桌腿.dwg", "software": "AutoCAD 2024", - "pluginVersion": "1.0.0", - "modelFile": "model.glb", - "panelCount": 12, - "hardwareTypes": [ - { - "typeId": "type_000", - "signature": { - "width": 35.0, - "height": 12.0, - "depth": 12.0, - "volume": 4032.5 - }, - "instances": [ - { - "position": { "x": 100.0, "y": 50.0, "z": 18.0 }, - "rotation": { "x": 0, "y": 0, "z": 1.5708 }, - "sourceLayer": "五金件" - }, - { - "position": { "x": 100.0, "y": 150.0, "z": 18.0 }, - "rotation": { "x": 0, "y": 0, "z": 1.5708 }, - "sourceLayer": "五金件" - } - ] - } - ] + "pluginVersion": "2.6.0", + "modelFile": "model.obj", + "exportMode": "single_asset", + "assetTypeHint": "COMPONENT", + "sourceEntityCount": 1, + "panelCount": 1, + "snapPatterns": [], + "snapSurfaces": [], + "hardwareTypes": [] } ``` @@ -160,17 +151,17 @@ dotnet build -c Release ─────── ────── 1. 打开 DWG 文件 2. FEXPORT -3. 框选板材 ────────────────→ -4. 框选五金件 ──────────────→ -5. 保存 ZIP ────────────────→ 上传 ZIP +3. 选择资产类型(板材/组件/五金) +4. 框选单个资产实体 ───────→ +5. 保存 ZIP ────────────────→ 上传到资产中心 ↓ 自动解析 ↓ - 匹配五金件库 + 创建/更新资产族规格款 ↓ 保存到数据库 ↓ - 3D 预览 ✓ + 辅助装配可用 ✓ ``` ## 开发 diff --git a/autocad-plugin/build-installer.ps1 b/autocad-plugin/build-installer.ps1 index 8bb9be84..9f07084f 100644 --- a/autocad-plugin/build-installer.ps1 +++ b/autocad-plugin/build-installer.ps1 @@ -90,7 +90,7 @@ $PackageXml = @" SchemaVersion="1.0" AutodeskProduct="AutoCAD" Name="$PluginName" - Description="家具导出插件 v$Version - 支持整套兼容导出与资产中心单资产导出" + Description="家具导出插件 v$Version - 默认资产中心单资产导出,保留整套兼容导出" Author="Furniture 3D System" AppVersion="$Version" FriendlyVersion="$Version" @@ -119,7 +119,7 @@ $PackageXml = @" AppName="$PluginName" Version="$Version" ModuleName="./Contents/$PluginName.dll" - AppDescription="家具导出插件 - 支持整套兼容导出与资产中心单资产导出" + AppDescription="家具导出插件 - 默认资产中心单资产导出,保留整套兼容导出" LoadOnAutoCADStartup="True" AppType="Net" /> @@ -306,7 +306,7 @@ New-ItemProperty -Path $appKey -Name "DESCRIPTION" -PropertyType String -Value " Write-Step "[3/3] 完成" Write-Host "" Write-Host "安装完成。请完全关闭 AutoCAD 后重新启动。" -ForegroundColor Green -Write-Host "启动后命令行输入:FEXPORTASSET(单资产)或 FEXPORT(整套兼容)" -ForegroundColor Green +Write-Host "启动后命令行输入:FEXPORT(单资产)或 FEXPORTPRODUCT(整套兼容)" -ForegroundColor Green Write-Host "" '@ Write-TextFileUtf8Bom -Path (Join-Path $InstallerDir "install.ps1") -Content $InstallPs1 @@ -480,8 +480,10 @@ $Readme = @" 使用方法 ─────────────────────────────────────────────────────────────────────── 打开 AutoCAD 后,命令行输入: - FEXPORTASSET -> 单资产导出到资产中心(板材 / 组件 / 五金) - FEXPORT -> 整套家具兼容导出 + FEXPORT -> 单资产导出到资产中心(板材 / 组件 / 五金) + FEXPORTASSET -> 单资产导出别名 + FEXPORTPRODUCT -> 整套家具兼容导出 + FEXPORTBUNDLE -> 整套家具兼容导出别名 FINFO -> 查看实体信息 安装脚本做了什么(便于 IT/排查) @@ -495,7 +497,7 @@ $Readme = @" 常见问题 ─────────────────────────────────────────────────────────────────────── -Q: 提示“未知命令 FEXPORTASSET / FEXPORT” +Q: 提示“未知命令 FEXPORT / FEXPORTPRODUCT” A: 1) 确认已重启 AutoCAD(关闭再打开) 2) 确认插件目录存在: %AppData%\Autodesk\ApplicationPlugins\FurnitureExporter.bundle\Contents\FurnitureExporter.dll diff --git a/autocad-plugin/build.cmd b/autocad-plugin/build.cmd index 7503da49..ba11b1c5 100644 --- a/autocad-plugin/build.cmd +++ b/autocad-plugin/build.cmd @@ -75,7 +75,8 @@ if %ERRORLEVEL% EQU 0 ( echo 1. 打开 AutoCAD 2024 echo 2. 输入命令: NETLOAD echo 3. 选择上述 DLL 文件 - echo 4. 使用命令: FEXPORT 导出模型 + echo 4. 使用命令: FEXPORT 导出单资产模型 + echo 旧整套兼容导出: FEXPORTPRODUCT echo. ) else ( echo. diff --git a/autocad-plugin/build.ps1 b/autocad-plugin/build.ps1 index d3aba144..7520958e 100644 --- a/autocad-plugin/build.ps1 +++ b/autocad-plugin/build.ps1 @@ -84,7 +84,8 @@ try { Write-Host " 1. 打开 AutoCAD 2024" Write-Host " 2. 输入命令: NETLOAD" Write-Host " 3. 选择上述 DLL 文件" - Write-Host " 4. 使用命令: FEXPORT 导出模型" + Write-Host " 4. 使用命令: FEXPORT 导出单资产模型" + Write-Host " 旧整套兼容导出: FEXPORTPRODUCT" Write-Host "" } else { diff --git a/autocad-plugin/installer/FurnitureExporter.bundle/PackageContents.xml b/autocad-plugin/installer/FurnitureExporter.bundle/PackageContents.xml index 2bdec4dd..3e479416 100644 --- a/autocad-plugin/installer/FurnitureExporter.bundle/PackageContents.xml +++ b/autocad-plugin/installer/FurnitureExporter.bundle/PackageContents.xml @@ -3,7 +3,7 @@ SchemaVersion="1.0" AutodeskProduct="AutoCAD" Name="FurnitureExporter" - Description="家具导出插件 v2.6.0 - 支持整套兼容导出与资产中心单资产导出" + Description="家具导出插件 v2.6.0 - 默认资产中心单资产导出,保留整套兼容导出" Author="Furniture 3D System" AppVersion="2.6.0" FriendlyVersion="2.6.0" @@ -32,7 +32,7 @@ AppName="FurnitureExporter" Version="2.6.0" ModuleName="./Contents/FurnitureExporter.dll" - AppDescription="家具导出插件 - 支持整套兼容导出与资产中心单资产导出" + AppDescription="家具导出插件 - 默认资产中心单资产导出,保留整套兼容导出" LoadOnAutoCADStartup="True" AppType="Net" /> diff --git a/autocad-plugin/installer/install.ps1 b/autocad-plugin/installer/install.ps1 index 4c1cc4c4..91bf0492 100644 --- a/autocad-plugin/installer/install.ps1 +++ b/autocad-plugin/installer/install.ps1 @@ -174,5 +174,5 @@ New-ItemProperty -Path $appKey -Name "DESCRIPTION" -PropertyType String -Value " Write-Step "[3/3] 完成" Write-Host "" Write-Host "安装完成。请完全关闭 AutoCAD 后重新启动。" -ForegroundColor Green -Write-Host "启动后命令行输入:FEXPORTASSET(单资产)或 FEXPORT(整套兼容)" -ForegroundColor Green +Write-Host "启动后命令行输入:FEXPORT(单资产)或 FEXPORTPRODUCT(整套兼容)" -ForegroundColor Green Write-Host "" \ No newline at end of file diff --git a/autocad-plugin/installer/使用说明.txt b/autocad-plugin/installer/使用说明.txt index e2a66d95..06ac4c6e 100644 --- a/autocad-plugin/installer/使用说明.txt +++ b/autocad-plugin/installer/使用说明.txt @@ -16,8 +16,10 @@ 使用方法 ─────────────────────────────────────────────────────────────────────── 打开 AutoCAD 后,命令行输入: - FEXPORTASSET -> 单资产导出到资产中心(板材 / 组件 / 五金) - FEXPORT -> 整套家具兼容导出 + FEXPORT -> 单资产导出到资产中心(板材 / 组件 / 五金) + FEXPORTASSET -> 单资产导出别名 + FEXPORTPRODUCT -> 整套家具兼容导出 + FEXPORTBUNDLE -> 整套家具兼容导出别名 FINFO -> 查看实体信息 安装脚本做了什么(便于 IT/排查) @@ -31,7 +33,7 @@ 常见问题 ─────────────────────────────────────────────────────────────────────── -Q: 提示“未知命令 FEXPORTASSET / FEXPORT” +Q: 提示“未知命令 FEXPORT / FEXPORTPRODUCT” A: 1) 确认已重启 AutoCAD(关闭再打开) 2) 确认插件目录存在: %AppData%\Autodesk\ApplicationPlugins\FurnitureExporter.bundle\Contents\FurnitureExporter.dll