唯杰地图 logo唯杰地图
VJMAP
EN

块、符号与组

vjcad/references/autodraw/blocks-symbols.md 4.8 KB195 行
原文

块定义与插入、符号管理、组实体。


创建块定义

const { LineEnt, CircleEnt, Engine } = vjcad;

const doc = Engine.currentDoc;
const blockName = "MySymbol";

// 检查是否已存在
let blockDef = doc.blocks.itemByName(blockName);
if (!blockDef) {
    blockDef = doc.blocks.add(blockName);
    blockDef.basePoint = [0, 0];  // 基点

    // 添加块内实体
    const line1 = new LineEnt([-10, 0], [10, 0]);
    const line2 = new LineEnt([0, -10], [0, 10]);
    const circle = new CircleEnt([0, 0], 5);

    line1.setDefaults();
    line2.setDefaults();
    circle.setDefaults();

    blockDef.addEntity(line1);
    blockDef.addEntity(line2);
    blockDef.addEntity(circle);
}

插入块引用(InsertEnt)

const { InsertEnt, Engine } = vjcad;

const insert = new InsertEnt();
insert.blockId = blockDef.blockId;      // 块ID(必须)
insert.insertionPoint = [50, 50];       // 插入点
insert.scaleFactor = 1.5;               // 缩放因子
insert.rotation = Math.PI / 4;          // 旋转角度(弧度)
insert.setDefaults();
insert.color = 5;
Engine.addEntities(insert);
属性 说明
blockId 块ID(必须,从 blockDef.blockId 获取)
insertionPoint 插入点
scaleFactor 缩放因子
rotation 旋转角度(弧度)

炸开块

const explodedEnts = insert.getNestEnts(true);
explodedEnts.forEach(ent => Engine.addEntities(ent));
Engine.eraseEntities(insert);

符号管理

从本地存储加载符号

const {
    getLocalStorageService,
    parseSymbolVcadData,
    mergeSymbolToDocument,
    Point2D, Engine
} = vjcad;

const localService = getLocalStorageService();

// 获取分类和符号列表
const categories = await localService.getLocalSymbolCategories();
const symbols = await localService.getLocalSymbolList(categories[0].id);
const symbol = await localService.getLocalSymbol(symbols[0].id);
// 返回 { record: ILocalSymbolRecord, vcadData: string }——basePoint 在 record 上

// 解析符号数据
const symbolDoc = await parseSymbolVcadData(symbol.vcadData);

// 合并到文档——内部逐个 Engine.pcanvas.addEntity,**不记撤销**,需自己包撤销组并补记
Engine.undoManager.start_undoMark('插入符号');
try {
    const addedEntities = mergeSymbolToDocument(
        symbolDoc,
        new Point2D(100, 100),    // 插入点
        symbol.record.basePoint,   // 基点(record.basePoint,不是 symbol.basePoint)
        1.5,                       // 缩放
        45,                        // 旋转(度)
        false                      // clearSourceInfo
    );
    if (addedEntities.length) Engine.undoManager.added_undoMark(addedEntities);   // 内置插入命令同此写法
} finally {
    Engine.undoManager.end_undoMark();
}

Engine.zoomExtents();

交互式插入符号

const { insertSymbolInteractive } = vjcad;

const entities = await insertSymbolInteractive(
    symbol.vcadData, basePoint,   // 首参是 vcad JSON 字符串,不是符号记录对象
    { allowScale: true, allowRotation: true, clearSourceInfo: false }
);

创建本地符号

const {
    getLocalStorageService,
    buildSymbolVcadData,
    generateThumbnailFromEntities
} = vjcad;

const localService = getLocalStorageService();

// 创建分类
const category = await localService.createLocalSymbolCategory("我的符号");

// 生成符号数据
const vcadData = await buildSymbolVcadData(entities, false);
const thumbnail = await generateThumbnailFromEntities(entities, 128, 128);

// 保存符号
const symbol = await localService.saveLocalSymbol({
    categoryId: category.id,
    name: "十字符号",
    basePoint: [0, 0],
    thumbnail: thumbnail,
    vcadData: vcadData
});

GroupEnt — 组

创建组

const { GroupEnt, LineEnt, CircleEnt, Engine } = vjcad;

const line = new LineEnt([0, 0], [100, 0]);
const circle = new CircleEnt([50, 50], 20);
line.setDefaults();
circle.setDefaults();

const group = new GroupEnt("MyGroup", [line, circle]);
group.setDefaults();
Engine.addEntities(group);

访问组内实体

group.items.forEach((item, index) => {
    console.log(`${index}: ${item.type}`);
});

炸开组

const explodedEntities = group.explode();
explodedEntities.forEach(ent => Engine.addEntities(ent));
Engine.eraseEntities(group);
Engine.regen(true);

命令方式

await Engine.editor.executerWithOp('GROUP');     // 创建组
await Engine.editor.executerWithOp('UNGROUP');   // 取消组