文档模型
大约 6 分钟
文档模型
CadDocument 代表一个 CAD 文档,是所有绘图数据的容器,管理图层、块、样式等所有文档级别的数据。
概述
文档基本信息
import { Engine, CadDocument } from 'vjcad';
// 获取当前文档
const doc: CadDocument = Engine.currentDoc;
// 基本属性
console.log('文档名称:', doc.name); // 文件名
console.log('文档路径:', doc.path); // 完整路径
console.log('文档ID:', doc.docId); // 唯一标识符
console.log('是否已修改:', doc.DBMOD === 1); // 修改状态
// 使用 Engine 快捷访问
console.log('图形名称:', Engine.DWGNAME); // 等同于 doc.name
console.log('图形前缀:', Engine.DWGPREFIX); // 等同于 doc.path
console.log('是否已命名:', Engine.DWGTITLED); // path !== ""文档属性
| 属性 | 类型 | 说明 |
|---|---|---|
name | string | 文档名称(文件名) |
path | string | 文档完整路径 |
docId | number | 文档唯一标识符 |
DBMOD | number | 修改状态(0=未修改,1=已修改) |
CLAYER | string | 当前图层名称 |
LTSCALE | number | 全局线型比例 |
DIMSCALE | number | 标注全局比例 |
TEXTSIZE | number | 默认文字高度 |
文档环境变量
import { Engine, CadDocument } from 'vjcad';
const doc = Engine.currentDoc;
// 图层相关
doc.CLAYER = '标注层'; // 设置当前图层
console.log('当前图层:', doc.CLAYER);
// 也可以使用 setCLAYER 方法
doc.setCLAYER('图层1', true); // 第二个参数表示是否更新UI
// 线型比例
doc.LTSCALE = 100; // 全局线型比例
console.log('全局线型比例:', doc.LTSCALE);
// 标注比例
doc.DIMSCALE = 50; // 标注全局比例
console.log('标注比例:', doc.DIMSCALE);
// 文字高度
doc.TEXTSIZE = 2.5; // 默认文字高度图层集合 (Layers)
图层集合管理文档中所有图层。
访问图层
import { Engine, Layer } from 'vjcad';
const doc = Engine.currentDoc;
const layers = doc.layers;
// 获取所有图层
console.log('图层数量:', layers.items.length);
// 遍历图层
for (const layer of layers.items) {
console.log(`图层: ${layer.name}, 颜色: ${layer.color}, 开关: ${layer.layerOn}`);
}
// 根据名称获取图层
const layer0 = layers.itemByName('0');
console.log('0图层颜色:', layer0?.color);
// 根据索引获取图层
const firstLayer = layers.itemByIndex(0);创建图层
import { Engine } from 'vjcad';
const layers = Engine.currentDoc.layers;
// 方式一:自动命名
const newLayer1 = layers.makeLayer();
console.log('新图层名称:', newLayer1.name); // "图层1", "图层2", ...
// 方式二:指定名称
const newLayer2 = layers.addlayer('标注层', true, 3); // 名称, 开关, 颜色
newLayer2.lineType = 'CONTINUOUS';
// 方式三:检查并创建
if (!layers.has('我的图层')) {
const myLayer = layers.addlayer('我的图层', true, 1);
}图层属性
import { Engine, Layer } from 'vjcad';
const layer = Engine.currentDoc.layers.itemByName('图层1');
if (layer) {
// 基本属性
layer.name = '新名称'; // 图层名称
layer.color = 1; // 图层颜色(1=红色)
layer.lineType = 'HIDDEN'; // 图层线型
layer.lineWeight = 0.25; // 图层线宽(毫米)
// 状态控制
layer.layerOn = true; // 图层开关(true=显示)
layer.frozen = false; // 冻结状态(true=冻结)
layer.locked = false; // 锁定状态(true=锁定)
layer.plottable = true; // 可打印(true=可打印)
// 透明度
layer.transparency = 0; // 透明度(0-100)
}图层操作
import { Engine } from 'vjcad';
const layers = Engine.currentDoc.layers;
// 删除图层
const layerToDelete = layers.itemByName('临时图层');
if (layerToDelete && layerToDelete.name !== '0') {
layers.delete(layerToDelete);
}
// 检查图层是否存在
const exists = layers.has('标注层');
// 获取图层索引
const index = layers.indexOf('图层1');块集合 (Blocks)
块集合管理所有块定义,包括模型空间和图纸空间。
访问块
import { Engine, BlockDefinition } from 'vjcad';
const doc = Engine.currentDoc;
const blocks = doc.blocks;
// 获取模型空间
const modelSpace = blocks.itemByName('*Model');
console.log('模型空间实体数:', modelSpace?.items.length);
// 获取图纸空间
const paperSpace = blocks.itemByName('*Paper');
// 获取当前空间
const currentSpace: BlockDefinition = doc.currentSpace;
// 遍历所有块定义
for (const block of blocks.items) {
if (!block.name.startsWith('*')) { // 排除系统块
console.log(`块: ${block.name}, 实体数: ${block.items.length}`);
}
}创建块
import { Engine, BlockDefinition, LineEnt, CircleEnt, Point2D } from 'vjcad';
const blocks = Engine.currentDoc.blocks;
// 创建新块定义
const newBlock = new BlockDefinition();
newBlock.name = '我的块';
newBlock.origin = new Point2D(0, 0); // 块基点
// 添加实体到块
const line = new LineEnt(new Point2D(0, 0), new Point2D(100, 0));
const circle = new CircleEnt(new Point2D(50, 50), 20);
newBlock.add(line);
newBlock.add(circle);
// 添加到块集合
blocks.add(newBlock);块属性
import { BlockDefinition, Point2D } from 'vjcad';
const block: BlockDefinition = /* ... */;
// 基本属性
block.name = '块名称'; // 块名称
block.origin = new Point2D(0, 0); // 块基点
// 实体操作
const entities = block.items; // 获取所有实体
block.add(entity); // 添加实体
block.erase([entity]); // 删除实体
// 空间属性
const zoom = block.zoom; // 当前缩放级别
const center = block.viewCenter; // 视图中心当前空间
当前空间是用户正在编辑的空间(模型空间或某个布局的图纸空间)。
import { Engine, BlockDefinition, EntityBase } from 'vjcad';
// 获取当前空间
const currentSpace: BlockDefinition = Engine.currentSpace;
// 等同于 Engine.currentDoc.currentSpace
// 访问空间中的实体
const entities: EntityBase[] = currentSpace.items;
console.log('当前空间实体数:', entities.length);
// 遍历实体
for (const entity of entities) {
console.log(`${entity.type}: ${entity.id}, 图层: ${entity.layer}`);
}
// 空间视图属性
console.log('缩放级别:', currentSpace.zoom);
console.log('视图中心:', currentSpace.viewCenter);其他数据集合
文字样式
import { Engine } from 'vjcad';
const textStyles = Engine.currentDoc.textStyles;
// 遍历文字样式
for (const style of textStyles.items) {
console.log(`样式: ${style.name}, 字体: ${style.fontName}`);
}
// 获取样式
const standard = textStyles.itemByName('Standard');标注样式
import { Engine } from 'vjcad';
const dimStyles = Engine.currentDoc.dimensionStyles;
// 遍历标注样式
for (const style of dimStyles.items) {
console.log(`样式: ${style.name}`);
}图像集合
import { Engine } from 'vjcad';
const images = Engine.currentDoc.images;
// 遍历图像
for (const image of images.items) {
console.log(`图像: ${image.name}, 路径: ${image.path}`);
}文档序列化
导出为 JSON
import { Engine, CadDocument } from 'vjcad';
const doc = Engine.currentDoc;
// 导出为数据库格式对象
const dbDoc = doc.toDb();
// 转换为 JSON 字符串
const jsonStr = JSON.stringify(dbDoc);
// 保存到文件(示例)
// await saveToFile('drawing.json', jsonStr);从 JSON 导入
import { CadDocument } from 'vjcad';
// 从 JSON 恢复
const jsonStr = /* 读取文件内容 */;
const dbData = JSON.parse(jsonStr);
const newDoc = new CadDocument();
await newDoc.fromDb(dbData);
// 设置为当前文档
Engine.setActiveDocument(newDoc);文档生命周期
文档操作
import { Engine, CadDocument } from 'vjcad';
// 创建新文档
const newDoc = new CadDocument();
newDoc.name = '新图纸';
// 添加到文档集合
Engine.docs.items.push(newDoc);
// 设置为活动文档
Engine.setActiveDocument(newDoc);
// 关闭文档时清理资源
Engine.disposeDocument(newDoc);多文档管理
import { Engine, CadDocument } from 'vjcad';
// 获取所有打开的文档
const docs = Engine.docs.items;
console.log('打开的文档数:', docs.length);
// 遍历文档
for (const doc of docs) {
console.log(`${doc.name} - ${doc.DBMOD === 1 ? '已修改' : '未修改'}`);
}
// 切换文档
const targetDoc = docs.find(d => d.name === '图纸A');
if (targetDoc) {
Engine.setActiveDocument(targetDoc);
}文档集合汇总
| 集合 | 类型 | 说明 |
|---|---|---|
layers | Layers | 图层集合,管理所有图层 |
blocks | Blocks | 块定义集合,包含模型空间和图纸空间 |
layouts | Layouts | 布局集合,管理打印布局 |
images | Images | 图像集合,外部图像引用 |
textStyles | TextStyles | 文字样式集合 |
dimensionStyles | DimStyles | 标注样式集合 |
lineTypes | LineTypes | 线型定义集合 |
plotStyles | PlotStyles | 打印样式集合 |