UNPKG

@inweb/viewer-core

Version:

3D CAD and BIM data Viewer core

81 lines (66 loc) 3 kB
/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// import { IViewer } from "../viewer/IViewer"; import { ICommand, ICommandHandler, ICommandDescription, ICommandsRegistry } from "./ICommands"; class CommandsRegistry implements ICommandsRegistry { private readonly _commands = new Map<string, ICommand>(); registerCommand(id: string, handler: ICommandHandler, description?: ICommandDescription, thisArg?: any): void { this._commands.set(id, { id, handler, thisArg, description }); } registerCommandAlias(id: string, alias: string): void { this.registerCommand(alias, (viewer: IViewer, ...args) => this.executeCommand(id, viewer, ...args)); } getCommand(id: string): ICommand | undefined { return this._commands.get(id); } getCommands(): Map<string, ICommand> { const map = new Map<string, ICommand>(); this._commands.forEach((value, key) => map.set(key, value)); return map; } executeCommand(id: string, viewer: IViewer, ...args: any[]): any { const command = this._commands.get(id); if (!command) { if (viewer) { const isDraggerCommand = viewer.draggers.includes(id); if (isDraggerCommand) return viewer.setActiveDragger(id); } console.warn(`Command '${id}' not found`); return undefined; } const { handler, thisArg } = command; const result = handler.apply(thisArg, [viewer, ...args]); viewer?.emit({ type: "command", data: id, args }); return result; } } const _commandsRegistry = new Map<string, CommandsRegistry>(); function commandsRegistry(viewerType = ""): ICommandsRegistry { let result = _commandsRegistry.get(viewerType); if (!result) { result = new CommandsRegistry(); _commandsRegistry.set(viewerType, result); } return result; } export { commandsRegistry };