唯杰地图 logo唯杰地图
VJMAP
EN

dwg-import-export

vjcad/references/file/dwg-import-export.md 4.9 KB141 行
原文

本文回答: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(或手工导出 .webcad JSON)。
  • cadVersion 写错(如 '2025',超出 2000-2018):服务端可能拒绝。
  • unGroup: true 后大量内嵌实体被打散,文件体积膨胀;按需选择。

参考(官方文档 MCP)

  • 文档:vjcad/doc/file/file-operations.md
  • 示例:vjcad/example/file/07importdwg.js、08exportdwg.js