export-dwg
本文回答:从 vjmap 后台导出 DWG / DXF 文件。
一、接口
const result = await svc.execCommand(
"exportDxf",
{}, // 参数
mapid,
version,
true // useGet:true 走 GET,false/省略走 POST
);
if (result.error) throw new Error(result.error);
// result = { status: true, fileid: "原图名_.dxf" }
// ⚠️ 与 exportPdf 不同:exportDxf 不返回 path,只返回 fileid
// 文件写在服务端 mapfiles 目录(Util::GetMapFilesPath)
二、下载
DXF 文件落在服务端 data/mapfiles/ 目录,需走配置的静态下载路由取回。出厂 config.json 的映射:
// system.token_router_static:
"_downmapfiles::./data/mapfiles" // URL 前缀 _downmapfiles → mapfiles 目录
拼 URL 下载(前缀以你部署的 config 为准):
const url = svc.baseUrl() + "_downmapfiles/" + result.fileid + "?token=" + svc.accessToken;
window.open(url);
要拿内容:svc.httpGet(url, undefined, { raw: true }) 拿文本(第 2 参是 query 参数,不是请求配置;不加 raw:true 会把响应体当 JSON 解析而失败,结果在返回对象的 .data),要 blob 直接用 fetch(url)。
对比:
exportPdf返回的是{status, path: "download/xxx.pdf"}(文件在data/download/,根静态路由/download),所以 PDF 可以svc.baseUrl() + result.path + "?token=...",DXF 不行。/download与_downmapfiles都注册在 JWT 鉴权之后,URL 必须带?token=(否则 403)。
三、试用版限制
试用版由于数据安全,不能下载 dwg 或 dxf图,只能在线预览。正式版可以。
正式版:需要在后端
config.json开启下载许可。
四、先变换再导出
例:旋转 90° 后导出。
// 1) 用 composeNewMap 生成新图(四参数 rotate)
const composed = await svc.composeNewMap({
mapid,
version,
fourParameter: [0, 0, 1, -Math.PI / 2]
});
// 2) 绑定到临时 mapid
const tempId = vjmap.getTempMapId(5);
const upd = await svc.updateMap({
mapid: tempId,
fileid: composed.fileid,
mapopenway: vjmap.MapOpenWay.Memory,
style: { backcolor: 0 }
});
// 3) 导出(exportDxf 返回 fileid,按第二节的下载路由拼 URL)
const exp = await svc.execCommand("exportDxf", {}, tempId, upd.version, true);
window.open(svc.baseUrl() + "_downmapfiles/" + exp.fileid + "?token=" + svc.accessToken);
五、仅导出指定图层
⚠️ exportDxf 写出的是整个图形数据库,style.layeron/layeroff 只控制显示,不会过滤导出内容。要真正只导出某些图层,先用 composeNewMap 的 layers 过滤实体生成新图,再导出:
const part = await svc.composeNewMap({ mapid, version, layers: ["图层A", "图层B"] }); // 不在列表里的图层实体被删除
const tempId = vjmap.getTempMapId(5);
const upd = await svc.updateMap({
mapid: tempId,
fileid: part.fileid,
mapopenway: vjmap.MapOpenWay.Memory
});
const exp = await svc.execCommand("exportDxf", {}, tempId, upd.version, true);
六、vjmapext 绘制后导出(mapdata 回写)
import { MapCadLayer } from "vjmapext";
const cad = new MapCadLayer();
map.addControl(cad);
cad.createUI({ theme: "dark" });
// 绘制 / 修改
cad.addEntity(...);
// 回写后端:exportDwg 内部构造 DbDocument → service.updateMap 生成新图
const res = await cad.exportDwg({ newMapId: "my_new_map" }); // 返回 {mapid, version, ...}
// 也可用 svc.execCommand 直接导出既有图为 DXF
const exp = await svc.execCommand("exportDxf", {}, mapid);
exportDwg 默认生成新 mapid(newMapId 未传时用 vjmap.getTempMapId() 临时图);对新图 openMap/exportDxf 即可看到叠加的实体。
七、其他导出格式
- PDF:
svc.execCommand("exportPdf", pdfParam, mapid, version, true),支持 DPI / 纸张 / 边距。 - PNG:走
svc.wmsTileUrl({ width, height, bbox, transparent, backgroundColor })拼 URLwindow.open。 - GeoJSON:
conditionQueryFeature({ includegeom: true, realgeom: true, toMapCoordinate: true })(fields若指定须含geojson)再自行序列化,见 export-formats §三。 - ForgeViewer:参见官方指南 https://vjmap.com/guide/forgeviewer.html。
八、常见坑
- 试用版下载 403 → 正式版才能下载。
- 导出大图超时 → nginx
proxy_read_timeout/ 后端命令超时需要加长。 - 导出后的 DWG 原生 AutoCAD 打不开 → 导出是 DXF(ASCII),用 "另存为 DWG" 即可。或要求后端使用 DWG 输出。
- 含自定义块导出:部分实体(vjmap 自定义)导出时会转成标准 AcDb 实体。