符号命令
大约 5 分钟
符号命令
符号命令用于创建、管理和插入符号,实现图形元素的重复使用和共享。符号支持保存到服务端或本地浏览器存储。
符号的概念
符号是一组 CAD 实体的集合,可以作为独立单元进行管理和插入:
- 符号定义: 包含实体数据、基点、缩略图等信息
- 符号分类: 用于组织和管理符号
- 存储位置: 支持服务端存储和本地浏览器存储
符号与块的区别
| 特性 | 符号 | 块 |
|---|---|---|
| 存储方式 | 独立文件(服务端/本地) | 图形文档内 |
| 共享范围 | 跨文档、跨用户 | 仅限当前文档 |
| 管理方式 | 分类管理 | 块定义列表 |
| 插入方式 | 合并实体到文档 | 插入块参照 |
INSERTSYMBOL - 插入符号
从符号库中选择符号并插入到当前图形。
命令名: INSERTSYMBOL
用法
命令: INSERTSYMBOL执行命令后打开符号选择对话框。
对话框说明
三栏布局:
- 左侧: 分类列表(服务端分类和本地分类分组显示)
- 中间: 符号网格(显示缩略图和名称,支持搜索和分页)
- 右侧: 预览和插入选项
插入选项:
- 允许缩放: 启用后可交互指定缩放比例
- 允许旋转: 启用后可交互指定旋转角度
- 按原坐标插入: 直接按符号原始坐标插入,不指定插入点
- 清空来源图信息: 清除实体的 objectId,用于去除版本追踪信息
操作流程
- 选择分类
- 选择符号(可搜索、双击快速插入)
- 设置插入选项
- 点击"插入"按钮
- 在图形中指定插入点
- 可选:指定缩放比例(拖动或输入数值)
- 可选:指定旋转角度(拖动或输入数值)
交互提示
指定插入点: <点击或输入坐标>
指定缩放比例或拖动鼠标 <1.00>: <拖动/点击/输入数值/回车确认>
指定旋转角度或拖动鼠标 <0.0°>: <拖动/点击/输入角度/回车确认>
已插入 n 个实体(缩放: x.xx, 旋转: xx.x°)。CREATESYMBOL - 新增符号
将选中的实体保存为符号。
命令名: CREATESYMBOL
用法
命令: CREATESYMBOL如果当前有选中的实体,会自动带入;否则可在对话框中选择。
对话框说明
左侧表单:
- 选择实体: 显示已选数量,支持"选择"和"清空"按钮
- 符号名称: 输入符号的名称
- 保存位置: 选择"服务端"或"本地"
- 分类: 选择目标分类,支持"新建"分类
- 清空来源图信息: 清除实体的 objectId
右侧预览:
- 显示选中实体的预览图
- 支持开启/关闭预览
基点坐标:
- X/Y 坐标输入框
- "拾取"按钮:在图形中交互拾取基点
操作流程
- 选择要保存的实体(或使用当前选择集)
- 输入符号名称
- 选择保存位置和分类
- 设置基点坐标(可拾取)
- 点击"保存"按钮
数据处理
创建符号时会自动:
- 收集实体依赖的图层、线型、文字样式、块定义
- 导出填充图案定义
- 生成缩略图
- 压缩数据(服务端存储时)
MANAGESYMBOL - 管理符号
打开符号管理对话框,管理分类和符号。
命令名: MANAGESYMBOL
用法
命令: MANAGESYMBOL对话框说明
标签页:
- 服务端符号: 管理服务端存储的符号
- 本地符号: 管理本地浏览器存储的符号
三栏布局:
- 左侧: 分类管理(新建、重命名、删除分类)
- 中间: 符号列表(搜索、分页、删除符号)
- 右侧: 符号预览和详细信息
分类管理
| 操作 | 按钮 | 权限要求 |
|---|---|---|
| 新建分类 | + | 服务端需权限,本地无限制 |
| 重命名分类 | ✎ | 服务端仅 root,本地无限制 |
| 删除分类 | × | 服务端仅 root,本地无限制 |
符号管理
- 搜索: 按名称搜索符号
- 排序: 按时间或名称排序
- 删除: 选中符号后点击删除按钮
注意
删除分类会同时删除该分类下的所有符号,操作不可恢复。
代码示例
示例1: 创建本地符号
const { LineEnt, CircleEnt, Engine, getLocalStorageService,
buildSymbolVcadData, generateThumbnailFromEntities } = vjcad;
// 1. 创建实体
const line1 = new LineEnt([-10, 0], [10, 0]);
const line2 = new LineEnt([0, -10], [0, 10]);
const circle = new CircleEnt([0, 0], 8);
line1.setDefaults();
line2.setDefaults();
circle.setDefaults();
// 2. 获取本地存储服务
const localService = getLocalStorageService();
// 3. 创建或获取分类
let categories = await localService.getLocalSymbolCategories();
let category = categories.find(c => c.name === "示例符号");
if (!category) {
category = await localService.createLocalSymbolCategory("示例符号");
}
// 4. 构建符号数据
const entities = [line1, line2, circle];
const vcadData = await buildSymbolVcadData(entities, false);
// 5. 生成缩略图
const thumbnail = await generateThumbnailFromEntities(entities, 128, 128);
// 6. 保存符号
const symbol = await localService.saveLocalSymbol({
categoryId: category.id,
name: "十字圆符号",
basePoint: [0, 0],
thumbnail: thumbnail,
vcadData: vcadData
});
console.log("符号已保存:", symbol.id);示例2: 交互式插入符号
const { Engine, getLocalStorageService, insertSymbolInteractive } = vjcad;
// 1. 获取符号数据
const localService = getLocalStorageService();
const categories = await localService.getLocalSymbolCategories();
const symbols = await localService.getLocalSymbolList(categories[0].id);
const symbolData = await localService.getLocalSymbol(symbols[0].id);
// 2. 交互式插入
const entities = await insertSymbolInteractive(
symbolData.vcadData,
symbolData.basePoint,
{
allowScale: true, // 允许缩放
allowRotation: true, // 允许旋转
clearSourceInfo: false // 保留来源信息
}
);
if (entities) {
console.log("插入成功,实体数量:", entities.length);
Engine.zoomExtents();
}示例3: 直接插入符号(无交互)
const { Engine, Point2D, getLocalStorageService,
parseSymbolVcadData, mergeSymbolToDocument } = vjcad;
// 获取符号
const localService = getLocalStorageService();
const symbolData = await localService.getLocalSymbol(symbolId);
// 解析符号文档
const symbolDoc = await parseSymbolVcadData(symbolData.vcadData);
// 直接插入到指定位置
const insertPoint = new Point2D(100, 100);
const entities = mergeSymbolToDocument(
symbolDoc,
insertPoint,
symbolData.basePoint,
2.0, // 缩放 2 倍
45, // 旋转 45 度
false // 保留来源信息
);
Engine.regen();