唯杰地图 logo唯杰地图
VJMAP
EN

document-space

vjcad/references/core/document-space.md 4.5 KB113 行
原文

本文回答:Engine.currentDoc 是当前 CadDocument,包含 layers / blocks / layouts / textStyles / dimensionStyles / linetypeDefinitions;它的 currentSpace(也作 Engine.currentSpace)是当前空间(模型空间 / 图纸空间),items 是所有实体,addEntities / erase 是空间级操作。

一、文档结构

引自 vjcad/doc/guide/architecture.md:

class CadDocument {
  name: string;
  path: string;            // 文件路径(字段名是 path,不是 filePath)
  fileByte: any;
  isNewDocument: boolean;
  isReadOnly: boolean;
  DBMOD: number;           // 修改标记位
  STATE: any;

  layers: Layers;
  blocks: Blocks;
  layouts: Layouts;
  textStyles: TextStyles;
  dimensionStyles: DimStyles;   // 字段名是 dimensionStyles,不是 dimStyles
  images: Images;
  plotStyles: PlotStyles;
  linetypeDefinitions: any;     // 线型定义表
  serverSource?: any;           // 服务端来源信息(见 §五)

  // ⚠️ CadDocument 没有 save()/load()/newDocument() 方法,见 §四
}

MCP 参考:vjcad/doc/guide/architecture.md。

二、当前空间访问

// 文档与空间
const doc = Engine.currentDoc;
const space = Engine.currentSpace;     // === doc.currentSpace
const cur  = doc.CLAYER;               // 当前图层

// 所有实体(含已删除!erase 是软删 isAlive=false,仍留在 items 里供 undo 恢复)
const allEntities = space.items;
const aliveOnly   = space.aliveItems;  // items.filter(e => e.isAlive),只含存活实体

// 空间级操作
space.erase(entitiesArray);            // 删除(注意自己处理 undo)
space.addEntities(entitiesArray);     // 只入库 + 派发 EntitiesAdded:不记撤销、不刷新可选实体列表(新实体暂不可点选)

currentSpace.addEntities 是底层入库:期间单实体 EntityAdded 被暂停丢弃,只发一次 EntitiesAdded,不记 undo、不调 refreshRemain。业务代码用 Engine.addEntities(arr)(逐个 pcanvas.addEntity 绘制 + 记一条撤销 + 刷新可选列表)。

MCP 参考:vjcad/doc/command/api-reference.md。

三、文档级 API(图层 / 块 / 文字样式...)

const doc = Engine.currentDoc;

// 图层
doc.layers.has('我的图层');
doc.layers.add('我的图层', { color: 3, lineType: 'CONTINUOUS', layerOn: true, frozen: false });

// 文字样式
const ts = new TextStyle();
ts.name = '楷体样式';
ts.fontFileName = 'simkai';
doc.textStyles.add(ts);

// 遍历所有文字样式
doc.textStyles.items.forEach(s => {
  console.log(s.name, s.fontFileName, s.widthFactor, s.obliqueAngle);
});

MCP 参考:vjcad/doc/guide/quick-start.md(图层)、vjcad/example/entity/text/04fonts.js(文字样式)。

四、文档级保存 / 加载

// CadDocument 无 save/load/newDocument 方法,真实路径:
await drawingManager.saveDrawing({ /* ISaveDrawingParams */ });  // 保存
await drawingManager.openDrawing({ /* IOpenDrawingParams */ });  // 打开
Engine.view.newDocument();                                       // 新建

实际工程多走 DrawingManagerService.openDrawing(...) + Engine.view.openDbDoc(...),详见 file/server。

五、Engine.currentDoc.serverSource(服务端来源信息)

打开服务端图纸后建议在 Engine.currentDoc.serverSource 上保留:

Engine.currentDoc.serverSource = {
  type: 'imports',
  mapid: env.exampleMapId,
  version: 'v1',
  branchName: 'main',
  lastPatchId: openResult.latestPatchId || 'base'
};

之后保存命令可基于 serverSource 直接 QSAVE。Viewer 模式下示例里这一行被注释(不写入服务端)。MCP 参考:vjcad/example/file/01openfromserver.js、vjcad/example/basic/04viewerremote.js。

反例

  • 把 doc.layouts 当 space:layouts 是布局集合,space 才是当前激活的模型空间或某个布局空间。
  • 用 space.addEntities(arr) 代替 Engine.addEntities:实体已入库但无法撤销、新实体暂不可点选,视图也可能没更新(Engine.addEntities 会逐个立即绘制、记撤销并刷新可选列表)。

参考(官方文档 MCP)

  • 文档:vjcad/doc/guide/architecture.md、vjcad/doc/command/api-reference.md、vjcad/doc/guide/quick-start.md
  • 示例:vjcad/example/entity/text/04fonts.js、vjcad/example/file/01openfromserver.js