用户输入交互和事件监听。
const { PointInputOptions, InputStatusEnum, getPoint, Point2D } = vjcad;
// 基本用法
const options = new PointInputOptions("指定点位置:");
const result = await getPoint(options);
if (result.status === InputStatusEnum.OK) {
const point = result.value; // Point2D {x, y}
console.log(`点: (${point.x}, ${point.y})`);
}
带橡皮筋线:
const opt = new PointInputOptions("指定终点:");
opt.useBasePoint = true; // 启用橡皮筋线
opt.basePoint = startPoint; // 设置基点
const result = await getPoint(opt);
隐藏默认橡皮筋线,使用自定义预览:
const opt = new PointInputOptions("指定终点:");
opt.useBasePoint = true;
opt.basePoint = startPoint;
opt.hideRubberBand = true; // 隐藏默认橡皮筋线
opt.callback = (canvasPt) => {
const worldPt = Engine.CanvasToWcs(canvasPt);
// 创建自定义预览
const preview = new LineEnt([startPoint.x, startPoint.y], [worldPt.x, worldPt.y]);
preview.setDefaults();
preview.color = 1;
Engine.clearPreview();
Engine.drawPreviewEntities([preview]);
};
const result = await getPoint(opt);
Engine.clearPreview();
带关键字选项:
const opt = new PointInputOptions("指定点 [直线(L)/圆(C)/退出(E)]:");
opt.keywords = ["L", "C", "E"];
const result = await getPoint(opt);
switch (result.status) {
case InputStatusEnum.OK:
// 用户点击了坐标点
const point = result.value;
break;
case InputStatusEnum.Keyword:
// 用户输入了关键字
const keyword = result.stringResult.toUpperCase();
if (keyword === "L") { /* 处理直线 */ }
else if (keyword === "C") { /* 处理圆 */ }
else if (keyword === "E") { /* 退出 */ }
break;
case InputStatusEnum.Cancel:
// 用户取消(ESC)
break;
}
const { SelectionInputOptions, InputStatusEnum, getSelections } = vjcad;
const options = new SelectionInputOptions("选择对象:");
const result = await getSelections(options);
if (result.status === InputStatusEnum.OK) {
const entities = result.value; // 实体数组
console.log(`选中了 ${entities.length} 个实体`);
entities.forEach((ent, i) => {
console.log(`${i + 1}. ${ent.type} (ID: ${ent.id}, 颜色: ${ent.color})`);
});
}
特点:
const { RealInputOptions, InputStatusEnum, getReal } = vjcad;
const options = new RealInputOptions("输入圆的半径:");
options.defaultValue = 30; // 默认值
const result = await getReal(options);
if (result.status === InputStatusEnum.OK) {
const radius = result.value;
} else if (result.status === InputStatusEnum.EnterOrSpace) {
// 用户按回车,使用默认值
const radius = options.defaultValue;
}
const { IntegerInputOptions, InputStatusEnum, getInteger } = vjcad;
const options = new IntegerInputOptions("输入多边形边数:");
options.defaultValue = 6;
const result = await getInteger(options);
if (result.status === InputStatusEnum.OK) {
const sides = result.value;
} else if (result.status === InputStatusEnum.EnterOrSpace) {
const sides = options.defaultValue;
}
const { StringInputOptions, InputStatusEnum, getString } = vjcad;
const options = new StringInputOptions("输入图层名称:");
options.defaultValue = "新图层";
const result = await getString(options);
if (result.status === InputStatusEnum.OK) {
const layerName = result.value;
}
| 状态 | 说明 | 常见场景 |
|---|
OK | 成功获取输入 | 用户点击/输入有效值 |
Cancel | 用户取消 | 按 ESC |
EnterOrSpace | 用户按回车/空格 | 使用默认值 |
Keyword | 用户输入关键字 | 带 keywords 选项时 |
const { CadEventManager, CadEvents, Engine } = vjcad;
// 获取事件管理器
const events = Engine.eventManager;
// 或: const events = CadEventManager.getInstance();
// 注册监听器
events.on(CadEvents.EntityAdded, (args) => {
console.log('实体已添加:', args.entity.type);
});
// 链式调用
events
.on(CadEvents.EntityAdded, handler1)
.on(CadEvents.EntityModified, handler2);
// 一次性监听器
events.once(CadEvents.DocumentOpened, (args) => {
console.log('文档已打开:', args.document.name);
});
// 方式1:保存处理函数引用
const handler = (args) => { console.log(args); };
events.on(CadEvents.EntityAdded, handler);
events.off(CadEvents.EntityAdded, handler);
// 方式2:移除指定事件的所有监听器
events.offAll(CadEvents.EntityAdded);
// 方式3:移除所有事件的监听器
events.offAll();
| 方法 | 说明 |
|---|
on(event, handler) | 注册监听器 |
once(event, handler) | 注册一次性监听器 |
off(event, handler) | 移除指定监听器 |
offAll(event?) | 移除所有监听器 |
hasListeners(event) | 检查是否有监听器 |
listenerCount(event) | 获取监听器数量 |
suspendEvents() | 暂停事件触发 |
resumeEvents() | 恢复事件触发 |
// 实体添加
events.on(CadEvents.EntityAdded, (args) => {
console.log('实体:', args.entity);
console.log('文档:', args.document);
});
// 批量添加
events.on(CadEvents.EntitiesAdded, (args) => {
console.log('添加数量:', args.entities.length);
});
// 实体修改
events.on(CadEvents.EntityModified, (args) => {
console.log('修改的实体:', args.entity);
});
// 实体删除
events.on(CadEvents.EntitiesErased, (args) => {
args.entities.forEach(ent => {
console.log('已删除:', ent.type);
});
});
events.on(CadEvents.SelectionChanged, (args) => {
const selected = Engine.ssGetFirst();
console.log('当前选中数量:', selected.length);
});
events.on(CadEvents.CommandStarted, (args) => {
console.log('命令开始:', args.commandName);
});
events.on(CadEvents.CommandEnded, (args) => {
console.log('命令结束:', args.commandName);
});
events.on(CadEvents.CommandCancelled, (args) => {
console.log('命令取消:', args.commandName);
});
events.on(CadEvents.DocumentOpened, (args) => {
console.log('文档名:', args.document.name);
console.log('文件路径:', args.filePath);
});
events.on(CadEvents.DocumentSaved, (args) => {
console.log('文档已保存:', args.document.name);
});
events.on(CadEvents.DocumentModified, (args) => {
console.log('文档已修改');
});
events.on(CadEvents.LayerAdded, (args) => {
console.log('新图层:', args.layer.name);
});
events.on(CadEvents.CurrentLayerChanged, (args) => {
console.log('当前图层:', args.layer.name);
});
以 -ing 结尾的事件可以取消。
// 阻止实体删除
events.on(CadEvents.EntityErasing, (args) => {
if (args.entity.layer === "保护图层") {
args.cancel = true;
args.cancelReason = "保护图层上的实体不允许删除";
message.info("删除已取消");
}
});
// 阻止文档关闭
events.on(CadEvents.DocumentClosing, (args) => {
if (hasUnsavedChanges()) {
args.cancel = true;
args.cancelReason = "请先保存修改";
}
});
// 阻止命令执行
events.on(CadEvents.CommandStarting, (args) => {
if (args.commandName === 'ERASE' && !hasPermission()) {
args.cancel = true;
args.cancelReason = "没有删除权限";
}
});
可取消事件列表:
DocumentCreating / DocumentOpening / DocumentClosing / DocumentSavingEntityAdding / EntitiesAdding / EntityErasing / EntitiesErasingCommandStartingLayerAdding / LayerDeletingBlockAdding / BlockDeleting
| 事件 | 说明 |
|---|
DocumentCreating / DocumentCreated | 新建文档 |
DocumentOpening / DocumentOpened | 打开文档 |
DocumentClosing / DocumentClosed | 关闭文档 |
DocumentSaving / DocumentSaved | 保存文档 |
DocumentModified | 文档修改 |
DocumentSwitched | 切换文档 |
| 事件 | 说明 |
|---|
EntityAdding / EntityAdded | 添加实体 |
EntitiesAdding / EntitiesAdded | 批量添加 |
EntityModified | 实体修改 |
EntityErasing / EntityErased | 删除实体 |
EntitiesErasing / EntitiesErased | 批量删除 |
| 事件 | 说明 |
|---|
CommandStarting / CommandStarted | 命令开始 |
CommandEnded | 命令结束 |
CommandCancelled | 命令取消 |
| 事件 | 说明 |
|---|
SelectionChanged | 选择集变化 |
SelectionCleared | 选择集清空 |
| 事件 | 说明 |
|---|
LayerAdding / LayerAdded | 添加图层 |
LayerDeleting / LayerDeleted | 删除图层 |
LayerModified | 图层修改 |
CurrentLayerChanged | 当前图层切换 |
| 事件 | 说明 |
|---|
ViewZoomed | 视图缩放 |
ViewPanned | 视图平移 |
ViewRegenerated | 视图重绘 |
| 事件 | 说明 |
|---|
BlockAdding / BlockAdded | 添加块定义 |
BlockDeleting / BlockDeleted | 删除块定义 |
BlockModified | 块定义修改 |