document-space
本文回答:
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