> **本文回答**：从 vjmap 后台导出 DWG / DXF 文件。

## 一、接口

```js
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` 的映射：

```jsonc
// system.token_router_static:
"_downmapfiles::./data/mapfiles"   // URL 前缀 _downmapfiles → mapfiles 目录
```

拼 URL 下载（前缀以你部署的 config 为准）：

```js
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° 后导出。

```js
// 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` 过滤实体生成新图，再导出：

```js
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 回写）

```js
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 })` 拼 URL `window.open`。
- **GeoJSON**：`conditionQueryFeature({ includegeom: true, realgeom: true, toMapCoordinate: true })`（`fields` 若指定须含 `geojson`）再自行序列化，见 [export-formats](export-formats.md) §三。
- **ForgeViewer**：参见官方指南 [https://vjmap.com/guide/forgeviewer.html](https://vjmap.com/guide/forgeviewer.html)。

## 八、常见坑

1. **试用版下载 403** → 正式版才能下载。
2. **导出大图超时** → nginx `proxy_read_timeout` / 后端命令超时需要加长。
3. **导出后的 DWG 原生 AutoCAD 打不开** → 导出是 DXF（ASCII），用 "另存为 DWG" 即可。或要求后端使用 DWG 输出。
4. **含自定义块导出**：部分实体（vjmap 自定义）导出时会转成标准 AcDb 实体。
