dwg-import-export
本文回答:DWG 转换强依赖服务端:
IMPORTDWG走"uploadMap→openMap→drawingManager.openDrawing"三步;EXPORTDWG走"drawingManager.exportToDwg(...)",只返回服务端文件名/路径({status, path, filename, entityCount}),不含二进制,也不返回下载 URL。支持 DWG(2000-2018)/ DXF;标注可选导出为原生 CAD 标注。
一、IMPORTDWG(导入)
命令版
await Engine.editor.executerWithOp('IMPORTDWG');
API 版(完整流程)
import { DrawingManagerService, Service, MapOpenWay, openMapDarkStyle } from 'vjcad';
const drawingManager = new DrawingManagerService();
const service = drawingManager.getService();
// 1. 上传文件
const upload = await service.uploadMap(file);
if (upload.error) throw new Error(upload.error);
// 2. 服务端解析 DWG → webcad
const mapid = file.name.replace(/\.(dwg|dxf)$/i, '') + '_' + Date.now();
const open = await service.openMap({
mapid,
fileid: upload.fileid,
uploadname: file.name,
mapopenway: MapOpenWay.Memory,
style: openMapDarkStyle()
}, true);
if (open.error) throw new Error(open.error);
// 3. 拉取 webcad JSON 加载到编辑器
const draw = await drawingManager.openDrawing({
type: 'imports',
mapid: open.mapid,
version: open.version,
branch: 'main'
});
if (draw.success) {
const file2 = new File(
[draw.webcadJson],
'drawing.webcad',
{ type: 'application/json' }
);
await Engine.view.openDbDoc(file2, draw.webcadData);
Engine.currentDoc.serverSource = {
type: 'imports',
mapid: open.mapid,
version: open.version,
branchName: 'main',
lastPatchId: draw.latestPatchId || 'base'
};
await Engine.currentDoc.setOriginalJson(draw.webcadJson);
}
MCP 参考:vjcad/doc/file/file-operations.md、vjcad/example/file/07importdwg.js。
支持格式
- DWG:AutoCAD 2000-2018 版本
- DXF:图形交换格式
二、EXPORTDWG(导出)
命令版
await Engine.editor.executerWithOp('EXPORTDWG');
API 版
const currentJson = JSON.stringify(Engine.currentDoc.toDb());
const src = Engine.currentDoc.serverSource;
const result = await drawingManager.exportToDwg({
type: src.type,
webcadJson: currentJson,
mapid: src.mapid,
version: src.version,
branch: src.branchName,
cadVersion: '', // ''=自动 / '2018' / '2010' …
isZoomExtents: false, // 导出时是否缩放至全图
useCache: true,
unGroup: false, // 是否解散组
exportDimAsNative: false // 是否转成原生 CAD 标注
});
if (result.status) {
// 只返回服务端文件名/路径不含二进制;IExportWebcadResponse.downloadUrl 虽在 d.ts 声明但从不赋值
// 下载需按服务端路径拼 URL(参考 EXPORTDWG 命令 ExportToDwgCommand.performExport):
const url = `${SystemConstants.SERVICE_ROOT_URL}${downloadDir}/${result.filename}?token=${SystemConstants.ACCESS_TOKEN}`;
window.open(url, '_blank'); // downloadDir = 服务端下载目录(EXPORTDWG 对话框里由用户填写)
} else {
console.error(result.error);
}
MCP 参考:vjcad/doc/file/file-operations.md、vjcad/example/file/08exportdwg.js。
⚠️ 入口:
drawingManager/exportToDwg/toDb不是顶层导出——import { drawingManager }得到undefined。正确入口是new DrawingManagerService()(类已导出),Engine.drawingManager也不存在。EXPORTDWG命令弹export-dwg-options-dialog并 await 用户确认,不可脚本化。
IExportToDwgParams 表
| 参数 | 类型 | 说明 |
|---|---|---|
type |
'imports'|'designs' |
图纸类型 |
webcadJson |
string | 当前 webcad JSON |
mapid |
string | 图纸 ID(imports) |
version |
string | 版本(imports) |
designPath |
string | 设计图路径(designs) |
branch |
string | 分支 |
cadVersion |
string | CAD 版本(2000-2018) |
isZoomExtents |
boolean | 缩放至全图 |
useCache |
boolean | 是否缓存 |
unGroup |
boolean | 是否解散组 |
exportDimAsNative |
boolean | 标注转原生 |
三、imports vs designs 类型
| 类型 | 来源 | 导出方式 |
|---|---|---|
imports |
已上传的 DWG | 增量导出,保留原 DWG 格式细节 |
designs |
用户从空白创建 | 全新导出,不依赖原始文件 |
反例
- 没有服务端:导入 / 导出都不可用,只能
QSAVE下载.vcad(或手工导出.webcadJSON)。 cadVersion写错(如'2025',超出 2000-2018):服务端可能拒绝。unGroup: true后大量内嵌实体被打散,文件体积膨胀;按需选择。
参考(官方文档 MCP)
- 文档:
vjcad/doc/file/file-operations.md - 示例:
vjcad/example/file/07importdwg.js、08exportdwg.js