fix(cad): make FEXPORT default to single asset export

This commit is contained in:
WuYongJie 2026-05-11 20:23:00 +08:00
parent e2766b2cfb
commit 2c06163575
9 changed files with 128 additions and 71 deletions

View File

@ -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
/// <summary>
/// 主导出命令 - 导出板材 GLB + 五金件位置 JSON
/// </summary>
[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<string> GetEntityHandles(Database db, ObjectId[] ids)

View File

@ -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);
}
}
}

View File

@ -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 预览 ✓
辅助装配可用 ✓
```
## 开发

View File

@ -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" />
</Components>
@ -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

View File

@ -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.

View File

@ -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 {

View File

@ -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" />
</Components>

View File

@ -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 ""

View File

@ -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