UNPKG

@inweb/viewer-core

Version:

3D CAD and BIM data Viewer core

430 lines (391 loc) 13.1 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 { IEventEmitter } from "@inweb/eventemitter2"; import { Client } from "@inweb/client"; import { ICommandService } from "../commands/ICommands"; import { IOptions } from "../options/IOptions"; import { IDragger } from "../draggers/IDraggers"; import { IComponent } from "../components/IComponents"; import { FileSource, ILoader } from "../loaders/ILoader"; import { IModel } from "../models/IModel"; import { IViewpoint } from "./IViewpoint"; import { IInfo } from "./IInfo"; /** * Viewer core interface. */ export interface IViewer extends IEventEmitter, ICommandService { /** * The `Client` instance that is used to load model reference files from the Open Cloud Server. */ client: Client | undefined; /** * Viewer options. */ options: IOptions; /** * {@link https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement | HTMLCanvasElement} for the * viewer used to operate on. Defined only while the viewer is initialized. */ canvas: HTMLCanvasElement | undefined; /** * List of canvas events, such as mouse events or * {@link https://developer.mozilla.org/docs/Web/API/Pointer_events#event_types_and_global_event_handlers | pointer events} * or {@link https://developer.mozilla.org/docs/Web/API/TouchEvent#touch_event_types | touch events} * that the viewer should listen and redirect to the draggers and components. * * By default, the following events are redirected: * * - click * - contextmenu * - dblclick * - mousedown * - mouseleave * - mousemove * - mouseup * - pointercancel * - pointerdown * - pointerleave * - pointermove * - pointerup * - touchcancel * - touchend * - touchmove * - touchstart * - wheel */ canvasEvents: string[]; /** * List of active loaders used to load models into the viewer. */ loaders: ILoader[]; /** * List of models loaded into the viewer. */ models: IModel[]; /** * List of names of available draggers. * * The following draggers are available by default: * * - Pan * - Orbit * - Zoom * - MeasureLine * - CuttingPlaneXAxis * - CuttingPlaneYAxis * - CuttingPlaneZAxis * - Walk * * For a quick reference on how to implement your own dragger, see {@link IDragger}. */ draggers: string[]; /** * List of names of available components. */ components: string[]; /** * Statistical information about the GPU memory and the rendering process. */ info: IInfo; /** * Initializes the viewer it with the specified canvas. Call {@link dispose | dispose()} to release * allocated resources. * * Fires: * * - {@link InitializeEvent | initialize} * - {@link InitializeProgressEvent | initializeprogress} * * @param canvas - * {@link https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement | HTMLCanvasElement} for the * viewer used to operate on. * @param onProgress - A callback function that handles events measuring progress of viewer * initialization. */ initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent) => void): Promise<this>; /** * Unloads an open file, clears the canvas and markups, and releases resources allocated by this viewer * instance. Call this method before release the `Viewer` instance. */ dispose(): this; /** * Returns `true` if viewer has been initialized. */ isInitialized(): boolean; /** * Resizes the output canvas to (width, height) with device pixel ratio taken into account. * * Fires: * * - {@link ResizeEvent | resize} * * @param width - The width of the canvas. * @param height - The height of the canvas. * @param updateStyle - Setting `updateStyle` to false prevents any style changes to the output canvas. */ setSize(width: number, height: number, updateStyle?: boolean): void; /** * Updates the viewer. * * Fires: * * - {@link UpdateEvent | update} * * @param force - If `true` updates the viewer immidietly. Otherwise the update will be scheduled for * the next animation frame. Default is `false`. */ update(force?: boolean): void; /** * Loads a file into the viewer. * * The viewer must be {@link initialize | initialized} before opening the file. Otherwise, `open()` does * nothing. * * This method requires a `Client` instance to be specified to load file from the Open Cloud Server. * The file geometry data on the Open Cloud Server must be converted into a format siutable for the * viewer, otherwise an exception will be thrown. * * For files from Open Cloud Server, the default model will be loaded. If there is no default model, * first availiable model will be loaded. If no models are found in the file, an exception will be * thrown. * * For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data * URL`, a file format must be specified using `params.format` parameter. If no appropriate loader is * found for the specified format, an exception will be thrown. * * If there was an active dragger before opening the file, it will be deactivated. After opening the * file, you must manually activate the required dragger. * * Fires: * * - {@link CancelEvent | cancel} * - {@link ClearEvent | clear} * - {@link OpenEvent | open} * - {@link GeometryStartEvent | geometrystart} * - {@link GeometryProgressEvent | geometryprogress} * - {@link DatabaseChunkEvent | databasechunk} * - {@link GeometryChunkEvent | geometrychunk} * - {@link GeometryEndEvent | geometryend} * - {@link GeometryErrorEvent | geometryerror} * * @param file - File to load. Can be: * * - `File`, `Assembly` or `Model` instance from the Open Cloud Server * - `URL` string * - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string * - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object * - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer} * object * * @param params - Loading parameters. * @param params.format - File format. Required when loading a file as `ArrayBuffer` or `Data URL`. * @param params.mode - File opening mode. Can be one of: * * - `file` - Single file mode. Unloads an open file and opens a new one. This is default mode. * - `assembly` - Assembly mode. Appends a file to an already open file. This mode is not supported for * all viewers. * * @param params.modelId - Unique model ID in the assembly (multi-model scene). Used as a model prefix * when selecting objects (see {@link getSelected2}). Must not contain the ":" (colon). Required when * loading a file as `ArrayBuffer` or `Data URL`. * @param params.requestHeader - The * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP * request. * @param params.withCredentials - Whether the HTTP request uses credentials such as cookies, * authorization headers or TLS client certificates. See * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials} * for mode details. */ open( file: FileSource, params: { format?: string; mode?: string; modelId?: string; requestHeader?: HeadersInit; withCredentials?: boolean; } ): Promise<this>; /** * Cancels asynchronous file loading started with {@link open | open()}. * * Fires: * * - {@link CancelEvent | calcel} */ cancel(): this; /** * Unloads an open file, clears the canvas and markups, deactivates the active dragger. * * Fires: * * - {@link ClearEvent | clear} */ clear(): this; /** * Returns `true` if current opened model is 3D model. */ is3D(): boolean; /** * Creates an overlay view. Overlay view is used to draw cutting planes and markups. */ syncOverlay(): void; /** * Clears the overlay view. */ clearOverlay(): void; /** * Removes all cutting planes. */ clearSlices(): void; /** * Returns a list of original handles for the selected objects. To avoid handle collisions in * assemblies (multi-model scenes), use {@link getSelected2} instead. * * @returns The list of original object handles. */ getSelected(): string[]; /** * Returns a list of original handles for the selected objects in assemblies (multi-model scenes). * * @returns The list of original object handles with model prefix in format "model:handle". */ getSelected2(): string[]; /** * Selects the objects by original handles. To avoid handle collisions in assemblies (multi-model * scenes), use {@link setSelected2} instead. * * Fires: * * - {@link SelectEvent | select} * - {@link Select2Event | select2} * * @param handles - The list of original handles. */ setSelected(handles?: string[]): void; /** * Selects the objects by original handles in assemblies (multi-model scenes). * * Fires: * * - {@link SelectEvent | select} * - {@link Select2Event | select2} * * @param handles - The list of original handles with model prefix in format "model:handle". */ setSelected2(handles?: string[]): void; /** * Unselects all objects. * * Fires: * * - {@link SelectEvent | select} */ clearSelected(): void; /** * Makes the selected objects invisible. * * Fires: * * - {@link HideEvent | hide} * - {@link SelectEvent | select} */ hideSelected(): void; /** * Hides all objects except selected. * * Fires: * * - {@link IsolateEvent | isolate} */ isolateSelected(): void; /** * Makes all objects visible. * * Fires: * * - {@link ShowAllEvent | showall} */ showAll(): void; /** * Breaks the model into its component objects. To collect objects back use index `0`. * * Fires: * * - {@link ExplodeEvent | explode} * * @param index - Explode index. Range is 0 to 100. */ explode(index: number): void; /** * Collect model objects back. Alias to {@link explode | explode(0)}. * * Fires: * * - {@link ExplodeEvent | explode} */ collect(): void; /** * Returns the active dragger reference, or `null` if there is no active dragger. */ activeDragger(): IDragger | null; /** * Changes the active dragger. The viewer must be initialized before activating the dragger, otherwise * an exception will be thrown. * * Fires: * * - {@link ChangeActiveDraggerEvent | changeactivedragger} * * @param name - Dragger name. Can be one of the {@link draggers} list or an ampty string to deactivate * the current dragger. * @returns Returns the new active dragger reference or `null` if there is no dragger with the given * name. */ setActiveDragger(name: string): IDragger | null; /** * Resets the state of the active dragger. */ resetActiveDragger(): void; /** * Returns the component reference, or `null` if there is no component with the specified name. * * @param name - Component name. Can be one of the {@link components} list. */ getComponent(name: string): IComponent | null; /** * Sets the viewer state to the specified viewpoint. * * To get a list of available viewpoints from the server for a specific file, use the * `File.getViewpoints()`. * * @param viewpoint - Viewpoint data. */ drawViewpoint(viewpoint: IViewpoint): void; /** * Saves the viewer state at the viewpoint. * * To save a viewpoint to the server for a specific file, use the `File.saveViewpoint()`. */ createViewpoint(): IViewpoint; }