命令开发
大约 2 分钟
命令开发
自定义命令的开发与注册,包括命令结构、预览绘制、状态机等高级用法。
在线示例
| 示例 | 描述 | 链接 |
|---|---|---|
| 简单命令 | 命令基本结构示例 | 在线演示{target="_blank"} |
| 注册命令 | CommandRegistry 用法 | 在线演示{target="_blank"} |
| 带预览命令 | 预览绘制示例 | 在线演示{target="_blank"} |
| 状态机命令 | 多步骤命令示例 | 在线演示{target="_blank"} |
| 执行脚本 | EXECUTESTR 执行 CAD 命令脚本示例 | 在线演示{target="_blank"} |
| 执行 JS 代码 | EXECUTEJS 执行 JavaScript 代码示例 | 在线演示{target="_blank"} |
核心 API
命令基本结构
const { CommandDefinition, CommandOptions, CommandRegistry } = vjcad;
// 1. 定义命令类
class MyCommand {
async main() {
writeMessage("<br/>命令执行中...");
// 命令逻辑
}
}
// 2. 创建命令选项
const options = new CommandOptions();
options.useAutoComplete = true;
// 3. 创建命令定义
const cmdDef = new CommandDefinition(
'MYCMD', // 命令名(大写)
'命令描述', // 描述
MyCommand, // 命令类
options // 选项
);
// 4. 注册命令
CommandRegistry.regist(cmdDef);
// 5. 执行命令
await Engine.editor.executerWithOp('MYCMD');带预览的命令
class DrawCircleCommand {
async main() {
const { getPoint, drawPreviewEntity } = vjcad;
// 获取圆心
const centerResult = await getPoint({ prompt: "指定圆心:" });
if (centerResult.status !== InputStatusEnum.OK) return;
const center = centerResult.value;
// 获取半径点(带预览)
const radiusResult = await getPoint({
prompt: "指定半径:",
basePoint: center,
onMouseMove: (currentPoint) => {
const radius = distance(center, currentPoint);
const previewCircle = new CircleEnt(center, radius);
drawPreviewEntity(previewCircle);
}
});
if (radiusResult.status !== InputStatusEnum.OK) return;
const radius = distance(center, radiusResult.value);
// 创建实体
const circle = new CircleEnt(center, radius);
circle.setDefaults();
Engine.addEntities(circle);
}
}状态机命令
class MultiStepCommand {
state = 'START';
async main() {
while (this.state !== 'END') {
switch (this.state) {
case 'START':
await this.handleStart();
break;
case 'SELECT':
await this.handleSelect();
break;
case 'CONFIRM':
await this.handleConfirm();
break;
}
}
}
async handleStart() {
// 初始化逻辑
this.state = 'SELECT';
}
// ...
}