CommandRegistry API
大约 1 分钟
CommandRegistry API
CommandRegistry 负责命令的注册、查找与执行。通过 cadLayer.commandRegistry 访问实例。
方法
register
register(name: string, cls: CommandClass, description?: string): void注册一个命令。
| 参数 | 类型 | 说明 |
|---|---|---|
name | string | 命令名称(不区分大小写) |
cls | CommandClass | 命令类,需实现 main 静态方法 |
description | string | 可选,命令描述(用于 UI 显示) |
示例:
class DrawStar {
static async main(ctx: CommandContext, opts?: Record<string, any>) {
const result = await ctx.inputManager.getPoint({ prompt: '指定中心点' });
if (result.status !== InputStatusEnum.OK) return;
// 绘制星形...
}
}
cadLayer.commandRegistry.register('star', DrawStar, '绘制星形');execute
execute(name: string, opts?: Record<string, any>): Promise<void>执行已注册的命令。
| 参数 | 类型 | 说明 |
|---|---|---|
name | string | 命令名称 |
opts | Record<string, any> | 可选,传递给命令的参数 |
repeatLast
repeatLast(): Promise<void>重复执行上一条命令。
lastCommandName
readonly lastCommandName: string | undefined上一条执行的命令名称。
CommandClass
命令类接口定义。
interface CommandClass {
main(ctx: CommandContext, opts?: Record<string, any>): Promise<void>;
}命令通过 main 静态方法实现,接收 CommandContext 上下文和可选参数。
CommandContext
命令执行时注入的上下文对象,提供对所有子系统的访问。
interface CommandContext {
store: EntityStore;
inputManager: InputManager;
eventBus: EventBus;
coordMapper: CoordMapper;
renderPipeline: RenderPipeline;
previewManager: PreviewManager;
gripManager: GripManager;
drawingDefaults: DrawingDefaults;
undoManager: UndoManager;
blocks: Blocks;
map: vjmap.Map;
dimReactorManager: DimReactorManager;
}| 属性 | 类型 | 说明 |
|---|---|---|
store | EntityStore | 实体存储 |
inputManager | InputManager | 用户输入管理器 |
eventBus | EventBus | 事件总线 |
coordMapper | CoordMapper | 坐标映射器 |
renderPipeline | RenderPipeline | 渲染管线 |
previewManager | PreviewManager | 预览管理器 |
gripManager | GripManager | 夹点管理器 |
drawingDefaults | DrawingDefaults | 绘图默认值 |
undoManager | UndoManager | 撤销管理器 |
blocks | Blocks | 块定义集合 |
map | vjmap.Map | 地图实例 |
dimReactorManager | DimReactorManager | 标注反应器管理器 |
命令完整示例:
class DrawCircleCmd {
static async main(ctx: CommandContext) {
const centerResult = await ctx.inputManager.getPoint({
prompt: '指定圆心',
});
if (centerResult.status !== InputStatusEnum.OK) return;
const radiusResult = await ctx.inputManager.getReal({
prompt: '输入半径',
defaultValue: 10,
});
if (radiusResult.status !== InputStatusEnum.OK) return;
const circle = new CircleEnt();
circle.center = centerResult.point!;
circle.radius = radiusResult.value!;
ctx.store.add(circle);
}
}
cadLayer.commandRegistry.register('mycircle', DrawCircleCmd, '绘制圆');