@inweb/client 25.3.9 → 25.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.js +703 -681
- package/dist/client.js.map +1 -1
- package/dist/client.min.js +1 -1
- package/dist/client.module.js +618 -579
- package/dist/client.module.js.map +1 -1
- package/lib/Api/Client.d.ts +5 -8
- package/lib/Viewer/Viewer.d.ts +0 -6
- package/package.json +1 -1
- package/src/Api/Client.ts +44 -12
- package/src/Viewer/Viewer.ts +1 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.module.js","sources":["../packages/client/src/Api/Model.ts","../packages/client/src/Api/impl/http.ts","../packages/client/src/Api/impl/FetchError.ts","../packages/client/src/Api/impl/Utils.ts","../packages/client/src/Api/ClashTest.ts","../packages/client/src/Api/Assembly.ts","../packages/client/src/Viewer/CanvasEvents.ts","../packages/client/src/Viewer/EventEmitter2.ts","../packages/client/src/Api/HttpClient.ts","../packages/client/src/Viewer/Options.ts","../packages/client/src/Api/Permission.ts","../packages/client/src/Api/Job.ts","../packages/client/src/Api/File.ts","../packages/client/src/Api/Role.ts","../packages/client/src/Api/Member.ts","../packages/client/src/Api/Project.ts","../packages/client/src/Api/User.ts","../packages/client/src/Api/Client.ts","../packages/client/src/Viewer/Commands.ts","../packages/client/src/Viewer/Draggers/Common/OdaGeAction.ts","../packages/client/src/Viewer/Draggers/Common/OdBaseDragger.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/MeasureUtils.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/MeasureLineItem.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/index.ts","../packages/client/src/Viewer/Draggers/OdaWalkDragger.ts","../packages/client/src/Viewer/Draggers/OdBaseCuttingPlaneDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneXAxisDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneYAxisDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneZAxisDragger.ts","../packages/client/src/Viewer/Draggers/Actions/OrbitAction.ts","../packages/client/src/Viewer/Draggers/OdOrbitDragger.ts","../packages/client/src/Viewer/Draggers/Actions/PanAction.ts","../packages/client/src/Viewer/Draggers/OdPanDragger.ts","../packages/client/src/Viewer/Draggers/Actions/ZoomAction.ts","../packages/client/src/Viewer/Draggers/OdZoomDragger.ts","../packages/client/src/Viewer/Draggers/OdZoomWheelDragger.ts","../packages/client/src/Viewer/Draggers/OdZoomWindowDragger/OdSelectionFrame.ts","../packages/client/src/Viewer/Draggers/OdZoomWindowDragger/index.ts","../packages/client/src/Viewer/Draggers/OrbitAroundBuildingDragger.ts","../packages/client/src/Viewer/Draggers/Common/GestureManager.ts","../packages/client/src/Viewer/utils.ts","../packages/client/src/Viewer/Loaders/BaseLoader.ts","../packages/client/src/Viewer/Loaders/TCSLoader.ts","../packages/client/src/Viewer/Loaders/UpdaterController.ts","../packages/client/src/Viewer/Loaders/VsfXStreamingLoader.ts","../packages/client/src/Viewer/Loaders/VsfXPartialLoader.ts","../packages/client/src/Viewer/Loaders/VsfXLoader.ts","../packages/client/src/Viewer/Loaders/LoaderFactory.ts","../packages/client/src/Viewer/Markup/IMarkup.ts","../packages/client/src/Viewer/Markup/Impl/Konva/MarkupColor.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaLine.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaText.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaRectangle.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaEllipse.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaArrow.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaImage.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaCloud.ts","../packages/client/src/Viewer/Markup/Impl/Konva/KonvaMarkup.ts","../packages/client/src/Viewer/Draggers/OdaLineDragger.ts","../packages/client/src/Viewer/Draggers/OdaTextDragger.ts","../packages/client/src/Viewer/Markup/Impl/Visualize/VisualizeMarkup.ts","../packages/client/src/Viewer/Markup/MarkupFactory.ts","../packages/client/src/Viewer/Viewer.ts","../packages/client/src/Viewer/Commands/ApplyModelTransform.ts","../packages/client/src/Viewer/Commands/ClearMarkup.ts","../packages/client/src/Viewer/Commands/ClearSlices.ts","../packages/client/src/Viewer/Commands/CreatePreview.ts","../packages/client/src/Viewer/Commands/Explode.ts","../packages/client/src/Viewer/Commands/GetDefaultViewPositions.ts","../packages/client/src/Viewer/Commands/GetModels.ts","../packages/client/src/Viewer/Commands/GetSelected.ts","../packages/client/src/Viewer/Commands/HideSelected.ts","../packages/client/src/Viewer/Commands/IsolateSelected.ts","../packages/client/src/Viewer/Commands/RegenerateAll.ts","../packages/client/src/Viewer/Commands/ResetView.ts","../packages/client/src/Viewer/Commands/SelectModel.ts","../packages/client/src/Viewer/Commands/SetActiveDragger.ts","../packages/client/src/Viewer/Commands/SetDefaultViewPosition.ts","../packages/client/src/Viewer/Commands/SetMarkupColor.ts","../packages/client/src/Viewer/Commands/SetSelected.ts","../packages/client/src/Viewer/Commands/ShowAll.ts","../packages/client/src/Viewer/Commands/Unselect.ts","../packages/client/src/Viewer/Commands/ZoomToExtents.ts","../packages/client/src/Viewer/Commands/ZoomToObjects.ts","../packages/client/src/Viewer/Commands/ZoomToSelected.ts","../packages/client/src/index.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { File } from \"./File\";\nimport { Assembly } from \"./Assembly\";\n\n/**\n * The class representing the is a description of view of the file or assembly. For example,\n * for `dwg` it is a `Model` space or layout, and for `rvt` files it is a `3D` view.\n */\nexport class Model {\n private _data: any;\n private _file: File | Assembly;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements model data storage.\n * @param file - The `File` of 'Assembly' instance that owns the model.\n */\n constructor(data: any, file: File | Assembly) {\n this.path = `${file.path}/downloads`;\n this.httpClient = file.httpClient;\n this._file = file;\n this._data = data;\n }\n\n /**\n * The `Assembly` instance that owns the model.\n *\n * @readonly\n */\n get assembly(): Assembly {\n return this._file as Assembly;\n }\n\n /**\n * Raw model data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * Scene description file resource ID. Use {@link Model#downloadResource | downloadResource()}\n * to download scene description file.\n *\n * @readonly\n */\n get database(): string {\n return this.data.database;\n }\n\n /**\n * `true` if this is default model.\n *\n * @readonly\n */\n get default(): boolean {\n return this.data.default;\n }\n\n /**\n * The `File` instance that owns the model.\n *\n * @readonly\n */\n get file(): File {\n return this._file as File;\n }\n\n /**\n * The ID of the file that owns the model.\n *\n * @readonly\n */\n get fileId(): string {\n return this.data.fileId;\n }\n\n /**\n * The list of resource IDs for geometry data files. Use\n * {@link Model#downloadResource | downloadResource()} to download geometry data files.\n *\n * @readonly\n */\n get geometry(): string[] {\n return this.data.geometry;\n }\n\n /**\n * Unique model ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Model name.\n *\n * @readonly\n */\n get name(): string {\n return this.data.name;\n }\n\n // Reserved for future use.\n get version(): string {\n return this.data.version;\n }\n\n /**\n * Returns model viewpoint list.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n */\n getViewpoints(): Promise<any[]> {\n return this._file\n .getViewpoints()\n .then((array) =>\n array.filter(\n ({ custom_fields = {} }) => custom_fields.modelId === this.id || custom_fields.modelName === this.name\n )\n );\n }\n\n /**\n * Add new model viewpoint. To create a new viewpoint use\n * {@link Viewer#createViewpoint | Viewer.createViewpoint()}.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n * @param viewpoint - Viewpoint.\n */\n saveViewpoint(viewpoint: any): Promise<any> {\n return this._file.saveViewpoint({\n ...viewpoint,\n custom_fields: { ...viewpoint.custom_fields, modelId: this.id, modelName: this.name },\n });\n }\n\n /**\n * Delete model viewpoint.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @returns Returns the raw data of a deleted viewpoint.\n */\n deleteViewpoint(guid: string): Promise<any> {\n return this._file.deleteViewpoint(guid);\n }\n\n /**\n * Returns viewpoint preview image as <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n *\n * @async\n * @param guid - Viewpoint GIID.\n */\n getSnapshot(guid: string): Promise<string> {\n return this._file.getSnapshot(guid);\n }\n\n /**\n * Returns snapshot data.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @param bitmapGuid - Bitmap GUID.\n */\n getSnapshotData(guid: string, bitmapGuid: string): Promise<string> {\n return this._file.getSnapshotData(guid, bitmapGuid);\n }\n\n /**\n * Downloads model resource, such as scene description file or geometry data files.\n *\n * @async\n * @param resourceId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this._file.downloadResource(dataId, onProgress, signal);\n }\n\n // Internal download routines used by Viewer.\n\n partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ): Promise<void> {\n return this._file.partialDownloadResource(dataId, onProgress, signal);\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ): Promise<void> {\n return this._file.downloadFileRange(requestId, records, dataId, onProgress, signal);\n }\n\n /**\n * Returns a list of references to files used to extract geometry data.\n *\n * @async\n * @param [signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n getReferences(signal?: AbortSignal) {\n return this._file.getReferences(signal);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport const STATUS_CODES = {\n 100: \"Continue\",\n 101: \"Switching Protocols\",\n 102: \"Processing\",\n 103: \"Early Hints\",\n 200: \"OK\",\n 201: \"Created\",\n 202: \"Accepted\",\n 203: \"Non-Authoritative Information\",\n 204: \"No Content\",\n 205: \"Reset Content\",\n 206: \"Partial Content\",\n 207: \"Multi-Status\",\n 208: \"Already Reported\",\n 226: \"IM Used\",\n 300: \"Multiple Choices\",\n 301: \"Moved Permanently\",\n 302: \"Found\",\n 303: \"See Other\",\n 304: \"Not Modified\",\n 305: \"Use Proxy\",\n 307: \"Temporary Redirect\",\n 308: \"Permanent Redirect\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 407: \"Proxy Authentication Required\",\n 408: \"Request Time-out\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 414: \"URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Range Not Satisfiable\",\n 417: \"Expectation Failed\",\n 418: \"I'm a teapot\",\n 421: \"Misdirected Request\",\n 422: \"Unprocessable Entity\",\n 423: \"Locked\",\n 424: \"Failed Dependency\",\n 425: \"Too Early\",\n 426: \"Upgrade Required\",\n 428: \"Precondition Required\",\n 429: \"Too Many Requests\",\n 431: \"Header Fields Too Large\",\n 451: \"Unavailable For Legal Reasons\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\",\n 506: \"Variant Also Negotiates\",\n 507: \"Insufficient Storage\",\n 508: \"Loop Detected\",\n 509: \"Bandwidth Limit Exceeded\",\n 510: \"Not Extended\",\n 511: \"Network Authentication Required\",\n};\n\nexport function statusText(status: number): string {\n return STATUS_CODES[status] || `Error ${status}`;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { statusText } from \"./http\";\n\n/**\n * The `FetchError` object indicates an error when request to Open Cloud Server could not be\n * performed. A `FetchError` is typically (but not exclusively) thrown when a network error\n * occurs, access denied, or object not found.\n */\n\nexport class FetchError extends Error {\n protected status: number;\n protected statusText: string;\n\n /**\n * @property status - The <a href=\"https://developer.mozilla.org/docs/Web/HTTP/Status\" target\n * =\"_blank\">HTTP status code</a> of the response.\n * @property message - Error message. Inherited from <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Error\"\n * target =\"_blank\">Error</a>.\n */\n constructor(status: number, message?: string) {\n super(message || statusText(status));\n this.status = status;\n this.statusText = statusText(status);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FetchError } from \"./FetchError\";\nimport { statusText } from \"./http\";\n\nexport function json(request: any): any {\n return request.then((response) => response.json());\n}\n\nexport function text(request: any): any {\n return request.then((response) => response.text());\n}\n\nexport function arrayBuffer(request: any): any {\n return request.then((response) => response.arrayBuffer());\n}\n\nfunction error400(text: string, _default = \"400\") {\n try {\n return JSON.parse(text).description;\n } catch {\n return _default;\n }\n}\n\nfunction handleXMLHttpError(xhr: any): Promise<any> {\n if (xhr.status === 0) {\n return Promise.reject(new FetchError(0, \"Network error\"));\n }\n if (xhr.status < 200 || xhr.status > 299) {\n switch (xhr.status) {\n case 400: {\n console.error(xhr.responseText);\n return Promise.reject(new FetchError(400, error400(xhr.responseText)));\n }\n case 500: {\n console.error(error400(xhr.responseText, xhr.responseText));\n return Promise.reject(new FetchError(500));\n }\n default: {\n return Promise.reject(new FetchError(xhr.status));\n }\n }\n }\n return Promise.resolve(xhr);\n}\n\nfunction handleFetchError(response: Response): Promise<Response> {\n if (!response.ok) {\n switch (response.status) {\n case 400: {\n return response.text().then((text) => {\n console.error(text);\n return Promise.reject(new FetchError(400, error400(text)));\n });\n }\n case 500: {\n return response.text().then((text) => {\n console.error(error400(text, text));\n return Promise.reject(new FetchError(500));\n });\n }\n default:\n return Promise.reject(new FetchError(response.status, statusText(response.status)));\n }\n }\n return Promise.resolve(response);\n}\n\nexport function $init(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null,\n signal?: AbortSignal\n): RequestInit {\n headers = { ...headers };\n headers[\"Content-Type\"] = \"application/json\";\n\n if (method === \"POST\" || method === \"PUT\") {\n if (body instanceof FormData) {\n delete headers[\"Content-Type\"];\n } else if (body instanceof File || body instanceof Blob) {\n const formData = new FormData();\n formData.append(\"file\", body);\n return $init(method, headers, formData, signal);\n } else if (body instanceof ArrayBuffer) {\n const blob = new Blob([body]);\n return $init(method, headers, blob, signal);\n } else if (body && typeof body === \"object\") {\n body = JSON.stringify(body);\n } else if (typeof body === \"string\") {\n headers[\"Content-Type\"] = \"text/plain\";\n }\n }\n\n const result = { method, headers } as RequestInit;\n\n // body with type \"object\", converted to type \"string\" in the code above\n if (\n body &&\n (body instanceof ArrayBuffer ||\n body instanceof Blob ||\n body instanceof globalThis.File ||\n body instanceof FormData ||\n typeof body === \"string\")\n ) {\n result.body = body;\n }\n\n if (signal) result.signal = signal;\n\n return result;\n}\n\nexport function $fetch(url: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n return fetch(url, init).then((response) => handleFetchError(response));\n}\n\nexport function $get(url: RequestInfo | URL, headers?: HeadersInit, signal?: AbortSignal): Promise<Response> {\n return $fetch(url, $init(\"GET\", headers, null, signal));\n}\n\nexport function $put(\n url: RequestInfo | URL,\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n) {\n return $fetch(url, $init(\"PUT\", headers, body));\n}\n\nexport function $post(\n url: RequestInfo | URL,\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n) {\n return $fetch(url, $init(\"POST\", headers, body));\n}\n\nexport function $delete(url: RequestInfo | URL, headers?: HeadersInit) {\n return $fetch(url, $init(\"DELETE\", headers));\n}\n\nexport function streamProgress(stream: ReadableStream<Uint8Array>, onprogress: (progress: number) => void) {\n const reader = stream.getReader();\n let current = 0;\n\n function calc(ev) {\n if (!ev.done) {\n reader.read().then(calc).catch(console.error);\n }\n if (ev.value) current += ev.value.length;\n onprogress(current);\n }\n\n reader.read().then(calc).catch(console.error);\n\n return stream;\n}\n\nexport function downloadProgress(response: Response, onprogress?: (progress: number) => void): Response {\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const tee = response.body.tee();\n streamProgress(tee[0], (bytesCount: number) => onprogress && onprogress(bytesCount / total));\n return new Response(tee[1]);\n}\n\ninterface XMLHttpParams {\n headers: HeadersInit;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: XMLHttpRequestBodyInit | Document;\n uploadProgress?: (progress: number) => void;\n downloadProgress?: (progress: number) => void;\n}\n\nexport function $XMLHttp(\n url: string,\n { headers, method, body, uploadProgress, downloadProgress }: XMLHttpParams\n): Promise<XMLHttpRequest> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, true);\n for (const key in headers) {\n xhr.setRequestHeader(key, headers[key]);\n }\n function calcProgress(event) {\n return event.lengthComputable ? event.loaded / event.total : 1;\n }\n xhr.upload.onprogress = (event) => uploadProgress && uploadProgress(calcProgress(event));\n xhr.onprogress = (event) => downloadProgress && downloadProgress(calcProgress(event));\n xhr.onloadend = (event) => handleXMLHttpError(event.target).then(resolve, reject);\n xhr.send(body);\n });\n}\n\nfunction delay(ms: number, signal: AbortSignal) {\n return new Promise((resolve) => {\n let timeoutId = 0;\n\n const abortHandler = () => {\n clearTimeout(timeoutId);\n resolve(true);\n };\n\n timeoutId = window.setTimeout(() => {\n signal.removeEventListener(\"abort\", abortHandler);\n resolve(false);\n }, ms);\n\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n });\n}\n\nexport async function waitFor(\n func: (params: any) => Promise<boolean>,\n params: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n abortError?: DOMException;\n timeoutError?: DOMException;\n result?: any;\n } = {}\n) {\n const timeout = params.timeout ?? 600000;\n const interval = params.interval ?? 3000;\n const signal = params.signal ?? new AbortController().signal;\n const abortError = params.abortError ?? new DOMException(\"Aborted\", \"AbortError\");\n const timeoutError = params.timeoutError ?? new DOMException(\"Timeout\", \"TimeoutError\");\n\n const end = performance.now() + timeout;\n let count = timeout / interval;\n\n do {\n if (await func(params)) return Promise.resolve(params.result);\n if ((await delay(interval, signal)) || signal.aborted) return Promise.reject(abortError);\n } while (performance.now() < end && --count > 0);\n\n return Promise.reject(timeoutError);\n}\n\nexport async function downloadPartOfFile(\n requestId: number,\n records: any | null,\n url: string,\n defHeaders: HeadersInit,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n const headers = { ...defHeaders };\n const isMultipleResourceParts = records && records.length;\n if (records) {\n const ranges: string[] = [];\n if (isMultipleResourceParts) {\n for (let i = 0; i < records.length; i++) {\n const record = records[i];\n ranges.push(`${record.begin}-${record.end}`);\n }\n } else {\n for (let i = 0; i < records.size(); i++) {\n const record = records.get(i);\n ranges.push(`${record.begin}-${record.end}`);\n record.delete();\n }\n }\n headers[\"Range\"] = \"bytes=\" + ranges.join(\",\");\n }\n\n const response = await $fetch(url, $init(\"GET\", headers, null, signal));\n const contentLength = response.headers.get(\"content-length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n\n const reader = response.body.getReader();\n\n if (isMultipleResourceParts) {\n let curRecordIndex = 0;\n let curRecordPos = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n let totalLeft = value.byteLength;\n let loadedPos = 0;\n while (totalLeft > 0) {\n const curRecord = records[curRecordIndex];\n const recLeft = curRecord.size - curRecordPos;\n if (totalLeft < recLeft) {\n const buf = value.subarray(loadedPos, loadedPos + totalLeft);\n if (typeof onProgress === \"function\") onProgress(loadedPos / total, buf, curRecord.reqId);\n curRecordPos += totalLeft;\n totalLeft = 0;\n } else {\n const buf = value.subarray(loadedPos, loadedPos + recLeft);\n if (typeof onProgress === \"function\") onProgress(loadedPos / total, buf, curRecord.reqId);\n curRecordIndex++;\n curRecordPos = 0;\n loadedPos += recLeft;\n totalLeft -= recLeft;\n }\n }\n }\n } else {\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (onProgress) onProgress(loaded / total, value, requestId);\n }\n }\n}\n\nexport function parseArgs(args: string | object): object {\n if (typeof args === \"string\") {\n const firstArg = args.indexOf(\"--\");\n if (firstArg !== -1) args = args.slice(firstArg);\n const argArray = args\n .split(\"--\")\n .map((x) =>\n x\n .split(\"=\")\n .map((y) => y.split(\" \"))\n .flat()\n )\n .filter((x) => x[0])\n .map((x) => x.concat([\"\"]));\n return Object.fromEntries(argArray);\n }\n return args ?? {};\n}\n\nexport function userFullName(firstName: string | any, lastName = \"\", userName = \"\"): string {\n if (firstName && typeof firstName !== \"string\") {\n return userFullName(firstName.firstName ?? firstName.name, firstName.lastName, firstName.userName);\n }\n return `${firstName ?? \"\"} ${lastName ?? \"\"}`.trim() || userName;\n}\n\nexport function userInitials(fullName = \"\"): string {\n const names = fullName.split(\" \").filter((x) => x);\n return names\n .reduce((initials, name, index) => {\n if (index === 0 || index === names.length - 1) initials += name.charAt(0);\n return initials;\n }, \"\")\n .toUpperCase();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { waitFor, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * The base class provides information about the file/assembly clash detection test and test results.\n */\nexport class ClashTest {\n private _data: any;\n private basePath: string;\n private httpClient: IHttpClient;\n\n /**\n * @param data - Raw test data.\n * @param basePath - Clash tests API base path for the owner file/assembly.\n * @param httpClient - Http client.\n */\n constructor(data: any, basePath: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.basePath = basePath;\n this.data = data;\n }\n\n protected internalGet(relativePath: string): Promise<any> {\n return this.httpClient.get(`${this.basePath}/clashes/${this.id}${relativePath}`);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ): Promise<any> {\n return this.httpClient.put(`${this.basePath}/clashes/${this.id}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string): Promise<any> {\n return this.httpClient.delete(`${this.basePath}/clashes/${this.id}${relativePath}`);\n }\n\n /**\n * The type of the clashes that the test detects:\n *\n * - `Сlearance clash` (true) - a clash in which the entity A may or may not intersect with\n * entity B, but comes within a distance of less than the `tolerance`.\n * - `Hard clash` (false) - a clash in which the entity A intersects with entity B by a\n * distance of more than the `tolerance`.\n *\n * @readonly\n */\n get clearance(): boolean {\n return this.data.clearance;\n }\n\n /**\n * Test creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Raw test data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n }\n\n /**\n * Unique test ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Test last update (UTC) time in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get lastModifiedAt(): string {\n return this.data.lastModifiedAt;\n }\n\n /**\n * Test name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * Test owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * First selection set for clash detection. Entities from `selectionSetA` will be tested\n * against each others by entities from the `selectionSetB` during the test.\n *\n * @readonly\n */\n get selectionSetA(): string[] {\n return this.data.selectionSetA;\n }\n\n /**\n * The type of first selection set for clash detection. Can be one of:\n *\n * - `all` - All file/assembly entities.\n * - `handle` - Entities with handles specified in the `selectionSetA`.\n * - `models` - Entities of file/assembly models specified in `selectionSetA`.\n * - `searchquery` - Entities retrieved by the search queries specified in `selectionSetA`.\n *\n * @readonly\n */\n get selectionTypeA(): string {\n return this.data.selectionTypeA;\n }\n\n /**\n * Second selection set for clash detection. Entities from `selectionSetB` will be tested\n * against each others by entities from the `selectionSetA` during the test.\n *\n * @readonly\n */\n get selectionSetB(): string[] {\n return this.data.selectionSetB;\n }\n\n /**\n * The type of second selection set for clash detection. Can be one of:\n *\n * - `all` - All file/assembly entities.\n * - `handle` - Entities with handles specified in the `selectionSetB`.\n * - `models` - Entities of file/assembly models specified in `selectionSetB`.\n * - `searchquery` - Entities retrieved by the search queries specified in `selectionSetB`.\n *\n * @readonly\n */\n get selectionTypeB(): string {\n return this.data.selectionTypeB;\n }\n\n /**\n * Test status. Can be `none`, `waiting`, `inprogress`, `done` or `failed`.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * The distance of separation between entities at which test begins detecting clashes.\n *\n * @readonly\n */\n get tolerance(): number {\n return this.data.tolerance;\n }\n\n /**\n * Refresh test data.\n *\n * @async\n */\n checkout(): Promise<this> {\n return this.internalGet(\"\")\n .then((response) => response.json())\n .then((data) => {\n this.data = data;\n return this;\n });\n }\n\n /**\n * Update test data on the server.\n *\n * @async\n * @param data - Raw test data.\n */\n update(data: any): Promise<this> {\n return this.internalPut(\"\", data)\n .then((response) => response.json())\n .then((data) => {\n this.data = data;\n return this;\n });\n }\n\n /**\n * Remove a test from a file.\n *\n * @async\n * @returns Returns the raw data of a deleted test.\n */\n delete(): Promise<any> {\n return this.internalDelete(\"\").then((response) => response.json());\n }\n\n /**\n * Save test data changes to the server. Call this method to update test data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<this> {\n return this.update(this.data);\n }\n\n /**\n * Wait for test to complete. Test is done when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait test. If\n * test is not complete during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking test status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n waitForDone(params?: { timeout?: number; interval?: number; signal?: AbortSignal }) {\n const checkDone = () => this.checkout().then((test) => [\"done\", \"failed\"].includes(test.status));\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a report with the clash detection results for this test.\n *\n * @async\n */\n getReport(): Promise<any> {\n return this.internalGet(\"/report\").then((response) => response.json());\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IAssociatedFileData, IAssemblyVersionInfo } from \"./IAssembly\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Model } from \"./Model\";\nimport { ClashTest } from \"./ClashTest\";\nimport { json, downloadProgress, downloadPartOfFile, waitFor, userFullName, userInitials } from \"./impl/Utils\";\nimport { FetchError } from \"./impl/FetchError\";\n\n/**\n * The class representing a `assembly` entity.\n */\nexport class Assembly {\n private _data: any;\n private _useVersion: number | undefined;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements assembly data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.path = `/assemblies/${data.id}`;\n this.httpClient = httpClient;\n this.data = data;\n }\n\n public appendVersionParam(relativePath: string): string {\n if (this._useVersion === undefined) return relativePath;\n\n const delimiter = relativePath.includes(\"?\") ? \"&\" : \"?\";\n return `${relativePath}${delimiter}version=${this._useVersion}`;\n }\n\n protected internalGet(relativePath: string, signal?: AbortSignal) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.get(`${this.path}${relativePath}`, signal);\n }\n\n protected internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.post(`${this.path}${relativePath}`, body);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.put(`${this.path}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.delete(`${this.path}${relativePath}`);\n }\n\n async partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ): Promise<void> {\n let pathname = `${this.path}/downloads/${dataId}`;\n pathname = this.appendVersionParam(pathname);\n\n // TODO: replace with $get to handle fetch errors\n const response = await fetch(`${this.httpClient.serverUrl}${pathname}`, {\n headers: this.httpClient.headers,\n signal,\n });\n\n // TODO: use ReadableStream pipeTo()\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const reader = response.body.getReader();\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (typeof onProgress === \"function\") onProgress(loaded / total, value);\n }\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ): Promise<void> {\n let pathname = `${this.path}/downloads/${dataId}?requestId=${requestId}`;\n pathname = this.appendVersionParam(pathname);\n return downloadPartOfFile(\n requestId,\n records,\n `${this.httpClient.serverUrl}${pathname}`,\n this.httpClient.headers,\n onProgress,\n signal\n );\n }\n\n // Reserved for future use\n\n get activeVersion(): number {\n return this.data.activeVersion;\n }\n\n /**\n * List of unique files from which the assembly was created.\n *\n * @readonly\n */\n get associatedFiles(): IAssociatedFileData[] {\n return this.data.associatedFiles;\n }\n\n /**\n * Assembly creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get created(): string {\n return this.data.created;\n }\n\n /**\n * Raw assembly data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n // associatedFiles since 23.12\n this._data.associatedFiles ??= [];\n this._data.associatedFiles.forEach((file) => (file.link = `${this.httpClient.serverUrl}/files/${file.fileId}`));\n }\n\n /**\n * List of file IDs from which the assembly was created.\n *\n * @readonly\n */\n get files(): string[] {\n return this.data.files;\n }\n\n /**\n * Assembly geometry data type:\n *\n * - `vsfx` - VSFX, assembly can be opened in `VisualizeJS` viewer.\n *\n * Returns an empty string if geometry data has not yet been extracted.\n */\n get geometryType(): string {\n return this.status === \"done\" ? \"vsfx\" : \"\";\n }\n\n /**\n * Unique assembly ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Assembly name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n // Reserved for future use\n\n get originalAssemblyId(): string {\n return this.data.originalAssemblyId;\n }\n\n /**\n * Assembly owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n // Reserved for future use\n\n get previewUrl(): string {\n return this.data.previewUrl ?? \"\";\n }\n\n /**\n * List of assembly related job IDs.\n *\n * @readonly\n */\n get relatedJobs(): string[] {\n return this.data.relatedJobs;\n }\n\n /**\n * Assembly geometry data and properties status. Can be `waiting`, `inprogress`, `done` or `failed`.\n *\n * An assemblies without geometry data cannot be opened in viewer.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * Assembly type. Returns an `assembly`.\n *\n * @readonly\n */\n get type(): string {\n return \"assembly\";\n }\n\n // Reserved for future use\n\n get version(): number {\n return this.data.version;\n }\n\n get versions(): IAssemblyVersionInfo[] {\n return this.data.versions;\n }\n\n /**\n * Refresh assembly data.\n *\n * @async\n */\n async checkout(): Promise<Assembly> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Updates assembly data on the server.\n *\n * @async\n * @param data - Raw assembly data.\n */\n async update(data: any): Promise<Assembly> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the assembly from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted assembly.\n */\n delete(): Promise<any> {\n return json(this.internalDelete(\"\"));\n }\n\n /**\n * Save assembly data changes to the server. Call this method to update assembly data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Assembly> {\n return this.update(this.data);\n }\n\n // Reserved for future use\n\n setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null) {\n console.warn(\"Assembly does not support preview\");\n return Promise.resolve(this);\n }\n\n /**\n * Returns list of assembly models.\n *\n * @async\n */\n getModels(): Promise<Model[]> {\n return json(this.internalGet(\"/geometry\")).then((array) => array.map((data) => new Model(data, this)));\n }\n\n /**\n * Transformation matrix.\n *\n * @typedef {any} Transform\n * @property {any} translate - Translation part, move along the X, Y, Z axes.\n * @property {number} translate.x - The value for substruct for X axes.\n * @property {number} translate.y - The value for substruct for Y axes.\n * @property {number} translate.z - The value for substruct for Z axes.\n * @property {any} rotation - Rotation part, rotate by the specified angle, around the\n * specified vector.\n * @property {number} rotation.x - X coordinate of the rotation vector.\n * @property {number} rotation.y - Y coordinate of the rotation vector.\n * @property {number} rotation.z - Z coordinate of the rotation vector.\n * @property {number} rotation.angle - The angle of rotation.\n * @property {number} scale - Scaling part, scale with multiplier, from center of extends.\n */\n\n /**\n * Returns a model transformation.\n *\n * @param handle - Model handle.\n */\n getModelTransformMatrix(handle: string): any {\n return this.data.transform[handle];\n }\n\n /**\n * Set or delete a model transformation.\n *\n * @async\n * @param handle - Model handle.\n * @param transform - Transformation matrix. To delete transformation provide this to `undefined`.\n */\n setModelTransformMatrix(handle: string, transform: any): Promise<Assembly> {\n const obj = { ...this.data.transform };\n obj[handle] = transform;\n return this.update({ transform: obj });\n }\n\n /**\n * Returns the properties for an objects in the assembly.\n *\n * @async\n * @param handles - Object original handle or handles array. Leave this parameter undefined\n * to get properties for all objects in the assembly.\n * @returns {Promise<any>}\n */\n getProperties(handles?: string | string[]): Promise<any[]> {\n return json(this.internalGet(handles !== undefined ? `/properties?handles=${handles}` : \"/properties\"));\n }\n\n /**\n * Returns the list of original handles for an objects in the file that match the specified\n * patterns. Search patterns may be combined using query operators.\n *\n * @async\n * @example <caption>Simple search pattern.</caption>\n * searchPattern = {\n * key: \"Category\",\n * value: \"OST_Stairs\",\n * };\n *\n * @example <caption>Search patterns combination.</caption>\n * searchPattern = {\n * $or: [\n * {\n * $and: [\n * { key: \"Category\", value: \"OST_GenericModel\" },\n * { key: \"Level\", value: \"03 - Floor\" },\n * ],\n * },\n * { key: \"Category\", value: \"OST_Stairs\" },\n * ],\n * };\n *\n * @param searchPattern - Search pattern or combination of the patterns, see example below.\n */\n searchProperties(searchPattern: any): Promise<any[]> {\n return json(this.internalPost(\"/properties/search\", searchPattern));\n }\n\n /**\n * Returns the cda.json for an assembly.\n *\n * @async\n */\n getCdaTree(): Promise<any[]> {\n return json(this.internalGet(`/properties/tree`));\n }\n\n // Reserved for future use\n\n getViewpoints(): Promise<[]> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve([]);\n }\n\n saveViewpoint(viewpoint: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n deleteViewpoint(guid: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n getSnapshot(guid: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n getSnapshotData(guid: any, bitmapGuid: any): Promise<string> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve(\"\");\n }\n\n /**\n * Download assembly resource data, such as geometry data.\n *\n * @async\n * @param dataId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads/${dataId}`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n // Reserved for future use\n\n getReferences(signal?: AbortSignal) {\n return Promise.resolve({ fileId: \"\", references: [] });\n }\n\n /**\n * Wait for assembly to be created. Assembly is created when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait assembly.\n * If assembly is not created during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking assembly status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onCheckout - Waiting progress callback. Return `true` to cancel waiting.\n * @returns {Promise<Assembly>}\n */\n waitForDone(params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (assembly: Assembly, ready: boolean) => boolean;\n }): Promise<Assembly> {\n const checkDone = () =>\n this.checkout().then((assembly) => {\n const ready = [\"done\", \"failed\"].includes(assembly.status);\n const cancel = params?.onCheckout?.(assembly, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a list of assembly clash tests.\n *\n * @async\n * @param {number} start - The starting index in the test list. Used for paging.\n * @param {number} limit - The maximum number of tests that should be returned per request.\n * Used for paging.\n * @param {string} name - Filter the tests by part of the name.\n * @param {string | string[]} ids - List of tests IDs to return. You can specify multiple IDs\n * on one `string` by separating them with a \"|\".\n * @param {bool} sortByDesc - Allows to specify the descending order of the result. By\n * default tests are sorted by name in ascending order.\n * @param {string} sortField - Allows to specify sort field.\n */\n getClashTests(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: ClashTest[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return this.internalGet(`/clashes${queryString}`)\n .then((response) => response.json())\n .then((tests) => {\n return {\n ...tests,\n result: tests.result.map((data) => new ClashTest(data, this.path, this.httpClient)),\n };\n });\n }\n\n /**\n * Returns the assembly clash test information.\n *\n * @async\n * @param testId - Test ID.\n */\n getClashTest(testId: string): Promise<ClashTest> {\n return this.internalGet(`/clashes/${testId}`)\n .then((response) => response.json())\n .then((data) => new ClashTest(data, this.path, this.httpClient));\n }\n\n /**\n * Create assembly clash test. Assembly must be in a `done` state, otherwise the test will fail.\n *\n * @async\n * @param name - Test name.\n * @param selectionTypeA - The type of first selection set for clash detection. Can be `all`,\n * `handles`, `models` or `searchquery`.\n * @param selectionTypeB - The type of second selection set for clash detection. Can be\n * `all`, `handles`, `models` or `searchquery`.\n * @param selectionSetA - First selection set for clash detection.\n * @param selectionSetB - Second selection set for clash detection.\n * @param params - An object containing test parameters.\n * @param params.tolerance - The distance of separation between entities at which test begins\n * detecting clashes.\n * @param params.clearance - The type of the clashes that the test detects: `true` for\n * `Сlearance clash` or `false` for `Hard clash`.\n * @param params.waitForDone - Wait for test to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait test. If\n * test is not complete during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking test status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n createClashTest(\n name: string,\n selectionTypeA: string,\n selectionTypeB: string,\n selectionSetA?: string | string[],\n selectionSetB?: string | string[],\n params?: {\n tolerance?: number | string;\n clearance?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n }\n ): Promise<ClashTest> {\n const { tolerance, clearance, waitForDone } = params ?? {};\n if (!Array.isArray(selectionSetA)) selectionSetA = [selectionSetA];\n if (!Array.isArray(selectionSetB)) selectionSetB = [selectionSetB];\n\n return this.internalPost(\"/clashes\", {\n name,\n selectionTypeA,\n selectionTypeB,\n selectionSetA,\n selectionSetB,\n tolerance,\n clearance,\n })\n .then((response) => response.json())\n .then((data) => new ClashTest(data, this.path, this.httpClient))\n .then((result) => (waitForDone ? result.waitForDone(params) : result));\n }\n\n /**\n * Delete assembly clash test.\n *\n * @async\n * @param testId - Test ID.\n * @returns Returns the raw data of a deleted test.\n */\n deleteClashTest(testId: string): Promise<any> {\n return this.internalDelete(`/clashes/${testId}`).then((response) => response.json());\n }\n\n // Reserved for future use\n\n updateVersion(\n files?: string[],\n params: {\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n waitForDone: false,\n }\n ): Promise<Assembly> {\n return Promise.reject(new Error(\"Assembly version support will be implemeted in a future release\"));\n }\n\n getVersions(): Promise<Assembly[] | undefined> {\n return Promise.resolve(undefined);\n }\n\n getVersion(version: number): Promise<Assembly> {\n return Promise.reject(new FetchError(404));\n }\n\n deleteVersion(version: number): Promise<any> {\n return Promise.reject(new FetchError(404));\n }\n\n setActiveVersion(version: number) {\n return this.update({ activeVersion: version });\n }\n\n useVersion(version?: number) {\n this._useVersion = undefined;\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport const CANVAS_EVENTS = [\n \"click\",\n \"dblclick\",\n \"mousedown\",\n \"mousemove\",\n \"mouseup\",\n \"mouseleave\",\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointerleave\",\n \"pointercancel\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchend\",\n \"touchcancel\",\n];\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IEvent, IEventEmitter } from \"./IEventEmitter2\";\n\n/**\n * The minimal basic Event that can be emitted by a {@link EventEmitter2}.\n */\nexport interface Event<T extends string = string> extends IEvent {\n type: T;\n}\n\n/**\n * Event emitter for custom objects.\n */\nexport class EventEmitter2<EventMap extends Record<string, any> = Record<string, any>> implements IEventEmitter {\n private _listeners = undefined;\n\n /**\n * Registers a new listener for an event type.\n *\n * @param type - The type of event to listen to.\n * @param listener - The function that gets called when the event is fired.\n */\n addEventListener<T extends keyof EventMap>(type: T, listener: (event: EventMap[T]) => void): this {\n if (this._listeners === undefined) this._listeners = {};\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n\n /**\n * Removes the listener from an event type.\n *\n * @param type - The type of the listener that gets removed.\n * @param listener - The listener function that gets removed.\n */\n removeEventListener<T extends keyof EventMap>(type: T, listener: (event: EventMap[T]) => void): this {\n if (this._listeners === undefined) return this;\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x) => x !== listener);\n this._listeners[type] = listeners.length === 0 ? undefined : listeners;\n return this;\n }\n\n /**\n * If `type` is specified, removes all registered listeners for type, otherwise removes all\n * registered listeners.\n *\n * @param type - The type of the listener that gets removed.\n */\n removeAllListeners<T extends keyof EventMap>(type?: T): this {\n if (type) this._listeners[type] = undefined;\n else this._listeners = undefined;\n return this;\n }\n\n /**\n * Fires the event. Calls each of the listeners registered for the event type `event.type`,\n * in the order they were registered.\n *\n * @param event - The event that gets fired.\n */\n emitEvent<T extends keyof EventMap>(event: Event<Extract<T, string>> & EventMap[T]): boolean {\n if (this._listeners === undefined) return false;\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener) => listener.call(this, event));\n return true;\n }\n\n // Node.js style, to emit custom events\n\n /**\n * Alias to {@link EventEmitter2.addEventListener()}\n */\n on(type: string, listener: (event: object) => void): this {\n return this.addEventListener(type as any, listener as any);\n }\n\n /**\n * Alias to {@link EventEmitter2.removeEventListener()}.\n */\n off(type: string, listener: (event: object) => void): this {\n return this.removeEventListener(type as any, listener as any);\n }\n\n /**\n * Alias to {@link EventEmitter2.emitEvent()}.\n */\n emit(event: string | object, ...args: any[]): boolean {\n if (typeof event === \"string\") return this.emitEvent({ type: event, args } as any);\n else if (typeof event === \"object\") return this.emitEvent(event as any);\n else return false;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { $get, $delete, $post, $put, $XMLHttp } from \"./impl/Utils\";\n\nexport class HttpClient implements IHttpClient {\n serverUrl: string;\n headers: HeadersInit;\n signInUserId: string;\n\n constructor(serverUrl: string) {\n this.serverUrl = serverUrl;\n }\n\n get(relativePath: string, signal?: AbortSignal): Promise<Response> {\n return $get(`${this.serverUrl}${relativePath}`, this.headers, signal);\n }\n\n post(\n relativePath: string,\n body?: string | object | ArrayBuffer | Blob | globalThis.File | FormData\n ): Promise<Response> {\n return $post(`${this.serverUrl}${relativePath}`, this.headers, body);\n }\n\n put(\n relativePath: string,\n body?: string | object | ArrayBuffer | Blob | globalThis.File | FormData\n ): Promise<Response> {\n return $put(`${this.serverUrl}${relativePath}`, this.headers, body);\n }\n\n delete(relativePath: string): Promise<Response> {\n return $delete(`${this.serverUrl}${relativePath}`, this.headers);\n }\n\n postFile(\n relativePath: string,\n file: globalThis.File,\n onProgress?: (progress: number) => void\n ): Promise<XMLHttpRequest> {\n const data = new FormData();\n data.append(\"file\", file);\n\n return $XMLHttp(`${this.serverUrl}${relativePath}`, {\n method: \"POST\",\n headers: this.headers,\n body: data,\n uploadProgress: onProgress,\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { EventEmitter2 } from \"./EventEmitter2\";\n\nexport interface RGB {\n red: number;\n green: number;\n blue: number;\n}\n\n/**\n * `VisualizeJS` parameters.\n */\nexport interface OptionsData {\n /**\n * Show WCS\n *\n * @defaultValue true\n */\n showWCS?: boolean;\n\n /**\n * Enable camera animation\n *\n * @defaultValue true\n */\n cameraAnimation?: boolean;\n\n /**\n * Enable antialiasing use FXAA\n *\n * @defaultValue true\n */\n antialiasing?: boolean;\n\n /**\n * Enable ground shadows\n *\n * @defaultValue false\n */\n groundShadow?: boolean;\n\n /**\n * Enable shadows\n *\n * @defaultValue false\n */\n shadows?: boolean;\n\n /**\n * Camera speed on X axis\n *\n * @defaultValue 4\n */\n cameraAxisXSpeed?: number;\n\n /**\n * Camera speed on Y axis\n *\n * @defaultValue 1\n */\n cameraAxisYSpeed?: number;\n\n /**\n * Ambient occlusion\n *\n * @defaultValue false\n */\n ambientOcclusion?: boolean;\n\n /**\n * Enable streaming mode\n *\n * If enableStreamingMode is true then enablePartialMode will be used, otherwise -\n * enablePartialMode will be ignored and file / assembly will be loaded in one go\n *\n * @defaultValue true\n */\n enableStreamingMode?: boolean;\n\n /**\n * Enable partial load mode to be able open large drawing If enablePartialMode enabled, then\n * sceneGraph will be switched off\n *\n * @defaultValue false\n */\n enablePartialMode?: boolean;\n\n /**\n * The size of the memory buffer that the Viewer can use for graphics data\n *\n * @defaultValue 3294967296\n */\n memoryLimit?: number;\n\n /**\n * Cutting plane fill color\n *\n * @defaultValue { red: 0xff, green: 0x98, blue: 0x00 }\n */\n cuttingPlaneFillColor?: RGB;\n\n /**\n * Outline edges color in RGB format.\n */\n edgesColor?: { r: number; g: number; b: number };\n\n /**\n * Faces color in the RGB format.\n */\n facesColor?: { r: number; g: number; b: number };\n\n /**\n * Show or hide edges.\n */\n edgesVisibility?: boolean;\n\n /**\n * Show edges over drawing.\n */\n edgesOverlap?: boolean;\n\n /**\n * Show faces over drawing.\n */\n facesOverlap?: boolean;\n\n /**\n * Faces transparency value from 0 to 255.\n */\n facesTransparancy?: number;\n\n /**\n * Enable custom highlight settings.\n */\n enableCustomHighlight?: boolean;\n\n /**\n * Enable or disable scene graph, it increases perfomance improvement, but consumes memory\n * Large drawings can take up a lot of memory. If sceneGraph enabled, then enablePartialMode\n * will be switched off\n */\n sceneGraph: boolean;\n\n /**\n * Edge display models. No edges is usefull for less memory consumption: `false` - no edges\n * are displayed, `true` - display isolines.\n */\n edgeModel: boolean;\n\n /**\n * Reverse the mouse wheel direction for zooming: false - moving the wheel up zooms in,\n * moving down zooms out, `true` - moving the wheel up zooms out, moving down zooms in.\n */\n reverseZoomWheel: boolean;\n\n /**\n * Enable mouse wheel zooming.\n */\n enableZoomWheel: boolean;\n\n /**\n * Enable touch gestures. This option will be ignored when enableZoomWheel is disabled, since\n * gestures contains touch zoom.\n */\n enableGestures: boolean;\n\n /**\n * Default file geometry data type. Can be one of:\n *\n * - `vsfx` - `VSFX` (default), for opening a file in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, for opening a file in `Three.js` viewer.\n */\n geometryType?: string;\n}\n\nexport class Options {\n protected _emitter?: EventEmitter2;\n protected _data: OptionsData;\n\n constructor(emitter?: EventEmitter2) {\n this._emitter = emitter;\n this._data = Options.defaults();\n this.loadFromStorage();\n }\n\n static defaults(): OptionsData {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: { red: 0xff, green: 0x98, blue: 0x00 },\n edgesColor: { r: 0xff, g: 0x98, b: 0x00 },\n facesColor: { r: 0xff, g: 0x98, b: 0x00 },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\",\n };\n }\n\n notifierChangeEvent(): void {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({ type: \"optionschange\", data: this });\n }\n }\n\n saveToStorage(): void {\n if (typeof window !== \"undefined\")\n try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n\n loadFromStorage(): void {\n if (typeof window !== \"undefined\")\n try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = { ...data };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n\n /**\n * Reset options to default\n *\n * @param fields - Name of fields to be reset\n */\n resetToDefaults(fields?: string[]): void {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }, {});\n\n this.data = { ...this.data, ...resetData };\n } else {\n this.data = { ...this.data, ...Options.defaults() };\n }\n }\n\n get data(): OptionsData {\n return this._data;\n }\n\n set data(value: OptionsData) {\n const sceneGraph = value.enablePartialMode ? false : value.sceneGraph;\n this._data = { ...Options.defaults(), ...this._data, ...value, sceneGraph };\n this.notifierChangeEvent();\n }\n\n get showWCS(): boolean {\n return this._data.showWCS;\n }\n\n set showWCS(value: boolean) {\n this._data.showWCS = value;\n this.notifierChangeEvent();\n }\n\n get cameraAnimation(): boolean {\n return this._data.cameraAnimation;\n }\n\n set cameraAnimation(value: boolean) {\n this._data.cameraAnimation = value;\n this.notifierChangeEvent();\n }\n\n get antialiasing(): boolean {\n return this._data.antialiasing;\n }\n\n set antialiasing(value: boolean) {\n this._data.antialiasing = value;\n this.notifierChangeEvent();\n }\n\n get groundShadow(): boolean {\n return this._data.groundShadow;\n }\n\n set groundShadow(value: boolean) {\n this._data.groundShadow = value;\n this.notifierChangeEvent();\n }\n\n get shadows(): boolean {\n return this._data.shadows;\n }\n\n set shadows(value: boolean) {\n this._data.shadows = value;\n this.notifierChangeEvent();\n }\n\n get cameraAxisXSpeed(): number {\n return this._data.cameraAxisXSpeed;\n }\n\n set cameraAxisXSpeed(value: number) {\n this._data.cameraAxisXSpeed = value;\n this.notifierChangeEvent();\n }\n\n get cameraAxisYSpeed(): number {\n return this._data.cameraAxisYSpeed;\n }\n\n set cameraAxisYSpeed(value: number) {\n this.cameraAxisYSpeed = value;\n this.notifierChangeEvent();\n }\n\n get ambientOcclusion(): boolean {\n return this._data.ambientOcclusion;\n }\n\n set ambientOcclusion(value: boolean) {\n this._data.ambientOcclusion = value;\n this.notifierChangeEvent();\n }\n\n get enableStreamingMode(): boolean {\n return this._data.enableStreamingMode;\n }\n\n set enableStreamingMode(value: boolean) {\n this._data.enableStreamingMode = value;\n\n if (this._data.enableStreamingMode) {\n this._data.enablePartialMode = false;\n }\n\n this.notifierChangeEvent();\n }\n\n get enablePartialMode(): boolean {\n return this._data.enablePartialMode;\n }\n\n set enablePartialMode(value: boolean) {\n this._data.enablePartialMode = value;\n if (value) this._data.sceneGraph = false;\n this.notifierChangeEvent();\n }\n\n get memoryLimit(): number {\n return this._data.memoryLimit;\n }\n\n set memoryLimit(value: number) {\n this._data.memoryLimit = value;\n this.notifierChangeEvent();\n }\n\n get cuttingPlaneFillColor(): RGB {\n return this._data.cuttingPlaneFillColor;\n }\n\n set cuttingPlaneFillColor(value: RGB) {\n this._data.cuttingPlaneFillColor = value;\n this.notifierChangeEvent();\n }\n\n get edgesColor() {\n return this._data.edgesColor;\n }\n\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.notifierChangeEvent();\n }\n\n get facesColor() {\n return this._data.facesColor;\n }\n\n set facesColor(value) {\n this._data.facesColor = value;\n this.notifierChangeEvent();\n }\n\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.notifierChangeEvent();\n }\n\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.notifierChangeEvent();\n }\n\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.notifierChangeEvent();\n }\n\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.notifierChangeEvent();\n }\n\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.notifierChangeEvent();\n }\n\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.notifierChangeEvent();\n }\n\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.notifierChangeEvent();\n }\n\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n\n set reverseZoomWheel(value: boolean) {\n this._data.reverseZoomWheel = !!value;\n this.notifierChangeEvent();\n }\n\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n\n set enableZoomWheel(value: boolean) {\n this._data.enableZoomWheel = !!value;\n this.notifierChangeEvent();\n }\n\n get enableGestures() {\n return this._data.enableGestures;\n }\n\n set enableGestures(value: boolean) {\n this._data.enableGestures = !!value;\n this.notifierChangeEvent();\n }\n\n get geometryType() {\n return this._data.geometryType;\n }\n\n set geometryType(value: string) {\n this._data.geometryType = value;\n this.notifierChangeEvent();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json } from \"./impl/Utils\";\n\n/**\n * A permission provides information about {@link File | file} sharing granted to a specific\n * {@link User | users}, group, or project {@link Member | member}.\n */\nexport class Permission {\n private _data: any;\n protected fileId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements permission data storage.\n * @param fileId - Owner file ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, fileId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.fileId = fileId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/files/${this.fileId}/permissions/${this.id}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/files/${this.fileId}/permissions/${this.id}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/files/${this.fileId}/permissions/${this.id}`);\n }\n\n /**\n * Defines what actions are allowed to be performed on a file with this permission:\n *\n * - `read` - The ability to read file description, geometry data and properties\n * - `readSourceFile` - The ability to read source file\n * - `write` - The ability to modify file name, description and references\n * - `readViewpoint` - The ability to read file viewpoints\n * - `createViewpoint` - The ability to create file viewpoints\n */\n get actions(): string[] {\n return this.data.actions;\n }\n\n set actions(value: string[]) {\n this._data.actions = value;\n }\n\n /**\n * Raw permission data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * Unique permission ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Principials are any entity that can be authenticated by the server, such as a any user or\n * project that will get access to the file.\n *\n * @typedef {any} Principial\n * @property {any} user - The user entry that get access to the file.\n * @property {string} user.id - User ID.\n * @property {string} user.name - User name.\n * @property {any} project - The project entry that get access to the file.\n * @property {string} project.id - Project ID.\n * @property {string} project.name - Project name.\n */\n\n /**\n * A collection of principials that will get access to the file.\n */\n get grantedTo(): any[] {\n return this.data.grantedTo;\n }\n\n set grantedTo(value: any[]) {\n this.data.grantedTo = value;\n }\n\n /**\n * Specifies whether all users have access to the file or not.\n */\n get public(): boolean {\n return this.data.public;\n }\n\n set public(value: boolean) {\n this.data.public = value;\n }\n\n /**\n * Refresh permission data.\n *\n * @async\n */\n async checkout(): Promise<Permission> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update permission data on the server.\n *\n * @async\n * @param data - Raw permission data.\n */\n async update(data: any): Promise<Permission> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a permission from a file.\n *\n * @async\n * @returns Returns the raw data of a deleted permission.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save permission data changes to the server. Call this method to update permission data on\n * the server after any changes.\n *\n * @async\n */\n save(): Promise<Permission> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json, waitFor } from \"./impl/Utils\";\n\n/**\n * The class representing a `job` entity describes the process of converting a file from one\n * format to another, to obtain geometric data, validate the file, or run a clash test.\n */\nexport class Job {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements job data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n protected internalGet() {\n return this.httpClient.get(`/jobs/${this.data.id}`);\n }\n\n protected internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/jobs/${this.data.id}`, body);\n }\n\n protected internalDelete() {\n return this.httpClient.delete(`/jobs/${this.data.id}`);\n }\n\n /**\n * The ID of the assembly the job is working on (internal).\n *\n * @readonly\n */\n get assemblyId(): string {\n return this.data.assemblyId;\n }\n\n /**\n * Job creator ID. Use {@link Client#getUser | Client.getUser()} to obtain detailed creator information.\n *\n * @readonly\n */\n get authorId(): string {\n return this.data.authorId;\n }\n\n /**\n * Job creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Raw job data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * `true` if job is `done` or `failed`. See {@link Job#status | status} for more details.\n *\n * @readonly\n */\n get done(): boolean {\n return this.data.status === \"done\" || this.data.status === \"failed\";\n }\n\n /**\n * The ID of the file the job is working on.\n *\n * @readonly\n */\n get fileId(): string {\n return this.data.fileId;\n }\n\n /**\n * Unique job ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Job last update (UTC) time in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get lastUpdate(): string {\n return this.data.lastUpdate;\n }\n\n /**\n * Job type. Can be `properties`, `geomerty`, `geomertyGltf`, `validation`, `clash`, `dwg`,\n * `obj`, `gltf`, `glb`, `vsf`, `pdf` or `3dpdf`.\n *\n * @readonly\n */\n get outputFormat(): string {\n return this.data.outputFormat;\n }\n\n /**\n * Parameters for the job runner.\n *\n * @readonly\n */\n get parameters(): any {\n return this.data.parameters;\n }\n\n /**\n * Job status. Can be `waiting`, `inprogress`, `done` or `failed`.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * Job status description message.\n *\n * @readonly\n */\n get statusMessage(): string {\n return this.data.statusMessage;\n }\n\n /**\n * Job starting time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get startedAt(): string {\n return this.data.startedAt;\n }\n\n /**\n * Refresh job data.\n *\n * @async\n */\n async checkout(): Promise<Job> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update job data on the server. Only admins can update job data.\n *\n * @async\n * @param data - Raw job data.\n */\n async update(data: any): Promise<Job> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a job from the server job list. Jobs that are in progress or have already been\n * completed cannot be deleted.\n *\n * @async\n * @returns Returns the raw data of a deleted job.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n // /**\n // * Save job data changes to the server. Call this method to update job data on the server\n // * after any changes.\n // *\n // * @async\n // * @returns {Promise<Job>}\n // */\n // save() {\n // return this.update(this.data);\n // }\n\n /**\n * Wait for job to be done. Job is done when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait job. If\n * jobs is not done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking job status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onCheckout - Waiting progress callback. Return `true` to cancel waiting.\n */\n waitForDone(params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (job: Job, ready: boolean) => boolean;\n }): Promise<Job> {\n const checkDone = () =>\n this.checkout().then((job) => {\n const ready = [\"done\", \"failed\"].includes(job.status);\n const cancel = params?.onCheckout?.(job, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IFileStatus, IFileReferences, IFileVersionInfo } from \"./IFile\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Model } from \"./Model\";\nimport { Permission } from \"./Permission\";\nimport { Job } from \"./Job\";\nimport {\n json,\n text,\n downloadProgress,\n downloadPartOfFile,\n waitFor,\n parseArgs,\n userFullName,\n userInitials,\n} from \"./impl/Utils\";\n\n/**\n * The class representing a `file` entity.\n */\nexport class File {\n private _data: any;\n private _useVersion: number | undefined;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements file data storage.\n * @param httpClient - Http client for API.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.path = `/files/${data.id}`;\n this.httpClient = httpClient;\n this.data = data;\n }\n\n private appendVersionParam(relativePath: string): string {\n if (this._useVersion === undefined) return relativePath;\n\n const delimiter = relativePath.includes(\"?\") ? \"&\" : \"?\";\n return `${relativePath}${delimiter}version=${this._useVersion}`;\n }\n\n private internalGet(relativePath: string, signal?: AbortSignal) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.get(`${this.path}${relativePath}`, signal);\n }\n\n private internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.post(`${this.path}${relativePath}`, body);\n }\n\n private internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.put(`${this.path}${relativePath}`, body);\n }\n\n private internalDelete(relativePath: string) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.delete(`${this.path}${relativePath}`);\n }\n\n async partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ) {\n let pathname = `${this.path}/downloads/${dataId}`;\n pathname = this.appendVersionParam(pathname);\n\n // TODO: replace with $get to handle fetch errors\n const response = await fetch(`${this.httpClient.serverUrl}${pathname}`, {\n headers: this.httpClient.headers,\n signal,\n });\n\n // TODO: use ReadableStream pipeTo()\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const reader = response.body.getReader();\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (typeof onProgress === \"function\") onProgress(loaded / total, value);\n }\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ) {\n let pathname = `${this.path}/downloads/${dataId}?requestId=${requestId}`;\n pathname = this.appendVersionParam(pathname);\n return downloadPartOfFile(\n requestId,\n records,\n `${this.httpClient.serverUrl}${pathname}`,\n this.httpClient.headers,\n onProgress,\n signal\n );\n }\n\n /**\n * Active version number of the file.\n *\n * @readonly\n */\n get activeVersion(): number {\n return this.data.activeVersion;\n }\n\n /**\n * File creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get created(): string {\n return this.data.created;\n }\n\n /**\n * File custom fields object, to store custom data.\n *\n * @readonly\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this.data.customFields = value;\n }\n\n /**\n * Raw file data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.previewUrl = value.preview ? `${this.httpClient.serverUrl}${this.path}/preview` : \"\";\n // owner since 24.8\n if (typeof this._data.owner === \"string\") this._data.owner = { userId: this._data.owner };\n this._data.owner ??= {};\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n // status since 24.9\n this._data.status ??= {};\n this._data.status.geometry ??= { state: this._data.geometryStatus ?? \"none\" };\n this._data.status.properties ??= { state: this._data.propertiesStatus ?? \"none\" };\n this._data.status.validation ??= { state: this._data.validationStatus ?? \"none\" };\n // updatedBy since 24.10\n this._data.updatedBy ??= {};\n this._data.updatedBy.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.updatedBy.userId}/avatar`;\n this._data.updatedBy.fullName = userFullName(this._data.updatedBy);\n this._data.updatedBy.initials = userInitials(this._data.updatedBy.fullName);\n // geometryGltf status since 24.12\n this._data.status.geometryGltf ??= { state: \"none\" };\n }\n\n /**\n * Returns a list of formats in which the active version of the file was exported. To export\n * file to one of the supported formats create File Converter job using\n * {@link File.createJob()}. To download exported file use {@link File.downloadResource()}.\n *\n * @readonly\n */\n get exports(): string[] {\n return this.data.exports;\n }\n\n /**\n * Geometry data type of the active file version. Can be one of:\n *\n * - `vsfx` - `VSFX`, file can be opened in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, file can be opened in `Three.js` viewer.\n *\n * Returns an empty string if geometry data has not yet been extracted. A files without\n * geometry data can be exported to other formas, but cannot be opened in viewer.\n */\n get geometryType(): string {\n if (this.status.geometryGltf.state === \"done\") return \"gltf\";\n else if (this.status.geometry.state === \"done\") return \"vsfx\";\n else return \"\";\n }\n\n /**\n * Unique file ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * File name, including the extension.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * If the file is a version, then returns the ID of the original file. Otherwise, returns the file ID.\n *\n * @readonly\n */\n get originalFileId(): string {\n return this.data.originalFileId;\n }\n\n /**\n * File owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * File preview image URL. Use {@link File#setPreview | setPreview()} to change preview image.\n *\n * @readonly\n */\n get previewUrl(): string {\n return this.data.previewUrl;\n }\n\n /**\n * The size of the active version of the file in bytes.\n *\n * @readonly\n */\n get size(): number {\n return this.data.size;\n }\n\n /**\n * Total size of all versions of the file in the storage in bytes.\n *\n * @readonly\n */\n get sizeTotal(): number {\n return this.data.sizeTotal;\n }\n\n /**\n * Data status of the active version of the file. Contains:\n *\n * - `geometry` - status of geometry data of `VSFX` type.\n * - `geometryGltf` - status of geometry data of `glTF` type.\n * - `properties` - status of properties.\n * - `validation` - status of validation.\n *\n * Each status entity is a record with properties:\n *\n * - `state` - Data state. Can be `none`, `waiting`, `inprogress`, `done` or `failed`.\n * - `jobId` - Unique ID of the data job.\n *\n * @readonly\n */\n get status(): IFileStatus {\n return this.data.status;\n }\n\n /**\n * File type, matches the file extension.\n *\n * @readonly\n */\n get type(): string {\n return this.data.type;\n }\n\n /**\n * File last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get updatedAt(): string {\n return this.data.updatedAt;\n }\n\n /**\n * Information about the user who made the last update.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get updatedBy(): IShortUserDescription {\n return this.data.updatedBy;\n }\n\n /**\n * Zero-based file version number for version files. The original file has version `0`.\n */\n\n get version(): number {\n return this.data.version;\n }\n\n /**\n * List of the file versions.\n *\n * @readonly\n */\n get versions(): IFileVersionInfo[] {\n return this.data.versions;\n }\n\n /**\n * Refresh file data.\n *\n * @async\n */\n async checkout(): Promise<File> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Update file data on the server.\n *\n * @async\n * @param data - Raw file data.\n */\n async update(data: any): Promise<File> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the file and all its versions from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted file.\n */\n delete(): Promise<any> {\n return json(this.internalDelete(\"\"));\n }\n\n /**\n * Save file data changes to the server. Call this method to update file data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<File> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the file preview.\n *\n * @async\n * @param image - Preview image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the preview.\n */\n async setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null): Promise<File> {\n if (image) {\n this.data = await json(this.internalPost(\"/preview\", image));\n } else {\n this.data = await json(this.internalDelete(\"/preview\"));\n }\n return this;\n }\n\n /**\n * Returns a list of models of the active version of the file.\n *\n * @async\n */\n getModels(): Promise<Model[]> {\n return json(this.internalGet(\"/geometry\")).then((array) => array.map((data) => new Model(data, this)));\n }\n\n // File does not support model transformation.\n\n getModelTransformMatrix(handle: string): any {\n return undefined;\n }\n\n setModelTransformMatrix(handle: string, transform: any): Promise<File> {\n console.warn(\"File does not support model transformation\");\n return Promise.resolve(this);\n }\n\n /**\n * Object properties.\n *\n * @typedef {any} Properties\n * @property {string} handle - Object original handle.\n * @property {string | any} * - Object property. Can be `any` for nested properties.\n */\n\n /**\n * Returns the properties for an objects in the active version of the file.\n *\n * @async\n * @param handles - Object original handle or handles array. Leave this parameter `undefined`\n * to get properties for all objects in the file.\n */\n getProperties(handles?: string | string[]): Promise<any[]> {\n return json(this.internalGet(handles !== undefined ? `/properties?handles=${handles}` : \"/properties\"));\n }\n\n /**\n * Search pattern.\n *\n * @typedef {any} SearchPattern\n * @property {string} key - Property name.\n * @property {string} value - Property value.\n */\n\n /**\n * Query operator. Operator name can be `$and`, `$or`, `$not`, `$eq`, `$regex`.\n *\n * @typedef {any} QueryOperator\n * @property {string | SearchPattern[] | QueryOperator[]} * - Array of the query values or\n * patterns for operator.\n */\n\n /**\n * Returns the list of original handles for an objects in the active version of the file that\n * match the specified patterns. Search patterns may be combined using query operators.\n *\n * @async\n * @example <caption>Simple search pattern.</caption>\n * searchPattern = {\n * key: \"Category\",\n * value: \"OST_Stairs\",\n * };\n *\n * @example <caption>Search patterns combination.</caption>\n * searchPattern = {\n * $or: [\n * {\n * $and: [\n * { key: \"Category\", value: \"OST_GenericModel\" },\n * { key: \"Level\", value: \"03 - Floor\" },\n * ],\n * },\n * { key: \"Category\", value: \"OST_Stairs\" },\n * ],\n * };\n *\n * @param {SearchPattern | QueryOperator} searchPattern - Search pattern or combination of\n * the patterns, see example below.\n * @returns {Promise<Properties[]>}\n */\n\n searchProperties(searchPattern: any): Promise<any[]> {\n return json(this.internalPost(\"/properties/search\", searchPattern));\n }\n\n /**\n * Returns the cda.json for an active version of the file.\n *\n * @async\n */\n getCdaTree(): Promise<any[]> {\n return json(this.internalGet(`/properties/tree`));\n }\n\n /**\n * Returns a list of file viewpoints.\n *\n * @async\n */\n getViewpoints(): Promise<any[]> {\n return json(this.internalGet(\"/viewpoints\")).then((viewpoints) => viewpoints.result);\n }\n\n /**\n * Add new file viewpoint. To create a new viewpoint use\n * {@link Viewer#createViewpoint | Viewer.createViewpoint()}.\n *\n * @async\n * @param viewpoint - Viewpoint.\n */\n saveViewpoint(viewpoint: any): Promise<any> {\n return json(this.internalPost(\"/viewpoints\", viewpoint));\n }\n\n /**\n * Delete file viewpoint.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @returns Returns the raw data of a deleted viewpoint.\n */\n deleteViewpoint(guid: string): Promise<any> {\n return json(this.internalDelete(`/viewpoints/${guid}`));\n }\n\n /**\n * Returns viewpoint preview image as <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n *\n * @async\n * @param guid - Viewpoint GUID.\n */\n getSnapshot(guid: string): Promise<string> {\n return text(this.internalGet(`/viewpoints/${guid}/snapshot`));\n }\n\n /**\n * Returns viewpoint preview data.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @param bitmapGuid - Bitmap GUID.\n */\n getSnapshotData(guid: string, bitmapGuid: string): Promise<string> {\n return text(this.internalGet(`/viewpoints/${guid}/bitmaps/${bitmapGuid}`));\n }\n\n /**\n * Download source of active version of the file.\n *\n * @async\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n download(onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Download file resource data of the active version of the file, such as exported file.\n *\n * @example <caption>Export file to DWG.</caption>\n * const job = await file.crateJob(\"dwg\");\n * await job.waitForDone();\n * const resourceId = file.exports.find((x) => x.endsWith(\".dwg\"));\n * const arrayBuffer = await file.downloadResource(resourceId);\n * const blob = new Blob([arrayBuffer]);\n * const fileName = file.name.replace(/\\.[^.]+$/, \"\") + \".dwg\";\n * FileSaver.saveAs(blob, fileName);\n *\n * @param dataId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads/${dataId}`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Returns a list of references to files used to correct rendering of the current file.\n *\n * @async\n * @param [signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n getReferences(signal?: AbortSignal): Promise<IFileReferences> {\n return json(this.internalGet(\"/references\", signal));\n }\n\n /**\n * Set the file references.\n *\n * @async\n * @param references - File references.\n */\n setReferences(references: IFileReferences): Promise<IFileReferences> {\n return json(this.internalPut(\"/references\", references));\n }\n\n /**\n * Create a new job for the active version of the file.\n *\n * @async\n * @param outputFormat - The job type. Can be one of:\n *\n * - `geometry` - Extract file geometry data into `VSFX`.\n * - `geometryGltf` - Extract file geometry data into `glTF`.\n * - `properties` - Extract file properties.\n * - `validation` - Validate the file. Only for `IFC`.\n * - `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`, `3dpdf` - Export file to the one of the\n * supported format. Use {@link File.exports | File.exports()} to get the list of\n * completed file exports. Use {@link File.downloadResource | File.downloadResource()}\n * to download the exported file.\n * - Other custom job name. Custom job runner must be registered in the job templates table\n * before creating a job.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n createJob(outputFormat: string, parameters?: string | object): Promise<Job> {\n const pathname = this.appendVersionParam(\"/jobs\");\n return this.httpClient\n .post(pathname, {\n fileId: this.id,\n outputFormat,\n parameters: parseArgs(parameters),\n })\n .then((response) => response.json())\n .then((data) => new Job(data, this.httpClient));\n }\n\n /**\n * Create job to extract geometry data of active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"geometry\")}.\n *\n * @async\n * @param type - Geometry data type. Can be one of:\n *\n * - `vsfx` - `VSFX` (default), for opening a file in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, for opening a file in `Three.js` viewer.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n extractGeometry(type?: string, parameters?: string | object): Promise<Job> {\n return this.createJob(type === \"gltf\" ? \"geometryGltf\" : \"geometry\", parameters);\n }\n\n /**\n * Create job to extract properties of the active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"properties\")}.\n *\n * @async\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n extractProperties(parameters?: string | object): Promise<Job> {\n return this.createJob(\"properties\", parameters);\n }\n\n /**\n * Create a job to validate the active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"validation\")}.\n *\n * To get validation report use\n * {@link File.downloadResource | File.downloadResource(\"validation_report.json\")}.\n *\n * @async\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n validate(parameters?: string | object): Promise<Job> {\n return this.createJob(\"validation\", parameters);\n }\n\n /**\n * Wait for jobs of the active version of the file to be done. Job is done when it changes to\n * `none`, `done` or `failed` status.\n *\n * @async\n * @param {string | string[]} jobs - Job or job array to wait on. Can be `geometry`,\n * `geometryGltf`, `properties`, `validation`, `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`,\n * `3dpdf` or custom job name.\n * @param {Boolean} [waitAll] - If this parameter is `true`, the function returns when all\n * the specified jobs have done. If `false`, the function returns when any one of the jobs are done.\n * @param {Object} [params] - An object containing waiting parameters.\n * @param {Number} [params.timeout] - The time, in milliseconds that the function should wait\n * jobs. If no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param {Number} [params.interval] - The time, in milliseconds, the function should delay\n * in between checking jobs status.\n * @param {AbortSignal} [params.signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param {function} [params.onCheckout] - Waiting progress callback. Return `true` to cancel waiting.\n * @returns {Promise<File>}\n */\n waitForDone(\n jobs,\n waitAll?: boolean,\n params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (file: File, ready: boolean) => boolean;\n }\n ): Promise<this> {\n if (!Array.isArray(jobs)) jobs = [jobs];\n if (waitAll === undefined) waitAll = true;\n\n const checkDone = () =>\n this.checkout().then((file) => {\n const readyJobs = jobs.filter((x: string) =>\n [\"none\", \"done\", \"failed\"].includes(file.status[x]?.state ?? \"none\")\n );\n const ready = waitAll ? readyJobs.length === jobs.length : readyJobs.length > 0;\n const cancel = params?.onCheckout?.(file, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a list of file permissions.\n *\n * @async\n */\n getPermissions(): Promise<Permission[]> {\n return json(this.internalGet(\"/permissions\")).then((array) =>\n array.map((data) => new Permission(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the permission information.\n *\n * @async\n * @param permissionId - Permission ID.\n */\n getPermission(permissionId: string): Promise<Permission> {\n return json(this.internalGet(`/permissions/${permissionId}`)).then(\n (data) => new Permission(data, this.id, this.httpClient)\n );\n }\n\n /**\n * Create a new file permission.\n *\n * @async\n * @param actions - Actions are allowed to be performed on a file with this permission. See\n * {@link Permission#actions | Permission.actions} for more details.\n * @param grantedTo - A collection of principials that will get access to the file.\n * @param public = false - Specifies whether all users have access to the file or not.\n */\n createPermission(actions: string | string[], grantedTo: any[], _public: boolean): Promise<Permission> {\n return json(\n this.internalPost(\"/permissions\", {\n actions: typeof actions === \"string\" ? [actions] : actions,\n grantedTo,\n public: _public,\n })\n ).then((data) => new Permission(data, this.id, this.httpClient));\n }\n\n /**\n * Delete file permission.\n *\n * @async\n * @param permissionId - Permission ID.\n * @returns Returns the raw data of a deleted permission.\n */\n deletePermission(permissionId: string): Promise<any> {\n return json(this.internalDelete(`/permissions/${permissionId}`));\n }\n\n /**\n * Upload the new version of the file to the server and extract the geometry and properties as needed.\n *\n * @async\n * @param file - Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object are generally retrieved from a <a\n * href=\"https://developer.mozilla.org/docs/Web/API/FileList\" target=\"_blank\">FileList</a>\n * object returned as a result of a user selecting files using the HTML `<input>` element.\n * @param params - An object containing upload parameters.\n * @param params.geometry=true - Create job to extract file geometry data. The geometry data\n * type is the same as the original file.\n * @param params.properties=false - Create job to extract file properties.\n * @param params.waitForDone=false - Wait for geometry and properties jobs to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait jobs. If\n * no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking jobs status.\n * @param params.signal - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onProgress - Upload progress callback.\n */\n\n async uploadVersion(\n file: globalThis.File,\n params: {\n geometry?: boolean;\n properties?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n waitForDone: false,\n }\n ): Promise<File> {\n const result = await this.httpClient\n .postFile(`${this.path}/versions`, file, (progress) => params.onProgress?.(progress, file))\n .then((xhr: XMLHttpRequest) => JSON.parse(xhr.responseText))\n .then((data) => new File(data, this.httpClient));\n\n if (params.geometry === undefined && this.geometryType !== \"\") params.geometry = true;\n if (params.properties === undefined && this.status.properties.state !== \"none\") params.properties = true;\n\n const jobs: string[] = [];\n if (params.geometry) jobs.push((await result.extractGeometry(this.geometryType)).outputFormat);\n if (params.properties) jobs.push((await result.extractProperties()).outputFormat);\n if (params.waitForDone && jobs.length > 0) await result.waitForDone(jobs, true, params);\n\n await this.checkout();\n\n return result;\n }\n\n /**\n * Returns a list of version files.\n *\n * @async\n */\n getVersions(): Promise<File[]> {\n return this.internalGet(\"/versions\")\n .then((response) => response.json())\n .then((files) => files.map((data) => new File(data, this.httpClient)))\n .then((files) => files.map((file) => (file.id == file.originalFileId ? file.useVersion(0) : file)));\n }\n\n /**\n * Returns the version file.\n *\n * @async\n * @param version - Desired version.\n */\n getVersion(version: number): Promise<File> {\n return this.internalGet(`/versions/${version}`)\n .then((response) => response.json())\n .then((data) => new File(data, this.httpClient))\n .then((file) => (file.id == file.originalFileId ? file.useVersion(0) : file));\n }\n\n /**\n * Delete version file.\n *\n * @async\n * @param version - Version to delete.\n */\n async deleteVersion(version: number): Promise<any> {\n const response = await this.internalDelete(`/versions/${version}`);\n const result = await response.json();\n\n await this.checkout();\n\n return result;\n }\n\n /**\n * Replace the active version of the file with the selected version.\n *\n * @async\n * @param version - Desired active version.\n */\n\n setActiveVersion(version: number): Promise<File> {\n return this.update({ activeVersion: version });\n }\n\n /**\n * Use given version instead of active version for current file on client side. This version\n * change will affect the result:\n *\n * - getModels()\n * - getProperties()\n * - searchProperties()\n * - getCdaTree()\n * - download()\n * - downloadResource()\n * - createJob()\n * - extractGeometry()\n * - extractProperties()\n * - validate()\n * - waitForDone()\n * - Viewer.open()\n *\n * Other clients will still continue to use the currently active version of the file. Use\n * `undefined` to revert back to the active version.\n *\n * Note. You need to update the file data using [File.checkout()]{@link File#checkout} to\n * match the size and status fields to the version you selected.\n */\n useVersion(version?: number): this {\n this._useVersion = version;\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json } from \"./impl/Utils\";\n\n/**\n * A roles determines what permissions {@link User | users} have on a {@link Project | project}.\n */\nexport class Role {\n private _data: any;\n protected projectId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements role data storage.\n * @param projectId - Owner project ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, projectId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.projectId = projectId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/projects/${this.projectId}/roles/${this.name}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/projects/${this.projectId}/roles/${this.name}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/projects/${this.projectId}/roles/${this.name}`);\n }\n\n /**\n * Role description.\n */\n get description(): string {\n return this.data.description;\n }\n\n set description(value: string) {\n this._data.description = value;\n }\n\n /**\n * Raw role data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n set data(value: any) {\n this._data = value;\n }\n\n /**\n * Role name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this._data.name = value;\n }\n\n /**\n * Role actions are allowed to be performed.\n *\n * @property {string[]} projectActions - Actions are allowed to be performed at the project\n * level: `update`, `createTopic`, `createDocument`.\n * @property {string[]} topicActions - Actions are allowed to be performed at the topic\n * level: `update`, `updateBimSnippet`, `updateRelatedTopics`, `updateDocumentReferences`,\n * `updateFiles`, `createComment`, `createViewpoint`, `delete`.\n * @property {string[]} commentActions - Actions are allowed to be performed at the comment\n * level: `update`, `delete`.\n * @property {string[]} viewpointActions - Actions are allowed to be performed at the\n * viewpoint level: `delete`.\n * @property {string[]} odaGroupActions - Actions are allowed to be performed at the members\n * level: `update`, `delete`.\n * @property {string[]} odaRoleActions - Actions are allowed to be performed at the roles\n * level: `update`, `delete`.\n */\n get permissions(): any {\n return this.data.permissions;\n }\n\n set permissions(value: any) {\n this.data.permissions = value || {};\n }\n\n /**\n * Refresh role data.\n *\n * @async\n */\n async checkout(): Promise<Role> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update role data on the server.\n *\n * @async\n * @param data - Raw role data.\n */\n async update(data: any): Promise<Role> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Delete a role from the project.\n *\n * @async\n * @returns Returns the raw data of a deleted role.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save role data changes to the server. Call this method to update role data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<Role> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { json, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * Members are the {@link User | users} who have access to the {@link Project | project}.\n */\nexport class Member {\n private _data: any;\n protected projectId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements member data storage.\n * @param projectId - Owner project ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, projectId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.projectId = projectId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/projects/${this.projectId}/members/${this.id}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/projects/${this.projectId}/members/${this.id}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/projects/${this.projectId}/members/${this.id}`);\n }\n\n /**\n * Raw member data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.user.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.user.userId}/avatar`;\n this._data.user.fullName = userFullName(this._data.user);\n this._data.user.initials = userInitials(this._data.user.fullName);\n }\n\n /**\n * Unique member ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Member role. See {@link Project#getRoles | Project.getRoles()} for more details.\n */\n get role(): string {\n return this.data.role;\n }\n\n set role(value: string) {\n this.data.role = value;\n }\n\n /**\n * Member type. Can be `owner` or `user`.\n *\n * @readonly\n */\n get type(): string {\n return this.data.type;\n }\n\n /**\n * User information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get user(): IShortUserDescription {\n return this.data.user;\n }\n\n /**\n * Refresh member data.\n *\n * @async\n */\n async checkout(): Promise<Member> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update member data on the server.\n *\n * @async\n * @param data - Raw member data.\n */\n async update(data: any): Promise<Member> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a member from a project.\n *\n * @async\n * @returns Returns the raw data of a deleted member.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save member data changes to the server. Call this method to update member data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Member> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Role } from \"./Role\";\nimport { Member } from \"./Member\";\nimport { json, text, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * Projects are used to collaborate on models and track issues.\n */\nexport class Project {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements project data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n protected internalGet(relativePath: string) {\n return this.httpClient.get(`/projects/${this.id}${relativePath}`);\n }\n\n protected internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n return this.httpClient.post(`/projects/${this.id}${relativePath}`, body);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n return this.httpClient.put(`/projects/${this.id}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string) {\n return this.httpClient.delete(`/projects/${this.id}${relativePath}`);\n }\n\n /**\n * Project features the user has access to.\n *\n * @property {string[]} project_actions - Actions are allowed to be performed: `update`,\n * `createTopic`, `createDocument`.\n * @readonly\n */\n get authorization(): any {\n return this.data.authorization;\n }\n\n /**\n * Project creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Project custom fields object, to store custom data.\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this.data.customFields = value;\n }\n\n /**\n * Raw project data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.previewUrl = value.avatarUrl ? `${this.httpClient.serverUrl}/projects/${this._data.id}/preview` : \"\";\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n }\n\n /**\n * Project description.\n */\n get description(): string {\n return this.data.description;\n }\n\n set description(value: string) {\n this.data.description = value;\n }\n\n /**\n * Project end date in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get endDate(): string {\n return this.data.endDate;\n }\n\n set endDate(value: string | Date) {\n this.data.endDate = value instanceof Date ? value.toISOString() : value;\n }\n\n /**\n * Unique project ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * The number of members in the project.\n *\n * @readonly\n */\n get memberCount(): number {\n return this.data.memberCount;\n }\n\n /**\n * The number of models in the project.\n *\n * @readonly\n */\n get modelCount(): number {\n return this.data.modelCount;\n }\n\n /**\n * Project name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * Project owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * Project preview image URL. Use [setPreview()]{@link Project#setPreview} to change preview image.\n *\n * @readonly\n */\n get previewUrl(): string {\n return this._data.previewUrl;\n }\n\n /**\n * `true` if project is public (shared) project.\n */\n get public(): boolean {\n return this.data.public;\n }\n\n set public(value: boolean) {\n this.data.public = value;\n }\n\n /**\n * Project start date in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get startDate(): string {\n return this.data.startDate;\n }\n\n set startDate(value: string | Date) {\n this.data.startDate = value instanceof Date ? value.toISOString() : value;\n }\n\n /**\n * The number of topics in the project.\n *\n * @readonly\n */\n get topicCount(): number {\n return this.data.topicCount;\n }\n\n /**\n * Project last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get updatedAt(): string {\n return this.data.updatedAt;\n }\n\n /**\n * Refresh project data.\n *\n * @async\n */\n async checkout(): Promise<Project> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Update project data on the server.\n *\n * @async\n * @param data - Raw project data.\n */\n async update(data: any): Promise<Project> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the project from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted project.\n */\n delete(): Promise<any> {\n return text(this.internalDelete(\"\")).then((text) => {\n // TODO fix for server 23.5 and below\n try {\n return JSON.parse(text);\n } catch {\n return { id: this.id };\n }\n });\n }\n\n /**\n * Save project data changes to the server. Call this method to update project data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Project> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the project preview.\n *\n * @async\n * @param image - Preview image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the preview.\n */\n\n async setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null) {\n if (image) {\n this.data = await json(this.internalPost(\"/preview\", image));\n } else {\n this.data = await json(this.internalDelete(\"/preview\"));\n }\n return this;\n }\n\n /**\n * Returns a list of project roles. Project {@link Member | members} have different abilities\n * depending on the role they have in a project.\n *\n * @async\n */\n getRoles(): Promise<Role[]> {\n return json(this.internalGet(\"/roles\")).then((array) =>\n array.map((data) => new Role(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the role information.\n *\n * @async\n * @param name - Role name.\n */\n getRole(name: string): Promise<Role> {\n return json(this.internalGet(`/roles/${name}`)).then((data) => new Role(data, this.id, this.httpClient));\n }\n\n /**\n * Create a new project role.\n *\n * @async\n * @param name - Role name.\n * @param description - Role description.\n * @param permissions - Actions are allowed to be performed. See\n * {@link Role#permissions | Role.permissions} for more details.\n */\n createRole(name: string, description: string, permissions: any): Promise<Role> {\n return json(\n this.internalPost(\"/roles\", {\n name,\n description,\n permissions: permissions || {},\n })\n ).then((data) => new Role(data, this.id, this.httpClient));\n }\n\n /**\n * Delete project role.\n *\n * @async\n * @param name - Role name.\n * @returns Returns the raw data of a deleted role.\n */\n deleteRole(name: string): Promise<any> {\n return json(this.internalDelete(`/roles/${name}`));\n }\n\n /**\n * Returns a list of project members.\n *\n * @async\n */\n getMembers(): Promise<Member[]> {\n return json(this.internalGet(\"/members\")).then((array) =>\n array.map((data) => new Member(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the member information.\n *\n * @async\n * @param memberId - Member ID.\n */\n getMember(memberId: string): Promise<Member> {\n return json(this.internalGet(`/members/${memberId}`)).then((data) => new Member(data, this.id, this.httpClient));\n }\n\n /**\n * Add a user to the project to become a member and have permission to perform actions.\n *\n * @async\n * @param userId - User ID.\n * @param role - User role from the list of project roles.\n */\n addMember(userId: string, role: string): Promise<Member> {\n return json(this.internalPost(\"/members\", { userId, role })).then(\n (data) => new Member(data, this.id, this.httpClient)\n );\n }\n\n /**\n * Remove a member from a project.\n *\n * @async\n * @param memberId - Member ID.\n * @returns Returns the raw data of a deleted member.\n */\n removeMember(memberId: string): Promise<any> {\n return json(this.internalDelete(`/members/${memberId}`));\n }\n\n /**\n * Information about the file (model) that can be reference in the project topics.\n *\n * @typedef {any} FileInformation\n * @property {any[]} display_information - The list of fields to allow users to associate the\n * file with a server model.\n * @property {string} display_information.field_display_name - Field display name.\n * @property {string} display_information.field_value - Field value.\n * @property {any} file - The file reference object.\n * @property {string} file.file_name - File name.\n * @property {string} file.reference - File ID.\n */\n\n /**\n * Returns a list of project files. To add a file to this list, create a `project` permission\n * on the file using {@link File#createPermission | File.createPermission()}.\n *\n * @async\n */\n getFilesInformation(): Promise<any[]> {\n return json(this.httpClient.get(`/bcf/3.0/projects/${this.data.id}/files_information`)).then((items) => {\n items.forEach((item) => {\n const getFieldValue = (displayName: string) => {\n return (item.display_information.find((x) => x.field_display_name === displayName) || {}).field_value;\n };\n\n const previewUrl = `${this.httpClient.serverUrl}/files/${item.file.reference}/preview`;\n const ownerAvatarUrl = `${this.httpClient.serverUrl}/users/${getFieldValue(\"Owner\")}/avatar`;\n\n const ownerFirstName = getFieldValue(\"Owner First Name\");\n const ownerLastName = getFieldValue(\"Owner Last Name\");\n const ownerUserName = getFieldValue(\"Owner User Name\");\n const ownerFullName = userFullName(ownerFirstName, ownerLastName, ownerUserName);\n const ownerInitials = userInitials(ownerFullName);\n\n item.display_information.push({ field_display_name: \"Preview URL\", field_value: previewUrl });\n item.display_information.push({ field_display_name: \"Owner Avatar URL\", field_value: ownerAvatarUrl });\n item.display_information.push({ field_display_name: \"Owner Full Name\", field_value: ownerFullName });\n item.display_information.push({ field_display_name: \"Owner Initials\", field_value: ownerInitials });\n\n // updatedBy since 24.10\n\n const updatedByAvatarUrl = `${this.httpClient.serverUrl}/users/${getFieldValue(\"Updated By\")}/avatar`;\n\n const updatedByFirstName = getFieldValue(\"Updated By First Name\");\n const updatedByLastName = getFieldValue(\"Updated By Last Name\");\n const updatedByUserName = getFieldValue(\"Updated By User Name\");\n const updatedByFullName = userFullName(updatedByFirstName, updatedByLastName, updatedByUserName);\n const updatedByInitials = userInitials(updatedByFullName);\n\n item.display_information.push({ field_display_name: \"Updated By Avatar URL\", field_value: updatedByAvatarUrl });\n item.display_information.push({ field_display_name: \"Updated By Full Name\", field_value: updatedByFullName });\n item.display_information.push({ field_display_name: \"Updated By Initials\", field_value: updatedByInitials });\n\n // geometryType since 24.12\n\n const geometry = getFieldValue(\"Geometry Status\");\n const geometryGltf = getFieldValue(\"GeometryGltf Status\");\n const geometryType = geometry === \"done\" ? \"vsfx\" : geometryGltf === \"done\" ? \"gltf\" : \"\";\n\n item.display_information.push({ field_display_name: \"Geometry Type\", field_value: geometryType });\n });\n return items;\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json, userFullName, userInitials } from \"./impl/Utils\";\n\nexport interface UserParams {\n /**\n * `true` if user is an administrator\n */\n isAdmin?: boolean;\n\n /**\n * User name\n */\n userName?: string;\n\n /**\n * First name\n */\n firstName?: string;\n\n /**\n * Last name\n */\n lastName?: string;\n\n /**\n * `true` if user is allowed to create a project\n */\n canCreateProject?: boolean;\n\n /**\n * The maximum number of projects that the user can create\n */\n projectsLimit?: number;\n\n /**\n * The size of the file storage available to the user\n */\n storageLimit?: number;\n}\n\n/**\n * The class representing a `user` entity.\n */\nexport class User {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements user data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n /**\n * User avatar image URL. Use {@link User#setAvatar | setAvatar()} to change avatar image.\n *\n * @readonly\n */\n get avatarUrl(): string {\n return this._data.avatarUrl;\n }\n\n /**\n * `true` if user is allowed to create a project.\n *\n * @readonly\n */\n get canCreateProject(): boolean {\n return this.data.canCreateProject;\n }\n\n /**\n * User account registration time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createAt(): string {\n return this.data.createAt;\n }\n\n /**\n * User custom fields object, to store custom data.\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this._data.customFields = value;\n }\n\n /**\n * Raw user data received from the server.\n *\n * @readonly\n */\n\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.avatarUrl = value.avatarImage ? `${this.httpClient.serverUrl}/users/${this._data.id}/avatar` : \"\";\n this._data.fullName = userFullName(this._data);\n this._data.initials = userInitials(this._data.fullName);\n }\n\n /**\n * User email.\n *\n * @readonly\n */\n get email(): string {\n return this.data.email;\n }\n\n /**\n * The user's email confirmation code, or an empty string if the email has already been confirmed.\n *\n * @readonly\n */\n get emailConfirmationId(): string {\n return this.data.emailConfirmationId;\n }\n\n /**\n * First name.\n */\n get firstName(): string {\n return this.data.firstName;\n }\n\n set firstName(value: string) {\n this._data.firstName = value;\n }\n\n /**\n * Full name. Returns the user's first and last name. If first name and last names are empty,\n * returns the user name.\n */\n get fullName(): string {\n return this.data.fullName;\n }\n\n /**\n * Unique user ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * User initials. Returns a first letters of the user's first and last names. If first name\n * and last names are empty, returns the first letter of the user name.\n */\n get initials(): string {\n return this.data.initials;\n }\n\n /**\n * `false` if the user has not yet confirmed his email address.\n *\n * @readonly\n */\n get isEmailConfirmed(): boolean {\n return this.data.isEmailConfirmed;\n }\n\n /**\n * User last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get lastModified(): string {\n return this.data.lastModified;\n }\n\n /**\n * Last name.\n */\n get lastName(): string {\n return this.data.lastName;\n }\n\n set lastName(value: string) {\n this._data.lastName = value;\n }\n\n /**\n * User last sign in time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get lastSignIn(): string {\n return this.data.lastSignIn;\n }\n\n /**\n * The maximum number of projects that a user can create.\n *\n * @readonly\n */\n get projectsLimit(): number {\n return this.data.projectsLimit;\n }\n\n /**\n * The user's API key.\n *\n * @readonly\n */\n get token(): string {\n return this.data.tokenInfo.token;\n }\n\n /**\n * User name.\n */\n get userName(): string {\n return this.data.userName;\n }\n\n set userName(value: string) {\n this._data.userName = value;\n }\n\n /**\n * Refresh user data. Only admins can checkout other users, if the current logged in user\n * does not have administrator rights, hi can only checkout himself, otherwise an exception\n * will be thrown.\n */\n async checkout(): Promise<User> {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.get(\"/user\"));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.get(`/users/${this.id}`));\n this.data = { id: data.id, ...data.userBrief };\n }\n return this;\n }\n\n /**\n * Update user data on the server. Only admins can update other users, if the current logged\n * in user does not have administrator rights, hi can only update himself, otherwise an\n * exception will be thrown.\n *\n * @async\n * @param data - Raw user data.\n */\n async update(data: any) {\n if (this.id === this.httpClient.signInUserId) {\n const newData = await json(this.httpClient.put(\"/user\", data));\n this.data = { id: this.id, ...newData };\n } else {\n const newData = await json(this.httpClient.put(`/users/${this.id}`, { userBrief: data }));\n this.data = { id: newData.id, ...newData.userBrief };\n }\n return this;\n }\n\n /**\n * Delete a user from the server. Only admins can delete users, if the current logged in user\n * does not have administrator rights, an exception will be thrown.\n *\n * Admins can delete themselves or other admins. An admin can only delete himself if he is\n * not the last administrator.\n *\n * You need to re-login to continue working after deleting the current logged in user.\n *\n * @async\n * @returns Returns the raw data of a deleted user.\n */\n delete(): Promise<any> {\n return json(this.httpClient.delete(`/users/${this.id}`)).then((data) => {\n if (this.id === this.httpClient.signInUserId) {\n this.httpClient.headers = {};\n this.httpClient.signInUserId = \"\";\n }\n return data;\n });\n }\n\n /**\n * Save user data changes to the server. Call this method to update user data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<User> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the user avatar. Only admins can set the avatar of other users, if the\n * current logged in user does not have administrator rights, he can only set his own avatar,\n * otherwise an exception will be thrown.\n *\n * @async\n * @param image - Avatar image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the avatar.\n */\n async setAvatar(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null): Promise<User> {\n if (image) {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.post(\"/user/avatar\", image));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.post(`/users/${this.id}/avatar`, image));\n this.data = { id: data.id, ...data.userBrief };\n }\n } else {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.delete(\"/user/avatar\"));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.delete(`/users/${this.id}/avatar`));\n this.data = { id: data.id, ...data.userBrief };\n }\n }\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { EventEmitter2 } from \"../Viewer/EventEmitter2\";\nimport { IHttpClient } from \"./IHttpClient\";\nimport { HttpClient } from \"./HttpClient\";\nimport { ClientEventMap } from \"./ClientEvents\";\nimport { Options } from \"../Viewer/Options\";\nimport { OptionsEventMap } from \"../Viewer/OptionsEvents\";\nimport { Assembly } from \"./Assembly\";\nimport { File } from \"./File\";\nimport { Job } from \"./Job\";\nimport { Project } from \"./Project\";\nimport { User } from \"./User\";\nimport { downloadProgress, json, text, parseArgs } from \"./impl/Utils\";\n\n/**\n * The `Client.js` library class that provides methods to access the [Open Cloud\n * Server](https://cloud.opendesign.com/docs/index.html#/opencloud_server) resources like\n * Projects, Files, Issues etc.\n */\nexport class Client extends EventEmitter2<ClientEventMap & OptionsEventMap> {\n private _options: Options;\n private _serverUrl: string;\n\n private _httpClient: IHttpClient;\n private _user: User | null;\n\n public eventEmitter: EventEmitter2;\n\n /**\n * @param params - An object containing client configuration parameters.\n * @param params.serverUrl - Open Cloud Server URL.\n */\n constructor(params: { serverUrl?: string; url?: string } = {}) {\n super();\n this.configure(params);\n this.eventEmitter = this;\n this._options = new Options(this);\n this._user = null;\n }\n\n /**\n * Open Cloud Server URL. Use {@link Client#configure | configure()} to change server URL.\n *\n * @readonly\n */\n get serverUrl(): string {\n return this._serverUrl;\n }\n\n /**\n * `VisualizeJS` parameters. Changes to these parameters are automatically applied to\n * `Viewer` instances associated with that client.\n */\n get options(): Options {\n return this._options;\n }\n\n /**\n * Change the client configuration parameters.\n *\n * @param params - An object containing new configuration parameters.\n * @param params.serverUrl - Open Cloud Server URL.\n * @returns Returns a reference to the `Client`.\n */\n configure(params: { serverUrl?: string }): this {\n this._serverUrl = (params.serverUrl || \"\").replace(/\\/+$/, \"\");\n this._httpClient = new HttpClient(this.serverUrl);\n this._user = null;\n return this;\n }\n\n /**\n * The Object represents server version information.\n *\n * @typedef {any} VersionResult\n * @property {string} version - The server version.\n * @property {string} hash - Build hash.\n */\n\n /**\n * Returns server version.\n *\n * @async\n */\n version(): Promise<any> {\n return this._httpClient\n .get(\"/version\")\n .then((response) => response.json())\n .then((data) => ({\n ...data,\n server: data.version,\n client: \"CLIENT_JS_VERSION\",\n }));\n }\n\n /**\n * Register a new user with the specified email and password.\n *\n * @async\n * @param email - User email. Cannot be empty.\n * @param password - User password. Cannot be empty. Password can only contain letters (a-z,\n * A-Z), numbers (0-9), and special characters (~!@#$%^&*()_-+={}[]:;\"'`<>,.?|/\\ ).\n * @param userName - User name. Cannot be empty or blank if defined. Leave undefined to use\n * `username` from email.\n */\n registerUser(email: string, password: string, userName?: string): Promise<any> {\n return this._httpClient\n .post(\"/register\", {\n email,\n password,\n userName: userName ?? (email + \"\").split(\"@\").at(0),\n })\n .then((response) => response.json());\n }\n\n /**\n * Resend the Confirmation Email to new user. If the user's email is already confirmed, an\n * exception will be thrown.\n *\n * @async\n * @param email - User email.\n * @param password - User password.\n */\n resendConfirmationEmail(email: string, password: string): Promise<any> {\n return this._httpClient\n .post(\"/register/email-confirmation\", { email, password })\n .then((response) => response.json());\n }\n\n /**\n * Confirm the user's email. If the user's email is already confirmed, an exception will be thrown.\n *\n * @async\n * @param emailConfirmationId - Confirmation code from the Confirmation Email.\n */\n confirmUserEmail(emailConfirmationId: string): Promise<any> {\n return this._httpClient\n .get(`/register/email-confirmation/${emailConfirmationId}`)\n .then((response) => response.json());\n }\n\n /**\n * Log in an existing user using email or user name.\n *\n * @async\n * @param email - An email or user name for authentication request.\n * @param password - Password for authentication request.\n */\n async signInWithEmail(email: string, password: string): Promise<User> {\n const credentials = btoa(unescape(encodeURIComponent(email + \":\" + password)));\n this._httpClient.headers = { Authorization: \"Basic \" + credentials };\n const data = await json(this._httpClient.get(\"/token\"));\n return this.setCurrentUser(data);\n }\n\n /**\n * Log in an existing user using API Key.\n *\n * @async\n * @param token - An access token for authentication request. See\n * {@link User#token | User.token} for more details.\n */\n async signInWithToken(token: string): Promise<User> {\n this._httpClient.headers = { Authorization: token };\n const data = await json(this._httpClient.get(\"/user\"));\n return this.setCurrentUser(data);\n }\n\n // Save the current logged in user information for internal use.\n\n private setCurrentUser(data: any): User {\n this._user = new User(data, this._httpClient);\n this._httpClient.headers = { Authorization: data.tokenInfo.token };\n this._httpClient.signInUserId = this._user.id;\n return this._user;\n }\n\n private clearCurrentUser(): void {\n this._user = null;\n this._httpClient.headers = {};\n this._httpClient.signInUserId = \"\";\n }\n\n /**\n * Returns the current logged in user information. Returns `null` if the user is not logged\n * in or the logged in user has deleted himself.\n */\n getCurrentUser(): User | null {\n if (this._user && !this._httpClient.signInUserId) this._user = null;\n return this._user;\n }\n\n /**\n * Returns a list of server users. Only admins can get a list of users, if the current logged\n * in user does not have administrator rights, an exception will be thrown.\n *\n * @async\n */\n getUsers(): Promise<User[]> {\n return json(this._httpClient.get(\"/users\"))\n .then((array) => array.map((data) => ({ id: data.id, ...data.userBrief })))\n .then((array) => array.map((data) => new User(data, this._httpClient)));\n }\n\n /**\n * Returns the user information. Only admins can get other users, if the current logged in\n * user does not have administrator rights, hi can only get himself, otherwise an exception\n * will be thrown.\n *\n * @async\n * @param userId - User ID.\n */\n getUser(userId: string): Promise<User> {\n if (userId === this._httpClient.signInUserId) {\n return json(this._httpClient.get(\"/user\"))\n .then((data) => ({ id: userId, ...data }))\n .then((data) => new User(data, this._httpClient));\n } else {\n return json(this._httpClient.get(`/users/${userId}`))\n .then((data) => ({ id: data.id, ...data.userBrief }))\n .then((data) => new User(data, this._httpClient));\n }\n }\n\n /**\n * Create a new user. Only admins can create users, if the current logged in user does not\n * have administrator rights, an exception will be thrown.\n *\n * @async\n * @param email - User email. Cannot be empty.\n * @param password - User password. Cannot be empty. Password can only contain latin letters\n * (a-z, A-Z), numbers (0-9), and special characters (~!@#$%^&*()_-+={}[]:;\"'`<>,.?|/\\ ).\n * @param params - Additional user data.\n * @param params.isAdmin - `true` if user is an administrator.\n * @param params.userName - User name. Cannot be empty or blank if defined. Leave undefined\n * to use `username` from email.\n * @param params.firstName - First name.\n * @param params.lastName - Last name.\n * @param params.canCreateProject - `true` if user is allowed to create a project.\n * @param params.projectsLimit - The maximum number of projects that the user can create.\n * @param params.storageLimit - The size of the file storage available to the user.\n */\n createUser(\n email: string,\n password: string,\n params: {\n isAdmin?: boolean;\n userName?: string;\n firstName?: string;\n lastName?: string;\n canCreateProject?: boolean;\n projectsLimit?: number;\n storageLimit?: number;\n } = {}\n ): Promise<User> {\n const { isAdmin, userName, ...rest } = params;\n return json(\n this._httpClient.post(\"/users\", {\n isAdmin,\n userBrief: {\n ...rest,\n email,\n userName: userName ?? (email + \"\").split(\"@\").at(0),\n },\n password,\n })\n )\n .then((data) => ({ id: data.id, ...data.userBrief }))\n .then((data) => new User(data, this._httpClient));\n }\n\n /**\n * Delete a user from the server. Only admins can delete users, if the current logged in user\n * does not have administrator rights, an exception will be thrown.\n *\n * Admins can delete themselves or other admins. An admin can only delete himself if he is\n * not the last administrator.\n *\n * You need to re-login to continue working after deleting the current logged in user.\n *\n * @async\n * @param userId - User ID.\n * @returns Returns the raw data of a deleted user.\n */\n deleteUser(userId: string): Promise<any> {\n return json(this._httpClient.delete(`/users/${userId}`)).then((data) => {\n if (userId === this._httpClient.signInUserId) {\n this.clearCurrentUser();\n }\n return data;\n });\n }\n\n /**\n * Result for file list.\n *\n * @typedef {any} FilesResult\n * @property {number} allSize - Total number of files the user has access to.\n * @property {number} start - The starting index in the file list in the request.\n * @property {number} limit - The maximum number of requested files.\n * @property {File[]} result - Result file list.\n * @property {number} size - The number of files in the result list.\n */\n\n /**\n * Returns a list of files the user has access to.\n *\n * @async\n * @param start - The starting index in the file list. Used for paging.\n * @param limit - The maximum number of files that should be returned per request. Used for paging.\n * @param name - Filter the files by part of the name.\n * @param ext - Filter the files by extension. Extension can be `dgn`, `dwf`, `dwg`, `dxf`,\n * `ifc`, `ifczip`, `nwc`, `nwd`, `obj`, `rcs`, `rfa`, `rvt`, `step`, `stl`, `stp`, `vsf`,\n * or any other drawing or reference file type extension. You can specify multiple\n * extensions on one `string` by separating them with a \"|\".\n * @param ids - List of file IDs to return. You can specify multiple IDs on one `string` by\n * separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default,\n * files are sorted by name in ascending order.\n * @param {string} sortField - Allows to specify sort field.\n */\n getFiles(\n start?: number,\n limit?: number,\n name?: string,\n ext?: string | string[],\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: File[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ext) {\n if (Array.isArray(ext)) ext = ext.join(\"|\");\n if (typeof ext === \"string\") ext = ext.toLowerCase();\n if (ext) searchParams.set(\"ext\", ext);\n }\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/files${queryString}`)).then((files) => {\n return {\n ...files,\n result: files.result.map((data) => new File(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Returns the file information.\n *\n * @async\n * @param fileId - File ID.\n */\n getFile(fileId: string): Promise<File> {\n return json(this._httpClient.get(`/files/${fileId}`)).then((data) => new File(data, this._httpClient));\n }\n\n /**\n * Upload a drawing or reference file to the server.\n *\n * Fires:\n *\n * - {@link UploadProgressEvent | uploadprogress}\n *\n * @async\n * @param file - Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object are generally retrieved from a <a\n * href=\"https://developer.mozilla.org/docs/Web/API/FileList\" target=\"_blank\">FileList</a>\n * object returned as a result of a user selecting files using the HTML `<input>` element.\n * @param params - An object containing upload parameters.\n * @param params.geometry=true - Create job to extract file geometry data. Can be:\n *\n * - `true` - Extract file geometry data into type, defined by [options]{@link Client#options}.\n * - `vsfx` - Extract file geometry data into `VSFX` to open the file in `VisualizeJS` viewer.\n * - `gltf` - Extract file geometry data into `glTF` to open the file in `Three.js` viewer.\n *\n * @param params.properties=false - Create job to extract file properties.\n * @param params.waitForDone=false - Wait for geometry and properties jobs to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait jobs. If\n * no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking jobs status.\n * @param params.signal - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onProgress - Upload progress callback.\n */\n async uploadFile(\n file: globalThis.File,\n params: {\n geometry?: boolean | string;\n properties?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n geometry: true,\n properties: false,\n waitForDone: false,\n }\n ): Promise<File> {\n const result = await this._httpClient\n .postFile(\"/files\", file, (progress) => {\n this.emitEvent({ type: \"uploadprogress\", data: progress, file });\n params.onProgress?.(progress, file);\n })\n .then((xhr: XMLHttpRequest) => JSON.parse(xhr.responseText))\n .then((data) => new File(data, this._httpClient));\n\n const geometryType = typeof params.geometry === \"string\" ? params.geometry : this.options.geometryType;\n\n const jobs: string[] = [];\n if (params.geometry) jobs.push((await result.extractGeometry(geometryType)).outputFormat);\n if (params.properties) jobs.push((await result.extractProperties()).outputFormat);\n if (params.waitForDone && jobs.length > 0) await result.waitForDone(jobs, true, params);\n\n return result;\n }\n\n /**\n * Delete the drawing or reference file from the server.\n *\n * @async\n * @param fileId - File ID.\n * @returns Returns the raw data of a deleted file.\n */\n deleteFile(fileId: string): Promise<any> {\n return json(this._httpClient.delete(`/files/${fileId}`));\n }\n\n /**\n * Download the drawing or reference file.\n *\n * @async\n * @param fileId - File ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadFile(fileId: string, onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ArrayBuffer> {\n return this._httpClient\n .get(`/files/${fileId}/downloads`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Result for job list.\n *\n * @typedef {any} JobsResult\n * @property {number} allSize - Total number of jobs created by the user.\n * @property {number} start - The starting index in the job list in the request.\n * @property {number} limit - The maximum number of requested jobs.\n * @property {Job[]} result - Result job list.\n * @property {number} size - The number of jobs in the result list.\n */\n\n /**\n * Returns a list of jobs created by current user.\n *\n * @async\n * @param status - Filter the jobs by status. Status can be `waiting`, `inpogress`, `done` or\n * `failed`. You can specify multiple statuses on one `string` by separating them with a \"|\".\n * @param limit - The maximum number of jobs that should be returned per request. Used for paging.\n * @param start - The starting index in the job list. Used for paging.\n * @param sortByDesc - Allows to specify the descending order of the result. By default, jobs\n * are sorted by creation time in ascending order.\n * @param {boolean} sortField - Allows to specify sort field.\n */\n getJobs(\n status?: string | string[],\n limit?: number,\n start?: number,\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: Job[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (status) {\n if (Array.isArray(status)) status = status.join(\"|\");\n if (typeof status === \"string\") status = status.trim().toLowerCase();\n if (status) searchParams.set(\"status\", status);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/jobs${queryString}`)).then((jobs) => ({\n ...jobs,\n result: jobs.result.map((data) => new Job(data, this._httpClient)),\n }));\n }\n\n /**\n * Returns the job information.\n *\n * @async\n * @param jobId - Job ID.\n */\n getJob(jobId: string): Promise<Job> {\n return json(this._httpClient.get(`/jobs/${jobId}`)).then((data) => new Job(data, this._httpClient));\n }\n\n /**\n * Create a new job.\n *\n * @async\n * @param fileId - File ID.\n * @param outputFormat - The job type. Can be one of:\n *\n * - `geometry` - Extract file geometry data into `VSFX`.\n * - `geometryGltf` - Extract file geometry data into `glTF`.\n * - `properties` - Extract file properties.\n * - `validation` - Validate the file. Only for `IFC`.\n * - `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`, `3dpdf` - Export file to the one of the supported format.\n * - Other custom job name. Custom job runner must be registered in the job templates table\n * before creating a job.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n createJob(fileId: string, outputFormat: string, parameters?: string | object): Promise<Job> {\n return this._httpClient\n .post(\"/jobs\", {\n fileId,\n outputFormat,\n parameters: parseArgs(parameters),\n })\n .then((response) => response.json())\n .then((data) => new Job(data, this._httpClient));\n }\n\n /**\n * Remove a job from the server job list. The method does not delete or stop jobs that are\n * already being executed.\n *\n * @async\n * @param jobId - Job ID.\n * @returns Returns the raw data of a deleted job.\n */\n deleteJob(jobId: string): Promise<any> {\n return json(this._httpClient.delete(`/jobs/${jobId}`));\n }\n\n /**\n * Result for assembly list.\n *\n * @typedef {any} AssembliesResult\n * @property {number} allSize - Total number of assemblies the user has access to.\n * @property {number} start - The starting index in the assembly list in the request.\n * @property {number} limit - The maximum number of requested assemblies.\n * @property {Assembly[]} result - Result assembly list.\n * @property {number} size - The number of assemblies in the result list.\n */\n\n /**\n * Returns a list of assemblies the user has access to.\n *\n * @async\n * @param start - The starting index in the assembly list. Used for paging.\n * @param limit - The maximum number of assemblies that should be returned per request. Used\n * for paging.\n * @param name - Filter the assemblies by part of the name.\n * @param ids - List of assembly IDs to return. You can specify multiple IDs on one `string`\n * by separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default\n * assemblies are sorted by name in ascending order.\n * @param sortField - Allows to specify sort field.\n */\n getAssemblies(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: Assembly[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/assemblies${queryString}`)).then((assemblies) => {\n return {\n ...assemblies,\n result: assemblies.result.map((data) => new Assembly(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Get assembly information.\n *\n * @async\n * @param assemblyId - Assembly ID.\n */\n getAssembly(assemblyId: string): Promise<Assembly> {\n return json(this._httpClient.get(`/assemblies/${assemblyId}`)).then((data) => new Assembly(data, this._httpClient));\n }\n\n /**\n * Create a new assembly.\n *\n * @async\n * @param files - List of file IDs.\n * @param name - Assembly name.\n * @param params - An object containing upload parameters.\n * @param params.waitForDone=false - Wait for assembly to be created.\n */\n createAssembly(\n files: string[],\n name: string,\n params?: {\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n }\n ): Promise<Assembly> {\n const { waitForDone } = params ?? {};\n return this._httpClient\n .post(\"/assemblies\", { name, files })\n .then((response) => response.json())\n .then((data) => new Assembly(data, this._httpClient))\n .then((result) => (waitForDone ? result.waitForDone(params) : result));\n }\n\n /**\n * Delete the assembly from the server.\n *\n * @async\n * @param assemblyId - Assembly ID.\n * @returns Returns the raw data of a deleted assembly.\n */\n deleteAssembly(assemblyId: string): Promise<any> {\n return json(this._httpClient.delete(`/assemblies/${assemblyId}`));\n }\n\n /**\n * Result for project list.\n *\n * @typedef {any} ProjectsResult\n * @property {number} allSize - Total number of projects the user has access to.\n * @property {number} start - The starting index in the project list in the request.\n * @property {number} limit - The maximum number of requested projects.\n * @property {Project[]} result - Result project list.\n * @property {number} size - The number of projects in the result list.\n */\n\n /**\n * Returns a list of projects the user has access to.\n *\n * @async\n * @param start - The starting index in the project list. Used for paging.\n * @param limit - The maximum number of projects that should be returned per request. Used for paging.\n * @param name - Filter the projects by part of the name.\n * @param ids - List of project IDs to return. You can specify multiple IDs on one `string`\n * by separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default\n * projects are sorted by name in ascending order.\n */\n getProjects(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean\n ): Promise<{ allSize: number; start: number; limit: number; result: Project[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n return json(this._httpClient.get(`/projects${queryString}`))\n .then((projects) => {\n // fix for server 23.5 and below\n if (Array.isArray(projects)) {\n let result = projects;\n if (ids) result = result.filter((x) => ids.includes(x.id));\n if (name) result = result.filter((x) => x.name.includes(name));\n if (limit > 0) {\n const begin = start > 0 ? start : 0;\n result = result.slice(begin, begin + limit);\n }\n return {\n allSize: projects.length,\n start,\n limit,\n result,\n size: result.length,\n };\n }\n return projects;\n })\n .then((projects) => {\n return {\n ...projects,\n result: projects.result.map((data) => new Project(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Returns the project information.\n *\n * @async\n * @param projectId - Project ID.\n */\n getProject(projectId: string): Promise<Project> {\n return json(this._httpClient.get(`/projects/${projectId}`)).then((data) => new Project(data, this._httpClient));\n }\n\n /**\n * Create a new project.\n *\n * @async\n * @param name - Project name.\n * @param description - Project description.\n * @param startDate - Project start date.\n * @param endDate - Project end date.\n * @param avatarUrl - Project preview image URL. Can be <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n */\n createProject(\n name: string,\n description?: string,\n startDate?: Date | string,\n endDate?: Date | string,\n avatarUrl?: string\n ): Promise<Project> {\n return json(\n this._httpClient.post(\"/projects\", {\n name,\n description,\n startDate: startDate instanceof Date ? startDate.toISOString() : startDate,\n endDate: endDate instanceof Date ? endDate.toISOString() : endDate,\n avatarUrl,\n })\n ).then((data) => new Project(data, this._httpClient));\n }\n\n /**\n * Delete the project from the server.\n *\n * @async\n * @param projectId - Project ID.\n * @returns Returns the raw data of a deleted project.\n */\n deleteProject(projectId: string): Promise<any> {\n return text(this._httpClient.delete(`/projects/${projectId}`)).then((text) => {\n // fix for server 23.5 and below\n try {\n return JSON.parse(text);\n } catch {\n return { id: projectId };\n }\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IViewer } from \"./IViewer\";\nimport { ICommand, ICommandHandler, ICommandDescription, ICommandsMap, ICommands } from \"./ICommands\";\n\nclass Commands implements ICommands {\n private readonly _commands = new Map<string, ICommand>();\n\n registerCommand(id: string, handler: ICommandHandler, description?: ICommandDescription, thisArg?: any): void {\n this._commands.set(id, { id, handler, thisArg, description });\n }\n\n registerCommandAlias(id: string, alias: string): void {\n this.registerCommand(alias, (viewer: IViewer, ...args) => this.executeCommand(id, viewer, ...args));\n }\n\n getCommand(id: string): ICommand | undefined {\n return this._commands.get(id);\n }\n\n getCommands(): ICommandsMap {\n const map = new Map<string, ICommand>();\n this._commands.forEach((value, key) => map.set(key, value));\n return map;\n }\n\n executeCommand(id: string, viewer: IViewer, ...args: any[]): any {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n\n const { handler, thisArg } = command;\n const result = handler.apply(thisArg, [viewer, ...args]);\n\n viewer?.emit({ type: \"command\", data: id, args });\n\n return result;\n }\n}\n\nconst _commands = new Map<string, Commands>();\n\nexport function commands(viewerType: string): ICommands {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands();\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", () => {});\ncommands(\"ThreeJS\").registerCommand(\"noop\", () => {});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Matrix3d, OdTvPlane, Point3d, Vector3d } from \"./Geometry\";\n\nexport type ViewParams = {\n position: number[];\n target: number[];\n upVector: number[];\n viewFieldWidth: number;\n viewFieldHeight: number;\n perspective: boolean;\n};\n\nexport class OdaGeAction {\n protected m_module;\n\n constructor(module: any) {\n this.m_module = module;\n }\n\n protected getViewer(): any {\n return this.m_module.getViewer();\n }\n\n protected getModel(): any {\n return this.getViewer().getMarkupModel();\n }\n\n protected copyPoint(point: Point3d): Point3d {\n const p: Point3d = new this.m_module.Point3d();\n p.set(point.x, point.y, point.z);\n return p;\n }\n\n protected createVector3d(): Vector3d {\n return new this.m_module.Vector3d();\n }\n\n protected createPoint3d(): Point3d {\n return new this.m_module.Point3d();\n }\n\n protected createMatrix3d(): Matrix3d {\n return new this.m_module.Matrix3d();\n }\n\n protected createPlane(): OdTvPlane {\n return new this.m_module.OdTvPlane();\n }\n\n protected toVector(geVector): Vector3d {\n return this.m_module.Vector3d.createFromArray(geVector);\n }\n\n protected toGeVector(v: Vector3d): number[] {\n return [v.x, v.y, v.z];\n }\n\n protected toGePoint(point: Point3d): number[] {\n return [point.x, point.y, point.z];\n }\n\n protected toPoint(gePoint: number[]): Point3d {\n return this.m_module.Point3d.createFromArray(gePoint);\n }\n\n protected screenToWorld(x: number, y: number): Point3d {\n return this.toPoint(this.m_module.getViewer().screenToWorld(x, y));\n }\n\n protected toDoubleArray(points: Point3d[]): number[] {\n const p: number[] = [];\n for (let i = 0; i < points.length; i++) {\n p.push(points[i].x);\n p.push(points[i].y);\n p.push(points[i].z);\n }\n return p;\n }\n\n protected correctCameraTarget(): void {\n const params = this.getViewParams();\n const ext = this.m_module.getViewer().getActiveExtents();\n const { min, max } = ext;\n const target = this.toPoint(params.target);\n\n const contains =\n target.x >= min.x &&\n target.y >= min.y &&\n target.z >= min.z &&\n target.x <= max.x &&\n target.y <= max.y &&\n target.z <= max.z;\n if (!contains) {\n params.target = ext.center();\n this.setViewParams(params);\n }\n }\n\n protected setViewParams = (params: ViewParams) => {\n const extView = this.m_module.getViewer().getActiveTvExtendedView();\n extView.setView(\n params.position,\n params.target,\n params.upVector,\n params.viewFieldWidth,\n params.viewFieldHeight,\n params.perspective\n );\n extView.delete?.();\n };\n\n protected getViewParams = () => {\n const view = this.m_module.getViewer().activeView;\n const obj = {\n position: view.viewPosition,\n target: view.viewTarget,\n upVector: view.upVector,\n viewFieldWidth: view.viewFieldWidth,\n viewFieldHeight: view.viewFieldHeight,\n perspective: view.perspective,\n } as ViewParams;\n view.delete?.();\n return obj;\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\n\nimport { Viewer } from \"../../Viewer\";\nimport { CANVAS_EVENTS } from \"../../CanvasEvents\";\nimport { Point2d } from \"./Geometry\";\nimport { OdaGeAction } from \"./OdaGeAction\";\n\nconst CLICK_DELTA = 5;\n\nconst INTERACTIVITY_FPS = 24;\n\n/**\n * A [Viewer]{@link Viewer} event that fires when the viewer needs to be updated.\n *\n * @property {string} type - `update`\n * @event update\n */\n\n/**\n * A [Viewer]{@link Viewer} event that fires when the user selects an entity with the mouse.\n *\n * @property {string} type - `select`\n * @property {OdTvSelectionSet} data - The set of selected entities. For more information, see\n * [OdTvSelectionSet](https://cloud.opendesign.com/docs/index.html#/vis/OdTvSelectionSet?id=odtvselectionset).\n * @event select\n */\n\nexport class OdBaseDragger extends OdaGeAction {\n protected subject: Viewer;\n protected needInputText: boolean;\n protected mouseDownPosition: Point2d;\n protected autoSelect: boolean;\n protected onmessage: (event: any) => boolean;\n protected canvasEvents: string[];\n protected isDragging: boolean;\n protected press: boolean;\n\n public name: string;\n\n constructor(subject: Viewer) {\n super(subject.visualizeJs);\n this.subject = subject;\n this.needInputText = false;\n this.mouseDownPosition = { x: 0, y: 0 };\n this.autoSelect = false;\n\n this.onmessage = (event) => this.subject.emitEvent(event);\n this.canvasEvents = CANVAS_EVENTS;\n }\n\n public initialize(): void {\n this.canvasEvents = this.canvasEvents.filter((x) => typeof this[x] === \"function\");\n this.canvasEvents.forEach((x) => (this[x] = this[x].bind(this)));\n this.canvasEvents.forEach((x) => this.subject.on(x, this[x]));\n\n this.getViewer().setEnableAutoSelect(!!this.autoSelect);\n }\n\n public dispose(): void {\n this.canvasEvents.forEach((x) => this.subject.off(x, this[x]));\n }\n\n protected relativeCoords(event: MouseEvent): Point2d {\n return { x: event.offsetX * window.devicePixelRatio, y: event.offsetY * window.devicePixelRatio };\n }\n\n protected pointerdown(ev: PointerEvent): void {\n if (!ev.isPrimary || OdBaseDragger.isGestureActive) {\n return;\n }\n\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n\n const relCoord = this.relativeCoords(ev);\n this.isDragging = true;\n this.mouseDownPosition = { x: relCoord.x, y: relCoord.y };\n this.start(relCoord.x, relCoord.y, ev.clientX, ev.clientY);\n this.subject.update();\n }\n\n protected pointerup(ev: PointerEvent): void {\n if (OdBaseDragger.needSkipPointerUp) {\n return;\n }\n\n if (!ev.isPrimary) {\n return;\n }\n\n (ev.target as HTMLElement).releasePointerCapture(ev.pointerId);\n\n const relCoord = this.relativeCoords(ev);\n this.end(relCoord.x, relCoord.y);\n this.isDragging = false;\n this.subject.update();\n }\n\n protected pointercancel(ev: PointerEvent): void {\n if (!ev.isPrimary) {\n return;\n }\n\n this.m_module.canvas.dispatchEvent(new PointerEvent(\"pointerup\", ev));\n }\n\n protected pointermove(ev: PointerEvent): void {\n if (!ev.isPrimary || OdBaseDragger.isGestureActive) {\n return;\n }\n\n const relCoord = this.relativeCoords(ev);\n this.drag(relCoord.x, relCoord.y, ev.movementX, ev.movementY);\n if (this.isDragging) {\n this.subject.update();\n }\n }\n\n protected click(ev: MouseEvent): void {\n const viewer = this.getViewer();\n const relCoord = this.relativeCoords(ev);\n const x = relCoord.x;\n const y = relCoord.y;\n\n const isNotDragging =\n Math.abs(x - this.mouseDownPosition.x) < CLICK_DELTA && Math.abs(y - this.mouseDownPosition.y) < CLICK_DELTA;\n\n if (viewer && viewer.getEnableAutoSelect() && isNotDragging) {\n viewer.unselect();\n viewer.select(x, y, x, y);\n this.subject.update();\n\n const selectionSet = viewer.getSelected();\n const handles = this.subject.getSelected();\n this.onmessage({ type: \"select\", data: selectionSet, handles });\n }\n }\n\n protected dblclick(ev: MouseEvent): void {\n const viewer = this.getViewer();\n const relCoord = this.relativeCoords(ev);\n const x = relCoord.x;\n const y = relCoord.y;\n\n const device = viewer.getActiveDevice();\n const clickView = device.viewAt([x, y]);\n if (clickView && !clickView.active) {\n viewer.activeView = clickView;\n clickView.delete();\n this.subject.update();\n } else {\n if (viewer && viewer.getEnableAutoSelect()) {\n const pSelected = viewer.getSelected();\n\n if (!pSelected.isNull() && pSelected.numItems() !== 0) {\n const itr = pSelected.getIterator();\n const entity = itr.getEntity();\n viewer.zoomToEntity(entity);\n\n this.onmessage({ type: \"zoomtoentity\", data: entity });\n this.subject.update();\n\n this.deleteAll([itr, entity]);\n }\n }\n }\n\n device.delete();\n }\n\n protected start(x: number, y: number, absoluteX = 0, absoluteY = 0): void {}\n\n protected drag(x: number, y: number, absoluteX = 0, absoluteY = 0): void {}\n\n protected end(x: number, y: number): void {}\n\n protected beginInteractivity = () => {\n const viewer = this.getViewer();\n const view = viewer.activeView;\n if (view[\"beginInteractivity\"]) {\n view.beginInteractivity(INTERACTIVITY_FPS);\n this.subject.update();\n }\n view.delete();\n };\n\n protected endInteractivity = () => {\n const viewer = this.getViewer();\n const view = viewer.activeView;\n if (view[\"endInteractivity\"]) {\n view.endInteractivity();\n\n const device = this.getViewer().getActiveDevice();\n const canvas = this.m_module.canvas;\n device.invalidate([0, 0, canvas.width, canvas.height]);\n device.delete();\n this.subject.update();\n }\n view.delete();\n };\n\n protected getActiveMarkupEntity(entityName: string): any {\n return this.subject.addMarkupEntity(entityName);\n }\n\n private syncOverlayView(): any {\n return this.subject.syncOverlay();\n }\n\n protected deleteAll(objects): void {\n for (const obj of objects) {\n obj?.delete?.();\n }\n }\n\n public updatePreview(): void {}\n\n private static _isGestureActive = false;\n\n protected static set isGestureActive(value: boolean) {\n if (OdBaseDragger._isGestureActive === value) {\n return;\n }\n\n OdBaseDragger._isGestureActive = value;\n if (OdBaseDragger._isGestureActive) {\n OdBaseDragger.needSkipPointerUp = true;\n }\n }\n\n protected static get isGestureActive() {\n return OdBaseDragger._isGestureActive;\n }\n\n private static _needSkipPointerUp = false;\n\n private static get needSkipPointerUp() {\n if (OdBaseDragger._needSkipPointerUp) {\n OdBaseDragger.needSkipPointerUp = false;\n return true;\n }\n\n return false;\n }\n\n private static set needSkipPointerUp(value: boolean) {\n OdBaseDragger._needSkipPointerUp = value;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point2d } from \"../Common/Geometry\";\n\nexport function createHtmlElementIfNeed(\n element: HTMLElement,\n targetElement: HTMLElement,\n dataTestId: string\n): HTMLElement {\n if (!element) {\n element = document.createElement(\"div\");\n element.setAttribute(\"data-testid\", dataTestId);\n\n targetElement.appendChild(element);\n }\n return element;\n}\n\nexport function destroyHtmlElement(element: HTMLElement, targetElement: HTMLElement) {\n if (element) {\n targetElement.removeChild(element);\n }\n return null;\n}\n\nexport function worldToScreen(gePoint: number[], moduleInstance, viewer): Point2d {\n const worldPoint = moduleInstance.Point3d.createFromArray(gePoint);\n const avp = viewer.activeView;\n const mtx = avp.worldToDeviceMatrix;\n\n const devicePoint = worldPoint.transformBy(mtx);\n\n const res = { x: devicePoint.x / window.devicePixelRatio, y: devicePoint.y / window.devicePixelRatio };\n\n mtx.delete();\n worldPoint.delete();\n devicePoint.delete();\n avp.delete();\n return res;\n}\n\nexport function getDistance(gePoint1: number[], gePoint2: number[], moduleInstance: any) {\n const tvPoint1 = moduleInstance.Point3d.createFromArray(gePoint1);\n const tvPoint2 = moduleInstance.Point3d.createFromArray(gePoint2);\n\n const distance = tvPoint1.distanceTo(tvPoint2).toFixed(2);\n\n tvPoint1.delete();\n tvPoint2.delete();\n\n return distance;\n}\n\nexport function getAngle(geStart: number[], geOrigin: number[], geEnd: number[], moduleInstance: any): number {\n const tvStart = moduleInstance.Point3d.createFromArray(geStart);\n const tvOrigin = moduleInstance.Point3d.createFromArray(geOrigin);\n const tvEnd = moduleInstance.Point3d.createFromArray(geEnd);\n\n const s1 = tvStart.sub(tvOrigin);\n const s2 = tvEnd.sub(tvOrigin);\n\n const v1 = s1.asVector();\n const v2 = s2.asVector();\n\n const angle = (180 * v1.angleTo(v2)) / Math.PI;\n\n return angle;\n}\n\nexport function getDataForDrawLine(p1: Point2d, p2: Point2d) {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n let angle = (180 * Math.atan(dy / dx)) / Math.PI;\n if (dx < 0) {\n angle -= 180;\n }\n const width = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n return { angle, width };\n}\n\nfunction normalizeFloat(value: number): number {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n}\n\nconst lineSegmentsIntersect = (p1: Point2d, p2: Point2d, p3: Point2d, p4: Point2d): false | Point2d => {\n const a_dx = p2.x - p1.x;\n const a_dy = p2.y - p1.y;\n const b_dx = p4.x - p3.x;\n const b_dy = p4.y - p3.y;\n const s = (-a_dy * (p1.x - p3.x) + a_dx * (p1.y - p3.y)) / (-b_dx * a_dy + a_dx * b_dy);\n const t = (+b_dx * (p1.y - p3.y) - b_dy * (p1.x - p3.x)) / (-b_dx * a_dy + a_dx * b_dy);\n return s >= 0 && s <= 1 && t >= 0 && t <= 1\n ? {\n x: normalizeFloat(p1.x + t * a_dx),\n y: normalizeFloat(p1.y + t * a_dy),\n }\n : false;\n};\n\nfunction checkSegmentsIntersect(p1: Point2d, p2: Point2d, p3: Point2d, p4: Point2d, res: Point2d[]): void {\n const r = lineSegmentsIntersect(p1, p2, p3, p4);\n if (r) {\n res.push(r);\n }\n}\n\nexport function isInsideRect(p: Point2d, width: number, height: number): boolean {\n return p.x <= width && p.x >= 0 && p.y <= height && p.y >= 0;\n}\n\nexport function getDataForDrawLineWithFixed(p1: Point2d, p2: Point2d, width: number, height: number) {\n const pLU = { x: 0, y: 0 };\n const pRU = { x: width, y: 0 };\n\n const pLB = { x: 0, y: height };\n const pRB = { x: width, y: height };\n\n const intersects: Point2d[] = [];\n\n checkSegmentsIntersect(p1, p2, pLU, pRU, intersects);\n checkSegmentsIntersect(p1, p2, pLU, pLB, intersects);\n checkSegmentsIntersect(p1, p2, pLB, pRB, intersects);\n checkSegmentsIntersect(p1, p2, pRB, pRU, intersects);\n\n let fixedP1: Point2d = null;\n let fixedP2: Point2d = null;\n\n if (intersects.length === 0) {\n fixedP1 = p1;\n fixedP2 = p2;\n } else if (intersects.length === 1) {\n if (isInsideRect(p1, width, height)) {\n fixedP1 = p1;\n fixedP2 = intersects[0];\n } else {\n fixedP1 = intersects[0];\n fixedP2 = p2;\n }\n } else {\n fixedP1 = intersects[0];\n fixedP2 = intersects[1];\n }\n\n const dx = fixedP2.x - fixedP1.x;\n const dy = fixedP2.y - fixedP1.y;\n let angle = (180 * Math.atan(dy / dx)) / Math.PI;\n if (dx < 0) {\n angle -= 180;\n }\n const size = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n return { angle, width: size, p1: fixedP1, p2: fixedP2 };\n}\n\nexport function onSetCallback(element: HTMLElement, cb: () => void): void {\n if (element) {\n element.onclick = cb ? () => cb() : () => {};\n }\n}\n\nexport function onSetSelectivity(element: HTMLElement, enable: boolean): void {\n element.style.pointerEvents = enable ? \"auto\" : \"none\";\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport * as utils from \"./MeasureUtils\";\n\nexport class MeasureLineItem {\n protected htmlElemStartPoint: HTMLElement;\n protected htmlElemEndPoint: HTMLElement;\n protected htmlElemLine: HTMLElement;\n protected htmlElemTitle: HTMLElement;\n protected startPoint: number[];\n protected endPoint: number[];\n protected unit: string;\n protected scale: number;\n protected size: number;\n protected style: CSSStyleDeclaration;\n protected viewer: any;\n protected moduleInstance: any;\n protected targetElement: HTMLElement;\n protected isFinishDraw: boolean;\n\n public lineThickness: number;\n\n constructor(targetElement: HTMLElement, viewer: any, moduleInstance: any) {\n this.htmlElemStartPoint = null;\n this.htmlElemEndPoint = null;\n this.htmlElemLine = null;\n this.htmlElemTitle = null;\n\n this.startPoint = null;\n this.endPoint = null;\n\n this.unit = \"\";\n this.scale = 1.0;\n this.size = 10.0;\n this.lineThickness = 2;\n\n this.style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n color: \"white\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n } as CSSStyleDeclaration;\n\n this.htmlElemStartPoint = utils.createHtmlElementIfNeed(this.htmlElemStartPoint, targetElement, \"ruler-start\");\n this.htmlElemEndPoint = utils.createHtmlElementIfNeed(this.htmlElemEndPoint, targetElement, \"ruler-end\");\n this.htmlElemLine = utils.createHtmlElementIfNeed(this.htmlElemLine, targetElement, \"ruler-line\");\n this.htmlElemTitle = utils.createHtmlElementIfNeed(this.htmlElemTitle, targetElement, \"ruler-value\");\n\n this.viewer = viewer;\n this.moduleInstance = moduleInstance;\n this.targetElement = targetElement;\n this.isFinishDraw = false;\n }\n\n drawMeasureLine(): void {\n const pointSize = this.size;\n const rect = this.moduleInstance.canvas.getBoundingClientRect();\n\n // draw start point\n if (this.startPoint) {\n this.htmlElemStartPoint = utils.createHtmlElementIfNeed(\n this.htmlElemStartPoint,\n this.targetElement,\n \"ruler-start\"\n );\n\n const pScreenStart = utils.worldToScreen(this.startPoint, this.moduleInstance, this.viewer);\n if (utils.isInsideRect(pScreenStart, rect.width, rect.height)) {\n this.htmlElemStartPoint.style.display = \"block\";\n this.htmlElemStartPoint.style.cursor = \"pointer\";\n this.htmlElemStartPoint.style.position = \"absolute\";\n this.htmlElemStartPoint.style.top = `${pScreenStart.y - pointSize / 2}px`;\n this.htmlElemStartPoint.style.left = `${pScreenStart.x - pointSize / 2}px`;\n this.htmlElemStartPoint.style.borderRadius = `${pointSize}px`;\n this.htmlElemStartPoint.style.border = this.style.border;\n this.htmlElemStartPoint.style.background = this.style.background;\n this.htmlElemStartPoint.style.zIndex = \"2\";\n this.htmlElemStartPoint.style.width = `${pointSize}px`;\n this.htmlElemStartPoint.style.height = `${pointSize}px`;\n this.htmlElemStartPoint.style.boxShadow = this.style.boxShadow;\n } else {\n this.htmlElemStartPoint.style.display = \"none\";\n }\n }\n\n // draw end point\n if (this.endPoint && this.isFinishDraw) {\n this.htmlElemEndPoint = utils.createHtmlElementIfNeed(this.htmlElemEndPoint, this.targetElement, \"ruler-end\");\n\n const pScreenEnd = utils.worldToScreen(this.endPoint, this.moduleInstance, this.viewer);\n\n if (utils.isInsideRect(pScreenEnd, rect.width, rect.height)) {\n this.htmlElemEndPoint.style.display = \"block\";\n this.htmlElemEndPoint.style.cursor = \"pointer\";\n this.htmlElemEndPoint.style.position = \"absolute\";\n this.htmlElemEndPoint.style.top = `${pScreenEnd.y - pointSize / 2}px`;\n this.htmlElemEndPoint.style.left = `${pScreenEnd.x - pointSize / 2}px`;\n this.htmlElemEndPoint.style.borderRadius = `${pointSize}px`;\n this.htmlElemEndPoint.style.border = this.style.border;\n this.htmlElemEndPoint.style.background = this.style.background;\n this.htmlElemEndPoint.style.zIndex = \"2\";\n this.htmlElemEndPoint.style.width = `${pointSize}px`;\n this.htmlElemEndPoint.style.height = `${pointSize}px`;\n this.htmlElemEndPoint.style.boxShadow = this.style.boxShadow;\n } else {\n this.htmlElemEndPoint.style.display = \"none\";\n }\n }\n\n if (this.endPoint && this.startPoint) {\n const point1 = utils.worldToScreen(this.startPoint, this.moduleInstance, this.viewer);\n const point2 = utils.worldToScreen(this.endPoint, this.moduleInstance, this.viewer);\n\n const { p1, p2, angle, width } = utils.getDataForDrawLineWithFixed(point1, point2, rect.width, rect.height);\n\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n\n const height = this.lineThickness;\n if (utils.isInsideRect(p1, rect.width, rect.height) && utils.isInsideRect(p2, rect.width, rect.height)) {\n this.htmlElemLine = utils.createHtmlElementIfNeed(this.htmlElemLine, this.targetElement, \"ruler-line\");\n this.htmlElemLine.style.display = \"block\";\n this.htmlElemLine.style.cursor = \"pointer\";\n this.htmlElemLine.style.position = \"absolute\";\n this.htmlElemLine.style.top = `${p1.y}px`;\n this.htmlElemLine.style.left = `${p1.x}px`;\n this.htmlElemLine.style.width = `${width}px`;\n this.htmlElemLine.style.transform = `rotate(${angle}deg)`;\n this.htmlElemLine.style.transformOrigin = `0px ${height / 2}px`;\n this.htmlElemLine.style.boxShadow = this.style.boxShadow;\n this.htmlElemLine.style.border = \"none\";\n this.htmlElemLine.style.background = this.style.background;\n this.htmlElemLine.style.zIndex = \"1\";\n this.htmlElemLine.style.height = `${height}px`;\n\n const distance = `${this.getDistance()} ${this.unit}`;\n\n const pX = p1.x + dx / 2;\n const pY = p1.y + dy / 2;\n\n const widthTitle = distance.length * 10;\n\n this.htmlElemTitle = utils.createHtmlElementIfNeed(this.htmlElemTitle, this.targetElement, \"ruler-value\");\n this.htmlElemTitle.style.display = \"block\";\n this.htmlElemTitle.style.cursor = \"pointer\";\n this.htmlElemTitle.style.font = \"10px\";\n this.htmlElemTitle.style.color = \"white\";\n this.htmlElemTitle.style.position = \"Absolute\";\n this.htmlElemTitle.style.top = `${pY}px`;\n this.htmlElemTitle.style.left = `${pX - widthTitle / 2}px`;\n this.htmlElemTitle.style.width = `${widthTitle}px`;\n this.htmlElemTitle.style.transformOrigin = \"0px 0px\";\n this.htmlElemTitle.style.borderRadius = \"5px\";\n this.htmlElemTitle.style.boxShadow = this.style.boxShadow;\n this.htmlElemTitle.style.border = \"none\";\n this.htmlElemTitle.style.background = this.style.background;\n this.htmlElemTitle.style.zIndex = \"3\";\n this.htmlElemTitle.style.padding = \"2px\";\n this.htmlElemTitle.style.textAlign = \"center\";\n this.htmlElemTitle.innerHTML = `${distance}`;\n } else {\n this.htmlElemLine.style.display = \"none\";\n this.htmlElemTitle.style.display = \"none\";\n }\n }\n }\n\n getDistance(): number {\n return utils.getDistance(this.startPoint, this.endPoint, this.moduleInstance) / this.scale;\n }\n\n setStartPoint(gePoint: number[]): void {\n this.startPoint = gePoint;\n this.drawMeasureLine();\n }\n\n setEndPoint(gePoint: number[], isFinish: boolean): void {\n this.isFinishDraw = isFinish === undefined ? true : isFinish;\n this.endPoint = gePoint;\n this.drawMeasureLine();\n }\n\n update(): void {\n this.drawMeasureLine();\n }\n\n setSize(size: number): void {\n this.size = size;\n this.drawMeasureLine();\n }\n\n clear(): void {\n this.endPoint = null;\n this.startPoint = null;\n this.htmlElemStartPoint = utils.destroyHtmlElement(this.htmlElemStartPoint, this.targetElement);\n this.htmlElemEndPoint = utils.destroyHtmlElement(this.htmlElemEndPoint, this.targetElement);\n this.htmlElemLine = utils.destroyHtmlElement(this.htmlElemLine, this.targetElement);\n this.htmlElemTitle = utils.destroyHtmlElement(this.htmlElemTitle, this.targetElement);\n }\n\n setUnit(unit: string): void {\n this.unit = unit;\n this.drawMeasureLine();\n }\n\n setConversionFactor(scale: number): void {\n this.scale = scale;\n this.drawMeasureLine();\n }\n\n setStyle(style: CSSStyleDeclaration): void {\n this.style = style;\n this.drawMeasureLine();\n }\n\n setSelectionReactor(reactor: any): void {\n utils.onSetCallback(this.htmlElemStartPoint, reactor ? reactor.onStartPoint : null);\n utils.onSetCallback(this.htmlElemEndPoint, reactor ? reactor.onEndPoint : null);\n utils.onSetCallback(this.htmlElemTitle, reactor ? reactor.onTitle : null);\n }\n\n setSelectability(enable: boolean): void {\n utils.onSetSelectivity(this.htmlElemStartPoint, enable);\n utils.onSetSelectivity(this.htmlElemEndPoint, enable);\n utils.onSetSelectivity(this.htmlElemLine, enable);\n utils.onSetSelectivity(this.htmlElemTitle, enable);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../../Viewer\";\nimport { OdBaseDragger } from \"../Common/OdBaseDragger\";\nimport { MeasureLineItem } from \"./MeasureLineItem\";\n\nfunction renameUnit(table, unit) {\n return table[unit] || unit;\n}\n\nexport class MeasureLineDragger extends OdBaseDragger {\n protected lineThickness: number;\n protected gripingRadius: number;\n protected firstPoint: number[];\n protected secondPoint: number[];\n protected renameUnitTable: any;\n protected items: MeasureLineItem[];\n protected m_overlayElement: HTMLElement;\n protected previewMeasureLine: MeasureLineItem;\n\n constructor(subject: Viewer) {\n super(subject);\n this.lineThickness = 2;\n this.press = false;\n this.gripingRadius = 5.0;\n this.firstPoint = null;\n this.secondPoint = null;\n\n this.renameUnitTable = {\n Millimeters: \"mm\",\n Centimeters: \"cm\",\n Meters: \"m\",\n Feet: \"ft\",\n Inches: \"in\",\n Yards: \"yd\",\n Kilometers: \"km\",\n Miles: \"mi\",\n Micrometers: \"µm\",\n MicroInches: \"µin\",\n Undefined: \" \",\n };\n\n this.items = [];\n\n this.canvasEvents.push(\"resize\");\n }\n\n override initialize(): void {\n super.initialize();\n\n this.m_overlayElement = document.createElement(\"div\");\n this.m_overlayElement.style.background = \"rgba(0,0,0,0)\";\n this.m_overlayElement.style.position = \"fixed\";\n this.m_overlayElement.style.zIndex = \"1\";\n this.m_overlayElement.style.pointerEvents = \"none\";\n document.body.appendChild(this.m_overlayElement);\n\n this.resize();\n }\n\n override dispose(): void {\n super.dispose();\n this.m_overlayElement.remove();\n }\n\n override updatePreview(): void {\n this.items.forEach((item) => item.update());\n }\n\n resize(): void {\n const rect = this.m_module.canvas.getBoundingClientRect();\n\n this.m_overlayElement.style.top = `${rect.top}px`;\n this.m_overlayElement.style.left = `${rect.left}px`;\n this.m_overlayElement.style.width = `${rect.width}px`;\n this.m_overlayElement.style.height = `${rect.height}px`;\n }\n\n getSnapPointRadius(): number {\n const view = this.getViewer().activeView;\n const corners = view.viewDcCorners();\n\n const pt1 = corners.lowerLeft;\n const pt2 = corners.upperRight;\n\n pt2[0] -= pt1[0];\n pt2[1] -= pt1[1];\n\n return Math.min(pt2[0], pt2[1]) / 120;\n }\n\n override drag(x: number, y: number): void {\n this.createNewMeasureIfNeed();\n const point = this.getViewer().getSnapPoint(x, y, this.gripingRadius);\n\n if (this.isDragging) {\n if (point) {\n if (this.firstPoint) {\n this.secondPoint = point;\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n this.previewMeasureLine.setEndPoint(this.secondPoint, true);\n } else {\n this.firstPoint = point;\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n }\n } else {\n this.secondPoint = null;\n this.previewMeasureLine.clear();\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n this.previewMeasureLine.setEndPoint(this.getViewer().screenToWorld(x, y), false);\n }\n } else {\n if (point) {\n this.previewMeasureLine.setStartPoint(point);\n } else {\n this.previewMeasureLine.clear();\n }\n }\n }\n\n override end(): void {\n if (this.firstPoint && this.secondPoint) {\n const newLineMeasure = this.createMeasureLine();\n newLineMeasure.setStartPoint(this.firstPoint);\n newLineMeasure.setEndPoint(this.secondPoint, true);\n }\n this.firstPoint = null;\n this.secondPoint = null;\n this.previewMeasureLine.clear();\n }\n\n createNewMeasureIfNeed(): void {\n if (!this.previewMeasureLine) {\n this.previewMeasureLine = this.createMeasureLine();\n }\n }\n\n createMeasureLine(): MeasureLineItem {\n const viewer = this.m_module.getViewer();\n const item = new MeasureLineItem(this.m_overlayElement, viewer, this.m_module);\n item.lineThickness = this.lineThickness || item.lineThickness;\n item.setUnit(renameUnit(this.renameUnitTable, viewer.getUnit()));\n this.items.push(item);\n return item;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point2d, Vector3 } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nconst FocalLengthConst = 42.0;\n\nconst calcFocalLength = (lensLength: number, fieldWidth: number, fieldHeight: number): number => {\n return (lensLength / FocalLengthConst) * Math.sqrt(fieldWidth * fieldWidth + fieldHeight * fieldHeight);\n};\n\nexport class OdaWalkDragger extends OdBaseDragger {\n protected lastCoord: Point2d;\n protected speed: number;\n protected delta: number;\n protected keyPressMap: Set<string>;\n protected oldWCSEnableValue: boolean;\n protected viewParams: any;\n protected cameraId: any;\n protected cameraWalker: any;\n protected viewer: any;\n protected multiplier: number;\n protected lastFrameTS: number;\n protected animationId: any;\n protected deltaAngle: number;\n protected enableZoomWheelPreviousValue: boolean;\n\n constructor(subject: Viewer) {\n super(subject);\n this.viewer = undefined;\n\n this.multiplier = 5;\n this.speed = 1;\n\n this.keyPressMap = new Set();\n this.keydown = this.keydown.bind(this);\n this.keyup = this.keyup.bind(this);\n\n this.lastFrameTS = 0;\n this.animationId = undefined;\n this.processMovement = this.processMovement.bind(this);\n\n this.deltaAngle = Math.PI / 3600;\n this.autoSelect = true;\n }\n\n override initialize() {\n super.initialize();\n this.viewer = this.getViewer();\n\n window.addEventListener(\"keydown\", this.keydown, false);\n window.addEventListener(\"keyup\", this.keyup, false);\n\n this.oldWCSEnableValue = this.viewer.getEnableWCS();\n this.viewer.setEnableWCS(false);\n\n const view = this.viewer.activeView;\n const maxDimension = this.getMaxDimension(view);\n this.speed = maxDimension / 30000;\n\n this.subject.emitEvent({ type: \"walkstart\" });\n\n this.viewParams = this.getViewParams();\n //this.viewParams.lensLength = view.lensLength;\n\n this.setViewParams(this.viewParams);\n //view.lensLength = (view.lensLength * 42) / 120;\n\n const model = this.viewer.getActiveModel();\n this.cameraId = model.appendCamera(\"Camera0\");\n this.setupCamera(view);\n model.delete();\n\n //pCamera.setAdjustLensLength(true);\n this.cameraWalker = new this.m_module.OdTvCameraWalker();\n this.cameraWalker.setCamera(this.cameraId);\n\n this.subject.update();\n this.enableZoomWheelPreviousValue = this.subject.options.enableZoomWheel;\n this.subject.options.enableZoomWheel = false;\n }\n\n override dispose() {\n this.oldWCSEnableValue =\n this.oldWCSEnableValue !== undefined ? this.oldWCSEnableValue : this.subject.options.showWCS;\n this.viewer.setEnableWCS(this.oldWCSEnableValue);\n\n super.dispose();\n\n this.keyPressMap.clear();\n\n window.removeEventListener(\"keydown\", this.keydown);\n window.removeEventListener(\"keyup\", this.keyup);\n\n if (this.animationId) {\n window.cancelAnimationFrame(this.animationId);\n this.animationId = undefined;\n }\n\n if (this.cameraId) {\n const model = this.viewer.getActiveModel();\n model.removeEntity(this.cameraId);\n model.delete();\n this.cameraWalker?.delete();\n }\n\n if (this.viewParams) {\n this.setViewParams(this.viewParams);\n\n const avp = this.viewer.activeView;\n //avp.lensLength = this.viewParams.lensLength;\n avp.delete();\n }\n\n this.subject.update();\n this.subject.options.enableZoomWheel = this.enableZoomWheelPreviousValue;\n }\n\n keydown(ev) {\n switch (ev.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.subject.emitEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.subject.emitEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n case \"KeyW\":\n case \"KeyA\":\n case \"KeyS\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.keyPressMap.add(ev.code);\n if (!this.animationId) this.processMovement(0);\n break;\n }\n }\n\n keyup(ev) {\n this.keyPressMap.delete(ev.code);\n if (this.keyPressMap.size < 1 && this.animationId) {\n window.cancelAnimationFrame(this.animationId);\n this.animationId = undefined;\n this.lastFrameTS = 0;\n }\n }\n\n processMovement(timestamp) {\n this.animationId = requestAnimationFrame(this.processMovement);\n\n if (this.lastFrameTS !== 0) {\n const deltaTS = timestamp - this.lastFrameTS;\n const currentDelta = this.multiplier * deltaTS * this.speed;\n\n for (const keyCode of this.keyPressMap) {\n switch (keyCode) {\n case \"KeyW\":\n this.cameraWalker.moveForward(currentDelta);\n break;\n case \"KeyS\":\n this.cameraWalker.moveBackward(currentDelta);\n break;\n case \"KeyA\":\n this.cameraWalker.moveLeft(currentDelta);\n break;\n case \"KeyD\":\n this.cameraWalker.moveRight(currentDelta);\n break;\n case \"KeyQ\":\n this.cameraWalker.moveUp(currentDelta);\n break;\n case \"KeyE\":\n this.cameraWalker.moveDown(currentDelta);\n break;\n }\n }\n this.subject.update();\n }\n\n this.lastFrameTS = timestamp;\n }\n\n override drag(x, y, dltX, dltY) {\n if (this.cameraId && this.isDragging) {\n if (dltX !== 0.0) this.turnLeft(-dltX * this.deltaAngle);\n if (dltY !== 0.0) this.cameraWalker.turnDown(dltY * this.deltaAngle);\n this.subject.update();\n }\n }\n\n turnLeft(angle) {\n //TODO: migrate to VisualizeJS\n const pCamera = this.cameraWalker.camera().openObjectAsCamera();\n const dir = this.toVector(pCamera.direction());\n const up = this.toVector(pCamera.upVector());\n\n const pos = pCamera.position();\n\n const rotMatrix = this.createMatrix3d();\n const zAxisVector: Vector3 = [0, 0, 1];\n rotMatrix.setToRotation(angle, zAxisVector, pos);\n dir.transformBy(rotMatrix);\n up.transformBy(rotMatrix);\n pCamera.setupCameraByDirection(pos, dir.toArray(), up.toArray());\n pCamera.delete();\n }\n\n setupCamera(view) {\n const pCamera = this.cameraId.openObjectAsCamera();\n const target = view.viewTarget;\n\n pCamera.setDisplayGlyph(false);\n pCamera.setDisplayTarget(false);\n pCamera.setAutoAdjust(true);\n pCamera.setupCamera(view.viewPosition, target, view.upVector);\n pCamera.setNearClip(false, 1.0);\n pCamera.setFarClip(false, 0);\n pCamera.setViewParameters(view.viewFieldWidth, view.viewFieldHeight, true);\n\n const focalL = calcFocalLength(view.lensLength, view.viewFieldWidth, view.viewFieldHeight);\n\n const pTarget = this.toPoint(view.viewTarget);\n const viewDir = this.toPoint(view.viewPosition);\n const viewDirSub = viewDir.sub(pTarget);\n const viewDirVec = viewDirSub.asVector();\n const viewDirVecNormal = viewDirVec.normalize();\n\n const geViewDir = this.toGeVector(viewDirVecNormal);\n const newGeViewDir = [geViewDir[0] * focalL, geViewDir[1] * focalL, geViewDir[2] * focalL];\n\n const pTarget2 = this.toPoint(view.viewTarget);\n const newGeViewDirPt = this.toPoint(newGeViewDir);\n\n const newPos = pTarget2.add(newGeViewDirPt);\n pCamera.setupCamera(this.toGePoint(newPos), view.viewTarget, view.upVector);\n\n this.deleteAll([pTarget, viewDir, viewDirSub, viewDirVec, viewDirVecNormal, pTarget2, newGeViewDirPt, newPos]);\n\n pCamera.assignView(view);\n pCamera.delete();\n }\n\n getMaxDimension(view) {\n const [xmax, ymax, zmax] = view.sceneExtents.max();\n const [xmin, ymin, zmin] = view.sceneExtents.min();\n const volume = [xmax - xmin, ymax - ymin, zmax - zmin];\n return Math.max(...volume);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point2d, Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdBaseCuttingPlaneDragger extends OdBaseDragger {\n protected m_size_x: number;\n protected m_size_y: number;\n protected m_size_z: number;\n protected m_center: Point3d;\n protected m_normal: number[];\n protected index: number;\n protected m_model: any;\n protected m_entity: any;\n protected planePreview: any;\n protected m_last: Point3d;\n protected m_click: Point2d;\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n\n //this.getViewer().getMarkupController().clear();\n\n const ext = this.getViewer().getActiveExtents();\n const min = ext.min();\n const max = ext.max();\n\n this.m_size_x = Math.abs(max[0] - min[0]) / 2;\n this.m_size_y = Math.abs(max[1] - min[1]) / 2;\n this.m_size_z = Math.abs(max[2] - min[2]) / 2;\n\n this.m_center = this.toPoint(ext.center());\n this.m_normal = this.createNormal();\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n plane.set(this.toGePoint(this.m_center), this.m_normal);\n\n avp.addCuttingPlane(plane);\n this.index = avp.numCuttingPlanes() - 1;\n\n const { red, green, blue } = this.subject.options.cuttingPlaneFillColor;\n avp.setEnableCuttingPlaneFill(true, red, green, blue);\n avp.setCuttingPlaneFillPatternEnabled(true, this.m_module.CuttingPlaneFillStyle.kHorizontalBars, 0x0, 0x0, 0x0);\n\n this.m_model = this.getModel();\n this.createPreview();\n\n this.deleteAll([ext, avp, plane]);\n }\n\n override dispose(): void {\n super.dispose();\n\n if (this.m_entity) {\n this.m_model.removeEntity(this.m_entity);\n this.deleteAll([this.m_model, this.m_entity, this.planePreview, this.m_center]);\n this.m_entity = null;\n this.planePreview = null;\n this.subject.update();\n }\n }\n\n createNormal(): number[] {\n return [0, 0, 0];\n }\n\n handleDelta(delta: Point3d): Point3d {\n return delta;\n }\n\n getPlanePreviewCoordinate(): any[] {\n return [];\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.m_last = this.screenToWorld(x, y);\n this.m_click = { x, y };\n }\n\n override drag(x: number, y: number): void {\n if (this.press) {\n const point = this.screenToWorld(x, y);\n const delta = this.handleDelta(point.sub(this.m_last));\n\n const oldCenter = this.m_center;\n this.m_center = oldCenter.add(delta);\n\n const oldLast = this.m_last;\n this.m_last = point;\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n const newPlane = plane.set(this.toGePoint(this.m_center), this.m_normal);\n const newCutting = avp.updateCuttingPlane(this.index, plane);\n\n this.drawPreview();\n\n this.deleteAll([avp, plane, oldCenter, delta, oldLast, newPlane, newCutting]);\n\n const device = this.getViewer().getActiveDevice();\n device.invalidate(device.getSize());\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n if (x === this.m_click.x && y === this.m_click.y) {\n this.m_normal = [this.m_normal[0] * -1, this.m_normal[1] * -1, this.m_normal[2] * -1];\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n plane.set(this.toGePoint(this.m_center), this.m_normal);\n avp.updateCuttingPlane(this.index, plane);\n\n this.deleteAll([avp, plane, this.m_last]);\n\n const device = this.getViewer().getActiveDevice();\n device.invalidate(device.getSize());\n }\n }\n\n createPreview(): void {\n this.m_entity = this.m_model.appendEntity(\"&CuttingPlanePreview\");\n\n const GeometryTypes = this.m_module.GeometryTypes;\n\n const transparencyDef = new this.m_module.OdTvTransparencyDef();\n const colorDef = new this.m_module.OdTvColorDef(112, 112, 112); //0x53, 0x72, 0xAE\n\n transparencyDef.setValue(0.9);\n\n const entityPtr = this.m_entity.openObject();\n entityPtr.setColor(colorDef, GeometryTypes.kFaces.value);\n\n colorDef.setColor(112, 112, 112); //0xcd, 0xe2, 0xff\n entityPtr.setColor(colorDef, GeometryTypes.kEdges.value);\n\n entityPtr.setLineWeight(5);\n\n entityPtr.setTransparency(transparencyDef, GeometryTypes.kFaces);\n transparencyDef.setValue(1.0);\n entityPtr.setTransparency(transparencyDef, GeometryTypes.kEdges);\n\n this.planePreview = entityPtr.appendPolygon(this.getPlanePreviewCoordinate());\n const polygonPtr = this.planePreview.openAsPolygon();\n polygonPtr.setFilled(true);\n\n this.deleteAll([transparencyDef, colorDef, entityPtr, polygonPtr, GeometryTypes]);\n this.subject.syncOverlay();\n }\n\n drawPreview(): void {\n const polygonPtr = this.planePreview.openAsPolygon();\n polygonPtr.setPoints(this.getPlanePreviewCoordinate());\n this.deleteAll([polygonPtr]);\n this.subject.syncOverlay();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneXAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [1, 0, 0];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.y = 0.0;\n delta.z = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x,\n this.m_center.y - this.m_size_y,\n this.m_center.z - this.m_size_z,\n this.m_center.x,\n this.m_center.y + this.m_size_y,\n this.m_center.z - this.m_size_z,\n this.m_center.x,\n this.m_center.y + this.m_size_y,\n this.m_center.z + this.m_size_z,\n this.m_center.x,\n this.m_center.y - this.m_size_y,\n this.m_center.z + this.m_size_z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneYAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [0, 1, 0];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.x = 0.0;\n delta.z = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x - this.m_size_x,\n this.m_center.y,\n this.m_center.z - this.m_size_z,\n this.m_center.x + this.m_size_x,\n this.m_center.y,\n this.m_center.z - this.m_size_z,\n this.m_center.x + this.m_size_x,\n this.m_center.y,\n this.m_center.z + this.m_size_z,\n this.m_center.x - this.m_size_x,\n this.m_center.y,\n this.m_center.z + this.m_size_z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneZAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [0, 0, 1];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.x = 0.0;\n delta.y = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x - this.m_size_x,\n this.m_center.y - this.m_size_y,\n this.m_center.z,\n this.m_center.x + this.m_size_x,\n this.m_center.y - this.m_size_y,\n this.m_center.z,\n this.m_center.x + this.m_size_x,\n this.m_center.y + this.m_size_y,\n this.m_center.z,\n this.m_center.x - this.m_size_x,\n this.m_center.y + this.m_size_y,\n this.m_center.z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Point2d, Point3d, Vector3d } from \"../Common/Geometry\";\nimport { Viewer } from \"../../Viewer\";\n\nexport class OrbitAction {\n private _m_module: any;\n private _subject: Viewer;\n private _beginInteractivity: () => void;\n private _endInteractivity: () => void;\n private m_viewCenter: any;\n private m_startPoint: Point2d;\n\n constructor(m_module: any, subject: Viewer, beginInteractivity: () => void, endInteractivity: () => void) {\n this._m_module = m_module;\n this._subject = subject;\n this._beginInteractivity = beginInteractivity;\n this._endInteractivity = endInteractivity;\n }\n\n public beginAction(x: number, y: number) {\n this.m_viewCenter = this.getCenter();\n this.m_startPoint = { x, y };\n\n const view = this.getViewer().activeView;\n\n view.delete();\n this._beginInteractivity();\n }\n\n public action(x: number, y: number) {\n const view = this.getViewer().activeView;\n\n const corners = view.vportRect;\n\n const size = Math.max(Math.abs(corners[2] - corners[0]), Math.abs(corners[3] - corners[1]));\n\n const distX = ((this.m_startPoint.x - x) * Math.PI) / size;\n const distY = ((this.m_startPoint.y - y) * Math.PI) / size;\n\n this.m_startPoint.x = x;\n this.m_startPoint.y = y;\n\n const xOrbit = distY;\n const yOrbit = distX;\n\n const viewParams = {\n position: view.viewPosition,\n target: view.viewTarget,\n upVector: view.upVector,\n viewFieldWidth: view.viewFieldWidth,\n viewFieldHeight: view.viewFieldHeight,\n perspective: view.perspective,\n };\n\n view.delete();\n\n const sideVector = this.getSideVector(viewParams);\n\n if (xOrbit !== 0.0) {\n this.calculateXOrbit(viewParams, -xOrbit, sideVector);\n }\n\n if (yOrbit !== 0.0) {\n this.calculateYOrbit(viewParams, yOrbit, sideVector);\n }\n\n sideVector.delete();\n\n const extView = this.getViewer().getActiveTvExtendedView();\n\n extView.setView(\n viewParams.position,\n viewParams.target,\n viewParams.upVector,\n viewParams.viewFieldWidth,\n viewParams.viewFieldHeight,\n viewParams.perspective\n );\n extView.delete();\n\n this._subject.activeDragger()?.updatePreview();\n }\n\n public endAction() {\n this._endInteractivity();\n }\n\n private getSideVector(viewParams: any): any {\n const pUpV = this.toVector(viewParams.upVector);\n const pTarget = this.toPoint(viewParams.target);\n const pPosition = this.toPoint(viewParams.position);\n\n const direct = pTarget.sub(pPosition);\n const vDirect = direct.asVector();\n\n const vCross = pUpV.crossProduct(vDirect);\n const sideVector = vCross.normalize();\n\n this.deleteAll([direct, pUpV, pTarget, pPosition, vDirect, vCross]);\n\n return sideVector;\n }\n\n private calculateXOrbit(viewParams: any, delta: number, sideVector: Vector3d): void {\n {\n const pPoint = this.toPoint(viewParams.position);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const rotatePoint = pPoint.rotateByBasePoint(delta, sideVector, pCenter);\n viewParams.position = rotatePoint.toArray();\n\n this.deleteAll([pPoint, pCenter, rotatePoint]);\n }\n\n {\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const rotatePoint = pTarget.rotateByBasePoint(delta, sideVector, pCenter);\n viewParams.target = rotatePoint.toArray();\n\n this.deleteAll([pTarget, pCenter, rotatePoint]);\n }\n\n {\n const pPoint = this.toPoint(viewParams.position);\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const pUp = pTarget.sub(pPoint);\n const vUp = pUp.asVector();\n\n const crossProduct = vUp.crossProduct(sideVector);\n const crossProductNormal = crossProduct.normalize();\n\n viewParams.upVector = crossProductNormal.toArray();\n\n this.deleteAll([pPoint, pTarget, pCenter, pUp, vUp, crossProduct, crossProductNormal]);\n }\n }\n\n private calculateYOrbit(viewParams: any, delta: number, sideVector: any): void {\n {\n const pPoint = this.toPoint(viewParams.position);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n\n const rotatePoint = pPoint.rotateByBasePoint(delta, zAxis, pCenter);\n viewParams.position = rotatePoint.toArray();\n\n this.deleteAll([zAxis, pPoint, pCenter, rotatePoint]);\n }\n\n {\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n\n const rotatePoint = pTarget.rotateByBasePoint(delta, zAxis, pCenter);\n viewParams.target = rotatePoint.toArray();\n\n this.deleteAll([zAxis, pTarget, pCenter, rotatePoint]);\n }\n\n {\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n const pTarget = this.toPoint(viewParams.target);\n const pPoint = this.toPoint(viewParams.position);\n\n const side = sideVector.rotateBy(delta, zAxis);\n\n const pUp = pTarget.sub(pPoint);\n const vUp = pUp.asVector();\n\n const cross = vUp.crossProduct(side);\n const crossNormal = cross.normalize();\n\n viewParams.upVector = crossNormal.toArray();\n\n this.deleteAll([zAxis, pTarget, pPoint, side, pUp, vUp, cross, crossNormal]);\n }\n }\n\n private getCenter(): any {\n const viewer = this.getViewer();\n let center;\n\n const pSet = viewer.getSelected();\n if (!pSet.isNull() && pSet.numItems() !== 0) {\n const itr = pSet.getIterator();\n let ext, entId, extSelected;\n for (; !itr.done(); itr.step()) {\n entId = itr.getEntity();\n ext = entId.getWCSExtents();\n if (extSelected) extSelected.addExt(ext);\n else extSelected = ext;\n }\n center = extSelected.center();\n\n extSelected.delete();\n itr.delete();\n } else {\n center = viewer.getActiveExtents().center();\n }\n\n return center;\n }\n\n private getViewer(): any {\n return this._m_module.getViewer();\n }\n\n private toVector(geVector): Vector3d {\n return this._m_module.Vector3d.createFromArray(geVector);\n }\n\n private toPoint(gePoint: number[]): Point3d {\n return this._m_module.Point3d.createFromArray(gePoint);\n }\n\n private deleteAll(objects): void {\n for (const obj of objects) {\n obj?.delete?.();\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { OrbitAction } from \"./Actions/OrbitAction\";\nimport { Point2d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdOrbitDragger extends OdBaseDragger {\n private _orbitAction: OrbitAction;\n protected m_viewCenter: any;\n protected m_startPoint: Point2d;\n protected startCameraParams: any;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._orbitAction = new OrbitAction(this.m_module, this.subject, this.beginInteractivity, this.endInteractivity);\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this._orbitAction.beginAction(x, y);\n }\n\n setDefaultViewParams(): void {\n const extView = this.getViewer().getActiveTvExtendedView();\n extView.setView(\n this.startCameraParams.position,\n this.startCameraParams.target,\n this.startCameraParams.upVector,\n this.startCameraParams.viewFieldWidth,\n this.startCameraParams.viewFieldHeight,\n this.startCameraParams.perspective\n );\n extView.delete();\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this._orbitAction.action(x, y);\n }\n }\n\n override end(): void {\n this.press = false;\n this._orbitAction.endAction();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Point2d, Point3d } from \"../Common/Geometry\";\nimport { ViewParams } from \"../Common/OdaGeAction\";\nimport { Viewer } from \"../../Viewer\";\n\nexport class PanAction {\n private _m_module: any;\n private _subject: Viewer;\n private _m_start: Point3d;\n private _deltaScreenPosition: Point2d;\n private _beginInteractivity: () => void;\n private _endInteractivity: () => void;\n private _getViewParams: () => ViewParams;\n private _setViewParams: (params: ViewParams) => void;\n\n constructor(\n m_module: any,\n subject: Viewer,\n beginInteractivity: () => void,\n endInteractivity: () => void,\n getViewParams: () => ViewParams,\n setViewParams: (params: ViewParams) => void\n ) {\n this._m_module = m_module;\n this._subject = subject;\n this._beginInteractivity = beginInteractivity;\n this._endInteractivity = endInteractivity;\n this._getViewParams = getViewParams;\n this._setViewParams = setViewParams;\n }\n\n public beginAction(x: number, y: number) {\n this._m_start = this.screenToWorld(x, y);\n this._deltaScreenPosition = { x, y };\n this._beginInteractivity();\n }\n\n public action(x: number, y: number) {\n const { Vector3d } = this._m_module;\n const params = this._getViewParams();\n const pt = this.screenToWorld(x, y);\n\n const ptSub = this._m_start.sub(pt);\n const delta = ptSub.asVector();\n\n const target = Vector3d.createFromArray(params.target);\n const targetWithDelta = target.add(delta);\n params.target = targetWithDelta.toArray();\n\n const position = Vector3d.createFromArray(params.position);\n const positionWithDelta = position.add(delta);\n params.position = positionWithDelta.toArray();\n\n this._setViewParams(params);\n target.delete();\n\n targetWithDelta.delete();\n position.delete();\n positionWithDelta.delete();\n\n this._subject.activeDragger()?.updatePreview();\n this._subject.emitEvent({\n type: \"pan\",\n x,\n y,\n dX: x - this._deltaScreenPosition.x,\n dY: y - this._deltaScreenPosition.y,\n });\n\n this._deltaScreenPosition = { x, y };\n }\n\n public endAction() {\n this._endInteractivity();\n }\n\n private screenToWorld(x: number, y: number): Point3d {\n return this._m_module.Point3d.createFromArray(this._m_module.getViewer().screenToWorld(x, y));\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { PanAction } from \"./Actions/PanAction\";\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdPanDragger extends OdBaseDragger {\n private _panAction: PanAction;\n protected m_start: Point3d;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._panAction = new PanAction(\n this.m_module,\n this.subject,\n this.beginInteractivity,\n this.endInteractivity,\n this.getViewParams,\n this.setViewParams\n );\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this._panAction.beginAction(x, y);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this._panAction.action(x, y);\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n this._panAction.endAction();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../../Viewer\";\n\nexport class ZoomAction {\n private _m_module: any;\n private _subject: Viewer;\n\n constructor(m_module: any, subject: Viewer) {\n this._m_module = m_module;\n this._subject = subject;\n }\n\n public action(x: number, y: number, zoomFactor: number) {\n const viewer = this._m_module.getViewer();\n viewer.zoomAt(zoomFactor, x, y);\n\n this._subject.activeDragger()?.updatePreview();\n this._subject.emitEvent({\n type: \"zoomat\",\n data: zoomFactor,\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { ZoomAction } from \"./Actions/ZoomAction\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdZoomDragger extends OdBaseDragger {\n private _zoomAction: ZoomAction;\n protected pressX: number;\n protected pressY: number;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.pressX = x;\n this.pressY = y;\n this.beginInteractivity();\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n const ZOOM_SPEED = 0.025;\n const zoomFactor = dltY > 0 ? 1 + ZOOM_SPEED : 1 - ZOOM_SPEED;\n this._zoomAction.action(this.pressX, this.pressY, zoomFactor);\n }\n }\n\n override end(): void {\n this.press = false;\n this.endInteractivity();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\nimport { ZoomAction } from \"./Actions/ZoomAction\";\n\nconst INTERACTIVITY_TIME_OUT = 100;\n\nexport class OdZoomWheelDragger extends OdBaseDragger {\n private _zoomAction: ZoomAction;\n\n private _endInteractivityTimeOutId;\n\n private _isEnableInteractivityMode: boolean;\n\n constructor(subject: Viewer) {\n super(subject);\n\n // ignore all events except \"wheel\" so as not to interfere with other handlers\n this.canvasEvents = [\"wheel\"];\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n this._endInteractivityTimeOutId = undefined;\n this._isEnableInteractivityMode = false;\n }\n\n wheel(event) {\n if (!this.subject.options.enableZoomWheel) {\n return;\n }\n\n event = event || window.event;\n event.preventDefault();\n\n const zoomReverse = this.subject.options.reverseZoomWheel ? -1 : 1;\n const zoomSpeed = 0.075 * zoomReverse;\n\n const viewer = this.getViewer();\n if (viewer) {\n const zoomFactor = event.deltaY > 0 ? 1 + zoomSpeed : 1 - zoomSpeed;\n\n this._zoomAction.action(\n event.offsetX * window.devicePixelRatio,\n event.offsetY * window.devicePixelRatio,\n zoomFactor\n );\n\n if (!this._isEnableInteractivityMode) {\n this._isEnableInteractivityMode = true;\n this.beginInteractivity();\n }\n\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n }\n\n if (!this._isEnableInteractivityMode) {\n this._isEnableInteractivityMode = true;\n this.beginInteractivity();\n }\n\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n }\n\n this.subject.update(true);\n\n this._endInteractivityTimeOutId = setTimeout(() => {\n this._endInteractivityTimeOutId = undefined;\n this.endInteractivity();\n this._isEnableInteractivityMode = false;\n }, INTERACTIVITY_TIME_OUT);\n }\n }\n\n override dispose(): void {\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n this.endInteractivity();\n this._isEnableInteractivityMode = false;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"../Common/Geometry\";\n\nexport class OdSelectionFrame {\n protected m_start: number[];\n protected m_end: number[];\n protected m_model: any;\n protected m_module: any;\n protected m_entity: any;\n protected m_frame: any;\n\n constructor() {\n this.m_start = [0, 0, 0]; // 0\n this.m_end = [0, 0, 0]; // 2\n\n this.m_model = null;\n }\n\n createPoint3d(): Point3d {\n return new this.m_module.Point3d();\n }\n\n init(instance: any, model: any): void {\n this.m_module = instance;\n this.m_model = model;\n }\n\n getViewer() {\n return this.m_module.getViewer();\n }\n\n setValue(value: number[]): void {\n this.m_end = value;\n this.draw();\n }\n\n setStartPoint(point: number[]): void {\n this.m_start = point;\n this.m_end = point;\n this.draw();\n }\n\n toDoubleArray(points: Point3d[]): number[] {\n const p: number[] = [];\n for (let i = 0; i < points.length; i++) {\n p.push(points[i].x);\n p.push(points[i].y);\n p.push(points[i].z);\n }\n return p;\n }\n\n draw(): void {\n const view = this.getViewer().activeView;\n const viewM = view.viewingMatrix;\n\n const points = [];\n points.push(this.m_start);\n points.push(this.createPoint3d());\n points.push(this.m_end);\n points.push(this.createPoint3d());\n\n const p0 = this.createPoint3d();\n p0.set(this.m_start[0], this.m_start[1], this.m_start[2]);\n\n const p2 = this.createPoint3d();\n p2.set(this.m_end[0], this.m_end[1], this.m_end[2]);\n\n p0.transformBy(viewM);\n p2.transformBy(viewM);\n\n points[1].x = p0.x;\n points[3].x = p2.x;\n points[1].y = p2.y;\n points[3].y = p0.y;\n points[1].z = points[3].z = p2.z;\n\n const eyeM = view.eyeToWorldMatrix;\n points[1].transformBy(eyeM);\n points[3].transformBy(eyeM);\n\n if (!this.m_entity) {\n this.m_entity = this.m_model.appendEntity(\"\");\n const entityPtr = this.m_entity.openObject();\n\n entityPtr.setColor(112, 112, 112);\n entityPtr.setLineWeight(2);\n\n this.m_frame = entityPtr.appendPolygon(this.toDoubleArray(points));\n entityPtr.delete();\n } else {\n this.m_frame.openAsPolygon().setPoints(this.toDoubleArray(points));\n }\n }\n\n clear(): void {\n if (this.m_entity) {\n this.m_model.removeEntity(this.m_entity);\n this.m_entity = null;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\n\nimport { Viewer } from \"../../Viewer\";\nimport { OdBaseDragger } from \"../Common/OdBaseDragger\";\nimport { OdSelectionFrame } from \"./OdSelectionFrame\";\n\nexport class OdZoomWindowDragger extends OdBaseDragger {\n protected m_frame: any;\n protected m_minX: number;\n protected m_minY: number;\n protected m_maxX: number;\n protected m_maxY: number;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this.needInputText = false;\n\n this.m_frame = new OdSelectionFrame();\n this.m_frame.init(this.m_module, this.getModel());\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.m_minX = x;\n this.m_minY = y;\n\n const startPoint = this.screenToWorld(x, y);\n this.m_frame.setStartPoint(startPoint);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this.m_maxX = x;\n this.m_maxY = y;\n\n const point = this.screenToWorld(x, y);\n this.m_frame.setValue(point);\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n this.m_maxX = x;\n this.m_maxY = y;\n\n if (this.m_minX !== this.m_maxX && this.m_minY !== this.m_maxY) {\n this.m_frame.clear();\n this.getViewer().zoomWindow(this.m_minX, this.m_minY, this.m_maxX, this.m_maxY);\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { Point2d } from \"./Common/Geometry\";\nimport { ViewParams } from \"./Common/OdaGeAction\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OrbitAroundBuildingDragger extends OdBaseDragger {\n protected maxPolarAngle: number;\n protected minPolarAngle: number;\n protected m_viewCenter: any;\n protected m_startPoint: Point2d;\n protected startCameraParams: ViewParams;\n protected m_delta: number;\n\n constructor(viewer: Viewer) {\n super(viewer);\n this.autoSelect = true;\n this.press = false;\n this.maxPolarAngle = Math.PI / 2;\n this.minPolarAngle = 0; // radians\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n\n this.m_viewCenter = this.getCenter();\n this.m_startPoint = { x, y };\n\n const view = this.getViewer().activeView;\n\n this.startCameraParams = this.getViewParams();\n\n const corners = view.vportRect;\n\n this.m_delta = Math.max(corners[1] - corners[0], corners[2] - corners[3]);\n\n this.beginInteractivity();\n }\n\n setDefaultViewParams(): void {\n this.setViewParams(this.startCameraParams);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n let dX = x - this.m_startPoint.x;\n let dY = y - this.m_startPoint.y;\n\n dX *= Math.PI / this.m_delta;\n dY *= Math.PI / this.m_delta;\n\n this.setDefaultViewParams();\n\n const { Vector3d, Matrix3d } = this.m_module;\n\n const target = Vector3d.createFromArray(this.startCameraParams.target);\n const offset = Vector3d.createFromArray(this.startCameraParams.position).sub(target);\n const dir = offset.normalize();\n\n const zMatrix = new Matrix3d();\n zMatrix.setToIdentity();\n const xMatrix = new Matrix3d();\n xMatrix.setToIdentity();\n\n // ---- restore start rotation ----\n\n const yAxis = Vector3d.createFromArray([dir.x, dir.y, dir.z]);\n const zAxis = Vector3d.createFromArray(this.startCameraParams.upVector);\n const xAxis = yAxis.crossProduct(zAxis);\n\n // ----------- zAxis rotation restore -----------\n let xyDir = Vector3d.createFromArray([yAxis.x, yAxis.y, 0]);\n\n if (xyDir.length() <= 0.00001) {\n xyDir.set(-xAxis.y, xAxis.x, 0);\n } else {\n xyDir = xyDir.normalize();\n }\n const xyAngle =\n Math.sign(xyDir.dotProduct(Vector3d.createFromArray([-1, 0, 0]))) *\n xyDir.angleTo(Vector3d.createFromArray([0, 1, 0]));\n dX -= xyAngle;\n // ----------- zAxis rotation restore -----------\n\n // ----------- xAxis rotation restore -----------\n let yzDir = Vector3d.createFromArray([dir.x, dir.y, 0]);\n let yzAngle = 0;\n if (yzDir.length() <= 0.00001) {\n yzAngle = (-dir.z * Math.PI) / 2;\n } else {\n yzDir = yzDir.normalize();\n yzAngle = -yzDir.angleTo(dir);\n }\n dY -= yzAngle;\n // ----------- xAxis rotation restore -----------\n\n // ---- restore start rotation ----\n\n zMatrix.setToRotation(-dX, [0, 0, 1], [0, 0, 0]);\n\n const xAngle = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, dY));\n xMatrix.setToRotation(xAngle, [1, 0, 0], [0, 0, 0]);\n\n const endMatrix = zMatrix.postMultBy(xMatrix);\n\n let pos = Vector3d.createFromArray([0, 1, 0]).transformBy(endMatrix);\n const up = Vector3d.createFromArray([0, 0, 1]).transformBy(endMatrix);\n\n pos.setLength(offset.length());\n pos = target.add(pos);\n\n const current = this.getViewParams();\n\n current.position = pos.toArray();\n current.upVector = up.toArray();\n\n this.setViewParams(current);\n }\n }\n\n override end(): void {\n this.press = false;\n this.endInteractivity();\n }\n\n getCenter(): any {\n const viewer = this.getViewer();\n\n let ext = viewer.getActiveExtents();\n\n const pSet = viewer.getSelected();\n if (!pSet.isNull() && pSet.numItems() !== 0) {\n const itr = pSet.getIterator();\n const entId = itr.getEntity();\n\n if (entId.getType() === 1) {\n const obj = entId.openObject();\n\n ext.delete();\n ext = obj.getExtents();\n\n obj.delete();\n } else if (entId.getType() === 2) {\n const obj = entId.openObjectAsInsert();\n const extTuple = obj.getExtents();\n\n ext.delete();\n ext = extTuple.ext;\n\n extTuple.delete();\n obj.delete();\n }\n\n itr.delete();\n }\n\n const center = ext.center();\n\n ext.delete();\n return center;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../../Viewer\";\nimport { OrbitAction } from \"../Actions/OrbitAction\";\nimport { PanAction } from \"../Actions/PanAction\";\nimport { ZoomAction } from \"../Actions/ZoomAction\";\nimport { Point2d } from \"./Geometry\";\nimport { OdBaseDragger } from \"./OdBaseDragger\";\n\nexport enum GestureAction {\n None,\n Orbit,\n Pan,\n Zoom,\n}\n\nexport class GestureManager extends OdBaseDragger {\n private _previousEvents = new Map<number, PointerEvent>();\n private _currentEvents = new Map<number, PointerEvent>();\n private _lastGestureAction = GestureAction.None;\n private _orbitAction: OrbitAction;\n private _panAction: PanAction;\n private _zoomAction: ZoomAction;\n\n private _initialDistance: number;\n private readonly _maxInitialDistanceDifference = 30 * window.devicePixelRatio;\n\n private _isSingleTouchEnabled = false;\n\n public get isSingleTouchEnabled(): boolean {\n return this._isSingleTouchEnabled;\n }\n\n public set isSingleTouchEnabled(value: boolean) {\n this._isSingleTouchEnabled = value;\n }\n\n public constructor(subject: Viewer) {\n super(subject);\n\n this._orbitAction = new OrbitAction(this.m_module, this.subject, this.beginInteractivity, this.endInteractivity);\n this._panAction = new PanAction(\n this.m_module,\n this.subject,\n this.beginInteractivity,\n this.endInteractivity,\n this.getViewParams,\n this.setViewParams\n );\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n }\n\n private getMiddlePoint(events: Map<number, PointerEvent>): Point2d {\n if (events.size !== 2) {\n return undefined;\n }\n\n const keys = this.getKeys(events);\n const point0 = this.relativeCoords(events.get(keys[0]));\n const point1 = this.relativeCoords(events.get(keys[1]));\n\n return {\n x: Math.floor((point0.x + point1.x) / 2),\n y: Math.floor((point0.y + point1.y) / 2),\n };\n }\n\n private getFirstPoint(events: Map<number, PointerEvent>): Point2d {\n if (events.size < 1) {\n return undefined;\n }\n\n const keys = this.getKeys(events);\n return this.relativeCoords(events.get(keys[0]));\n }\n\n private getDistance(events: Map<number, PointerEvent>): number {\n if (events.size !== 2) {\n return -1;\n }\n\n const keys = this.getKeys(events);\n const point0 = this.relativeCoords(events.get(keys[0]));\n const point1 = this.relativeCoords(events.get(keys[1]));\n\n return Math.hypot(point0.x - point1.x, point0.y - point1.y);\n }\n\n private updateEvent(event: PointerEvent) {\n const eventNotInCurrentEvents = !this._currentEvents.get(event.pointerId);\n if (eventNotInCurrentEvents && this._currentEvents.size === 2) {\n return;\n }\n\n const previousEvent = this._currentEvents.get(event.pointerId);\n if (previousEvent) {\n this._previousEvents.set(previousEvent.pointerId, previousEvent);\n }\n\n this._currentEvents.set(event.pointerId, event);\n\n if (eventNotInCurrentEvents) {\n this._initialDistance = this.getDistance(this._currentEvents);\n }\n }\n\n private removeEvent(event: PointerEvent) {\n this._currentEvents.delete(event.pointerId);\n this._previousEvents.delete(event.pointerId);\n\n if (this._currentEvents.size < 2) {\n this._initialDistance = -1;\n }\n }\n\n private getKeys(map: Map<number, PointerEvent>): number[] {\n return Array.from(map.keys());\n }\n\n private analyzeGesture() {\n if (this._currentEvents.size === 2) {\n const currentDistance = this.getDistance(this._currentEvents);\n const previousDistance = this.getDistance(this._previousEvents);\n\n const currentDistanceEqualsInitialDistance =\n Math.abs(this._initialDistance - currentDistance) <= this._maxInitialDistanceDifference;\n if (currentDistanceEqualsInitialDistance) {\n this.executePanAction(this.getMiddlePoint(this._currentEvents));\n } else {\n if (previousDistance !== -1 && currentDistance !== previousDistance) {\n this.executeZoomAction(currentDistance, previousDistance);\n }\n }\n } else if (this._currentEvents.size === 1 && this.isSingleTouchEnabled) {\n this.executeOrbitAction(this.getFirstPoint(this._currentEvents));\n }\n }\n\n private executeZoomAction(currentDistance: number, previousDistance: number) {\n if (this._lastGestureAction !== GestureAction.Zoom) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Zoom;\n OdBaseDragger.isGestureActive = true;\n }\n\n const zoomSpeed = (currentDistance - previousDistance) / 700;\n const zoomFactor = 1 + zoomSpeed;\n const middlePoint = this.getMiddlePoint(this._currentEvents);\n this._zoomAction.action(middlePoint.x, middlePoint.y, zoomFactor);\n this.subject.update();\n }\n\n private executePanAction(currentPoint: Point2d) {\n if (this._lastGestureAction !== GestureAction.Pan) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Pan;\n OdBaseDragger.isGestureActive = true;\n\n this._panAction.beginAction(currentPoint.x, currentPoint.y);\n }\n\n this._panAction.action(currentPoint.x, currentPoint.y);\n this.subject.update();\n }\n\n private executeOrbitAction(currentPoint: Point2d) {\n if (this._lastGestureAction !== GestureAction.Orbit) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Orbit;\n OdBaseDragger.isGestureActive = true;\n\n this._orbitAction.beginAction(currentPoint.x, currentPoint.y);\n }\n\n this._orbitAction.action(currentPoint.x, currentPoint.y);\n this.subject.update();\n }\n\n private executeEndAction(gestureAction: GestureAction) {\n if (gestureAction === GestureAction.Orbit) this._orbitAction.endAction();\n if (gestureAction === GestureAction.Pan) this._panAction.endAction();\n OdBaseDragger.isGestureActive = false;\n }\n\n private needIgnoreEvent(event: PointerEvent): boolean {\n return (\n !this.subject.options.enableZoomWheel || !this.subject.options.enableGestures || !this.eventIsTouchEvent(event)\n );\n }\n\n private eventIsTouchEvent(event: PointerEvent): boolean {\n return event.pointerType === \"touch\" || event.pointerType === \"\";\n }\n\n override pointerdown(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.updateEvent(event);\n }\n\n override pointermove(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.updateEvent(event);\n this.analyzeGesture();\n }\n\n override pointerup(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.removeEvent(event);\n\n if (this._currentEvents.size < 2) {\n this.executeEndAction(this._lastGestureAction);\n OdBaseDragger.isGestureActive = false;\n }\n\n this._lastGestureAction = GestureAction.None;\n }\n\n override pointercancel(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.pointerup(event);\n }\n\n pointerleave(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.pointerup(event);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport function loadScript(url: string) {\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = url;\n script.async = true;\n script.onload = () => resolve(script);\n script.onerror = () => {\n script.remove();\n reject(new Error(`GET ${url} failed to load script`));\n };\n document.body.appendChild(script);\n });\n}\n\nexport const memoize = (f) => {\n const cache = {};\n return (...args) => {\n const argStr = JSON.stringify(args);\n cache[argStr] = cache[argStr] || f(...args);\n return cache[argStr];\n };\n};\n\nfunction loadVisuazlizeJsScript(url) {\n if (window[\"getVisualizeLibInst\"]) {\n const script = window[\"getVisualizeLibInst\"].script;\n if (script) {\n if (script.src === url) return Promise.resolve(script);\n script.remove();\n }\n delete window[\"getVisualizeLibInst\"];\n }\n return loadScript(url);\n}\n\nexport const loadVisualizeJs = (url: string, onprogress) => {\n return loadVisuazlizeJsScript(url).then((script) => {\n return new Promise((resolve, reject) => {\n const instance = window[\"getVisualizeLibInst\"]({\n urlMemFile: url + \".wasm\",\n TOTAL_MEMORY: 134217728,\n onprogress,\n });\n instance[\"loadWasmError\"] = reject;\n instance.postRun.push(() => {\n window[\"getVisualizeLibInst\"].script = script;\n resolve(instance);\n });\n });\n });\n};\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Model } from \"../../Api/Model\";\nimport { OptionsData } from \"../Options\";\nimport { Viewer } from \"../Viewer\";\n\nexport class BaseLoader {\n protected viewer: Viewer;\n protected model: Model;\n protected options: OptionsData;\n\n constructor(viewer: Viewer, model: Model, options: OptionsData) {\n this.viewer = viewer;\n this.model = model;\n this.options = options;\n }\n\n async load(): Promise<void> {}\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\n\nexport class TCSLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n const listFileForDownload = [this.model.database, ...this.model.geometry];\n const chunksProgress = listFileForDownload.map(() => 0);\n\n const calcProgress = (index, progress) => {\n chunksProgress[index] = progress;\n const fileProgress = chunksProgress.reduce((acc, progress) => (acc += progress)) / (chunksProgress.length || 1);\n this.viewer.emitEvent({ type: \"geometryprogress\", data: fileProgress, model: this.model });\n };\n\n this.viewer._abortController = abortController;\n\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n for (let i = 0; i < listFileForDownload.length; i++) {\n const chunk = listFileForDownload[i];\n\n const progressCb = (progress) => calcProgress(i, progress);\n const arrayBuffer = await this.model.downloadResource(chunk, progressCb, abortController.signal);\n\n if (abortController.signal.aborted) {\n await Promise.reject(new Error(`Open model aborted ${this.model.name}`));\n }\n\n visViewer.parseStream(new Uint8Array(arrayBuffer));\n this.viewer.update();\n\n const data = new Uint8Array(arrayBuffer);\n\n if (i === 0) {\n this.viewer.update(true);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n }\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","import { Viewer } from \"../Viewer\";\n\nconst DELAY_TIME_MULTIPLEXER = 2.0;\nconst START_UPDATE_TIME = 1000;\n\nexport enum UpdateType {\n kDelay,\n kNormal,\n kForce,\n}\n\nexport class UpdaterController {\n private lastUpdate: number;\n private viewer: Viewer;\n public delayUpdateTime: number;\n\n constructor() {\n this.delayUpdateTime = START_UPDATE_TIME;\n }\n\n initialize(viewer: Viewer) {\n this.viewer = viewer;\n this.lastUpdate = performance.now();\n }\n\n update(type: UpdateType) {\n const isNeedUpdate = type !== UpdateType.kDelay || performance.now() - this.lastUpdate >= this.delayUpdateTime;\n const isForce = type === UpdateType.kForce;\n\n if (isNeedUpdate) {\n this.viewer.update(isForce);\n this.lastUpdate = performance.now();\n this.delayUpdateTime *= DELAY_TIME_MULTIPLEXER;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\nimport { UpdaterController, UpdateType } from \"./UpdaterController\";\n\nexport class VsfXStreamingLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n const updaterController = new UpdaterController();\n updaterController.initialize(this.viewer);\n\n this.viewer._abortController = abortController;\n\n let isFireDatabaseChunk = false;\n\n const chunkLoadHandler = (progress, data) => {\n if (!this.viewer.visualizeJs) return;\n\n const status = visViewer.parseVsfx(data);\n updaterController.update(UpdateType.kDelay);\n\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n\n let state = false;\n if (\n status === visLib.DatabaseStreamStatus.ReadyServiceData ||\n (status === visLib.DatabaseStreamStatus.Complete && !isFireDatabaseChunk)\n ) {\n isFireDatabaseChunk = true;\n state = true;\n }\n\n if (state) {\n updaterController.update(UpdateType.kForce);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n };\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n await this.model.partialDownloadResource(this.model.database, chunkLoadHandler, abortController.signal);\n console.timeEnd(\"File load time\");\n\n updaterController.update(UpdateType.kNormal);\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\nimport { UpdaterController, UpdateType } from \"./UpdaterController\";\n\nexport class VsfXPartialLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n const abortControllerForRequestMap = new Map();\n let servicePartAborted = false;\n\n const pendingRequestsMap = new Map();\n const PENDING_REQUESTS_SIZE = 50;\n const PENDING_REQUESTS_TIMEOUT = 250;\n let pendingRequestsTimerId = 0;\n const pendingRequestsAbortHandler = () => clearTimeout(pendingRequestsTimerId);\n\n const pendingRequestsAbortController = new AbortController();\n abortControllerForRequestMap.set(0, pendingRequestsAbortController);\n\n const updaterController = new UpdaterController();\n updaterController.initialize(this.viewer);\n\n this.viewer._abortController = abortController;\n this.viewer._abortControllerForRequestMap = abortControllerForRequestMap;\n\n visViewer.memoryLimit = this.options.memoryLimit;\n\n const requestLoadHandler = (progress, data, requestId) => {\n if (!this.viewer.visualizeJs) return;\n\n const state = visViewer.parseVsfxInPartialMode(requestId, data);\n updaterController.update(UpdateType.kDelay);\n\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n\n if (state) {\n updaterController.update(UpdateType.kForce);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n };\n\n const downloadPartOfFile = async (requestId, records, dataId, isMultipleParts = false) => {\n const abortCtrl = new AbortController();\n abortControllerForRequestMap.set(requestId, abortCtrl);\n try {\n await this.model.downloadFileRange(requestId, records, dataId, requestLoadHandler, abortCtrl.signal);\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n } finally {\n const requests = isMultipleParts ? [...new Set(records.map((item) => item.reqId))] : [requestId];\n requests.forEach((requestId) => visViewer.onRequestResponseComplete(requestId));\n abortControllerForRequestMap.delete(requestId);\n updaterController.update(UpdateType.kNormal);\n }\n };\n\n const recordsToArray = (requestId, records) => {\n const res = [];\n for (let i = 0; i < records.size(); i++) {\n const record = records.get(i);\n res.push({\n reqId: requestId,\n begin: record.begin,\n end: record.end,\n size: parseInt(record.end, 10) - parseInt(record.begin, 10),\n });\n record.delete();\n }\n return res;\n };\n\n const objectHandler = {\n onServicePartReceived: (bHasIndex) => {\n if (bHasIndex) {\n servicePartAborted = true;\n abortController.abort();\n }\n },\n\n onRequest: (requestId, records) => {\n downloadPartOfFile(requestId, records, this.model.database);\n },\n\n onFullLoaded: () => {\n updaterController.update(UpdateType.kNormal);\n console.timeEnd(\"File load time\");\n },\n\n onRequestResponseParsed: (requestId) => {\n abortControllerForRequestMap.delete(requestId);\n updaterController.update(UpdateType.kNormal);\n },\n\n onRequestAborted: (requestId) => {\n const abortCtrl = abortControllerForRequestMap.get(requestId);\n if (abortCtrl) abortCtrl.abort();\n },\n\n onRequestResourceFile: async (requestId, _, records) => {\n const dataId = `${this.model.fileId}${this.model.file.type}`;\n\n let pendingRequests = [];\n let recNumber = 0;\n const pendingRequestsRecord = pendingRequestsMap.get(dataId);\n if (pendingRequestsRecord) {\n pendingRequests = pendingRequestsRecord.array;\n recNumber = pendingRequestsRecord.number;\n }\n\n // first several records of each file are processed without grouping (they usually require to be processed sequentially)\n if (recNumber < 6) {\n pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });\n await downloadPartOfFile(requestId, records, dataId);\n return;\n }\n\n // group requests to each file to launch a combined server request\n if (pendingRequests.length >= PENDING_REQUESTS_SIZE) {\n if (pendingRequestsTimerId) {\n window.clearTimeout(pendingRequestsTimerId);\n pendingRequestsTimerId = 0;\n }\n\n downloadPartOfFile(requestId, pendingRequests, dataId, true);\n pendingRequests = [...recordsToArray(requestId, records)];\n } else {\n pendingRequests = [...pendingRequests, ...recordsToArray(requestId, records)];\n }\n\n pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });\n\n // set timeout to wait for the new requests, after that process the remaining requests\n if (pendingRequestsTimerId === 0) {\n pendingRequestsTimerId = window.setTimeout(() => {\n pendingRequestsAbortController.signal.removeEventListener(\"abort\", pendingRequestsAbortHandler);\n pendingRequestsTimerId = 0;\n\n pendingRequestsMap.forEach((requestsRecord, keyFileName) => {\n const array = requestsRecord.array;\n if (array.length > 0) {\n downloadPartOfFile(requestId, array, keyFileName, true);\n pendingRequestsMap.set(keyFileName, { array: [], number: requestsRecord.number + 1 });\n }\n });\n }, PENDING_REQUESTS_TIMEOUT);\n\n pendingRequestsAbortController.signal.addEventListener(\"abort\", pendingRequestsAbortHandler, { once: true });\n }\n },\n };\n\n visViewer.attachPartialResolver(objectHandler);\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n await this.model\n .downloadFileRange(0, null, this.model.database, requestLoadHandler, abortController.signal)\n .catch((error) => {\n if (!servicePartAborted) throw error;\n });\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n if (pendingRequestsTimerId) {\n window.clearTimeout(pendingRequestsTimerId);\n pendingRequestsTimerId = 0;\n }\n\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\n\nexport class VsfXLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n this.viewer._abortController = abortController;\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n const progressCb = (progress) =>\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n const arrayBuffer = await this.model.downloadResource(this.model.database, progressCb, abortController.signal);\n\n if (abortController.signal.aborted) {\n await Promise.reject(new Error(`Open model aborted ${this.model.name}`));\n }\n\n if (this.viewer.visualizeJs) {\n visViewer.parseVsfx(new Uint8Array(arrayBuffer));\n this.viewer.update(true);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n }\n\n console.timeEnd(\"File load time\");\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { TCSLoader } from \"./TCSLoader\";\nimport { VsfXStreamingLoader } from \"./VsfXStreamingLoader\";\nimport { VsfXPartialLoader } from \"./VsfXPartialLoader\";\nimport { Viewer } from \"../Viewer\";\nimport { Model } from \"../../Api/Model\";\nimport { OptionsData } from \"../Options\";\nimport { VsfXLoader } from \"./VsfXLoader\";\n\nexport class LoaderFactory {\n create(viewer: Viewer, model: Model, options: OptionsData) {\n const geometryType = model.database.split(\".\").pop();\n\n if (model.geometry.length === 0 && geometryType === \"vsfx\") {\n if (!options.enableStreamingMode) return new VsfXLoader(viewer, model, options);\n else if (options.enablePartialMode) return new VsfXPartialLoader(viewer, model, options);\n else return new VsfXStreamingLoader(viewer, model, options);\n }\n\n if (geometryType === \"data\") {\n return new TCSLoader(viewer, model, options);\n }\n throw new Error(`Unknown geometry type: ${geometryType}`);\n }\n}\n","import { OdBaseDragger } from \"../Draggers/Common/OdBaseDragger\";\nimport { Viewer } from \"../Viewer\";\nimport { IMarkupObject } from \"./Api/IMarkupObject\";\nimport { IViewpoint } from \"./IViewpoint\";\n\nexport enum MarkupType {\n Unknown,\n Konva = \"Konva\",\n Visualize = \"Visualize\",\n}\n\nexport enum MarkupMode {\n Line = \"Line\",\n Text = \"Text\",\n Rectangle = \"Rectangle\",\n Ellipse = \"Ellipse\",\n Arrow = \"Arrow\",\n Image = \"Image\",\n Cloud = \"Cloud\",\n}\n\nexport interface IMarkup {\n lineWidth: number;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[]): void;\n dispose(): void;\n\n getDraggers(): Map<string, typeof OdBaseDragger>;\n clearOverlay(): void;\n setMarkupColor(r: number, g: number, b: number): void;\n getMarkupColor(): { r: number; g: number; b: number };\n colorizeAllMarkup(r: number, g: number, b: number): void;\n setViewpoint(viewpoint: IViewpoint): void;\n getViewpoint(): IViewpoint;\n\n createObject(type: string, params: any): IMarkupObject;\n getObjects(): IMarkupObject[];\n getSelectedObjects(): IMarkupObject[];\n selectObjects(objects: IMarkupObject[]): void;\n clearSelected(): void;\n}\n","export class MarkupColor {\n public R: number;\n public G: number;\n public B: number;\n\n private _hex: string;\n\n /**\n * Color in #000000 format\n */\n get HexColor(): string {\n return \"#\" + this._hex;\n }\n\n get RGB(): { r: number; g: number; b: number } {\n return { r: this.R, g: this.G, b: this.B };\n }\n\n constructor(r: number, g: number, b: number) {\n this.setColor(r, g, b);\n }\n\n public setColor(r: number, g: number, b: number): void {\n this.R = r;\n this.G = g;\n this.B = b;\n\n this._hex = this.rgbToHex(r, g, b);\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n const valueToHex = (c) => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupLine } from \"../../IMarkupLine\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\nimport { LineType } from \"../../../IViewpoint\";\n\nconst LineTypeSpecs = new Map<string, number[]>([\n [\"solid\", []],\n [\"dot\", [30, 30, 0.001, 30]],\n [\"dash\", [30, 30]],\n]);\n\nexport class KonvaLine implements IMarkupLine, IMarkupColorable {\n private _ref: Konva.Line;\n\n constructor(\n params: { points: { x: number; y: number }[]; type?: LineType; width?: number; color?: string; id?: string },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.points) return;\n\n const konvaPoints = [];\n params.points.forEach((point) => konvaPoints.push(point.x, point.y));\n\n this._ref = new Konva.Line({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.width ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || [],\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"line\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): number[] {\n return this._ref.points();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n getLineType(): string {\n const typeSpecs = this._ref.dash() || [];\n let type: LineType;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n\n setLineType(type: string) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n\n addPoints(points: [{ x: number; y: number }]) {\n let newPoints = this._ref.points();\n points.forEach((point) => {\n newPoints = newPoints.concat([point.x, point.y]);\n });\n\n this._ref.points(newPoints);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupText } from \"../../IMarkupText\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaText implements IMarkupText, IMarkupColorable {\n private _ref: Konva.Text;\n private readonly TEXT_FONT_FAMILY = \"Calibri\";\n\n constructor(\n params: {\n position: { x: number; y: number };\n text: string;\n rotation?: number;\n fontSize?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params || !params.text) return;\n\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: params.fontSize ?? 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: params.color ?? \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: params.rotation ?? 0,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"text\";\n }\n\n getColor(): string {\n return this._ref.fill();\n }\n\n setColor(hex: string) {\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getText(): string {\n return this._ref.text();\n }\n\n setText(text: string): void {\n this._ref.text(text);\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n getFontSize() {\n return this._ref.fontSize();\n }\n\n setFontSize(size: number) {\n this._ref.fontSize(size);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupRectangle } from \"../../IMarkupRectangle\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaRectangle implements IMarkupRectangle, IMarkupColorable {\n private _ref: Konva.Rect;\n\n constructor(\n params: {\n position: { x: number; y: number };\n width?: number;\n height?: number;\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position) return;\n\n this._ref = new Konva.Rect({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"rectangle\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupEllipse } from \"../../IMarkupEllipse\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaEllipse implements IMarkupEllipse, IMarkupColorable {\n private _ref: Konva.Ellipse;\n\n constructor(\n params: {\n position: { x: number; y: number };\n radius: { x: number; y: number };\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position) return;\n\n this._ref = new Konva.Ellipse({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n getRadiusX(): number {\n return this._ref.radiusX();\n }\n\n setRadiusX(r: number) {\n this._ref.radius({ x: r, y: this._ref.radiusY() });\n }\n\n getRadiusY(): number {\n return this._ref.radiusY();\n }\n\n setRadiusY(r: number) {\n this._ref.radius({ x: this._ref.radiusX(), y: r });\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"ellipse\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupArrow } from \"../../IMarkupArrow\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaArrow implements IMarkupArrow, IMarkupColorable {\n private _ref: Konva.Arrow;\n\n constructor(\n params: {\n start: { x: number; y: number };\n end: { x: number; y: number };\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.start || !params.end) return;\n\n this._ref = new Konva.Arrow({\n stroke: params.color ?? \"#ff0000\",\n fill: params.color ?? \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [params.start.x, params.start.y, params.end.x, params.end.y],\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"arrow\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): { x: number; y: number }[] {\n const points = this._ref.points();\n return [\n { x: points[0], y: points[1] },\n { x: points[2], y: points[3] },\n ];\n }\n\n setPoints(points: { x: number; y: number }[]) {\n if (points.length === 2) {\n this._ref.points([points[0].x, points[0].y, points[1].x, points[1].y]);\n }\n }\n\n getStartPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[0], y: points[1] };\n }\n\n setStartPoint(x: number, y: number) {\n const points = this._ref.points();\n this._ref.points([x, y, points[2], points[3]]);\n }\n\n getEndPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[2], y: points[3] };\n }\n\n setEndPoint(x: number, y: number) {\n const points = this._ref.points();\n this._ref.points([points[0], points[1], x, y]);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupImage } from \"../../IMarkupImage\";\n\nexport class KonvaImage implements IMarkupImage {\n private _ref: Konva.Image;\n private _canvasImage: HTMLImageElement;\n private _ratio = 1;\n\n constructor(\n params: { position: { x: number; y: number }; src: string; width: number; height: number; id?: string },\n ref = null\n ) {\n if (ref) {\n if (ref.height() === 0 || ref.width() === 0) return;\n\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio = this._ref.height() / this._ref.width();\n return;\n }\n\n if (!params.position || !params.src) return;\n this._canvasImage = new Image();\n\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: params.width,\n height: params.height,\n draggable: true,\n });\n\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n this._ratio = this._ref.height() === 0 || this._ref.width() === 0 ? 1 : this._ref.height() / this._ref.width();\n };\n\n this._canvasImage.src = params.src;\n\n this._ref.id(this._ref._id.toString());\n }\n\n getSrc(): string {\n return this._canvasImage.src;\n }\n\n setSrc(src: any) {\n this._canvasImage.src = src;\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n\n getHeight(): number {\n return this._ref.height();\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"image\";\n }\n\n // we can break Liskov Substitution Principle, need to use separate IColorable\n // getColor(): string {\n // return this._ref.fill();\n // }\n\n // setColor(hex: string) {\n // this._ref.fill(hex);\n // }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\nimport { IMarkupCloud } from \"../../IMarkupCloud\";\n\nexport class KonvaCloud implements IMarkupCloud, IMarkupColorable {\n private _ref: Konva.Shape;\n\n constructor(\n params: {\n position: { x: number; y: number };\n width?: number;\n height?: number;\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position || !params.width || !params.height) return;\n\n const arcRadius = 16;\n\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 5,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return { x: midX, y: midY };\n }\n\n const points = [\n { x: 0, y: 0 },\n { x: 0 + this._ref.width(), y: 0 },\n { x: 0 + this._ref.width(), y: 0 + this._ref.height() },\n { x: 0, y: 0 + this._ref.height() },\n { x: 0, y: 0 },\n ];\n\n const midPoint = calculateMidpoint({ x: 0, y: 0 }, this._ref.width(), this._ref.height());\n\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, arcRadius, endAngle, startAngle);\n } else {\n context.arc(pX, pY, arcRadius, startAngle, endAngle);\n }\n\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n\n context.closePath();\n // (!) Konva specific method, it is very important\n // it will apply are required styles\n context.fillStrokeShape(shape);\n },\n });\n\n this._ref.className = \"Cloud\";\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n const minWidth = 100;\n const minHeight = 100;\n\n const newWidth = this._ref.width() * attrs.scaleX;\n const newHeight = this._ref.height() * attrs.scaleY;\n\n if (newWidth < minWidth || newHeight < minHeight) {\n this._ref.scale({ x: 1, y: 1 });\n return;\n }\n\n if (Math.abs(attrs.scaleX - 1) > 10e-6) {\n this._ref.width(newWidth);\n }\n\n if (Math.abs(attrs.scaleY - 1) > 10e-6) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.getSelfRect = () => {\n return {\n x: 0 - arcRadius,\n y: 0 - arcRadius,\n width: this._ref.width() + 2 * arcRadius,\n height: this._ref.height() + 2 * arcRadius,\n };\n };\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"cloud\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition() {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number) {\n this._ref.position({ x, y });\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkup, MarkupMode } from \"../../IMarkup\";\nimport { Viewer } from \"../../../Viewer\";\nimport { ChangeActiveDraggerEvent, PanEvent } from \"../../../ViewerEvents\";\nimport { MarkupColor } from \"./MarkupColor\";\nimport * as utils from \"../../../Draggers/MeasureLineDragger/MeasureUtils\";\nimport { OdBaseDragger } from \"../../../Draggers/Common/OdBaseDragger\";\nimport { IMarkupObject } from \"../../Api/IMarkupObject\";\nimport { KonvaLine } from \"../../Api/Impl/Konva/KonvaLine\";\nimport { KonvaText } from \"../../Api/Impl/Konva/KonvaText\";\nimport { KonvaRectangle } from \"../../Api/Impl/Konva/KonvaRectangle\";\nimport { KonvaEllipse } from \"../../Api/Impl/Konva/KonvaEllipse\";\nimport { KonvaArrow } from \"../../Api/Impl/Konva/KonvaArrow\";\nimport { KonvaImage } from \"../../Api/Impl/Konva/KonvaImage\";\nimport { KonvaCloud } from \"../../Api/Impl/Konva/KonvaCloud\";\nimport { IViewpoint, LineType } from \"../../IViewpoint\";\n\nclass KonvaShape {\n name: string;\n initializer: (ref: any) => any;\n}\n\n// move to separate class and create factory with enum?\nconst MarkupMode2Konva = new Map<MarkupMode, KonvaShape>([\n [\n MarkupMode.Line,\n {\n name: \"Line\",\n initializer: (ref) => {\n return new KonvaLine(null, ref);\n },\n },\n ],\n [\n MarkupMode.Text,\n {\n name: \"Text\",\n initializer: (ref) => {\n return new KonvaText(null, ref);\n },\n },\n ],\n [\n MarkupMode.Rectangle,\n {\n name: \"Rect\",\n initializer: (ref) => {\n return new KonvaRectangle(null, ref);\n },\n },\n ],\n [\n MarkupMode.Ellipse,\n {\n name: \"Ellipse\",\n initializer: (ref) => {\n return new KonvaEllipse(null, ref);\n },\n },\n ],\n [\n MarkupMode.Arrow,\n {\n name: \"Arrow\",\n initializer: (ref) => {\n return new KonvaArrow(null, ref);\n },\n },\n ],\n [\n MarkupMode.Image,\n {\n name: \"Image\",\n initializer: (ref) => {\n return new KonvaImage(null, ref);\n },\n },\n ],\n [\n MarkupMode.Cloud,\n {\n name: \"Cloud\",\n initializer: (ref) => {\n return new KonvaCloud(null, ref);\n },\n },\n ],\n]);\n\nexport class KonvaMarkup implements IMarkup {\n private _isInitialized = false;\n private _viewer: Viewer;\n private _canvasOriginal: HTMLCanvasElement;\n private _canvasEvents: string[];\n private _markupIsActive: boolean;\n private _markupMode: MarkupMode;\n private _markupColor: MarkupColor;\n private _konvaStage: Konva.Stage;\n private _konvaLayer: Konva.Layer;\n private _konvaTransformer: Konva.Transformer;\n\n private _textInputRef: HTMLTextAreaElement;\n private _textInputPos: Konva.Vector2d;\n private _textInputAngle: number;\n private _markupContainer: HTMLDivElement;\n private _zIndex = 1;\n\n private readonly _markupContainerName = \"markupContainer\";\n\n public lineWidth = 4;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[] = []): void {\n if (!Konva)\n throw new Error(\n 'Konva Markup: Error during Markup Initialization. Konva is not initialized. Update node_modules or add to your page <script src=\"https://unpkg.com/konva@9/konva.min.js\"></script>'\n );\n\n this._viewer = viewer;\n\n this._canvasOriginal = canvas;\n this._canvasEvents = canvasEvents;\n\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = this._markupContainerName;\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n // to eliminate grey box during delete elements\n this._markupContainer.style.outline = \"0px\";\n\n const parentDiv = this._canvasOriginal.parentElement;\n parentDiv.appendChild(this._markupContainer);\n\n this._markupColor = new MarkupColor(255, 0, 0);\n this._markupIsActive = false;\n\n this.initializeKonva();\n this.resize();\n\n this._canvasEvents.forEach((x) => this._markupContainer.addEventListener(x, this.redirectToViewer));\n\n this._viewer.addEventListener(\"resize\", this.resize);\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n\n this._isInitialized = true;\n }\n\n dispose(): void {\n if (!this._isInitialized) return;\n\n this._canvasEvents.forEach((x) => this._markupContainer.removeEventListener(x, this.redirectToViewer));\n\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.removeEventListener(\"resize\", this.resize);\n\n this.destroyKonva();\n\n this._markupContainer.remove();\n\n this._markupContainer = undefined;\n this._canvasOriginal = undefined;\n this._viewer = undefined;\n\n this._isInitialized = false;\n }\n\n changeActiveDragger = (event: ChangeActiveDraggerEvent) => {\n const draggerName = event.data;\n\n this._markupContainer.className = this._canvasOriginal.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${draggerName.toLowerCase()}`)\n .join(\" \");\n\n this.removeTextInput();\n\n const markupMode = MarkupMode[draggerName];\n const konvaMode = MarkupMode2Konva.get(markupMode);\n if (konvaMode) {\n this._markupMode = markupMode;\n this._markupIsActive = true;\n } else {\n this._markupIsActive = false;\n this._konvaTransformer.nodes([]);\n }\n };\n\n resize = () => {\n this._konvaStage?.width(this._canvasOriginal.clientWidth);\n this._konvaStage?.height(this._canvasOriginal.clientHeight);\n };\n\n pan = (event: PanEvent) => {\n const dX = event.dX / window.devicePixelRatio;\n const dY = event.dY / window.devicePixelRatio;\n\n Object.values(MarkupMode).forEach((mode) => this.konvaLayerFind(mode).forEach((x) => x.move({ x: dX, y: dY })));\n };\n\n redirectToViewer = (event) => {\n this._viewer.emit(event);\n };\n\n getDraggers(): Map<string, typeof OdBaseDragger> {\n return null;\n }\n\n clearOverlay(): void {\n this.removeTextInput();\n this._konvaTransformer.nodes([]);\n Object.values(MarkupMode).forEach((mode) => this.konvaLayerFind(mode).forEach((x) => x.destroy()));\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor.RGB;\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n this._markupColor.setColor(r, g, b);\n }\n\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n const hex = new MarkupColor(r, g, b).HexColor;\n Object.values(MarkupMode).forEach((mode) => {\n this.konvaLayerFind(mode).forEach((x) => {\n const konvaObj = MarkupMode2Konva.get(mode).initializer(x);\n if (konvaObj.setColor) konvaObj.setColor(hex);\n });\n });\n\n this._konvaLayer.draw();\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n const markupColor = viewpoint.custom_fields.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n this.loadMarkup(viewpoint);\n }\n\n getViewpoint(): IViewpoint {\n // TODO: at the current 25.2 state we need VisualizeJS here and below. In the future we need to use it as an external interface.\n if (!this._viewer.visualizeJs) return {};\n\n const viewpoint: IViewpoint = {\n lines: [],\n texts: [],\n arrows: [],\n clouds: [],\n ellipses: [],\n images: [],\n rectangles: [],\n };\n\n viewpoint.snapshot = {\n data: this.combineMarkupWithDrawing(),\n };\n\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor(),\n };\n\n this.fillViewpointShapes(viewpoint);\n\n viewpoint.description = new Date().toDateString();\n return viewpoint;\n }\n\n createObject(type: string, params: any): IMarkupObject {\n let object;\n let zIndex = this._zIndex;\n\n // TODO: factory?\n switch (type) {\n case \"line\":\n object = new KonvaLine(params);\n zIndex = 1;\n break;\n case \"text\":\n object = new KonvaText(params);\n break;\n case \"rectangle\":\n object = new KonvaRectangle(params);\n zIndex = 1;\n break;\n case \"ellipse\":\n object = new KonvaEllipse(params);\n zIndex = 1;\n break;\n case \"arrow\":\n object = new KonvaArrow(params);\n break;\n case \"image\":\n object = new KonvaImage(params);\n zIndex = 0;\n break;\n case \"cloud\":\n object = new KonvaCloud(params);\n zIndex = 1;\n break;\n default:\n throw new Error(\"Markup CreateObject - unsupported type has been detected.\");\n }\n\n this.addObject(object);\n\n // Set zIndex only when shape has been added to Layer else we will get \"Konva warning: Node has no parent. zIndex parameter is ignored.\"\n object.setZIndex(zIndex);\n this._zIndex++;\n return object;\n }\n\n getObjects(): IMarkupObject[] {\n const objects = [];\n this.konvaLayerFind(MarkupMode.Line).forEach((line) => {\n objects.push(new KonvaLine(null, line));\n });\n\n this.konvaLayerFind(MarkupMode.Text).forEach((text) => {\n objects.push(new KonvaText(null, text));\n });\n\n this.konvaLayerFind(MarkupMode.Rectangle).forEach((rectangle) => {\n objects.push(new KonvaRectangle(null, rectangle));\n });\n\n this.konvaLayerFind(MarkupMode.Ellipse).forEach((ellipse) => {\n objects.push(new KonvaEllipse(null, ellipse));\n });\n\n this.konvaLayerFind(MarkupMode.Arrow).forEach((arrow) => {\n objects.push(new KonvaArrow(null, arrow));\n });\n\n this.konvaLayerFind(MarkupMode.Image).forEach((image) => {\n objects.push(new KonvaImage(null, image));\n });\n\n this.konvaLayerFind(MarkupMode.Cloud).forEach((cloud) => {\n objects.push(new KonvaCloud(null, cloud));\n });\n\n return objects;\n }\n\n getSelectedObjects(): IMarkupObject[] {\n const objects = [];\n\n this._konvaTransformer.nodes().forEach((obj) => {\n const konvaShapeName = obj.className;\n switch (konvaShapeName) {\n case \"Line\":\n objects.push(new KonvaLine(null, obj));\n break;\n case \"Text\":\n objects.push(new KonvaText(null, obj));\n break;\n case \"Rect\":\n objects.push(new KonvaRectangle(null, obj));\n break;\n case \"Ellipse\":\n objects.push(new KonvaEllipse(null, obj));\n break;\n case \"Arrow\":\n objects.push(new KonvaArrow(null, obj));\n break;\n case \"Image\":\n objects.push(new KonvaImage(null, obj));\n break;\n case \"Cloud\":\n objects.push(new KonvaCloud(null, obj));\n break;\n default:\n break;\n }\n });\n\n return objects;\n }\n\n selectObjects(objects: IMarkupObject[]) {\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x) => x.ref()));\n this._konvaTransformer.nodes(selectedObjs);\n }\n\n clearSelected(): void {\n this._konvaTransformer.nodes([]);\n }\n\n private getPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n private fillViewpointShapes(viewpoint) {\n const markupLines = this.getMarkupLines();\n if (markupLines && markupLines.length > 0) {\n markupLines?.forEach((line) => {\n viewpoint.lines.push(line);\n });\n }\n\n const markupTexts = this.getMarkupTexts();\n if (markupTexts && markupTexts.length > 0) {\n markupTexts?.forEach((text) => {\n viewpoint.texts.push(text);\n });\n }\n\n const markupRectangles = this.getMarkupRectangles();\n if (markupRectangles && markupRectangles.length > 0) {\n markupRectangles?.forEach((rectangle) => {\n viewpoint.rectangles.push(rectangle);\n });\n }\n\n const markupEllipses = this.getMarkupEllipses();\n if (markupEllipses && markupEllipses.length > 0) {\n markupEllipses?.forEach((ellipse) => {\n viewpoint.ellipses.push(ellipse);\n });\n }\n\n const markupArrows = this.getMarkupArrows();\n if (markupArrows && markupArrows.length > 0) {\n markupArrows?.forEach((arrow) => {\n viewpoint.arrows.push(arrow);\n });\n }\n\n const markupImages = this.getMarkupImages();\n if (markupImages && markupImages.length > 0) {\n markupImages?.forEach((image) => {\n viewpoint.images.push(image);\n });\n }\n\n const markupClouds = this.getMarkupClouds();\n if (markupClouds && markupClouds.length > 0) {\n markupClouds?.forEach((cloud) => {\n viewpoint.clouds.push(cloud);\n });\n }\n }\n\n private addObject(object: IMarkupObject): void {\n this._konvaLayer.add(object.ref());\n }\n\n private konvaLayerFind(markupShape: MarkupMode): any {\n const konvaShape = MarkupMode2Konva.get(markupShape);\n if (konvaShape) {\n // for \"draggable\" Konva uses Rectangles in Transformer. We need only Shapes from Layer.\n const konvaShapes = this._konvaLayer.find(konvaShape.name).filter((x) => x.parent instanceof Konva.Layer);\n return konvaShapes;\n }\n }\n\n private initializeKonva(): any {\n // first we need Konva core things: stage and layer\n this._konvaStage = new Konva.Stage({\n container: this._markupContainerName,\n width: this._canvasOriginal.clientWidth,\n height: this._canvasOriginal.clientHeight,\n });\n const stage = this._konvaStage;\n const layer = new Konva.Layer({ pixelRation: window.devicePixelRatio });\n stage.add(layer);\n this._konvaLayer = layer;\n\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n });\n\n this._konvaTransformer = transformer;\n layer.add(transformer);\n\n let isPaint = false;\n let lastLine;\n\n stage.on(\"mousedown touchstart\", (e) => {\n // do nothing if we mousedown on any shape\n if (!this._markupIsActive || e.target !== stage || this._markupMode === MarkupMode.Text) return;\n\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n\n const pos = stage.getPointerPosition();\n\n if (this._markupMode === MarkupMode.Line) {\n // add point twice, so we have some drawings even on a simple click\n lastLine = this.addLine([pos.x, pos.y, pos.x, pos.y]);\n\n isPaint = true;\n }\n // 25.2 - currently only for debug purposes:\n else if (this._markupMode === MarkupMode.Rectangle) {\n this.addRectangle({ x: pos.x, y: pos.y }, 50, 50);\n } else if (this._markupMode === MarkupMode.Ellipse) {\n this.addEllipse({ x: pos.x, y: pos.y }, { x: 50, y: 50 });\n } else if (this._markupMode === MarkupMode.Arrow) {\n this.addArrow({ x: pos.x, y: pos.y }, { x: pos.x + 50, y: pos.y + 50 });\n } else if (this._markupMode === MarkupMode.Cloud) {\n this.addCloud({ x: pos.x, y: pos.y }, 200, 400);\n }\n });\n\n stage.on(\"mouseup touchend\", (e) => {\n if (!this._markupIsActive) return;\n isPaint = false;\n });\n\n stage.on(\"mousemove touchmove\", (e) => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n\n // prevent scrolling on touch devices\n //e.evt.preventDefault();\n\n const pos = stage.getPointerPosition();\n const newPoints = lastLine.points().concat([pos.x, pos.y]);\n lastLine.points(newPoints);\n });\n\n // clicks should select/deselect shapes\n stage.on(\"click tap\", (e) => {\n if (!this._markupIsActive) return;\n\n // if click on empty area - remove all selections\n if (e.target === stage) {\n if (this._markupMode === MarkupMode.Text) {\n if (this._textInputRef) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else if (transformer.nodes().length === 0) {\n const pos = stage.getPointerPosition();\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n }\n transformer.nodes([]);\n return;\n }\n\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else\n this.createTextInput(\n { x: e.target.attrs.x, y: e.target.attrs.y },\n e.evt.pageX,\n e.evt.pageY,\n e.target.attrs.rotation,\n e.target.attrs.text\n );\n return;\n } else {\n this.removeTextInput();\n }\n\n if (transformer.nodes().filter((x) => x.className === \"Cloud\").length > 0 || e.target.className === \"Cloud\") {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n\n // do we pressed shift or ctrl?\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n\n if (!metaPressed && !isSelected) {\n // if no key pressed and the node is not selected\n // select just one\n transformer.nodes([e.target]);\n } else if (metaPressed && isSelected) {\n // if we pressed keys and node was selected\n // we need to remove it from selection:\n const nodes = transformer.nodes().slice(); // use slice to have new copy of array\n // remove node from array\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n // add the node into selection\n const nodes = transformer.nodes().concat([e.target]);\n transformer.nodes(nodes);\n }\n });\n\n const container = stage.container();\n container.tabIndex = 1;\n // focus it\n // also stage will be in focus on its click\n container.focus();\n\n container.addEventListener(\"keydown\", (e) => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n this._konvaTransformer.nodes().forEach((x) => x.destroy());\n this._konvaTransformer.nodes([]);\n }\n layer.draw();\n return;\n }\n e.preventDefault();\n });\n }\n\n private destroyKonva() {\n this.clearOverlay();\n\n this._konvaStage.destroy();\n\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n\n private getMarkupLines() {\n const lines = [];\n this.konvaLayerFind(MarkupMode.Line).forEach((line) => {\n const linePoints = line.points();\n if (!linePoints) return;\n const worldPoints = [];\n const absoluteTransform = line.getAbsoluteTransform();\n for (let i = 0; i < linePoints.length; i += 2) {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n // https://stackoverflow.com/a/57641487 - check answer's comments\n const atPoint = absoluteTransform.point({ x: linePoints[i], y: linePoints[i + 1] });\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(atPoint.x * window.devicePixelRatio, atPoint.y * window.devicePixelRatio);\n worldPoints.push(worldPoint);\n }\n\n const konvaLine = new KonvaLine(null, line);\n lines.push({\n id: konvaLine.id(),\n points: worldPoints.map((p) => this.getPoint3dFromArray(p)),\n color: konvaLine.getColor() || \"ff0000\",\n type: konvaLine.getLineType() || \"solid\",\n width: konvaLine.getLineWidth() || 3,\n });\n });\n\n return lines;\n }\n\n private getMarkupTexts() {\n const texts = [];\n\n const textSize = 0.02;\n let textScale = 1.0;\n\n const projMtrx = this._viewer.visViewer().activeView.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n const tol = 1.0e-6;\n if (mtrxNumber > tol || mtrxNumber < -tol) {\n textScale = 1 / mtrxNumber;\n }\n\n this.konvaLayerFind(MarkupMode.Text).forEach((text) => {\n if (!text) return;\n\n const position = this._viewer\n .visViewer()\n .screenToWorld(text.x() * window.devicePixelRatio, text.y() * window.devicePixelRatio);\n\n const shape = new KonvaText(null, text);\n texts.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(position),\n text: shape.getText(),\n text_size: textSize * textScale,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize(),\n });\n });\n\n return texts;\n }\n\n private getMarkupRectangles() {\n const rectangles = [];\n this.konvaLayerFind(MarkupMode.Rectangle).forEach((rect) => {\n const position = rect.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaRectangle(null, rect);\n rectangles.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n width: shape.getWidth(),\n height: shape.getHeigth(),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return rectangles;\n }\n\n private getMarkupEllipses() {\n const ellipses = [];\n this.konvaLayerFind(MarkupMode.Ellipse).forEach((ellipse) => {\n const position = ellipse.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaEllipse(null, ellipse);\n ellipses.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n radius: { x: ellipse.getRadiusX(), y: ellipse.getRadiusY() },\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return ellipses;\n }\n\n private getMarkupArrows() {\n const arrows = [];\n this.konvaLayerFind(MarkupMode.Arrow).forEach((arrow) => {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n const absoluteTransform = arrow.getAbsoluteTransform();\n\n const atStartPoint = absoluteTransform.point({ x: arrow.points()[0], y: arrow.points()[1] });\n const worldStartPoint = this._viewer\n .visViewer()\n .screenToWorld(atStartPoint.x * window.devicePixelRatio, atStartPoint.y * window.devicePixelRatio);\n\n const atEndPoint = absoluteTransform.point({ x: arrow.points()[2], y: arrow.points()[3] });\n const worldEndPoint = this._viewer\n .visViewer()\n .screenToWorld(atEndPoint.x * window.devicePixelRatio, atEndPoint.y * window.devicePixelRatio);\n\n const shape = new KonvaArrow(null, arrow);\n arrows.push({\n id: shape.id(),\n start: this.getPoint3dFromArray(worldStartPoint),\n end: this.getPoint3dFromArray(worldEndPoint),\n color: shape.getColor(),\n });\n });\n\n return arrows;\n }\n\n private getMarkupImages() {\n const images = [];\n this.konvaLayerFind(MarkupMode.Image).forEach((image) => {\n const position = image.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaImage(null, image);\n images.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n src: shape.getSrc(),\n width: shape.getWidth(),\n height: shape.getHeight(),\n });\n });\n\n return images;\n }\n\n private getMarkupClouds() {\n const clouds = [];\n this.konvaLayerFind(MarkupMode.Cloud).forEach((cloud) => {\n const position = cloud.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaCloud(null, cloud);\n clouds.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n width: shape.getWidth(),\n height: shape.getHeigth(),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return clouds;\n }\n\n private loadMarkup(viewpoint: IViewpoint) {\n viewpoint.lines?.forEach((vpLine) => {\n const linePoints = [];\n vpLine.points.forEach((point) => {\n const screenPoint = utils.worldToScreen(\n [point.x, point.y, point.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n });\n\n this.addLine(linePoints, vpLine.color, vpLine.type, vpLine.width, vpLine.id);\n });\n\n viewpoint.texts?.forEach((vpText) => {\n const screenPoint = utils.worldToScreen(\n [vpText.position.x, vpText.position.y, vpText.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n this.addText(vpText.text, screenPoint, vpText.angle, vpText.color, vpText.text_size, vpText.font_size, vpText.id);\n });\n\n viewpoint.rectangles?.forEach((vpRect) => {\n const screenPoint = utils.worldToScreen(\n [vpRect.position.x, vpRect.position.y, vpRect.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addRectangle(\n { x: screenPoint.x, y: screenPoint.y },\n vpRect.width,\n vpRect.height,\n vpRect.line_width,\n vpRect.color,\n vpRect.id\n );\n });\n\n viewpoint.ellipses?.forEach((vpEllipse) => {\n const screenPoint = utils.worldToScreen(\n [vpEllipse.position.x, vpEllipse.position.y, vpEllipse.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addEllipse(\n { x: screenPoint.x, y: screenPoint.y },\n { x: vpEllipse.radius.x, y: vpEllipse.radius.y },\n vpEllipse.line_width,\n vpEllipse.color,\n vpEllipse.id\n );\n });\n\n viewpoint.arrows?.forEach((vpArrow) => {\n const startPoint = utils.worldToScreen(\n [vpArrow.start.x, vpArrow.start.y, vpArrow.start.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n const endPoint = utils.worldToScreen(\n [vpArrow.end.x, vpArrow.end.y, vpArrow.end.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addArrow({ x: startPoint.x, y: startPoint.y }, { x: endPoint.x, y: endPoint.y }, vpArrow.color, vpArrow.id);\n });\n\n viewpoint.clouds?.forEach((vpCloud) => {\n const screenPoint = utils.worldToScreen(\n [vpCloud.position.x, vpCloud.position.y, vpCloud.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addCloud(\n { x: screenPoint.x, y: screenPoint.y },\n vpCloud.width,\n vpCloud.height,\n vpCloud.line_width,\n vpCloud.color,\n vpCloud.id\n );\n });\n\n viewpoint.images?.forEach((vpImage) => {\n const screenPoint = utils.worldToScreen(\n [vpImage.position.x, vpImage.position.y, vpImage.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addImage({ x: screenPoint.x, y: screenPoint.y }, vpImage.src, vpImage.width, vpImage.height, vpImage.id);\n });\n }\n\n private combineMarkupWithDrawing() {\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n this._konvaTransformer.nodes([]);\n }\n\n const tempCanvas = document.createElement(\"canvas\");\n tempCanvas.height = this._canvasOriginal.height;\n tempCanvas.width = this._canvasOriginal.width;\n const ctx = tempCanvas.getContext(\"2d\");\n ctx.drawImage(this._canvasOriginal, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({ pixelRatio: window.devicePixelRatio }), 0, 0);\n return tempCanvas.toDataURL(\"image/jpeg\", 0.25);\n }\n\n private addLine(\n linePoints: number[],\n color?: string,\n type?: LineType,\n width?: number,\n id?: string\n ): Konva.Line | void {\n if (!linePoints || linePoints.length === 0) return;\n const points: { x: number; y: number }[] = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({ x: linePoints[i], y: linePoints[i + 1] });\n }\n\n const konvaLine = new KonvaLine({\n points,\n type: type || \"solid\",\n width: width || this.lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaLine.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private createTextInput(pos: Konva.Vector2d, inputX: number, inputY: number, angle: number, text: string): void {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.onkeydown = (event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n\n setTimeout(() => {\n this._textInputRef.focus();\n }, 50);\n } else {\n this.removeTextInput();\n }\n }\n\n private removeTextInput(): void {\n this._textInputRef?.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n\n private addText(\n specifiedText: string,\n position: Konva.Vector2d,\n angle?: number,\n color?: string,\n textSize?: number,\n fontSize?: number,\n id?: string\n ): void {\n if (specifiedText) {\n const tol = 1.0e-6;\n\n // in case we have old viewpoint without font_size\n if (textSize && textSize > tol && (!fontSize || fontSize < tol)) {\n const size = 0.02;\n let scale = 1.0;\n\n const projMtrx = this._viewer.visViewer().activeView.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n\n if (mtrxNumber > tol || mtrxNumber < -tol) {\n scale = 1 / mtrxNumber;\n }\n fontSize = textSize / (scale / size) / 34;\n }\n\n const konvaText = new KonvaText({\n position: { x: position.x, y: position.y },\n text: specifiedText,\n rotation: angle,\n fontSize,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n this._konvaLayer.add(konvaText.ref());\n }\n\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n // in case of edit - remove old Konva.Text object\n trNodes[0].destroy();\n this._konvaTransformer.nodes([]);\n }\n\n this.removeTextInput();\n\n return;\n }\n\n private addRectangle(\n position: Konva.Vector2d,\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Rect | void {\n if (!position) return;\n\n const konvaRectangle = new KonvaRectangle({\n position,\n width,\n height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaRectangle.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addEllipse(\n position: { x: number; y: number },\n radius: { x: number; y: number },\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Ellipse | void {\n if (!position) return;\n\n const konvaEllipse = new KonvaEllipse({\n position,\n radius,\n lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaEllipse.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addArrow(\n start: { x: number; y: number },\n end: { x: number; y: number },\n color?: string,\n id?: string\n ): Konva.Arrow | void {\n if (!start || !end) return;\n\n const konvaArrow = new KonvaArrow({\n start,\n end,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaArrow.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addCloud(\n position: { x: number; y: number },\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Shape | void {\n if (!position || !width || !height) return;\n\n const konvaCloud = new KonvaCloud({\n position,\n width,\n height,\n color: color || this._markupColor.HexColor,\n lineWidth: lineWidth || this.lineWidth,\n id,\n });\n\n const obj = konvaCloud.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addImage(\n position: { x: number; y: number },\n src: string,\n width: number,\n height: number,\n id?: string\n ): Konva.Image | void {\n if (!position || !width || !height) return;\n\n const konvaImage = new KonvaImage({\n position,\n src,\n width,\n height,\n id,\n });\n\n const obj = konvaImage.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport const MARKUP_ENTITY_LINE = \"$MarkupTempEntity_Line\";\n\nexport class OdaLineDragger extends OdBaseDragger {\n protected entity: any;\n protected points: any[];\n protected drawPoints: any[];\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n }\n\n override dispose(): void {\n super.dispose();\n this.end();\n this.points = null;\n this.drawPoints = null;\n }\n\n override start(x: number, y: number): void {\n const point = this.getViewer().screenToWorld(x, y);\n this.drawPoints = [point[0], point[1], point[2]];\n }\n\n override drag(x: number, y: number): void {\n if (this.isDragging) {\n const point = this.getViewer().screenToWorld(x, y);\n this.drawPoints.push(point[0], point[1], point[2]);\n this._updateFrame();\n }\n }\n\n override end(): void {\n if (this.entity) {\n this.entity.delete();\n this.drawPoints = null;\n this.entity = null;\n }\n }\n\n private _updateFrame(): void {\n if (this.entity) {\n const model = this.getViewer().getMarkupModel();\n model.removeEntity(this.entity);\n model.delete();\n this.entity.delete();\n }\n\n this.entity = this.getActiveMarkupEntity(MARKUP_ENTITY_LINE);\n\n const entityPtr = this.entity.openObject();\n entityPtr.appendPolyline(this.drawPoints).delete();\n entityPtr.delete();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport const MARKUP_ENTITY_TEXT = \"$MarkupTempEntity_Text\";\n\nexport class OdaTextDragger extends OdBaseDragger {\n protected textRef: HTMLTextAreaElement;\n protected m_center: Point3d;\n protected entity: any;\n protected readonly TEXT_HEIGHT_ALIGN = 24;\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n }\n\n override dispose(): void {\n super.dispose();\n this.textRef?.remove();\n this.textRef = null;\n }\n\n private _finishInput(): void {\n if (this.textRef && this.textRef.value.trimLeft()) {\n this._updateFrame();\n }\n this.textRef?.remove();\n this.textRef = null;\n }\n\n override start(x: number, y: number, absoluteX: number, absoluteY: number) {\n if (!this.textRef) {\n this.textRef = document.createElement(\"textarea\");\n this.textRef.style.zIndex = \"9999\";\n this.textRef.style.position = \"absolute\";\n this.textRef.style.display = \"block\";\n this.textRef.style.top = absoluteY + \"px\";\n this.textRef.style.left = absoluteX + \"px\";\n this.textRef.onkeypress = (event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n this._finishInput();\n }\n };\n document.body.appendChild(this.textRef);\n\n this.press = true;\n this.m_center = this.screenToWorld(x, y + this.TEXT_HEIGHT_ALIGN);\n this.needInputText = true;\n } else {\n this._finishInput();\n }\n }\n\n private _updateFrame(): void {\n this.entity = this.getActiveMarkupEntity(MARKUP_ENTITY_TEXT);\n const entityPtr = this.entity.openObject();\n\n const view = this.getViewer().activeView;\n const pos = this.toPoint(view.viewPosition);\n const target = this.toPoint(view.viewTarget);\n\n const eyeToWorld = view.eyeToWorldMatrix;\n const eyeDir = pos.sub(target).asVector();\n\n const xDir = this.toVector([1.0, 0.0, 0.0]);\n const direction = xDir.transformBy(eyeToWorld);\n\n const mtrx = this.createMatrix3d();\n mtrx.setToWorldToPlane(this.toGeVector(eyeDir));\n direction.transformBy(mtrx);\n\n const angel = -Math.atan2(-direction.y, direction.x);\n\n const textSize = 0.02;\n let textScale = 1.0;\n\n const projMtrx = view.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n const tol = 1.0e-6;\n if (!(mtrxNumber < tol && mtrxNumber > -tol)) {\n textScale = 1 / mtrxNumber;\n }\n\n const geomData = entityPtr.appendText(this.toGePoint(this.m_center), this.textRef.value.trimLeft());\n const textPtr = geomData.openAsText();\n\n textPtr.setNormal(this.toGeVector(eyeDir));\n textPtr.setRotation(angel);\n textPtr.setTextSize(textSize * textScale);\n textPtr.delete();\n geomData.delete();\n entityPtr.delete();\n }\n}\n","import { IMarkup, MarkupMode } from \"../../IMarkup\";\nimport { Viewer } from \"../../../Viewer\";\nimport { OdBaseDragger } from \"../../../Draggers/Common/OdBaseDragger\";\nimport { MARKUP_ENTITY_LINE, OdaLineDragger } from \"../../../Draggers/OdaLineDragger\";\nimport { MARKUP_ENTITY_TEXT, OdaTextDragger } from \"../../../Draggers/OdaTextDragger\";\nimport { IMarkupObject } from \"../../Api/IMarkupObject\";\nimport { ILine, IText, IViewpoint } from \"../../IViewpoint\";\n\nexport class VisualizeMarkup implements IMarkup {\n private _viewer: Viewer;\n protected _markupColor = { r: 255, g: 0, b: 0 };\n\n public lineWidth = 0;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[]): void {\n this._viewer = viewer;\n }\n\n dispose(): void {}\n\n getDraggers(): Map<string, typeof OdBaseDragger> {\n return new Map<string, typeof OdBaseDragger>([\n [MarkupMode.Line, OdaLineDragger],\n [MarkupMode.Text, OdaTextDragger],\n ]);\n }\n\n clearOverlay(): void {\n if (!this._viewer.visualizeJs) return;\n\n const visViewer = this._viewer.visViewer();\n const model = visViewer.getMarkupModel();\n model.clearEntities();\n model.delete();\n\n this._viewer.update();\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor;\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n const color = { r, g, b };\n this._markupColor = color;\n }\n\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n if (!this._viewer.visualizeJs) return;\n\n const visViewer = this._viewer.visViewer();\n const model = visViewer.getMarkupModel();\n const itr = model.getEntitiesIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n const entityPtr = entityId.openObject();\n const entityName = entityPtr.getName();\n\n if (entityName === MARKUP_ENTITY_LINE || entityName === MARKUP_ENTITY_TEXT) {\n entityPtr.setColor(r, g, b);\n }\n\n entityPtr.delete();\n }\n itr.delete();\n\n this._viewer.update();\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n function getLogicalPoint3dAsArray(point3d) {\n return [point3d.x, point3d.y, point3d.z];\n }\n\n function getPoint3d(module, gePoint) {\n return module.Point3d.createFromArray(gePoint);\n }\n\n if (!this._viewer.visualizeJs) return;\n\n const visLib = this._viewer.visLib();\n const visViewer = visLib.getViewer();\n const activeView = visViewer.activeView;\n\n this._viewer.syncOverlay();\n\n const markupColor = viewpoint.custom_fields.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n if (viewpoint.lines) {\n for (const line of viewpoint.lines) {\n const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_LINE);\n const entityPtr = entityId.openObject();\n\n const entityData = [];\n for (const point of line.points) {\n entityData.push(point.x, point.y, point.z);\n }\n const geomData = entityPtr.appendPolyline(entityData);\n\n geomData.delete();\n entityPtr.delete();\n }\n }\n\n if (viewpoint.texts) {\n const pos = getPoint3d(visLib, activeView.viewPosition);\n const target = getPoint3d(visLib, activeView.viewTarget);\n const normal = pos.sub(target).asVector();\n\n for (const text of viewpoint.texts) {\n const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_TEXT);\n const entityPtr = entityId.openObject();\n\n const geomData = entityPtr.appendText(getLogicalPoint3dAsArray(text.position), text.text);\n\n const textPtr = geomData.openAsText();\n textPtr.setNormal(getLogicalPoint3dAsArray(normal));\n textPtr.setRotation(text.angle);\n textPtr.setTextSize(text.text_size);\n\n textPtr.delete();\n geomData.delete();\n entityPtr.delete();\n }\n }\n\n this._viewer.update();\n }\n\n getViewpoint(): IViewpoint {\n function getLogicalPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n if (!this._viewer.visualizeJs) return {};\n\n const visLib = this._viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const viewpoint: IViewpoint = {\n lines: [],\n texts: [],\n };\n\n const model = visViewer.getMarkupModel();\n const itr = model.getEntitiesIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n const entityPtr = entityId.openObject();\n const entityName = entityPtr.getName();\n\n const geomItr = entityPtr.getGeometryDataIterator();\n if (geomItr.done()) {\n entityPtr.delete();\n continue;\n }\n\n const geometryId = geomItr.getGeometryData();\n\n if (entityName === MARKUP_ENTITY_LINE) {\n const polylinePtr = geometryId.openAsPolyline();\n const points = polylinePtr.getPoints();\n\n const line: ILine = {\n points: [],\n };\n for (const point of points) {\n line.points.push(getLogicalPoint3dFromArray(point));\n }\n\n viewpoint.lines.push(line);\n polylinePtr.delete();\n } else if (entityName === MARKUP_ENTITY_TEXT) {\n const textPtr = geometryId.openAsText();\n const position = textPtr.getPosition();\n\n const text: IText = {\n position: getLogicalPoint3dFromArray(position),\n text: textPtr.getString(),\n angle: textPtr.getRotation(),\n text_size: textPtr.getTextSize(),\n };\n\n viewpoint.texts.push(text);\n textPtr.delete();\n }\n\n entityPtr.delete();\n }\n itr.delete();\n\n viewpoint.snapshot = {\n data: visLib.canvas.toDataURL(\"image/jpeg\", 0.25),\n };\n\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor(),\n };\n\n viewpoint.description = new Date().toDateString();\n return viewpoint;\n }\n\n getLayer(): any {\n throw new Error(\"Not implemented yet\");\n }\n\n createObject(type: string, params: any): IMarkupObject {\n throw new Error(\"Not implemented yet\");\n }\n\n getObjects(): IMarkupObject[] {\n throw new Error(\"Not implemented yet\");\n }\n\n getSelectedObjects(): IMarkupObject[] {\n throw new Error(\"Not implemented yet\");\n }\n\n selectObjects(objects: IMarkupObject[]): void {\n throw new Error(\"Not implemented yet\");\n }\n\n clearSelected(): void {\n throw new Error(\"Not implemented yet\");\n }\n}\n","import { IMarkup, MarkupType } from \"./IMarkup\";\nimport { KonvaMarkup } from \"./Impl/Konva/KonvaMarkup\";\nimport { VisualizeMarkup } from \"./Impl/Visualize/VisualizeMarkup\";\n\nexport class MarkupFactory {\n public static createMarkup(markupType: MarkupType): IMarkup {\n let markup;\n switch (markupType) {\n case MarkupType.Konva:\n markup = this.createKonva();\n break;\n\n case MarkupType.Visualize:\n markup = this.createVisualize();\n break;\n\n default:\n throw new Error(\"Error during Markup Initialization. Markup Type is unknown.\");\n break;\n }\n\n return markup;\n }\n\n private static createKonva(): IMarkup {\n return new KonvaMarkup();\n }\n\n private static createVisualize(): IMarkup {\n return new VisualizeMarkup();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IViewer } from \"./IViewer\";\nimport { commands } from \"./Commands\";\nimport { EventEmitter2 } from \"./EventEmitter2\";\nimport { ViewerEventMap } from \"./ViewerEvents\";\nimport { OptionsEventMap, OptionsChangeEvent } from \"./OptionsEvents\";\nimport { CANVAS_EVENTS } from \"./CanvasEvents\";\n\nimport { OdBaseDragger } from \"./Draggers/Common/OdBaseDragger\";\nimport { MeasureLineDragger } from \"./Draggers/MeasureLineDragger/index\";\nimport { OdaWalkDragger } from \"./Draggers/OdaWalkDragger\";\nimport { OdCuttingPlaneXAxisDragger } from \"./Draggers/OdCuttingPlaneXAxisDragger\";\nimport { OdCuttingPlaneYAxisDragger } from \"./Draggers/OdCuttingPlaneYAxisDragger\";\nimport { OdCuttingPlaneZAxisDragger } from \"./Draggers/OdCuttingPlaneZAxisDragger\";\nimport { OdOrbitDragger } from \"./Draggers/OdOrbitDragger\";\nimport { OdPanDragger } from \"./Draggers/OdPanDragger\";\nimport { OdZoomDragger } from \"./Draggers/OdZoomDragger\";\nimport { OdZoomWheelDragger } from \"./Draggers/OdZoomWheelDragger\";\nimport { OdZoomWindowDragger } from \"./Draggers/OdZoomWindowDragger/index\";\nimport { OrbitAroundBuildingDragger } from \"./Draggers/OrbitAroundBuildingDragger\";\nimport { GestureManager } from \"./Draggers/Common/GestureManager\";\n\nimport { loadVisualizeJs } from \"./utils\";\n\nimport { Client } from \"../Api/Client\";\nimport { File } from \"../Api/File\";\nimport { Assembly } from \"../Api/Assembly\";\nimport { Model } from \"../Api/Model\";\nimport { Options, OptionsData } from \"./Options\";\nimport { LoaderFactory } from \"./Loaders/LoaderFactory\";\nimport { MarkupFactory } from \"./Markup/MarkupFactory\";\nimport { IMarkup, MarkupType } from \"./Markup/IMarkup\";\nimport { IClippingPlane, IOrthogonalCamera, IViewpoint } from \"./Markup/IViewpoint\";\n\nconst OVERLAY_VIEW_NAME = \"$OVERLAY_VIEW_NAME\";\n\nconst isExist = (value) => value !== undefined && value !== null;\n\n/**\n * The `Client.js` library class that provides methods to integrate with the\n * [VisualizeJS](https://cloud.opendesign.com/docs/index.html#/visualizejs) library.\n */\n\nexport class Viewer extends EventEmitter2<ViewerEventMap & OptionsEventMap> implements IViewer {\n private _activeDragger: OdBaseDragger | null;\n private _zoomWheelDragger: OdZoomWheelDragger | null;\n private _gestureManager: GestureManager | null;\n private _enableAutoUpdate: boolean;\n private _isNeedRender: boolean;\n private _isRunAsyncUpdate: boolean;\n private _renderTime: DOMHighResTimeStamp;\n\n protected _options: Options;\n protected _visualizeJsUrl: string;\n protected _abortControllerForReferences: AbortController | undefined;\n\n private clientoptionschange: (event: OptionsChangeEvent) => void;\n private canvaseventlistener: (event: Event) => void;\n\n public draggerFactory: Map<string, typeof OdBaseDragger>;\n public canvasEvents: string[];\n private frameId: number;\n private _resizeObserver: ResizeObserver | undefined;\n public canvas: HTMLCanvasElement | undefined;\n public markup: IMarkup;\n\n public visualizeJs: any;\n public _abortController: AbortController | undefined;\n public _abortControllerForRequestMap: Map<string, AbortController> | undefined;\n public client: Client;\n\n /**\n * @param client - The `Client` instance that provides access to a server. Do not specify\n * `Client` if you need a standalone viewer instance without access to server models.\n * @param params - An object containing viewer configuration parameters.\n * @param params.visualizeJsUrl - `VisualizeJS` library URL. Set this URL to use your own\n * library instance, or leave it undefined or blank to use the default URL defined by\n * `Client.js` you are using.\n *\n * _Note: Your own `VisualizeJS` library version must match the version of the `Client.js`\n * you are using._\n * @param params.enableAutoUpdate - Enable auto-update of the viewer after any changes. If\n * the auto-update is disabled, you need to update the `VisualizeJS` viewer and the active\n * dragger manually using the `update` event. Default is `true`.\n */\n constructor(\n client?: Client,\n params: { visualizeJsUrl?: string; enableAutoUpdate?: boolean; markupType?: MarkupType } = {\n markupType: MarkupType.Konva,\n }\n ) {\n super();\n this.configure(params);\n\n this._options = new Options(this);\n\n this.client = client;\n this.clientoptionschange = (event: OptionsChangeEvent) => (this._options.data = event.data.data);\n\n this._activeDragger = null;\n this._renderTime = 0;\n\n this.markup = MarkupFactory.createMarkup(params.markupType ?? MarkupType.Konva);\n\n this.draggerFactory = new Map<string, typeof OdBaseDragger>();\n this.registerDragger(\"Pan\", OdPanDragger);\n this.registerDragger(\"Orbit\", OdOrbitDragger);\n this.registerDragger(\"Zoom\", OdZoomDragger);\n this.registerDragger(\"ZoomWindow\", OdZoomWindowDragger);\n this.registerDragger(\"OrbitAroundBuilding\", OrbitAroundBuildingDragger);\n this.registerDragger(\"MeasureLine\", MeasureLineDragger);\n this.registerDragger(\"CuttingPlaneXAxis\", OdCuttingPlaneXAxisDragger);\n this.registerDragger(\"CuttingPlaneYAxis\", OdCuttingPlaneYAxisDragger);\n this.registerDragger(\"CuttingPlaneZAxis\", OdCuttingPlaneZAxisDragger);\n this.registerDragger(\"Walk\", OdaWalkDragger);\n\n const markupDraggers = this.markup.getDraggers();\n markupDraggers?.forEach((value, key) => {\n this.registerDragger(key, value);\n });\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this._enableAutoUpdate = params.enableAutoUpdate ?? true;\n this._isNeedRender = false;\n this._isRunAsyncUpdate = false;\n\n this.render = this.render.bind(this);\n this.resize = this.resize.bind(this);\n }\n\n /**\n * `VisualizeJS` parameters.\n *\n * Use this only for standalone viewer instances. Use {@link Client#options | Client.options}\n * instead if the viewer was created with a `Client` reference using\n * {@link Viewer | Viewer.create(client)}. Changes in client options will be automatically\n * applied to the viewer options.\n */\n get options(): Options {\n return this._options;\n }\n\n /**\n * `VisualizeJS` library URL. Use {@link Viewer#configure | configure()} to change library URL.\n *\n * @readonly\n */\n get visualizeJsUrl(): string {\n return this._visualizeJsUrl;\n }\n\n /**\n * Change the viewer configuration parameters.\n *\n * @param params - An object containing new configuration parameters.\n * @param params.visualizeJsUrl - `VisualizeJS` library URL. Set this URL to use your own\n * library instance or leave it blank to use the default URL defined by `Client.js`.\n */\n configure(params: { visualizeJsUrl?: string }): this {\n this._visualizeJsUrl = params.visualizeJsUrl || \"VISUALIZE_JS_URL\";\n return this;\n }\n\n /**\n * A [Viewer]{@link Viewer} event measuring progress of loading a `VisualizeJS` library.\n *\n * @property {string} type - `visualizeprogress`\n * @property {number} loaded - A 64-bit unsigned integer value indicating the amount of work\n * already performed by the underlying process. The ratio of work done can be calculated by\n * dividing total by the value of this property.\n * @property {number} total - A 64-bit unsigned integer representing the total amount of work\n * that the underlying process is in the progress of performing.\n * @event visualizeprogress\n */\n\n /**\n * Load `VisualizeJS` module and initialize it with the specified canvas. Call\n * {@link Viewer#dispose | dispose()} to release allocated resources.\n *\n * @async\n * @param canvas - HTML `<canvas>` element for `VisualizeJS`.\n * @param onProgress - A callback function that handles events measuring progress of loading\n * of the `VisualizeJS` library. Retrieves {@link event:visualizeprogress | visualizeprogress} event.\n */\n async initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent) => void): Promise<this> {\n if (this.client) {\n this.client.addEventListener(\"optionschange\", this.clientoptionschange);\n this.options.data = this.client.options.data;\n }\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n if (canvas.style.width === \"\" && canvas.style.height === \"\") {\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n }\n canvas.parentElement.style.touchAction = \"none\";\n canvas.style.touchAction = \"none\";\n\n canvas.width = canvas.clientWidth * window.devicePixelRatio;\n canvas.height = canvas.clientHeight * window.devicePixelRatio;\n\n const visualizeJs: any = await loadVisualizeJs(this.visualizeJsUrl, (ev) => {\n const { loaded, timeStamp, total, lengthComputable } = ev;\n const event = { loaded, timeStamp, total, lengthComputable, type: \"visualizeprogress\" } as ProgressEvent;\n onProgress?.(event);\n });\n\n this.visualizeJs = visualizeJs;\n this.visualizeJs.canvas = canvas;\n this.visualizeJs.Viewer.create();\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this.markup.initialize(this, canvas, this.canvasEvents);\n\n this._resizeObserver = new ResizeObserver(this.resize);\n this._resizeObserver.observe(canvas.parentElement);\n this.resize();\n\n this._zoomWheelDragger = new OdZoomWheelDragger(this);\n this._zoomWheelDragger.name = \"ZoomWheel\";\n this._zoomWheelDragger.initialize();\n\n this._gestureManager = new GestureManager(this);\n this._gestureManager.initialize();\n\n this.syncOpenCloudVisualStyle(true);\n this.syncOptions();\n\n this._renderTime = performance.now();\n this.render(this._renderTime);\n\n return this;\n }\n\n /**\n * Releases all resources allocated by this `Viewer` instance. Call this method before\n * release the `Viewer` instance.\n */\n dispose(): this {\n this.cancel();\n this.emitEvent({ type: \"dispose\" });\n\n if (this.frameId) cancelAnimationFrame(this.frameId);\n this.frameId = 0;\n\n this.setActiveDragger(\"\");\n\n this._zoomWheelDragger?.dispose();\n this._gestureManager?.dispose();\n\n this.removeAllListeners();\n\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n\n this.markup.dispose();\n\n this.canvasEvents.forEach((x) => this.canvas?.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n\n this.visualizeJs?.getViewer().clear();\n this.visualizeJs = undefined;\n\n this.client?.removeEventListener(\"optionschange\", this.clientoptionschange);\n\n return this;\n }\n\n /**\n * Returns `true` if `VisualizeJS` module has been loaded andinitialized.\n */\n isInitialized(): boolean {\n return !!this.visualizeJs;\n }\n\n // internal render/resize routines\n\n private render(time: DOMHighResTimeStamp) {\n this.frameId = requestAnimationFrame(this.render);\n\n if (!this.visualizeJs) return;\n\n if (this._isRunAsyncUpdate) return;\n\n const visViewer = this.visualizeJs.getViewer();\n if (visViewer.isRunningAnimation() || this._isNeedRender) {\n visViewer.update();\n this._activeDragger?.updatePreview();\n this._isNeedRender = !visViewer.getActiveDevice().isValid();\n\n const deltaTime = (time - this._renderTime) / 1000;\n this._renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n }\n\n public resize(): this {\n if (!this.visualizeJs) return this;\n\n const { clientWidth, clientHeight } = this.canvas;\n this.canvas.width = clientWidth * window.devicePixelRatio;\n this.canvas.height = clientHeight * window.devicePixelRatio;\n\n const visViewer = this.visualizeJs.getViewer();\n visViewer.resize(0, this.canvas.width, this.canvas.height, 0);\n\n this.update(true);\n this.emitEvent({ type: \"resize\", width: clientWidth, height: clientHeight });\n\n return this;\n }\n\n /**\n * Updates the viewer. Do nothing if the auto-update mode is disabled in the constructor (use\n * the `update` event to update viewer manually).\n *\n * Fires:\n *\n * - {@link UpdateEvent | update}\n *\n * @param force - If `true` updates the viewer immidietly. Otherwise updates on next\n * animation frame. Default is `false`.\n */\n update(force?: boolean) {\n if (this._enableAutoUpdate) {\n if (force) {\n this.visViewer()?.update();\n this.activeDragger()?.updatePreview();\n } else {\n this._isNeedRender = true;\n }\n }\n this.emitEvent({ type: \"update\", data: force });\n }\n\n /**\n * Update with internal schedule, need after change operation when have long update for\n * update without lock UI\n *\n * @param maxScheduleUpdateTimeInMs - Maximum time for one update, by default 30 ms\n * @param maxScheduleUpdateCount - Maximum count of schedule update\n * @returns return void Promise\n */\n\n private scheduleUpdateAsync(maxScheduleUpdateTimeInMs = 50): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n setTimeout(() => {\n try {\n this.visViewer()?.update(maxScheduleUpdateTimeInMs);\n this.activeDragger()?.updatePreview();\n resolve();\n } catch (e) {\n console.error(e);\n reject();\n }\n }, 0);\n });\n }\n\n async updateAsync(maxScheduleUpdateTimeInMs = 50, maxScheduleUpdateCount = 50): Promise<void> {\n this._isRunAsyncUpdate = true;\n const device = this.visViewer().getActiveDevice();\n try {\n for (let iterationCount = 0; !device.isValid() && iterationCount < maxScheduleUpdateCount; iterationCount++) {\n await this.scheduleUpdateAsync(maxScheduleUpdateTimeInMs);\n }\n await this.scheduleUpdateAsync(maxScheduleUpdateTimeInMs);\n } catch (e) {\n console.error(e);\n } finally {\n this._isRunAsyncUpdate = false;\n }\n }\n\n /**\n * Returns `VisualizeJS`\n * {@link https://cloud.opendesign.com/docs/index.html#/visualizejs_api | module} instance.\n */\n visLib(): any {\n return this.visualizeJs;\n }\n\n /**\n * Returns `VisualizeJS`\n * {@link https://cloud.opendesign.com/docs/index.html#/vis/Viewer | Viewer} instance.\n */\n visViewer(): any {\n return this.visualizeJs?.getViewer();\n }\n\n // update the VisualizeJS options\n\n syncOpenCloudVisualStyle(isInitializing: boolean): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (device.isNull()) return this;\n\n const view = device.getActiveView();\n\n // setup light\n view.enableDefaultLighting(true, visLib.DefaultLightingType.kTwoLights);\n view.setDefaultLightingIntensity(1.25);\n\n let visualStyleId;\n try {\n visualStyleId = visViewer.findVisualStyle(\"OpenCloud\");\n } catch (e) {\n if (!isInitializing) {\n console.log(\"OpenCloud visual style not found, creating it on client side\");\n }\n visualStyleId = visViewer.createVisualStyle(\"OpenCloud\");\n\n const colorDef = new visLib.OdTvColorDef(66, 66, 66);\n const shadedVsId = visViewer.findVisualStyle(\"Realistic\");\n\n const visualStylePtr = visualStyleId.openObject();\n visualStylePtr.copyFrom(shadedVsId);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kFaceModifiers, 0, visLib.VisualStyleOperations.kSet);\n //visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModel, 1, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModel, 2, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionDouble(visLib.VisualStyleOptions.kEdgeCreaseAngle, 60, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeStyles, 0, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModifiers, 8, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionColor(\n visLib.VisualStyleOptions.kEdgeColorValue,\n colorDef,\n visLib.VisualStyleOperations.kSet\n );\n visualStylePtr.delete();\n }\n\n view.visualStyle = visualStyleId;\n\n view.delete();\n device.delete();\n\n return this;\n }\n\n syncOptions(options: OptionsData = this.options.data): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (device.isNull()) return this;\n\n if (options.showWCS !== visViewer.getEnableWCS()) {\n visViewer.setEnableWCS(options.showWCS);\n }\n if (options.cameraAnimation !== visViewer.getEnableAnimation()) {\n visViewer.setEnableAnimation(options.cameraAnimation);\n }\n if (options.antialiasing !== visViewer.fxaaAntiAliasing3d) {\n visViewer.fxaaAntiAliasing3d = options.antialiasing;\n visViewer.fxaaQuality = 5;\n }\n\n if (options.shadows !== visViewer.shadows) {\n visViewer.shadows = options.shadows;\n\n const canvas = visLib.canvas;\n device.invalidate([0, canvas.clientWidth, canvas.clientHeight, 0]);\n }\n\n if (options.groundShadow !== visViewer.groundShadow) {\n visViewer.groundShadow = options.groundShadow;\n }\n\n if (options.ambientOcclusion !== device.getOptionBool(visLib.DeviceOptions.kSSAOEnable)) {\n device.setOptionBool(visLib.DeviceOptions.kSSAOEnable, options.ambientOcclusion);\n device.setOptionBool(visLib.DeviceOptions.kSSAODynamicRadius, true);\n device.setOptionDouble(visLib.DeviceOptions.kSSAORadius, 1);\n device.setOptionInt32(visLib.DeviceOptions.kSSAOLoops, 32);\n device.setOptionDouble(visLib.DeviceOptions.kSSAOPower, 2);\n device.setOptionInt32(visLib.DeviceOptions.kSSAOBlurRadius, 2);\n\n const activeView = visViewer.activeView;\n activeView.setSSAOEnabled(options.ambientOcclusion);\n activeView.delete();\n }\n\n if (isExist(options.edgeModel)) {\n const activeView = device.getActiveView();\n\n const visualStyleId = visViewer.findVisualStyle(\"OpenCloud\");\n const visualStylePtr = visualStyleId.openObject();\n\n visualStylePtr.setOptionInt32(\n visLib.VisualStyleOptions.kEdgeModel,\n options.edgeModel ? 2 : 0,\n visLib.VisualStyleOperations.kSet\n );\n\n activeView.visualStyle = visualStyleId;\n\n visualStylePtr.delete();\n visualStyleId.delete();\n activeView.delete();\n }\n\n device.delete();\n\n this.syncHighlightingOptions(options);\n this.update();\n\n return this;\n }\n\n syncHighlightingOptions(options: OptionsData = this.options.data): this {\n if (!this.visualizeJs) return this;\n\n const params = options.enableCustomHighlight ? options : Options.defaults();\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n const { Entry, OdTvRGBColorDef } = visLib;\n\n const highlightStyleId = visViewer.findHighlightStyle(\"Web_Default\");\n const highlightStylePtr = highlightStyleId.openObject();\n\n if (isExist(params.facesColor)) {\n const color = new OdTvRGBColorDef(params.facesColor.r, params.facesColor.g, params.facesColor.b);\n highlightStylePtr.setFacesColor(Entry.k3D.value | Entry.k3DTop.value, color);\n color.delete();\n }\n\n if (isExist(params.facesOverlap)) {\n highlightStylePtr.setFacesVisibility(Entry.k3DTop.value, params.facesOverlap);\n }\n if (isExist(params.facesTransparancy)) {\n highlightStylePtr.setFacesTransparency(Entry.k3D.value | Entry.k3DTop.value, params.facesTransparancy);\n }\n\n if (isExist(params.edgesColor)) {\n const color = new OdTvRGBColorDef(params.edgesColor.r, params.edgesColor.g, params.edgesColor.b);\n highlightStylePtr.setEdgesColor(\n Entry.k3DTop.value | Entry.k3D.value | Entry.k2D.value | Entry.k2DTop.value,\n color\n );\n color.delete();\n }\n\n if (isExist(params.edgesVisibility)) {\n highlightStylePtr.setEdgesVisibility(\n Entry.k2D.value | Entry.k2DTop.value | Entry.k3DTop.value | Entry.k3D.value,\n params.edgesVisibility\n );\n }\n if (isExist(params.edgesOverlap)) {\n const visibility = !isExist(params.edgesVisibility) ? true : params.edgesVisibility;\n highlightStylePtr.setEdgesVisibility(Entry.k2DTop.value | Entry.k3DTop.value, params.edgesOverlap && visibility);\n }\n\n const device = visViewer.getActiveDevice();\n if (!device.isNull()) {\n const canvas = visLib.canvas;\n\n device.invalidate([0, canvas.clientWidth, canvas.clientHeight, 0]);\n device.delete();\n }\n\n return this;\n }\n\n /**\n * List of names of available draggers:\n *\n * - `Line`\n * - `Text`\n * - `Pan`\n * - `Orbit`\n * - `Zoom`\n * - `ZoomWindow`\n * - `OrbitAroundBuilding`\n * - `MeasureLine`\n * - `CuttingPlaneXAxis`\n * - `CuttingPlaneYAxis`\n * - `CuttingPlaneZAxis`\n * - `Walk`\n *\n * @readonly\n */\n get draggers(): string[] {\n return [...this.draggerFactory.keys()];\n }\n\n /**\n * Register dragger on draggerFactory.\n *\n * @param name - Dragger name.\n * @param dragger - Dragger class.\n */\n public registerDragger(name: string, dragger: typeof OdBaseDragger): void {\n this.draggerFactory.set(name, dragger);\n }\n\n /**\n * Returns active dragger instance or `null` if there is no active dragger.\n */\n activeDragger(): any | null {\n return this._activeDragger;\n }\n\n /**\n * Set active dragger. `Viewer` must be {@link Viewer#initialize | initialized} before enable\n * dragger or exception is thrown.\n *\n * Fires:\n *\n * - {@link ChangeActiveDragger | changeactivedragger}\n *\n * @param name - Dragger name. Can be one of the {@link Viewer#draggers | draggers} list.\n * @returns Returns active dragger instance or `null` if there is no dragger with the given name.\n */\n setActiveDragger(name: string): OdBaseDragger | null {\n if (this._activeDragger?.name !== name) {\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n const Constructor = this.draggerFactory.get(name);\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n this._activeDragger.initialize();\n }\n const canvas = this.canvas;\n if (canvas) {\n canvas.className = canvas.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${name.toLowerCase()}`)\n .join(\" \");\n }\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n }\n return this._activeDragger;\n }\n\n /**\n * Reset the state of the active dragger.\n */\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger(\"\");\n this.setActiveDragger(dragger.name);\n }\n }\n\n /**\n * Remove all cutting planes.\n */\n clearSlices(): void {\n if (!this.visualizeJs) return;\n\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n activeView.removeCuttingPlanes();\n activeView.delete();\n\n this.update();\n }\n\n /**\n * Remove markup overlay.\n */\n clearOverlay(): void {\n this.markup.clearOverlay();\n }\n\n /**\n * Synchronize markup overlay.\n */\n syncOverlay(): any {\n if (!this.visualizeJs) return;\n\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n let overlayView = visViewer.getViewByName(OVERLAY_VIEW_NAME);\n if (!overlayView) {\n const overlayModel = visViewer.getMarkupModel();\n const pDevice = visViewer.getActiveDevice();\n\n overlayView = pDevice.createView(OVERLAY_VIEW_NAME, false);\n overlayView.addModel(overlayModel);\n\n activeView.addSibling(overlayView);\n pDevice.addView(overlayView);\n }\n\n overlayView.viewPosition = activeView.viewPosition;\n overlayView.viewTarget = activeView.viewTarget;\n overlayView.upVector = activeView.upVector;\n overlayView.viewFieldWidth = activeView.viewFieldWidth;\n overlayView.viewFieldHeight = activeView.viewFieldHeight;\n\n const viewPort = overlayView.getViewport();\n overlayView.setViewport(viewPort.lowerLeft, viewPort.upperRight);\n overlayView.vportRect = activeView.vportRect;\n\n this.update();\n\n return overlayView;\n }\n\n /**\n * Returns `true` if current drawing is 3D drawing.\n */\n is3D(): boolean {\n if (!this.visualizeJs) return false;\n\n const visViewer = this.visViewer();\n const ext = visViewer.getActiveExtents();\n const min = ext.min();\n const max = ext.max();\n const extHeight = max[2] - min[2];\n return extHeight !== 0;\n\n //return visViewer.activeView.upVector[1] >= 0.95;\n }\n\n /**\n * Returns a list of original handles for the selected entities.\n */\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n /**\n * Select model entities by original handles that are obtained using\n * {@link File.getProperties | File.getProperties()} or\n * {@link File.searchProperties | File.searchProperties()} methods.\n *\n * Fires:\n *\n * - {@link SelectEvent | select}\n *\n * @param handles - The list of original handles.\n */\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n /**\n * Load model references into the viewer. References are images, fonts, or any other files to\n * correct rendering of the model.\n *\n * @async\n * @param model - Instance of model with references. If a `File` instance is specified\n * instead of a model, the file references will be loaded.\n */\n async loadReferences(model: Model | File | Assembly): Promise<this> {\n if (!this.visualizeJs) return this;\n\n const abortController = new AbortController();\n this._abortControllerForReferences?.abort();\n this._abortControllerForReferences = abortController;\n\n let references = [];\n await model\n .getReferences(abortController.signal)\n .then((data) => (references = data.references))\n .catch((e) => console.error(\"Cannot load model references.\", e));\n\n for (const file of references) {\n await this.client\n .downloadFile(file.id, undefined, abortController.signal)\n .then((arrayBuffer) => this.visualizeJs?.getViewer().addEmbeddedFile(file.name, new Uint8Array(arrayBuffer)))\n .catch((e) => console.error(`Cannot load reference file ${file.name}.`, e));\n }\n\n return this;\n }\n\n // Internal loading routines\n\n applyModelTransformMatrix(model: Model | Assembly) {\n this.executeCommand(\"applyModelTransform\", model);\n }\n\n applySceneGraphSettings(options = this.options) {\n if (!this.visualizeJs) return;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (isExist(options.sceneGraph)) {\n device.setOptionBool(visLib.DeviceOptions.kDelaySceneGraphProc, !options.sceneGraph);\n }\n // if (options.enablePartialMode && visLib.HpTrc.Usd >= visViewer.memoryLimit) {\n // device.setOptionBool(visLib.DeviceOptions.kDelaySceneGraphProc, true);\n // }\n device.delete();\n\n this.update();\n }\n\n /**\n * Loads a model of a file or assembly into the viewer.\n *\n * This method requires a [Client]{@link Client | Client} instance to work. For standalone\n * viewer instance use {@link Viewer#openVsfFile | openVsfFile()} or\n * {@link Viewer#openVsfxFile | openVsfxFile()}.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @async\n * @param model - Model instance to load. If a `File` instance with multiple models is\n * specified, the default model will be loaded. If there is no default model, first\n * availiable model will be loaded.\n */\n async open(model: Model | File | Assembly): Promise<this> {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", model });\n\n if (model instanceof File || model instanceof Assembly) {\n const models = (await model.getModels()) ?? [];\n model = models.find((model) => model.default) ?? models[0];\n }\n if (!model) throw new Error(\"No default model found\");\n\n await this.loadReferences(model);\n\n const overrideOptions = new Options();\n overrideOptions.data = this.options.data;\n if (model.file.type === \".rcs\") {\n console.log(\"Partial load mode is forced for RCS file\");\n overrideOptions.enablePartialMode = true;\n }\n\n const loaderFactory = new LoaderFactory();\n const loader = loaderFactory.create(this, model, overrideOptions.data);\n await loader.load();\n\n if (this.visualizeJs) {\n this.applyModelTransformMatrix(model);\n this.applySceneGraphSettings();\n }\n\n return this;\n }\n\n /**\n * Loads a VSF file into the viewer.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param buffer - Binary data buffer to load.\n */\n openVsfFile(buffer: Uint8Array | ArrayBuffer): this {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", buffer });\n\n try {\n this.emitEvent({ type: \"geometrystart\", buffer });\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n visViewer.parseFile(data);\n\n this.syncOpenCloudVisualStyle(false);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"geometryprogress\", data: 1, buffer });\n this.emitEvent({ type: \"databasechunk\", data, buffer });\n this.emitEvent({ type: \"geometryend\", buffer });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error, buffer });\n throw error;\n }\n\n return this;\n }\n\n /**\n * Loads a VSFX file into the viewer.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param buffer - Binary data buffer to load.\n */\n openVsfxFile(buffer: Uint8Array | ArrayBuffer): this {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", buffer });\n\n try {\n this.emitEvent({ type: \"geometrystart\", buffer });\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n visViewer.parseVsfx(data);\n\n this.syncOpenCloudVisualStyle(false);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"geometryprogress\", data: 1, buffer });\n this.emitEvent({ type: \"databasechunk\", data, buffer });\n this.emitEvent({ type: \"geometryend\", buffer });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error, buffer });\n throw error;\n }\n\n return this;\n }\n\n /**\n * Cancels asynchronous model loading started by {@link Viewer#open | open()}.\n */\n cancel(): this {\n this._abortControllerForReferences?.abort();\n this._abortControllerForReferences = undefined;\n\n this._abortController?.abort();\n this._abortController = undefined;\n\n this._abortControllerForRequestMap?.forEach((controller) => controller.abort());\n this._abortControllerForRequestMap = undefined;\n\n this.emitEvent({ type: \"cancel\" });\n\n return this;\n }\n\n /**\n * Unloads the model and clears the viewer.\n */\n clear(): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n this.clearOverlay();\n\n visViewer.clear();\n visViewer.createLocalDatabase();\n\n this.syncOpenCloudVisualStyle(true);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n /**\n * Get markup color.\n *\n * @returns Color with `RGB` values.\n */\n getMarkupColor(): { r: number; g: number; b: number } {\n return this.markup.getMarkupColor();\n }\n\n /**\n * Set markup color.\n *\n * @param r - `Red` part of color.\n * @param g - `Green` part of color.\n * @param b - `Blue` part of color.\n */\n setMarkupColor(r = 255, g = 0, b = 0): void {\n this.markup.setMarkupColor(r, g, b);\n const color = { r, g, b };\n this.emitEvent({ type: \"changemarkupcolor\", data: color });\n }\n\n /**\n * Colorize all markup entities with the specified color.\n *\n * @param r - `Red` part of color.\n * @param g - `Green` part of color.\n * @param b - `Blue` part of color.\n */\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n this.markup.colorizeAllMarkup(r, g, b);\n }\n\n /**\n * Add an empty markup entity to the overlay.\n */\n addMarkupEntity(entityName: string) {\n if (!this.visualizeJs) return null;\n\n this.syncOverlay();\n\n const visViewer = this.visViewer();\n const model = visViewer.getMarkupModel();\n const entityId = model.appendEntity(entityName);\n const entityPtr = entityId.openObject();\n\n const color = this.getMarkupColor();\n entityPtr.setColor(color.r, color.g, color.b);\n entityPtr.setLineWeight(2);\n entityPtr.delete();\n\n this.update();\n\n return entityId;\n }\n\n /**\n * Draw a viewpoint. To get a list of available model viewpoints, use the\n * {@link Model#getViewpoints | Model.getViewpoints()} or\n * {@link File#getViewpoints | File.getViewpoints()}.\n *\n * @param viewpoint - Viewpoint.\n */\n drawViewpoint(viewpoint: IViewpoint): void {\n this.setOrthogonalCameraSettings(viewpoint.orthogonal_camera);\n this.setClippingPlanes(viewpoint.clipping_planes);\n this.markup.setViewpoint(viewpoint);\n }\n\n /**\n * Create a viewpoint. To add a viewpoint to the list of model viewpoints, use the\n * {@link Model#saveViewpoint | Model.saveViewpoint()} or\n * {@link File#saveViewpoint | File.saveViewpoint()}.\n */\n createViewpoint(): IViewpoint {\n const vp = this.markup.getViewpoint();\n vp.orthogonal_camera = this.getOrthogonalCameraSettings();\n vp.clipping_planes = this.getClippingPlanes();\n\n return vp;\n }\n\n private getPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n private getLogicalPoint3dAsArray(point3d) {\n return [point3d.x, point3d.y, point3d.z];\n }\n\n private getOrthogonalCameraSettings(): IOrthogonalCamera {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n return {\n view_point: this.getPoint3dFromArray(activeView.viewPosition),\n direction: this.getPoint3dFromArray(activeView.viewTarget),\n up_vector: this.getPoint3dFromArray(activeView.upVector),\n field_width: activeView.viewFieldWidth,\n field_height: activeView.viewFieldHeight,\n };\n }\n\n private setOrthogonalCameraSettings(settings: IOrthogonalCamera) {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n this.resetActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n if (settings) {\n activeView.setView(\n this.getLogicalPoint3dAsArray(settings.view_point),\n this.getLogicalPoint3dAsArray(settings.direction),\n this.getLogicalPoint3dAsArray(settings.up_vector),\n settings.field_width,\n settings.field_height,\n true\n );\n }\n\n this.syncOverlay();\n }\n\n private getClippingPlanes(): IClippingPlane[] {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n const clipping_planes = [];\n for (let i = 0; i < activeView.numCuttingPlanes(); i++) {\n const cuttingPlane = activeView.getCuttingPlane(i);\n\n const plane = {\n location: this.getPoint3dFromArray(cuttingPlane.getOrigin()),\n direction: this.getPoint3dFromArray(cuttingPlane.normal()),\n };\n\n clipping_planes.push(plane);\n }\n\n return clipping_planes;\n }\n\n private setClippingPlanes(clippingPlanes: IClippingPlane[]) {\n if (clippingPlanes) {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n for (const plane of clippingPlanes) {\n const cuttingPlane = new (this.visLib().OdTvPlane)();\n cuttingPlane.set(this.getLogicalPoint3dAsArray(plane.location), this.getLogicalPoint3dAsArray(plane.direction));\n\n activeView.addCuttingPlane(cuttingPlane);\n activeView.setEnableCuttingPlaneFill(true, 0x66, 0x66, 0x66);\n }\n }\n }\n\n /**\n * Executes the command denoted by the given command identifier.\n *\n * @param id - Identifier of the command to execute.\n * @param args - Parameters passed to the command function.\n * @returns A returned value of the given command. Returns `undefined` when the command doesn't exists.\n */\n executeCommand(id: string, ...args: any[]): any {\n return commands(\"VisualizeJS\").executeCommand(id, this, ...args);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\nimport { Model } from \"../../Api/Model\";\nimport { Assembly } from \"../../Api/Assembly\";\n\nexport const composeMatrixFromTransform = (translate, rotate, scale, modelCenter, matrix) => {\n const translateMatrix = matrix.setTranslation([translate.x, translate.y, translate.z]);\n const rotateMatrix = matrix.setToRotation(rotate.angle, [rotate.x, rotate.y, rotate.z], modelCenter);\n const scaleMatrix = matrix.setToScaling(scale, modelCenter);\n return translateMatrix.postMultBy(rotateMatrix).postMultBy(scaleMatrix);\n};\n\nfunction applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n if (!viewer.visualizeJs) return;\n\n const assembly = model instanceof Model ? model.assembly : model;\n if (!(assembly instanceof Assembly)) return;\n\n const visLib = viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n\n const transform = assembly.getModelTransformMatrix(modelPtr.getDatabaseHandle());\n if (transform) {\n const extents = modelPtr.getExtents();\n const matrix = composeMatrixFromTransform(\n transform.translate,\n transform.rotation,\n transform.scale,\n extents.center(),\n new visLib.Matrix3d()\n );\n\n modelPtr.setModelingMatrix(matrix, true);\n }\n }\n modelItr.delete();\n\n visViewer.clearViewExtentsCache?.();\n\n viewer.update();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"applyModelTransform\", applyModelTransform);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"clearMarkup\", (viewer: Viewer) => viewer.clearOverlay());\ncommands(\"VisualizeJS\").registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"clearSlices\", (viewer: Viewer) => viewer.clearSlices());\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n if (!viewer.visualizeJs) return \"\";\n\n return viewer.canvas?.toDataURL(type, encoderOptions) || \"\";\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"createPreview\", createPreview);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction explode(viewer: Viewer, index = 0): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.explode(index);\n\n viewer.update();\n viewer.emit({ type: \"explode\", data: index });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"explode\", explode);\ncommands(\"VisualizeJS\").registerCommand(\"collect\", (viewer: any) => explode(viewer, 0));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getDefaultViewPositions(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visLib = viewer.visLib();\n\n const defViewPos = visLib.DefaultViewPosition;\n return Object.keys(defViewPos).filter((x) => x !== \"values\");\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getModels(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visViewer = viewer.visViewer();\n\n const handles: string[] = [];\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n if (modelPtr.getName()[0] !== \"$\") handles.push(modelPtr.getDatabaseHandle());\n }\n modelItr.delete();\n\n return handles;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getModels\", getModels);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getSelected(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visViewer = viewer.visViewer();\n\n const handles: string[] = [];\n const selectionSet = visViewer.getSelected();\n if (!selectionSet.isNull() && selectionSet.numItems() !== 0) {\n const itr = selectionSet.getIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n\n const entityPtr =\n entityId.getType() === 1\n ? entityId.openObject()\n : entityId.getType() === 2\n ? entityId.openObjectAsInsert()\n : null;\n\n if (entityPtr) {\n const handle = entityPtr.getNativeDatabaseHandle();\n if (handle !== \"-1\") handles.push(handle);\n entityPtr.delete();\n }\n }\n itr.delete();\n }\n\n return handles;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getSelected\", getSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction hideSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.hideSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"hide\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"hideSelected\", hideSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction isolateSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.isolateSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"isolate\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"isolateSelected\", isolateSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction regenerateAll(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.regenAll();\n\n viewer.update();\n viewer.emit({ type: \"regenerateall\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"regenerateAll\", regenerateAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction resetView(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n viewer.executeCommand(\"setActiveDragger\", \"\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"unselect\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n viewer.executeCommand(\"k3DViewSW\");\n\n viewer.emit({ type: \"resetview\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"resetView\", resetView);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction selectModel(viewer: Viewer, handle: string): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n const activeView = visViewer.activeView;\n\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n if (modelPtr.getDatabaseHandle() === handle) {\n const selectionSet = activeView.selectCrossing([0, 9999, 9999, 0], modelPtr);\n\n visViewer.setSelected(selectionSet);\n const handles = viewer.getSelected();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: selectionSet, handles });\n\n selectionSet.delete();\n break;\n }\n }\n modelItr.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"selectModel\", selectModel);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"setActiveDragger\", (viewer: Viewer, dragger = \"\") => {\n viewer.setActiveDragger(dragger);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction setDefaultViewPosition(viewer: Viewer, position = \"\"): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = viewer.visViewer();\n\n const defViewPos = visLib.DefaultViewPosition;\n visViewer.setDefaultViewPositionWithAnimation(defViewPos[position]);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewTop\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewTop\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewBottom\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewBottom\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewLeft\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewLeft\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewRight\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewRight\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewFront\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewFront\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewBack\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewBack\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewSE\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewSE\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewSW\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewSW\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewNE\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewNE\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewNW\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewNW\"));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"setMarkupColor\", (viewer: Viewer, r = 255, g = 0, b = 0) => {\n viewer.setMarkupColor(r, g, b);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction setSelected(viewer: Viewer, handles: string[] = []): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const selectionSet = new visLib.OdTvSelectionSet();\n handles?.forEach((handle) => {\n const entityId = visViewer.getEntityByOriginalHandle(handle + \"\");\n if (!entityId.isNull()) selectionSet.appendEntity(entityId);\n });\n\n visViewer.setSelected(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: selectionSet, handles });\n\n selectionSet.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"setSelected\", setSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction showAll(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.unisolateSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"showall\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"showAll\", showAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction unselect(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.unselect();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: visViewer.getSelected(), handles: [] });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"unselect\", unselect);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToExtents(viewer: Viewer, force = false, animate = viewer.options.cameraAnimation): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n const saveEnableAmination = visViewer.getEnableAnimation();\n\n visViewer.setEnableAnimation(animate);\n visViewer.zoomExtents(force);\n visViewer.update();\n visViewer.setEnableAnimation(saveEnableAmination);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands(\"VisualizeJS\").registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = viewer.visViewer();\n\n const selectionSet = new visLib.OdTvSelectionSet();\n handles.forEach((handle) => {\n const entityId = visViewer.getEntityByOriginalHandle(handle + \"\");\n if (!entityId.isNull()) selectionSet.appendEntity(entityId);\n });\n\n visViewer.zoomToObjects?.(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n\n selectionSet.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToObjects\", zoomToObjects);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n\n const selectionSet = visViewer.getSelected();\n visViewer.zoomToObjects?.(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToSelected\", zoomToSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport { Assembly } from \"./Api/Assembly\";\nexport { CANVAS_EVENTS } from \"./Viewer/CanvasEvents\";\nexport { Client } from \"./Api/Client\";\nexport { ClashTest } from \"./Api/ClashTest\";\nexport { commands } from \"./Viewer/Commands\";\nexport { EventEmitter2 } from \"./Viewer/EventEmitter2\";\nexport { File } from \"./Api/File\";\nexport { IViewer } from \"./Viewer/IViewer\";\nexport { Job } from \"./Api/Job\";\nexport { Member } from \"./Api/Member\";\nexport { Model } from \"./Api/Model\";\nexport { OdBaseDragger } from \"./Viewer/Draggers/Common/OdBaseDragger\";\nexport { Options, OptionsData } from \"./Viewer/Options\";\nexport { Permission } from \"./Api/Permission\";\nexport { Project } from \"./Api/Project\";\nexport { Role } from \"./Api/Role\";\nexport { User } from \"./Api/User\";\nexport { Viewer, Viewer as VisualizejsViewer } from \"./Viewer/Viewer\";\n\nexport * from \"./Api/ClientEvents\";\nexport * from \"./Viewer/Markup/IViewpoint\";\nexport * from \"./Viewer/OptionsEvents\";\nexport * from \"./Viewer/ViewerCommands\";\nexport * from \"./Viewer/ViewerEvents\";\n\nexport const version = \"CLIENT_JS_VERSION\";\n"],"names":["Model","constructor","data","file","this","path","httpClient","_file","_data","assembly","value","database","default","fileId","geometry","id","name","version","getViewpoints","then","array","filter","custom_fields","modelId","modelName","saveViewpoint","viewpoint","deleteViewpoint","guid","getSnapshot","getSnapshotData","bitmapGuid","downloadResource","dataId","onProgress","signal","partialDownloadResource","downloadFileRange","requestId","records","getReferences","STATUS_CODES","statusText","status","FetchError","Error","message","super","json","request","response","text","error400","_default","JSON","parse","description","handleXMLHttpError","xhr","Promise","reject","console","error","responseText","resolve","handleFetchError","ok","$init","method","headers","body","FormData","File","Blob","formData","append","ArrayBuffer","blob","stringify","result","globalThis","$fetch","url","init","fetch","$get","$put","$post","$delete","streamProgress","stream","onprogress","reader","getReader","current","calc","ev","done","read","catch","length","downloadProgress","contentLength","_a","get","total","parseInt","tee","bytesCount","Response","$XMLHttp","uploadProgress","XMLHttpRequest","open","key","setRequestHeader","calcProgress","event","lengthComputable","loaded","upload","onloadend","target","send","delay","ms","timeoutId","abortHandler","clearTimeout","window","setTimeout","removeEventListener","addEventListener","once","async","waitFor","func","params","timeout","interval","_b","_c","AbortController","abortError","_d","DOMException","timeoutError","_e","end","performance","now","count","aborted","downloadPartOfFile","defHeaders","isMultipleResourceParts","ranges","i","record","push","begin","size","delete","join","curRecordIndex","curRecordPos","totalLeft","byteLength","loadedPos","curRecord","recLeft","buf","subarray","reqId","parseArgs","args","firstArg","indexOf","slice","argArray","split","map","x","y","flat","concat","Object","fromEntries","userFullName","firstName","lastName","userName","trim","userInitials","fullName","names","reduce","initials","index","charAt","toUpperCase","ClashTest","basePath","internalGet","relativePath","internalPut","put","internalDelete","clearance","createdAt","owner","avatarUrl","serverUrl","userId","lastModifiedAt","selectionSetA","selectionTypeA","selectionSetB","selectionTypeB","tolerance","checkout","update","save","waitForDone","checkDone","test","includes","getReport","Assembly","appendVersionParam","_useVersion","undefined","delimiter","internalPost","post","pathname","activeVersion","associatedFiles","created","forEach","link","files","geometryType","originalAssemblyId","previewUrl","relatedJobs","type","versions","setPreview","image","warn","getModels","getModelTransformMatrix","handle","transform","setModelTransformMatrix","obj","getProperties","handles","searchProperties","searchPattern","getCdaTree","arrayBuffer","references","ready","cancel","onCheckout","call","getClashTests","start","limit","ids","sortByDesc","sortField","searchParams","URLSearchParams","set","toString","Array","isArray","queryString","tests","getClashTest","testId","createClashTest","deleteClashTest","updateVersion","getVersions","getVersion","deleteVersion","setActiveVersion","useVersion","CANVAS_EVENTS","EventEmitter2","_listeners","listener","listeners","removeAllListeners","emitEvent","invoke","on","off","emit","HttpClient","postFile","Options","emitter","_emitter","defaults","loadFromStorage","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","notifierChangeEvent","saveToStorage","localStorage","setItem","item","getItem","resetToDefaults","fields","resetData","acc","field","Boolean","Permission","actions","grantedTo","public","Job","assemblyId","authorId","lastUpdate","outputFormat","parameters","statusMessage","startedAt","job","customFields","preview","_l","_m","_o","state","geometryStatus","_p","properties","_f","propertiesStatus","_g","_q","validation","_h","validationStatus","_j","_r","updatedBy","_k","_s","geometryGltf","exports","originalFileId","sizeTotal","updatedAt","viewpoints","download","setReferences","createJob","extractGeometry","extractProperties","validate","jobs","waitAll","readyJobs","getPermissions","getPermission","permissionId","createPermission","_public","deletePermission","uploadVersion","progress","Role","projectId","permissions","Member","user","role","Project","authorization","endDate","Date","toISOString","memberCount","modelCount","startDate","topicCount","getRoles","getRole","createRole","deleteRole","getMembers","getMember","memberId","addMember","removeMember","getFilesInformation","items","getFieldValue","displayName","display_information","find","field_display_name","field_value","reference","ownerAvatarUrl","ownerFirstName","ownerLastName","ownerUserName","ownerFullName","ownerInitials","updatedByAvatarUrl","updatedByFirstName","updatedByLastName","updatedByUserName","updatedByFullName","updatedByInitials","User","canCreateProject","createAt","avatarImage","email","emailConfirmationId","isEmailConfirmed","lastModified","lastSignIn","projectsLimit","token","tokenInfo","signInUserId","userBrief","newData","setAvatar","Client","configure","eventEmitter","_options","_user","_serverUrl","options","replace","_httpClient","server","client","registerUser","password","at","resendConfirmationEmail","confirmUserEmail","signInWithEmail","credentials","btoa","unescape","encodeURIComponent","Authorization","setCurrentUser","signInWithToken","clearCurrentUser","getCurrentUser","getUsers","getUser","createUser","isAdmin","rest","deleteUser","getFiles","ext","toLowerCase","getFile","uploadFile","deleteFile","downloadFile","getJobs","getJob","jobId","deleteJob","getAssemblies","assemblies","getAssembly","createAssembly","deleteAssembly","getProjects","projects","allSize","getProject","createProject","deleteProject","Commands","_commands","Map","registerCommand","handler","thisArg","registerCommandAlias","alias","viewer","executeCommand","getCommand","getCommands","command","isDraggerCommand","draggers","setActiveDragger","apply","commands","viewerType","OdaGeAction","module","setViewParams","extView","m_module","getViewer","getActiveTvExtendedView","setView","position","upVector","viewFieldWidth","viewFieldHeight","perspective","getViewParams","view","activeView","viewPosition","viewTarget","getModel","getMarkupModel","copyPoint","point","p","Point3d","z","createVector3d","Vector3d","createPoint3d","createMatrix3d","Matrix3d","createPlane","OdTvPlane","toVector","geVector","createFromArray","toGeVector","v","toGePoint","toPoint","gePoint","screenToWorld","toDoubleArray","points","correctCameraTarget","getActiveExtents","min","max","contains","center","CLICK_DELTA","INTERACTIVITY_FPS","OdBaseDragger","subject","visualizeJs","beginInteractivity","endInteractivity","device","getActiveDevice","canvas","invalidate","width","height","needInputText","mouseDownPosition","autoSelect","onmessage","canvasEvents","initialize","bind","setEnableAutoSelect","dispose","relativeCoords","offsetX","devicePixelRatio","offsetY","pointerdown","isPrimary","isGestureActive","setPointerCapture","pointerId","relCoord","isDragging","clientX","clientY","pointerup","needSkipPointerUp","releasePointerCapture","pointercancel","dispatchEvent","PointerEvent","pointermove","drag","movementX","movementY","click","isNotDragging","Math","abs","getEnableAutoSelect","unselect","select","selectionSet","getSelected","dblclick","clickView","viewAt","active","pSelected","isNull","numItems","itr","getIterator","entity","getEntity","zoomToEntity","deleteAll","absoluteX","absoluteY","getActiveMarkupEntity","entityName","addMarkupEntity","syncOverlayView","syncOverlay","objects","updatePreview","_isGestureActive","_needSkipPointerUp","createHtmlElementIfNeed","element","targetElement","dataTestId","document","createElement","setAttribute","appendChild","destroyHtmlElement","removeChild","worldToScreen","moduleInstance","worldPoint","avp","mtx","worldToDeviceMatrix","devicePoint","transformBy","res","getDistance","gePoint1","gePoint2","tvPoint1","tvPoint2","distance","distanceTo","toFixed","normalizeFloat","ceil","floor","lineSegmentsIntersect","p1","p2","p3","p4","a_dx","a_dy","b_dx","b_dy","s","t","checkSegmentsIntersect","isInsideRect","getDataForDrawLineWithFixed","pLU","pRU","pLB","pRB","intersects","fixedP1","fixedP2","dx","dy","angle","atan","PI","sqrt","pow","onSetCallback","cb","onclick","onSetSelectivity","enable","style","pointerEvents","MeasureLineItem","htmlElemStartPoint","htmlElemEndPoint","htmlElemLine","htmlElemTitle","startPoint","endPoint","unit","scale","lineThickness","border","background","color","boxShadow","utils.createHtmlElementIfNeed","isFinishDraw","drawMeasureLine","pointSize","rect","getBoundingClientRect","pScreenStart","utils.worldToScreen","utils.isInsideRect","display","cursor","top","left","borderRadius","zIndex","pScreenEnd","point1","point2","utils.getDataForDrawLineWithFixed","transformOrigin","pX","pY","widthTitle","font","padding","textAlign","innerHTML","utils.getDistance","setStartPoint","setEndPoint","isFinish","setSize","clear","utils.destroyHtmlElement","setUnit","setConversionFactor","setStyle","setSelectionReactor","reactor","utils.onSetCallback","onStartPoint","onEndPoint","onTitle","setSelectability","utils.onSetSelectivity","renameUnit","table","MeasureLineDragger","press","gripingRadius","firstPoint","secondPoint","renameUnitTable","Millimeters","Centimeters","Meters","Feet","Inches","Yards","Kilometers","Miles","Micrometers","MicroInches","Undefined","m_overlayElement","resize","remove","getSnapPointRadius","corners","viewDcCorners","pt1","lowerLeft","pt2","upperRight","createNewMeasureIfNeed","getSnapPoint","previewMeasureLine","newLineMeasure","createMeasureLine","getUnit","FocalLengthConst","calcFocalLength","lensLength","fieldWidth","fieldHeight","OdaWalkDragger","multiplier","speed","keyPressMap","Set","keydown","keyup","lastFrameTS","animationId","processMovement","deltaAngle","oldWCSEnableValue","getEnableWCS","setEnableWCS","maxDimension","getMaxDimension","viewParams","model","getActiveModel","cameraId","appendCamera","setupCamera","cameraWalker","OdTvCameraWalker","setCamera","enableZoomWheelPreviousValue","cancelAnimationFrame","removeEntity","code","add","timestamp","requestAnimationFrame","deltaTS","currentDelta","keyCode","moveForward","moveBackward","moveLeft","moveRight","moveUp","moveDown","dltX","dltY","turnLeft","turnDown","pCamera","camera","openObjectAsCamera","dir","direction","up","pos","rotMatrix","zAxisVector","setToRotation","setupCameraByDirection","toArray","setDisplayGlyph","setDisplayTarget","setAutoAdjust","setNearClip","setFarClip","setViewParameters","focalL","pTarget","viewDir","viewDirSub","sub","viewDirVec","asVector","viewDirVecNormal","normalize","geViewDir","newGeViewDir","pTarget2","newGeViewDirPt","newPos","assignView","xmax","ymax","zmax","sceneExtents","xmin","ymin","zmin","volume","OdBaseCuttingPlaneDragger","m_size_x","m_size_y","m_size_z","m_center","m_normal","createNormal","plane","addCuttingPlane","numCuttingPlanes","setEnableCuttingPlaneFill","setCuttingPlaneFillPatternEnabled","CuttingPlaneFillStyle","kHorizontalBars","m_model","createPreview","m_entity","planePreview","handleDelta","delta","getPlanePreviewCoordinate","m_last","m_click","oldCenter","oldLast","newPlane","newCutting","updateCuttingPlane","drawPreview","getSize","appendEntity","GeometryTypes","transparencyDef","OdTvTransparencyDef","colorDef","OdTvColorDef","setValue","entityPtr","openObject","setColor","kFaces","kEdges","setLineWeight","setTransparency","appendPolygon","polygonPtr","openAsPolygon","setFilled","setPoints","OdCuttingPlaneXAxisDragger","OdCuttingPlaneYAxisDragger","OdCuttingPlaneZAxisDragger","OrbitAction","_m_module","_subject","_beginInteractivity","_endInteractivity","beginAction","m_viewCenter","getCenter","m_startPoint","action","vportRect","distX","distY","xOrbit","yOrbit","sideVector","getSideVector","calculateXOrbit","calculateYOrbit","activeDragger","endAction","pUpV","pPosition","direct","vDirect","vCross","crossProduct","pPoint","pCenter","rotatePoint","rotateByBasePoint","pUp","vUp","crossProductNormal","zAxis","kZAxis","side","rotateBy","cross","crossNormal","pSet","entId","extSelected","step","getWCSExtents","addExt","OdOrbitDragger","_orbitAction","setDefaultViewParams","startCameraParams","PanAction","_getViewParams","_setViewParams","_m_start","_deltaScreenPosition","pt","ptSub","targetWithDelta","positionWithDelta","dX","dY","OdPanDragger","_panAction","ZoomAction","zoomFactor","zoomAt","OdZoomDragger","_zoomAction","pressX","pressY","ZOOM_SPEED","INTERACTIVITY_TIME_OUT","OdZoomWheelDragger","_endInteractivityTimeOutId","_isEnableInteractivityMode","wheel","preventDefault","zoomReverse","zoomSpeed","deltaY","OdSelectionFrame","m_start","m_end","instance","draw","viewM","viewingMatrix","p0","eyeM","eyeToWorldMatrix","m_frame","OdZoomWindowDragger","m_minX","m_minY","m_maxX","m_maxY","zoomWindow","OrbitAroundBuildingDragger","maxPolarAngle","minPolarAngle","m_delta","offset","zMatrix","setToIdentity","xMatrix","yAxis","xAxis","xyDir","xyAngle","sign","dotProduct","angleTo","yzDir","yzAngle","xAngle","endMatrix","postMultBy","setLength","getType","getExtents","openObjectAsInsert","extTuple","GestureAction","GestureManager","isSingleTouchEnabled","_isSingleTouchEnabled","_previousEvents","_currentEvents","_lastGestureAction","None","_maxInitialDistanceDifference","getMiddlePoint","events","keys","getKeys","point0","getFirstPoint","hypot","updateEvent","eventNotInCurrentEvents","previousEvent","_initialDistance","removeEvent","from","analyzeGesture","currentDistance","previousDistance","currentDistanceEqualsInitialDistance","executePanAction","executeZoomAction","executeOrbitAction","Zoom","executeEndAction","middlePoint","currentPoint","Pan","Orbit","gestureAction","needIgnoreEvent","eventIsTouchEvent","pointerType","pointerleave","loadScript","script","src","onload","onerror","loadVisuazlizeJsScript","loadVisualizeJs","urlMemFile","TOTAL_MEMORY","postRun","BaseLoader","load","TCSLoader","visLib","visViewer","abortController","listFileForDownload","chunksProgress","fileProgress","_abortController","chunk","progressCb","parseStream","Uint8Array","syncOpenCloudVisualStyle","syncOptions","DELAY_TIME_MULTIPLEXER","START_UPDATE_TIME","UpdateType","UpdaterController","delayUpdateTime","isNeedUpdate","kDelay","isForce","kForce","VsfXStreamingLoader","updaterController","isFireDatabaseChunk","chunkLoadHandler","parseVsfx","DatabaseStreamStatus","ReadyServiceData","Complete","time","timeEnd","kNormal","VsfXPartialLoader","abortControllerForRequestMap","servicePartAborted","pendingRequestsMap","PENDING_REQUESTS_SIZE","PENDING_REQUESTS_TIMEOUT","pendingRequestsTimerId","pendingRequestsAbortHandler","pendingRequestsAbortController","_abortControllerForRequestMap","requestLoadHandler","parseVsfxInPartialMode","isMultipleParts","abortCtrl","requests","onRequestResponseComplete","recordsToArray","objectHandler","onServicePartReceived","bHasIndex","abort","onRequest","onFullLoaded","onRequestResponseParsed","onRequestAborted","onRequestResourceFile","_","pendingRequests","recNumber","pendingRequestsRecord","number","requestsRecord","keyFileName","attachPartialResolver","VsfXLoader","LoaderFactory","create","pop","MarkupType","MarkupMode","MarkupColor","HexColor","_hex","RGB","R","G","B","rgbToHex","valueToHex","c","hex","LineTypeSpecs","KonvaLine","ref","_ref","konvaPoints","Konva","Line","stroke","strokeWidth","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","_id","enableMouseEditing","getColor","getRotation","rotation","setRotation","degrees","getZIndex","setZIndex","destroy","getPoints","setLineWidth","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","KonvaText","TEXT_FONT_FAMILY","Text","fontSize","fontFamily","fill","align","getText","setText","getPosition","setPosition","getFontSize","setFontSize","KonvaRectangle","Rect","lineWidth","getWidth","getHeigth","setWidth","w","setHeight","h","KonvaEllipse","Ellipse","radiusX","radius","radiusY","getRadiusX","setRadiusX","getRadiusY","setRadiusY","KonvaArrow","Arrow","getStartPoint","getEndPoint","KonvaImage","_ratio","_canvasImage","Image","getSrc","setSrc","getHeight","KonvaCloud","arcRadius","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","arcCount","lengthMod","pEndX","pEndY","endAngle","startAngle","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","e","attrs","minWidth","minHeight","newWidth","scaleX","newHeight","scaleY","getSelfRect","MarkupMode2Konva","initializer","Rectangle","Cloud","KonvaMarkup","_isInitialized","_zIndex","_markupContainerName","changeActiveDragger","draggerName","_markupContainer","_canvasOriginal","startsWith","removeTextInput","markupMode","konvaMode","_markupMode","_markupIsActive","_konvaTransformer","nodes","_konvaStage","clientWidth","clientHeight","pan","values","mode","konvaLayerFind","move","redirectToViewer","_viewer","_canvasEvents","outline","parentDiv","parentElement","_markupColor","initializeKonva","destroyKonva","getDraggers","clearOverlay","getMarkupColor","setMarkupColor","colorizeAllMarkup","konvaObj","_konvaLayer","setViewpoint","markupColor","markup_color","loadMarkup","getViewpoint","lines","texts","arrows","clouds","ellipses","images","rectangles","snapshot","combineMarkupWithDrawing","fillViewpointShapes","toDateString","createObject","object","addObject","getObjects","line","rectangle","ellipse","arrow","cloud","getSelectedObjects","konvaShapeName","selectObjects","selectedObjs","clearSelected","getPoint3dFromArray","markupLines","getMarkupLines","markupTexts","getMarkupTexts","markupRectangles","getMarkupRectangles","markupEllipses","getMarkupEllipses","markupArrows","getMarkupArrows","markupImages","getMarkupImages","markupClouds","getMarkupClouds","markupShape","konvaShape","konvaShapes","parent","Layer","Stage","container","stage","layer","pixelRation","transformer","Transformer","shouldOverdrawWholeArea","isPaint","lastLine","getPointerPosition","addLine","addRectangle","addEllipse","addArrow","addCloud","_textInputRef","addText","_textInputPos","_textInputAngle","createTextInput","evt","pageX","pageY","rotateEnabled","metaPressed","shiftKey","ctrlKey","metaKey","isSelected","splice","tabIndex","focus","trNodes","linePoints","worldPoints","absoluteTransform","getAbsoluteTransform","atPoint","konvaLine","textSize","textScale","projMtrx","projectionMatrix","mtrxNumber","tol","text_size","font_size","line_width","atStartPoint","worldStartPoint","atEndPoint","worldEndPoint","vpLine","screenPoint","vpText","vpRect","vpEllipse","vpArrow","vpCloud","vpImage","addImage","tempCanvas","ctx","getContext","drawImage","toCanvas","pixelRatio","toDataURL","inputX","inputY","onkeydown","specifiedText","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage","MARKUP_ENTITY_LINE","OdaLineDragger","drawPoints","_updateFrame","appendPolyline","MARKUP_ENTITY_TEXT","OdaTextDragger","TEXT_HEIGHT_ALIGN","textRef","_finishInput","trimLeft","onkeypress","eyeToWorld","eyeDir","xDir","mtrx","setToWorldToPlane","angel","atan2","geomData","appendText","textPtr","openAsText","setNormal","setTextSize","VisualizeMarkup","clearEntities","getEntitiesIterator","entityId","getName","getLogicalPoint3dAsArray","point3d","getPoint3d","entityData","normal","getLogicalPoint3dFromArray","geomItr","getGeometryDataIterator","geometryId","getGeometryData","polylinePtr","openAsPolyline","getString","getTextSize","getLayer","MarkupFactory","createMarkup","markupType","markup","createKonva","Visualize","createVisualize","OVERLAY_VIEW_NAME","isExist","Viewer","clientoptionschange","_activeDragger","_renderTime","draggerFactory","registerDragger","markupDraggers","canvaseventlistener","_enableAutoUpdate","enableAutoUpdate","_isNeedRender","_isRunAsyncUpdate","render","visualizeJsUrl","_visualizeJsUrl","touchAction","timeStamp","_resizeObserver","ResizeObserver","observe","_zoomWheelDragger","_gestureManager","frameId","disconnect","isInitialized","isRunningAnimation","isValid","deltaTime","force","scheduleUpdateAsync","maxScheduleUpdateTimeInMs","updateAsync","maxScheduleUpdateCount","iterationCount","isInitializing","getActiveView","enableDefaultLighting","DefaultLightingType","kTwoLights","setDefaultLightingIntensity","visualStyleId","findVisualStyle","log","createVisualStyle","shadedVsId","visualStylePtr","copyFrom","setOptionInt32","VisualStyleOptions","kFaceModifiers","VisualStyleOperations","kSet","kEdgeModel","setOptionDouble","kEdgeCreaseAngle","kEdgeStyles","kEdgeModifiers","setOptionColor","kEdgeColorValue","visualStyle","getEnableAnimation","setEnableAnimation","fxaaAntiAliasing3d","fxaaQuality","getOptionBool","DeviceOptions","kSSAOEnable","setOptionBool","kSSAODynamicRadius","kSSAORadius","kSSAOLoops","kSSAOPower","kSSAOBlurRadius","setSSAOEnabled","syncHighlightingOptions","Entry","OdTvRGBColorDef","highlightStyleId","findHighlightStyle","highlightStylePtr","setFacesColor","k3D","k3DTop","setFacesVisibility","setFacesTransparency","setEdgesColor","k2D","k2DTop","setEdgesVisibility","visibility","dragger","Constructor","resetActiveDragger","clearSlices","removeCuttingPlanes","overlayView","getViewByName","overlayModel","pDevice","createView","addModel","addSibling","addView","viewPort","getViewport","setViewport","is3D","extHeight","setSelected","loadReferences","_abortControllerForReferences","addEmbeddedFile","applyModelTransformMatrix","applySceneGraphSettings","kDelaySceneGraphProc","models","overrideOptions","loaderFactory","loader","openVsfFile","buffer","parseFile","openVsfxFile","controller","createLocalDatabase","drawViewpoint","setOrthogonalCameraSettings","orthogonal_camera","setClippingPlanes","clipping_planes","createViewpoint","vp","getOrthogonalCameraSettings","getClippingPlanes","view_point","up_vector","field_width","field_height","settings","cuttingPlane","getCuttingPlane","location","getOrigin","clippingPlanes","composeMatrixFromTransform","translate","rotate","modelCenter","matrix","translateMatrix","setTranslation","rotateMatrix","scaleMatrix","setToScaling","applyModelTransform","modelItr","getModelIterator","modelPtr","getDatabaseHandle","extents","setModelingMatrix","clearViewExtentsCache","encoderOptions","explode","getDefaultViewPositions","defViewPos","DefaultViewPosition","getNativeDatabaseHandle","hideSelected","hideSelectedObjects","isolateSelected","isolateSelectedObjects","regenerateAll","regenAll","resetView","selectModel","selectCrossing","setDefaultViewPosition","setDefaultViewPositionWithAnimation","OdTvSelectionSet","getEntityByOriginalHandle","showAll","unisolateSelectedObjects","zoomToExtents","animate","saveEnableAmination","zoomExtents","zoomToObjects","zoomToSelected"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.module.js","sources":["../packages/client/src/Api/Model.ts","../packages/client/src/Api/impl/http.ts","../packages/client/src/Api/impl/FetchError.ts","../packages/client/src/Api/impl/Utils.ts","../packages/client/src/Api/ClashTest.ts","../packages/client/src/Api/Assembly.ts","../packages/client/src/Viewer/CanvasEvents.ts","../packages/client/src/Viewer/EventEmitter2.ts","../packages/client/src/Api/HttpClient.ts","../packages/client/src/Api/Permission.ts","../packages/client/src/Api/Job.ts","../packages/client/src/Api/File.ts","../packages/client/src/Api/Role.ts","../packages/client/src/Api/Member.ts","../packages/client/src/Api/Project.ts","../packages/client/src/Api/User.ts","../packages/client/src/Api/Client.ts","../packages/client/src/Viewer/Commands.ts","../packages/client/src/Viewer/Draggers/Common/OdaGeAction.ts","../packages/client/src/Viewer/Draggers/Common/OdBaseDragger.ts","../packages/client/src/Viewer/Options.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/MeasureUtils.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/MeasureLineItem.ts","../packages/client/src/Viewer/Draggers/MeasureLineDragger/index.ts","../packages/client/src/Viewer/Draggers/OdaWalkDragger.ts","../packages/client/src/Viewer/Draggers/OdBaseCuttingPlaneDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneXAxisDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneYAxisDragger.ts","../packages/client/src/Viewer/Draggers/OdCuttingPlaneZAxisDragger.ts","../packages/client/src/Viewer/Draggers/Actions/OrbitAction.ts","../packages/client/src/Viewer/Draggers/OdOrbitDragger.ts","../packages/client/src/Viewer/Draggers/Actions/PanAction.ts","../packages/client/src/Viewer/Draggers/OdPanDragger.ts","../packages/client/src/Viewer/Draggers/Actions/ZoomAction.ts","../packages/client/src/Viewer/Draggers/OdZoomDragger.ts","../packages/client/src/Viewer/Draggers/OdZoomWheelDragger.ts","../packages/client/src/Viewer/Draggers/OdZoomWindowDragger/OdSelectionFrame.ts","../packages/client/src/Viewer/Draggers/OdZoomWindowDragger/index.ts","../packages/client/src/Viewer/Draggers/OrbitAroundBuildingDragger.ts","../packages/client/src/Viewer/Draggers/Common/GestureManager.ts","../packages/client/src/Viewer/utils.ts","../packages/client/src/Viewer/Loaders/BaseLoader.ts","../packages/client/src/Viewer/Loaders/TCSLoader.ts","../packages/client/src/Viewer/Loaders/UpdaterController.ts","../packages/client/src/Viewer/Loaders/VsfXStreamingLoader.ts","../packages/client/src/Viewer/Loaders/VsfXPartialLoader.ts","../packages/client/src/Viewer/Loaders/VsfXLoader.ts","../packages/client/src/Viewer/Loaders/LoaderFactory.ts","../packages/client/src/Viewer/Markup/IMarkup.ts","../packages/client/src/Viewer/Markup/Impl/Konva/MarkupColor.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaLine.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaText.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaRectangle.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaEllipse.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaArrow.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaImage.ts","../packages/client/src/Viewer/Markup/Api/Impl/Konva/KonvaCloud.ts","../packages/client/src/Viewer/Markup/Impl/Konva/KonvaMarkup.ts","../packages/client/src/Viewer/Draggers/OdaLineDragger.ts","../packages/client/src/Viewer/Draggers/OdaTextDragger.ts","../packages/client/src/Viewer/Markup/Impl/Visualize/VisualizeMarkup.ts","../packages/client/src/Viewer/Markup/MarkupFactory.ts","../packages/client/src/Viewer/Viewer.ts","../packages/client/src/Viewer/Commands/ApplyModelTransform.ts","../packages/client/src/Viewer/Commands/ClearMarkup.ts","../packages/client/src/Viewer/Commands/ClearSlices.ts","../packages/client/src/Viewer/Commands/CreatePreview.ts","../packages/client/src/Viewer/Commands/Explode.ts","../packages/client/src/Viewer/Commands/GetDefaultViewPositions.ts","../packages/client/src/Viewer/Commands/GetModels.ts","../packages/client/src/Viewer/Commands/GetSelected.ts","../packages/client/src/Viewer/Commands/HideSelected.ts","../packages/client/src/Viewer/Commands/IsolateSelected.ts","../packages/client/src/Viewer/Commands/RegenerateAll.ts","../packages/client/src/Viewer/Commands/ResetView.ts","../packages/client/src/Viewer/Commands/SelectModel.ts","../packages/client/src/Viewer/Commands/SetActiveDragger.ts","../packages/client/src/Viewer/Commands/SetDefaultViewPosition.ts","../packages/client/src/Viewer/Commands/SetMarkupColor.ts","../packages/client/src/Viewer/Commands/SetSelected.ts","../packages/client/src/Viewer/Commands/ShowAll.ts","../packages/client/src/Viewer/Commands/Unselect.ts","../packages/client/src/Viewer/Commands/ZoomToExtents.ts","../packages/client/src/Viewer/Commands/ZoomToObjects.ts","../packages/client/src/Viewer/Commands/ZoomToSelected.ts","../packages/client/src/index.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { File } from \"./File\";\nimport { Assembly } from \"./Assembly\";\n\n/**\n * The class representing the is a description of view of the file or assembly. For example,\n * for `dwg` it is a `Model` space or layout, and for `rvt` files it is a `3D` view.\n */\nexport class Model {\n private _data: any;\n private _file: File | Assembly;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements model data storage.\n * @param file - The `File` of 'Assembly' instance that owns the model.\n */\n constructor(data: any, file: File | Assembly) {\n this.path = `${file.path}/downloads`;\n this.httpClient = file.httpClient;\n this._file = file;\n this._data = data;\n }\n\n /**\n * The `Assembly` instance that owns the model.\n *\n * @readonly\n */\n get assembly(): Assembly {\n return this._file as Assembly;\n }\n\n /**\n * Raw model data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * Scene description file resource ID. Use {@link Model#downloadResource | downloadResource()}\n * to download scene description file.\n *\n * @readonly\n */\n get database(): string {\n return this.data.database;\n }\n\n /**\n * `true` if this is default model.\n *\n * @readonly\n */\n get default(): boolean {\n return this.data.default;\n }\n\n /**\n * The `File` instance that owns the model.\n *\n * @readonly\n */\n get file(): File {\n return this._file as File;\n }\n\n /**\n * The ID of the file that owns the model.\n *\n * @readonly\n */\n get fileId(): string {\n return this.data.fileId;\n }\n\n /**\n * The list of resource IDs for geometry data files. Use\n * {@link Model#downloadResource | downloadResource()} to download geometry data files.\n *\n * @readonly\n */\n get geometry(): string[] {\n return this.data.geometry;\n }\n\n /**\n * Unique model ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Model name.\n *\n * @readonly\n */\n get name(): string {\n return this.data.name;\n }\n\n // Reserved for future use.\n get version(): string {\n return this.data.version;\n }\n\n /**\n * Returns model viewpoint list.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n */\n getViewpoints(): Promise<any[]> {\n return this._file\n .getViewpoints()\n .then((array) =>\n array.filter(\n ({ custom_fields = {} }) => custom_fields.modelId === this.id || custom_fields.modelName === this.name\n )\n );\n }\n\n /**\n * Add new model viewpoint. To create a new viewpoint use\n * {@link Viewer#createViewpoint | Viewer.createViewpoint()}.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n * @param viewpoint - Viewpoint.\n */\n saveViewpoint(viewpoint: any): Promise<any> {\n return this._file.saveViewpoint({\n ...viewpoint,\n custom_fields: { ...viewpoint.custom_fields, modelId: this.id, modelName: this.name },\n });\n }\n\n /**\n * Delete model viewpoint.\n *\n * _**Note**: Assemblу models do not support viewpoints_.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @returns Returns the raw data of a deleted viewpoint.\n */\n deleteViewpoint(guid: string): Promise<any> {\n return this._file.deleteViewpoint(guid);\n }\n\n /**\n * Returns viewpoint preview image as <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n *\n * @async\n * @param guid - Viewpoint GIID.\n */\n getSnapshot(guid: string): Promise<string> {\n return this._file.getSnapshot(guid);\n }\n\n /**\n * Returns snapshot data.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @param bitmapGuid - Bitmap GUID.\n */\n getSnapshotData(guid: string, bitmapGuid: string): Promise<string> {\n return this._file.getSnapshotData(guid, bitmapGuid);\n }\n\n /**\n * Downloads model resource, such as scene description file or geometry data files.\n *\n * @async\n * @param resourceId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this._file.downloadResource(dataId, onProgress, signal);\n }\n\n // Internal download routines used by Viewer.\n\n partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ): Promise<void> {\n return this._file.partialDownloadResource(dataId, onProgress, signal);\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ): Promise<void> {\n return this._file.downloadFileRange(requestId, records, dataId, onProgress, signal);\n }\n\n /**\n * Returns a list of references to files used to extract geometry data.\n *\n * @async\n * @param [signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n getReferences(signal?: AbortSignal) {\n return this._file.getReferences(signal);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport const STATUS_CODES = {\n 100: \"Continue\",\n 101: \"Switching Protocols\",\n 102: \"Processing\",\n 103: \"Early Hints\",\n 200: \"OK\",\n 201: \"Created\",\n 202: \"Accepted\",\n 203: \"Non-Authoritative Information\",\n 204: \"No Content\",\n 205: \"Reset Content\",\n 206: \"Partial Content\",\n 207: \"Multi-Status\",\n 208: \"Already Reported\",\n 226: \"IM Used\",\n 300: \"Multiple Choices\",\n 301: \"Moved Permanently\",\n 302: \"Found\",\n 303: \"See Other\",\n 304: \"Not Modified\",\n 305: \"Use Proxy\",\n 307: \"Temporary Redirect\",\n 308: \"Permanent Redirect\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 407: \"Proxy Authentication Required\",\n 408: \"Request Time-out\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 414: \"URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Range Not Satisfiable\",\n 417: \"Expectation Failed\",\n 418: \"I'm a teapot\",\n 421: \"Misdirected Request\",\n 422: \"Unprocessable Entity\",\n 423: \"Locked\",\n 424: \"Failed Dependency\",\n 425: \"Too Early\",\n 426: \"Upgrade Required\",\n 428: \"Precondition Required\",\n 429: \"Too Many Requests\",\n 431: \"Header Fields Too Large\",\n 451: \"Unavailable For Legal Reasons\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\",\n 506: \"Variant Also Negotiates\",\n 507: \"Insufficient Storage\",\n 508: \"Loop Detected\",\n 509: \"Bandwidth Limit Exceeded\",\n 510: \"Not Extended\",\n 511: \"Network Authentication Required\",\n};\n\nexport function statusText(status: number): string {\n return STATUS_CODES[status] || `Error ${status}`;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { statusText } from \"./http\";\n\n/**\n * The `FetchError` object indicates an error when request to Open Cloud Server could not be\n * performed. A `FetchError` is typically (but not exclusively) thrown when a network error\n * occurs, access denied, or object not found.\n */\n\nexport class FetchError extends Error {\n protected status: number;\n protected statusText: string;\n\n /**\n * @property status - The <a href=\"https://developer.mozilla.org/docs/Web/HTTP/Status\" target\n * =\"_blank\">HTTP status code</a> of the response.\n * @property message - Error message. Inherited from <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Error\"\n * target =\"_blank\">Error</a>.\n */\n constructor(status: number, message?: string) {\n super(message || statusText(status));\n this.status = status;\n this.statusText = statusText(status);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FetchError } from \"./FetchError\";\nimport { statusText } from \"./http\";\n\nexport function json(request: any): any {\n return request.then((response) => response.json());\n}\n\nexport function text(request: any): any {\n return request.then((response) => response.text());\n}\n\nexport function arrayBuffer(request: any): any {\n return request.then((response) => response.arrayBuffer());\n}\n\nfunction error400(text: string, _default = \"400\") {\n try {\n return JSON.parse(text).description;\n } catch {\n return _default;\n }\n}\n\nfunction handleXMLHttpError(xhr: any): Promise<any> {\n if (xhr.status === 0) {\n return Promise.reject(new FetchError(0, \"Network error\"));\n }\n if (xhr.status < 200 || xhr.status > 299) {\n switch (xhr.status) {\n case 400: {\n console.error(xhr.responseText);\n return Promise.reject(new FetchError(400, error400(xhr.responseText)));\n }\n case 500: {\n console.error(error400(xhr.responseText, xhr.responseText));\n return Promise.reject(new FetchError(500));\n }\n default: {\n return Promise.reject(new FetchError(xhr.status));\n }\n }\n }\n return Promise.resolve(xhr);\n}\n\nfunction handleFetchError(response: Response): Promise<Response> {\n if (!response.ok) {\n switch (response.status) {\n case 400: {\n return response.text().then((text) => {\n console.error(text);\n return Promise.reject(new FetchError(400, error400(text)));\n });\n }\n case 500: {\n return response.text().then((text) => {\n console.error(error400(text, text));\n return Promise.reject(new FetchError(500));\n });\n }\n default:\n return Promise.reject(new FetchError(response.status, statusText(response.status)));\n }\n }\n return Promise.resolve(response);\n}\n\nexport function $init(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null,\n signal?: AbortSignal\n): RequestInit {\n headers = { ...headers };\n headers[\"Content-Type\"] = \"application/json\";\n\n if (method === \"POST\" || method === \"PUT\") {\n if (body instanceof FormData) {\n delete headers[\"Content-Type\"];\n } else if (body instanceof File || body instanceof Blob) {\n const formData = new FormData();\n formData.append(\"file\", body);\n return $init(method, headers, formData, signal);\n } else if (body instanceof ArrayBuffer) {\n const blob = new Blob([body]);\n return $init(method, headers, blob, signal);\n } else if (body && typeof body === \"object\") {\n body = JSON.stringify(body);\n } else if (typeof body === \"string\") {\n headers[\"Content-Type\"] = \"text/plain\";\n }\n }\n\n const result = { method, headers } as RequestInit;\n\n // body with type \"object\", converted to type \"string\" in the code above\n if (\n body &&\n (body instanceof ArrayBuffer ||\n body instanceof Blob ||\n body instanceof globalThis.File ||\n body instanceof FormData ||\n typeof body === \"string\")\n ) {\n result.body = body;\n }\n\n if (signal) result.signal = signal;\n\n return result;\n}\n\nexport function $fetch(url: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n return fetch(url, init).then((response) => handleFetchError(response));\n}\n\nexport function $get(url: RequestInfo | URL, headers?: HeadersInit, signal?: AbortSignal): Promise<Response> {\n return $fetch(url, $init(\"GET\", headers, null, signal));\n}\n\nexport function $put(\n url: RequestInfo | URL,\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n) {\n return $fetch(url, $init(\"PUT\", headers, body));\n}\n\nexport function $post(\n url: RequestInfo | URL,\n headers?: HeadersInit,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n) {\n return $fetch(url, $init(\"POST\", headers, body));\n}\n\nexport function $delete(url: RequestInfo | URL, headers?: HeadersInit) {\n return $fetch(url, $init(\"DELETE\", headers));\n}\n\nexport function streamProgress(stream: ReadableStream<Uint8Array>, onprogress: (progress: number) => void) {\n const reader = stream.getReader();\n let current = 0;\n\n function calc(ev) {\n if (!ev.done) {\n reader.read().then(calc).catch(console.error);\n }\n if (ev.value) current += ev.value.length;\n onprogress(current);\n }\n\n reader.read().then(calc).catch(console.error);\n\n return stream;\n}\n\nexport function downloadProgress(response: Response, onprogress?: (progress: number) => void): Response {\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const tee = response.body.tee();\n streamProgress(tee[0], (bytesCount: number) => onprogress && onprogress(bytesCount / total));\n return new Response(tee[1]);\n}\n\ninterface XMLHttpParams {\n headers: HeadersInit;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: XMLHttpRequestBodyInit | Document;\n uploadProgress?: (progress: number) => void;\n downloadProgress?: (progress: number) => void;\n}\n\nexport function $XMLHttp(\n url: string,\n { headers, method, body, uploadProgress, downloadProgress }: XMLHttpParams\n): Promise<XMLHttpRequest> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, true);\n for (const key in headers) {\n xhr.setRequestHeader(key, headers[key]);\n }\n function calcProgress(event) {\n return event.lengthComputable ? event.loaded / event.total : 1;\n }\n xhr.upload.onprogress = (event) => uploadProgress && uploadProgress(calcProgress(event));\n xhr.onprogress = (event) => downloadProgress && downloadProgress(calcProgress(event));\n xhr.onloadend = (event) => handleXMLHttpError(event.target).then(resolve, reject);\n xhr.send(body);\n });\n}\n\nfunction delay(ms: number, signal: AbortSignal) {\n return new Promise((resolve) => {\n let timeoutId = 0;\n\n const abortHandler = () => {\n clearTimeout(timeoutId);\n resolve(true);\n };\n\n timeoutId = window.setTimeout(() => {\n signal.removeEventListener(\"abort\", abortHandler);\n resolve(false);\n }, ms);\n\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n });\n}\n\nexport async function waitFor(\n func: (params: any) => Promise<boolean>,\n params: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n abortError?: DOMException;\n timeoutError?: DOMException;\n result?: any;\n } = {}\n) {\n const timeout = params.timeout ?? 600000;\n const interval = params.interval ?? 3000;\n const signal = params.signal ?? new AbortController().signal;\n const abortError = params.abortError ?? new DOMException(\"Aborted\", \"AbortError\");\n const timeoutError = params.timeoutError ?? new DOMException(\"Timeout\", \"TimeoutError\");\n\n const end = performance.now() + timeout;\n let count = timeout / interval;\n\n do {\n if (await func(params)) return Promise.resolve(params.result);\n if ((await delay(interval, signal)) || signal.aborted) return Promise.reject(abortError);\n } while (performance.now() < end && --count > 0);\n\n return Promise.reject(timeoutError);\n}\n\nexport async function downloadPartOfFile(\n requestId: number,\n records: any | null,\n url: string,\n defHeaders: HeadersInit,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n const headers = { ...defHeaders };\n const isMultipleResourceParts = records && records.length;\n if (records) {\n const ranges: string[] = [];\n if (isMultipleResourceParts) {\n for (let i = 0; i < records.length; i++) {\n const record = records[i];\n ranges.push(`${record.begin}-${record.end}`);\n }\n } else {\n for (let i = 0; i < records.size(); i++) {\n const record = records.get(i);\n ranges.push(`${record.begin}-${record.end}`);\n record.delete();\n }\n }\n headers[\"Range\"] = \"bytes=\" + ranges.join(\",\");\n }\n\n const response = await $fetch(url, $init(\"GET\", headers, null, signal));\n const contentLength = response.headers.get(\"content-length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n\n const reader = response.body.getReader();\n\n if (isMultipleResourceParts) {\n let curRecordIndex = 0;\n let curRecordPos = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n let totalLeft = value.byteLength;\n let loadedPos = 0;\n while (totalLeft > 0) {\n const curRecord = records[curRecordIndex];\n const recLeft = curRecord.size - curRecordPos;\n if (totalLeft < recLeft) {\n const buf = value.subarray(loadedPos, loadedPos + totalLeft);\n if (typeof onProgress === \"function\") onProgress(loadedPos / total, buf, curRecord.reqId);\n curRecordPos += totalLeft;\n totalLeft = 0;\n } else {\n const buf = value.subarray(loadedPos, loadedPos + recLeft);\n if (typeof onProgress === \"function\") onProgress(loadedPos / total, buf, curRecord.reqId);\n curRecordIndex++;\n curRecordPos = 0;\n loadedPos += recLeft;\n totalLeft -= recLeft;\n }\n }\n }\n } else {\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (onProgress) onProgress(loaded / total, value, requestId);\n }\n }\n}\n\nexport function parseArgs(args: string | object): object {\n if (typeof args === \"string\") {\n const firstArg = args.indexOf(\"--\");\n if (firstArg !== -1) args = args.slice(firstArg);\n const argArray = args\n .split(\"--\")\n .map((x) =>\n x\n .split(\"=\")\n .map((y) => y.split(\" \"))\n .flat()\n )\n .filter((x) => x[0])\n .map((x) => x.concat([\"\"]));\n return Object.fromEntries(argArray);\n }\n return args ?? {};\n}\n\nexport function userFullName(firstName: string | any, lastName = \"\", userName = \"\"): string {\n if (firstName && typeof firstName !== \"string\") {\n return userFullName(firstName.firstName ?? firstName.name, firstName.lastName, firstName.userName);\n }\n return `${firstName ?? \"\"} ${lastName ?? \"\"}`.trim() || userName;\n}\n\nexport function userInitials(fullName = \"\"): string {\n const names = fullName.split(\" \").filter((x) => x);\n return names\n .reduce((initials, name, index) => {\n if (index === 0 || index === names.length - 1) initials += name.charAt(0);\n return initials;\n }, \"\")\n .toUpperCase();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { waitFor, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * The base class provides information about the file/assembly clash detection test and test results.\n */\nexport class ClashTest {\n private _data: any;\n private basePath: string;\n private httpClient: IHttpClient;\n\n /**\n * @param data - Raw test data.\n * @param basePath - Clash tests API base path for the owner file/assembly.\n * @param httpClient - Http client.\n */\n constructor(data: any, basePath: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.basePath = basePath;\n this.data = data;\n }\n\n protected internalGet(relativePath: string): Promise<any> {\n return this.httpClient.get(`${this.basePath}/clashes/${this.id}${relativePath}`);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ): Promise<any> {\n return this.httpClient.put(`${this.basePath}/clashes/${this.id}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string): Promise<any> {\n return this.httpClient.delete(`${this.basePath}/clashes/${this.id}${relativePath}`);\n }\n\n /**\n * The type of the clashes that the test detects:\n *\n * - `Сlearance clash` (true) - a clash in which the entity A may or may not intersect with\n * entity B, but comes within a distance of less than the `tolerance`.\n * - `Hard clash` (false) - a clash in which the entity A intersects with entity B by a\n * distance of more than the `tolerance`.\n *\n * @readonly\n */\n get clearance(): boolean {\n return this.data.clearance;\n }\n\n /**\n * Test creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Raw test data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n }\n\n /**\n * Unique test ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Test last update (UTC) time in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get lastModifiedAt(): string {\n return this.data.lastModifiedAt;\n }\n\n /**\n * Test name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * Test owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * First selection set for clash detection. Entities from `selectionSetA` will be tested\n * against each others by entities from the `selectionSetB` during the test.\n *\n * @readonly\n */\n get selectionSetA(): string[] {\n return this.data.selectionSetA;\n }\n\n /**\n * The type of first selection set for clash detection. Can be one of:\n *\n * - `all` - All file/assembly entities.\n * - `handle` - Entities with handles specified in the `selectionSetA`.\n * - `models` - Entities of file/assembly models specified in `selectionSetA`.\n * - `searchquery` - Entities retrieved by the search queries specified in `selectionSetA`.\n *\n * @readonly\n */\n get selectionTypeA(): string {\n return this.data.selectionTypeA;\n }\n\n /**\n * Second selection set for clash detection. Entities from `selectionSetB` will be tested\n * against each others by entities from the `selectionSetA` during the test.\n *\n * @readonly\n */\n get selectionSetB(): string[] {\n return this.data.selectionSetB;\n }\n\n /**\n * The type of second selection set for clash detection. Can be one of:\n *\n * - `all` - All file/assembly entities.\n * - `handle` - Entities with handles specified in the `selectionSetB`.\n * - `models` - Entities of file/assembly models specified in `selectionSetB`.\n * - `searchquery` - Entities retrieved by the search queries specified in `selectionSetB`.\n *\n * @readonly\n */\n get selectionTypeB(): string {\n return this.data.selectionTypeB;\n }\n\n /**\n * Test status. Can be `none`, `waiting`, `inprogress`, `done` or `failed`.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * The distance of separation between entities at which test begins detecting clashes.\n *\n * @readonly\n */\n get tolerance(): number {\n return this.data.tolerance;\n }\n\n /**\n * Refresh test data.\n *\n * @async\n */\n checkout(): Promise<this> {\n return this.internalGet(\"\")\n .then((response) => response.json())\n .then((data) => {\n this.data = data;\n return this;\n });\n }\n\n /**\n * Update test data on the server.\n *\n * @async\n * @param data - Raw test data.\n */\n update(data: any): Promise<this> {\n return this.internalPut(\"\", data)\n .then((response) => response.json())\n .then((data) => {\n this.data = data;\n return this;\n });\n }\n\n /**\n * Remove a test from a file.\n *\n * @async\n * @returns Returns the raw data of a deleted test.\n */\n delete(): Promise<any> {\n return this.internalDelete(\"\").then((response) => response.json());\n }\n\n /**\n * Save test data changes to the server. Call this method to update test data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<this> {\n return this.update(this.data);\n }\n\n /**\n * Wait for test to complete. Test is done when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait test. If\n * test is not complete during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking test status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n waitForDone(params?: { timeout?: number; interval?: number; signal?: AbortSignal }) {\n const checkDone = () => this.checkout().then((test) => [\"done\", \"failed\"].includes(test.status));\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a report with the clash detection results for this test.\n *\n * @async\n */\n getReport(): Promise<any> {\n return this.internalGet(\"/report\").then((response) => response.json());\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IAssociatedFileData, IAssemblyVersionInfo } from \"./IAssembly\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Model } from \"./Model\";\nimport { ClashTest } from \"./ClashTest\";\nimport { json, downloadProgress, downloadPartOfFile, waitFor, userFullName, userInitials } from \"./impl/Utils\";\nimport { FetchError } from \"./impl/FetchError\";\n\n/**\n * The class representing a `assembly` entity.\n */\nexport class Assembly {\n private _data: any;\n private _useVersion: number | undefined;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements assembly data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.path = `/assemblies/${data.id}`;\n this.httpClient = httpClient;\n this.data = data;\n }\n\n public appendVersionParam(relativePath: string): string {\n if (this._useVersion === undefined) return relativePath;\n\n const delimiter = relativePath.includes(\"?\") ? \"&\" : \"?\";\n return `${relativePath}${delimiter}version=${this._useVersion}`;\n }\n\n protected internalGet(relativePath: string, signal?: AbortSignal) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.get(`${this.path}${relativePath}`, signal);\n }\n\n protected internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.post(`${this.path}${relativePath}`, body);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.put(`${this.path}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.delete(`${this.path}${relativePath}`);\n }\n\n async partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ): Promise<void> {\n let pathname = `${this.path}/downloads/${dataId}`;\n pathname = this.appendVersionParam(pathname);\n\n // TODO: replace with $get to handle fetch errors\n const response = await fetch(`${this.httpClient.serverUrl}${pathname}`, {\n headers: this.httpClient.headers,\n signal,\n });\n\n // TODO: use ReadableStream pipeTo()\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const reader = response.body.getReader();\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (typeof onProgress === \"function\") onProgress(loaded / total, value);\n }\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ): Promise<void> {\n let pathname = `${this.path}/downloads/${dataId}?requestId=${requestId}`;\n pathname = this.appendVersionParam(pathname);\n return downloadPartOfFile(\n requestId,\n records,\n `${this.httpClient.serverUrl}${pathname}`,\n this.httpClient.headers,\n onProgress,\n signal\n );\n }\n\n // Reserved for future use\n\n get activeVersion(): number {\n return this.data.activeVersion;\n }\n\n /**\n * List of unique files from which the assembly was created.\n *\n * @readonly\n */\n get associatedFiles(): IAssociatedFileData[] {\n return this.data.associatedFiles;\n }\n\n /**\n * Assembly creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get created(): string {\n return this.data.created;\n }\n\n /**\n * Raw assembly data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n // associatedFiles since 23.12\n this._data.associatedFiles ??= [];\n this._data.associatedFiles.forEach((file) => (file.link = `${this.httpClient.serverUrl}/files/${file.fileId}`));\n }\n\n /**\n * List of file IDs from which the assembly was created.\n *\n * @readonly\n */\n get files(): string[] {\n return this.data.files;\n }\n\n /**\n * Assembly geometry data type:\n *\n * - `vsfx` - VSFX, assembly can be opened in `VisualizeJS` viewer.\n *\n * Returns an empty string if geometry data has not yet been extracted.\n */\n get geometryType(): string {\n return this.status === \"done\" ? \"vsfx\" : \"\";\n }\n\n /**\n * Unique assembly ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Assembly name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n // Reserved for future use\n\n get originalAssemblyId(): string {\n return this.data.originalAssemblyId;\n }\n\n /**\n * Assembly owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n // Reserved for future use\n\n get previewUrl(): string {\n return this.data.previewUrl ?? \"\";\n }\n\n /**\n * List of assembly related job IDs.\n *\n * @readonly\n */\n get relatedJobs(): string[] {\n return this.data.relatedJobs;\n }\n\n /**\n * Assembly geometry data and properties status. Can be `waiting`, `inprogress`, `done` or `failed`.\n *\n * An assemblies without geometry data cannot be opened in viewer.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * Assembly type. Returns an `assembly`.\n *\n * @readonly\n */\n get type(): string {\n return \"assembly\";\n }\n\n // Reserved for future use\n\n get version(): number {\n return this.data.version;\n }\n\n get versions(): IAssemblyVersionInfo[] {\n return this.data.versions;\n }\n\n /**\n * Refresh assembly data.\n *\n * @async\n */\n async checkout(): Promise<Assembly> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Updates assembly data on the server.\n *\n * @async\n * @param data - Raw assembly data.\n */\n async update(data: any): Promise<Assembly> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the assembly from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted assembly.\n */\n delete(): Promise<any> {\n return json(this.internalDelete(\"\"));\n }\n\n /**\n * Save assembly data changes to the server. Call this method to update assembly data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Assembly> {\n return this.update(this.data);\n }\n\n // Reserved for future use\n\n setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null) {\n console.warn(\"Assembly does not support preview\");\n return Promise.resolve(this);\n }\n\n /**\n * Returns list of assembly models.\n *\n * @async\n */\n getModels(): Promise<Model[]> {\n return json(this.internalGet(\"/geometry\")).then((array) => array.map((data) => new Model(data, this)));\n }\n\n /**\n * Transformation matrix.\n *\n * @typedef {any} Transform\n * @property {any} translate - Translation part, move along the X, Y, Z axes.\n * @property {number} translate.x - The value for substruct for X axes.\n * @property {number} translate.y - The value for substruct for Y axes.\n * @property {number} translate.z - The value for substruct for Z axes.\n * @property {any} rotation - Rotation part, rotate by the specified angle, around the\n * specified vector.\n * @property {number} rotation.x - X coordinate of the rotation vector.\n * @property {number} rotation.y - Y coordinate of the rotation vector.\n * @property {number} rotation.z - Z coordinate of the rotation vector.\n * @property {number} rotation.angle - The angle of rotation.\n * @property {number} scale - Scaling part, scale with multiplier, from center of extends.\n */\n\n /**\n * Returns a model transformation.\n *\n * @param handle - Model handle.\n */\n getModelTransformMatrix(handle: string): any {\n return this.data.transform[handle];\n }\n\n /**\n * Set or delete a model transformation.\n *\n * @async\n * @param handle - Model handle.\n * @param transform - Transformation matrix. To delete transformation provide this to `undefined`.\n */\n setModelTransformMatrix(handle: string, transform: any): Promise<Assembly> {\n const obj = { ...this.data.transform };\n obj[handle] = transform;\n return this.update({ transform: obj });\n }\n\n /**\n * Returns the properties for an objects in the assembly.\n *\n * @async\n * @param handles - Object original handle or handles array. Leave this parameter undefined\n * to get properties for all objects in the assembly.\n * @returns {Promise<any>}\n */\n getProperties(handles?: string | string[]): Promise<any[]> {\n return json(this.internalGet(handles !== undefined ? `/properties?handles=${handles}` : \"/properties\"));\n }\n\n /**\n * Returns the list of original handles for an objects in the file that match the specified\n * patterns. Search patterns may be combined using query operators.\n *\n * @async\n * @example <caption>Simple search pattern.</caption>\n * searchPattern = {\n * key: \"Category\",\n * value: \"OST_Stairs\",\n * };\n *\n * @example <caption>Search patterns combination.</caption>\n * searchPattern = {\n * $or: [\n * {\n * $and: [\n * { key: \"Category\", value: \"OST_GenericModel\" },\n * { key: \"Level\", value: \"03 - Floor\" },\n * ],\n * },\n * { key: \"Category\", value: \"OST_Stairs\" },\n * ],\n * };\n *\n * @param searchPattern - Search pattern or combination of the patterns, see example below.\n */\n searchProperties(searchPattern: any): Promise<any[]> {\n return json(this.internalPost(\"/properties/search\", searchPattern));\n }\n\n /**\n * Returns the cda.json for an assembly.\n *\n * @async\n */\n getCdaTree(): Promise<any[]> {\n return json(this.internalGet(`/properties/tree`));\n }\n\n // Reserved for future use\n\n getViewpoints(): Promise<[]> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve([]);\n }\n\n saveViewpoint(viewpoint: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n deleteViewpoint(guid: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n getSnapshot(guid: any): Promise<any> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve({});\n }\n\n getSnapshotData(guid: any, bitmapGuid: any): Promise<string> {\n console.warn(\"Assembly does not support viewpoints\");\n return Promise.resolve(\"\");\n }\n\n /**\n * Download assembly resource data, such as geometry data.\n *\n * @async\n * @param dataId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads/${dataId}`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n // Reserved for future use\n\n getReferences(signal?: AbortSignal) {\n return Promise.resolve({ fileId: \"\", references: [] });\n }\n\n /**\n * Wait for assembly to be created. Assembly is created when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait assembly.\n * If assembly is not created during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking assembly status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onCheckout - Waiting progress callback. Return `true` to cancel waiting.\n * @returns {Promise<Assembly>}\n */\n waitForDone(params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (assembly: Assembly, ready: boolean) => boolean;\n }): Promise<Assembly> {\n const checkDone = () =>\n this.checkout().then((assembly) => {\n const ready = [\"done\", \"failed\"].includes(assembly.status);\n const cancel = params?.onCheckout?.(assembly, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a list of assembly clash tests.\n *\n * @async\n * @param {number} start - The starting index in the test list. Used for paging.\n * @param {number} limit - The maximum number of tests that should be returned per request.\n * Used for paging.\n * @param {string} name - Filter the tests by part of the name.\n * @param {string | string[]} ids - List of tests IDs to return. You can specify multiple IDs\n * on one `string` by separating them with a \"|\".\n * @param {bool} sortByDesc - Allows to specify the descending order of the result. By\n * default tests are sorted by name in ascending order.\n * @param {string} sortField - Allows to specify sort field.\n */\n getClashTests(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: ClashTest[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return this.internalGet(`/clashes${queryString}`)\n .then((response) => response.json())\n .then((tests) => {\n return {\n ...tests,\n result: tests.result.map((data) => new ClashTest(data, this.path, this.httpClient)),\n };\n });\n }\n\n /**\n * Returns the assembly clash test information.\n *\n * @async\n * @param testId - Test ID.\n */\n getClashTest(testId: string): Promise<ClashTest> {\n return this.internalGet(`/clashes/${testId}`)\n .then((response) => response.json())\n .then((data) => new ClashTest(data, this.path, this.httpClient));\n }\n\n /**\n * Create assembly clash test. Assembly must be in a `done` state, otherwise the test will fail.\n *\n * @async\n * @param name - Test name.\n * @param selectionTypeA - The type of first selection set for clash detection. Can be `all`,\n * `handles`, `models` or `searchquery`.\n * @param selectionTypeB - The type of second selection set for clash detection. Can be\n * `all`, `handles`, `models` or `searchquery`.\n * @param selectionSetA - First selection set for clash detection.\n * @param selectionSetB - Second selection set for clash detection.\n * @param params - An object containing test parameters.\n * @param params.tolerance - The distance of separation between entities at which test begins\n * detecting clashes.\n * @param params.clearance - The type of the clashes that the test detects: `true` for\n * `Сlearance clash` or `false` for `Hard clash`.\n * @param params.waitForDone - Wait for test to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait test. If\n * test is not complete during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking test status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n createClashTest(\n name: string,\n selectionTypeA: string,\n selectionTypeB: string,\n selectionSetA?: string | string[],\n selectionSetB?: string | string[],\n params?: {\n tolerance?: number | string;\n clearance?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n }\n ): Promise<ClashTest> {\n const { tolerance, clearance, waitForDone } = params ?? {};\n if (!Array.isArray(selectionSetA)) selectionSetA = [selectionSetA];\n if (!Array.isArray(selectionSetB)) selectionSetB = [selectionSetB];\n\n return this.internalPost(\"/clashes\", {\n name,\n selectionTypeA,\n selectionTypeB,\n selectionSetA,\n selectionSetB,\n tolerance,\n clearance,\n })\n .then((response) => response.json())\n .then((data) => new ClashTest(data, this.path, this.httpClient))\n .then((result) => (waitForDone ? result.waitForDone(params) : result));\n }\n\n /**\n * Delete assembly clash test.\n *\n * @async\n * @param testId - Test ID.\n * @returns Returns the raw data of a deleted test.\n */\n deleteClashTest(testId: string): Promise<any> {\n return this.internalDelete(`/clashes/${testId}`).then((response) => response.json());\n }\n\n // Reserved for future use\n\n updateVersion(\n files?: string[],\n params: {\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n waitForDone: false,\n }\n ): Promise<Assembly> {\n return Promise.reject(new Error(\"Assembly version support will be implemeted in a future release\"));\n }\n\n getVersions(): Promise<Assembly[] | undefined> {\n return Promise.resolve(undefined);\n }\n\n getVersion(version: number): Promise<Assembly> {\n return Promise.reject(new FetchError(404));\n }\n\n deleteVersion(version: number): Promise<any> {\n return Promise.reject(new FetchError(404));\n }\n\n setActiveVersion(version: number) {\n return this.update({ activeVersion: version });\n }\n\n useVersion(version?: number) {\n this._useVersion = undefined;\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport const CANVAS_EVENTS = [\n \"click\",\n \"dblclick\",\n \"mousedown\",\n \"mousemove\",\n \"mouseup\",\n \"mouseleave\",\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointerleave\",\n \"pointercancel\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchend\",\n \"touchcancel\",\n];\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IEvent, IEventEmitter } from \"./IEventEmitter2\";\n\n/**\n * The minimal basic Event that can be emitted by a {@link EventEmitter2}.\n */\nexport interface Event<T extends string = string> extends IEvent {\n type: T;\n}\n\n/**\n * Event emitter for custom objects.\n */\nexport class EventEmitter2<EventMap extends Record<string, any> = Record<string, any>> implements IEventEmitter {\n private _listeners = undefined;\n\n /**\n * Registers a new listener for an event type.\n *\n * @param type - The type of event to listen to.\n * @param listener - The function that gets called when the event is fired.\n */\n addEventListener<T extends keyof EventMap>(type: T, listener: (event: EventMap[T]) => void): this {\n if (this._listeners === undefined) this._listeners = {};\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n\n /**\n * Removes the listener from an event type.\n *\n * @param type - The type of the listener that gets removed.\n * @param listener - The listener function that gets removed.\n */\n removeEventListener<T extends keyof EventMap>(type: T, listener: (event: EventMap[T]) => void): this {\n if (this._listeners === undefined) return this;\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x) => x !== listener);\n this._listeners[type] = listeners.length === 0 ? undefined : listeners;\n return this;\n }\n\n /**\n * If `type` is specified, removes all registered listeners for type, otherwise removes all\n * registered listeners.\n *\n * @param type - The type of the listener that gets removed.\n */\n removeAllListeners<T extends keyof EventMap>(type?: T): this {\n if (type) this._listeners[type] = undefined;\n else this._listeners = undefined;\n return this;\n }\n\n /**\n * Fires the event. Calls each of the listeners registered for the event type `event.type`,\n * in the order they were registered.\n *\n * @param event - The event that gets fired.\n */\n emitEvent<T extends keyof EventMap>(event: Event<Extract<T, string>> & EventMap[T]): boolean {\n if (this._listeners === undefined) return false;\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener) => listener.call(this, event));\n return true;\n }\n\n // Node.js style, to emit custom events\n\n /**\n * Alias to {@link EventEmitter2.addEventListener()}\n */\n on(type: string, listener: (event: object) => void): this {\n return this.addEventListener(type as any, listener as any);\n }\n\n /**\n * Alias to {@link EventEmitter2.removeEventListener()}.\n */\n off(type: string, listener: (event: object) => void): this {\n return this.removeEventListener(type as any, listener as any);\n }\n\n /**\n * Alias to {@link EventEmitter2.emitEvent()}.\n */\n emit(event: string | object, ...args: any[]): boolean {\n if (typeof event === \"string\") return this.emitEvent({ type: event, args } as any);\n else if (typeof event === \"object\") return this.emitEvent(event as any);\n else return false;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { $get, $delete, $post, $put, $XMLHttp } from \"./impl/Utils\";\n\nexport class HttpClient implements IHttpClient {\n serverUrl: string;\n headers: HeadersInit;\n signInUserId: string;\n\n constructor(serverUrl: string) {\n this.serverUrl = serverUrl;\n }\n\n get(relativePath: string, signal?: AbortSignal): Promise<Response> {\n return $get(`${this.serverUrl}${relativePath}`, this.headers, signal);\n }\n\n post(\n relativePath: string,\n body?: string | object | ArrayBuffer | Blob | globalThis.File | FormData\n ): Promise<Response> {\n return $post(`${this.serverUrl}${relativePath}`, this.headers, body);\n }\n\n put(\n relativePath: string,\n body?: string | object | ArrayBuffer | Blob | globalThis.File | FormData\n ): Promise<Response> {\n return $put(`${this.serverUrl}${relativePath}`, this.headers, body);\n }\n\n delete(relativePath: string): Promise<Response> {\n return $delete(`${this.serverUrl}${relativePath}`, this.headers);\n }\n\n postFile(\n relativePath: string,\n file: globalThis.File,\n onProgress?: (progress: number) => void\n ): Promise<XMLHttpRequest> {\n const data = new FormData();\n data.append(\"file\", file);\n\n return $XMLHttp(`${this.serverUrl}${relativePath}`, {\n method: \"POST\",\n headers: this.headers,\n body: data,\n uploadProgress: onProgress,\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json } from \"./impl/Utils\";\n\n/**\n * A permission provides information about {@link File | file} sharing granted to a specific\n * {@link User | users}, group, or project {@link Member | member}.\n */\nexport class Permission {\n private _data: any;\n protected fileId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements permission data storage.\n * @param fileId - Owner file ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, fileId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.fileId = fileId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/files/${this.fileId}/permissions/${this.id}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/files/${this.fileId}/permissions/${this.id}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/files/${this.fileId}/permissions/${this.id}`);\n }\n\n /**\n * Defines what actions are allowed to be performed on a file with this permission:\n *\n * - `read` - The ability to read file description, geometry data and properties\n * - `readSourceFile` - The ability to read source file\n * - `write` - The ability to modify file name, description and references\n * - `readViewpoint` - The ability to read file viewpoints\n * - `createViewpoint` - The ability to create file viewpoints\n */\n get actions(): string[] {\n return this.data.actions;\n }\n\n set actions(value: string[]) {\n this._data.actions = value;\n }\n\n /**\n * Raw permission data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * Unique permission ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Principials are any entity that can be authenticated by the server, such as a any user or\n * project that will get access to the file.\n *\n * @typedef {any} Principial\n * @property {any} user - The user entry that get access to the file.\n * @property {string} user.id - User ID.\n * @property {string} user.name - User name.\n * @property {any} project - The project entry that get access to the file.\n * @property {string} project.id - Project ID.\n * @property {string} project.name - Project name.\n */\n\n /**\n * A collection of principials that will get access to the file.\n */\n get grantedTo(): any[] {\n return this.data.grantedTo;\n }\n\n set grantedTo(value: any[]) {\n this.data.grantedTo = value;\n }\n\n /**\n * Specifies whether all users have access to the file or not.\n */\n get public(): boolean {\n return this.data.public;\n }\n\n set public(value: boolean) {\n this.data.public = value;\n }\n\n /**\n * Refresh permission data.\n *\n * @async\n */\n async checkout(): Promise<Permission> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update permission data on the server.\n *\n * @async\n * @param data - Raw permission data.\n */\n async update(data: any): Promise<Permission> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a permission from a file.\n *\n * @async\n * @returns Returns the raw data of a deleted permission.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save permission data changes to the server. Call this method to update permission data on\n * the server after any changes.\n *\n * @async\n */\n save(): Promise<Permission> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json, waitFor } from \"./impl/Utils\";\n\n/**\n * The class representing a `job` entity describes the process of converting a file from one\n * format to another, to obtain geometric data, validate the file, or run a clash test.\n */\nexport class Job {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements job data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n protected internalGet() {\n return this.httpClient.get(`/jobs/${this.data.id}`);\n }\n\n protected internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/jobs/${this.data.id}`, body);\n }\n\n protected internalDelete() {\n return this.httpClient.delete(`/jobs/${this.data.id}`);\n }\n\n /**\n * The ID of the assembly the job is working on (internal).\n *\n * @readonly\n */\n get assemblyId(): string {\n return this.data.assemblyId;\n }\n\n /**\n * Job creator ID. Use {@link Client#getUser | Client.getUser()} to obtain detailed creator information.\n *\n * @readonly\n */\n get authorId(): string {\n return this.data.authorId;\n }\n\n /**\n * Job creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Raw job data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n }\n\n /**\n * `true` if job is `done` or `failed`. See {@link Job#status | status} for more details.\n *\n * @readonly\n */\n get done(): boolean {\n return this.data.status === \"done\" || this.data.status === \"failed\";\n }\n\n /**\n * The ID of the file the job is working on.\n *\n * @readonly\n */\n get fileId(): string {\n return this.data.fileId;\n }\n\n /**\n * Unique job ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Job last update (UTC) time in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get lastUpdate(): string {\n return this.data.lastUpdate;\n }\n\n /**\n * Job type. Can be `properties`, `geomerty`, `geomertyGltf`, `validation`, `clash`, `dwg`,\n * `obj`, `gltf`, `glb`, `vsf`, `pdf` or `3dpdf`.\n *\n * @readonly\n */\n get outputFormat(): string {\n return this.data.outputFormat;\n }\n\n /**\n * Parameters for the job runner.\n *\n * @readonly\n */\n get parameters(): any {\n return this.data.parameters;\n }\n\n /**\n * Job status. Can be `waiting`, `inprogress`, `done` or `failed`.\n *\n * @readonly\n */\n get status(): string {\n return this.data.status;\n }\n\n /**\n * Job status description message.\n *\n * @readonly\n */\n get statusMessage(): string {\n return this.data.statusMessage;\n }\n\n /**\n * Job starting time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get startedAt(): string {\n return this.data.startedAt;\n }\n\n /**\n * Refresh job data.\n *\n * @async\n */\n async checkout(): Promise<Job> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update job data on the server. Only admins can update job data.\n *\n * @async\n * @param data - Raw job data.\n */\n async update(data: any): Promise<Job> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a job from the server job list. Jobs that are in progress or have already been\n * completed cannot be deleted.\n *\n * @async\n * @returns Returns the raw data of a deleted job.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n // /**\n // * Save job data changes to the server. Call this method to update job data on the server\n // * after any changes.\n // *\n // * @async\n // * @returns {Promise<Job>}\n // */\n // save() {\n // return this.update(this.data);\n // }\n\n /**\n * Wait for job to be done. Job is done when it changes to `done` or `failed` status.\n *\n * @async\n * @param params - An object containing waiting parameters.\n * @param params.timeout - The time, in milliseconds that the function should wait job. If\n * jobs is not done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking job status.\n * @param params.signal- An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onCheckout - Waiting progress callback. Return `true` to cancel waiting.\n */\n waitForDone(params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (job: Job, ready: boolean) => boolean;\n }): Promise<Job> {\n const checkDone = () =>\n this.checkout().then((job) => {\n const ready = [\"done\", \"failed\"].includes(job.status);\n const cancel = params?.onCheckout?.(job, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IFileStatus, IFileReferences, IFileVersionInfo } from \"./IFile\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Model } from \"./Model\";\nimport { Permission } from \"./Permission\";\nimport { Job } from \"./Job\";\nimport {\n json,\n text,\n downloadProgress,\n downloadPartOfFile,\n waitFor,\n parseArgs,\n userFullName,\n userInitials,\n} from \"./impl/Utils\";\n\n/**\n * The class representing a `file` entity.\n */\nexport class File {\n private _data: any;\n private _useVersion: number | undefined;\n public httpClient: IHttpClient;\n public path: string;\n\n /**\n * @param data - An object that implements file data storage.\n * @param httpClient - Http client for API.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.path = `/files/${data.id}`;\n this.httpClient = httpClient;\n this.data = data;\n }\n\n private appendVersionParam(relativePath: string): string {\n if (this._useVersion === undefined) return relativePath;\n\n const delimiter = relativePath.includes(\"?\") ? \"&\" : \"?\";\n return `${relativePath}${delimiter}version=${this._useVersion}`;\n }\n\n private internalGet(relativePath: string, signal?: AbortSignal) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.get(`${this.path}${relativePath}`, signal);\n }\n\n private internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.post(`${this.path}${relativePath}`, body);\n }\n\n private internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.put(`${this.path}${relativePath}`, body);\n }\n\n private internalDelete(relativePath: string) {\n relativePath = this.appendVersionParam(relativePath);\n return this.httpClient.delete(`${this.path}${relativePath}`);\n }\n\n async partialDownloadResource(\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array) => void,\n signal?: AbortSignal\n ) {\n let pathname = `${this.path}/downloads/${dataId}`;\n pathname = this.appendVersionParam(pathname);\n\n // TODO: replace with $get to handle fetch errors\n const response = await fetch(`${this.httpClient.serverUrl}${pathname}`, {\n headers: this.httpClient.headers,\n signal,\n });\n\n // TODO: use ReadableStream pipeTo()\n const contentLength = response.headers.get(\"Content-Length\") ?? \"\";\n const total = parseInt(contentLength, 10);\n const reader = response.body.getReader();\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n loaded += value.byteLength;\n if (typeof onProgress === \"function\") onProgress(loaded / total, value);\n }\n }\n\n downloadFileRange(\n requestId: number,\n records: any | null,\n dataId: string,\n onProgress?: (progress: number, downloaded: Uint8Array, requestId: number) => void,\n signal?: AbortSignal\n ) {\n let pathname = `${this.path}/downloads/${dataId}?requestId=${requestId}`;\n pathname = this.appendVersionParam(pathname);\n return downloadPartOfFile(\n requestId,\n records,\n `${this.httpClient.serverUrl}${pathname}`,\n this.httpClient.headers,\n onProgress,\n signal\n );\n }\n\n /**\n * Active version number of the file.\n *\n * @readonly\n */\n get activeVersion(): number {\n return this.data.activeVersion;\n }\n\n /**\n * File creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get created(): string {\n return this.data.created;\n }\n\n /**\n * File custom fields object, to store custom data.\n *\n * @readonly\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this.data.customFields = value;\n }\n\n /**\n * Raw file data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.previewUrl = value.preview ? `${this.httpClient.serverUrl}${this.path}/preview` : \"\";\n // owner since 24.8\n if (typeof this._data.owner === \"string\") this._data.owner = { userId: this._data.owner };\n this._data.owner ??= {};\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n // status since 24.9\n this._data.status ??= {};\n this._data.status.geometry ??= { state: this._data.geometryStatus ?? \"none\" };\n this._data.status.properties ??= { state: this._data.propertiesStatus ?? \"none\" };\n this._data.status.validation ??= { state: this._data.validationStatus ?? \"none\" };\n // updatedBy since 24.10\n this._data.updatedBy ??= {};\n this._data.updatedBy.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.updatedBy.userId}/avatar`;\n this._data.updatedBy.fullName = userFullName(this._data.updatedBy);\n this._data.updatedBy.initials = userInitials(this._data.updatedBy.fullName);\n // geometryGltf status since 24.12\n this._data.status.geometryGltf ??= { state: \"none\" };\n }\n\n /**\n * Returns a list of formats in which the active version of the file was exported. To export\n * file to one of the supported formats create File Converter job using\n * {@link File.createJob()}. To download exported file use {@link File.downloadResource()}.\n *\n * @readonly\n */\n get exports(): string[] {\n return this.data.exports;\n }\n\n /**\n * Geometry data type of the active file version. Can be one of:\n *\n * - `vsfx` - `VSFX`, file can be opened in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, file can be opened in `Three.js` viewer.\n *\n * Returns an empty string if geometry data has not yet been extracted. A files without\n * geometry data can be exported to other formas, but cannot be opened in viewer.\n */\n get geometryType(): string {\n if (this.status.geometryGltf.state === \"done\") return \"gltf\";\n else if (this.status.geometry.state === \"done\") return \"vsfx\";\n else return \"\";\n }\n\n /**\n * Unique file ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * File name, including the extension.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * If the file is a version, then returns the ID of the original file. Otherwise, returns the file ID.\n *\n * @readonly\n */\n get originalFileId(): string {\n return this.data.originalFileId;\n }\n\n /**\n * File owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * File preview image URL. Use {@link File#setPreview | setPreview()} to change preview image.\n *\n * @readonly\n */\n get previewUrl(): string {\n return this.data.previewUrl;\n }\n\n /**\n * The size of the active version of the file in bytes.\n *\n * @readonly\n */\n get size(): number {\n return this.data.size;\n }\n\n /**\n * Total size of all versions of the file in the storage in bytes.\n *\n * @readonly\n */\n get sizeTotal(): number {\n return this.data.sizeTotal;\n }\n\n /**\n * Data status of the active version of the file. Contains:\n *\n * - `geometry` - status of geometry data of `VSFX` type.\n * - `geometryGltf` - status of geometry data of `glTF` type.\n * - `properties` - status of properties.\n * - `validation` - status of validation.\n *\n * Each status entity is a record with properties:\n *\n * - `state` - Data state. Can be `none`, `waiting`, `inprogress`, `done` or `failed`.\n * - `jobId` - Unique ID of the data job.\n *\n * @readonly\n */\n get status(): IFileStatus {\n return this.data.status;\n }\n\n /**\n * File type, matches the file extension.\n *\n * @readonly\n */\n get type(): string {\n return this.data.type;\n }\n\n /**\n * File last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get updatedAt(): string {\n return this.data.updatedAt;\n }\n\n /**\n * Information about the user who made the last update.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get updatedBy(): IShortUserDescription {\n return this.data.updatedBy;\n }\n\n /**\n * Zero-based file version number for version files. The original file has version `0`.\n */\n\n get version(): number {\n return this.data.version;\n }\n\n /**\n * List of the file versions.\n *\n * @readonly\n */\n get versions(): IFileVersionInfo[] {\n return this.data.versions;\n }\n\n /**\n * Refresh file data.\n *\n * @async\n */\n async checkout(): Promise<File> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Update file data on the server.\n *\n * @async\n * @param data - Raw file data.\n */\n async update(data: any): Promise<File> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the file and all its versions from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted file.\n */\n delete(): Promise<any> {\n return json(this.internalDelete(\"\"));\n }\n\n /**\n * Save file data changes to the server. Call this method to update file data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<File> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the file preview.\n *\n * @async\n * @param image - Preview image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the preview.\n */\n async setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null): Promise<File> {\n if (image) {\n this.data = await json(this.internalPost(\"/preview\", image));\n } else {\n this.data = await json(this.internalDelete(\"/preview\"));\n }\n return this;\n }\n\n /**\n * Returns a list of models of the active version of the file.\n *\n * @async\n */\n getModels(): Promise<Model[]> {\n return json(this.internalGet(\"/geometry\")).then((array) => array.map((data) => new Model(data, this)));\n }\n\n // File does not support model transformation.\n\n getModelTransformMatrix(handle: string): any {\n return undefined;\n }\n\n setModelTransformMatrix(handle: string, transform: any): Promise<File> {\n console.warn(\"File does not support model transformation\");\n return Promise.resolve(this);\n }\n\n /**\n * Object properties.\n *\n * @typedef {any} Properties\n * @property {string} handle - Object original handle.\n * @property {string | any} * - Object property. Can be `any` for nested properties.\n */\n\n /**\n * Returns the properties for an objects in the active version of the file.\n *\n * @async\n * @param handles - Object original handle or handles array. Leave this parameter `undefined`\n * to get properties for all objects in the file.\n */\n getProperties(handles?: string | string[]): Promise<any[]> {\n return json(this.internalGet(handles !== undefined ? `/properties?handles=${handles}` : \"/properties\"));\n }\n\n /**\n * Search pattern.\n *\n * @typedef {any} SearchPattern\n * @property {string} key - Property name.\n * @property {string} value - Property value.\n */\n\n /**\n * Query operator. Operator name can be `$and`, `$or`, `$not`, `$eq`, `$regex`.\n *\n * @typedef {any} QueryOperator\n * @property {string | SearchPattern[] | QueryOperator[]} * - Array of the query values or\n * patterns for operator.\n */\n\n /**\n * Returns the list of original handles for an objects in the active version of the file that\n * match the specified patterns. Search patterns may be combined using query operators.\n *\n * @async\n * @example <caption>Simple search pattern.</caption>\n * searchPattern = {\n * key: \"Category\",\n * value: \"OST_Stairs\",\n * };\n *\n * @example <caption>Search patterns combination.</caption>\n * searchPattern = {\n * $or: [\n * {\n * $and: [\n * { key: \"Category\", value: \"OST_GenericModel\" },\n * { key: \"Level\", value: \"03 - Floor\" },\n * ],\n * },\n * { key: \"Category\", value: \"OST_Stairs\" },\n * ],\n * };\n *\n * @param {SearchPattern | QueryOperator} searchPattern - Search pattern or combination of\n * the patterns, see example below.\n * @returns {Promise<Properties[]>}\n */\n\n searchProperties(searchPattern: any): Promise<any[]> {\n return json(this.internalPost(\"/properties/search\", searchPattern));\n }\n\n /**\n * Returns the cda.json for an active version of the file.\n *\n * @async\n */\n getCdaTree(): Promise<any[]> {\n return json(this.internalGet(`/properties/tree`));\n }\n\n /**\n * Returns a list of file viewpoints.\n *\n * @async\n */\n getViewpoints(): Promise<any[]> {\n return json(this.internalGet(\"/viewpoints\")).then((viewpoints) => viewpoints.result);\n }\n\n /**\n * Add new file viewpoint. To create a new viewpoint use\n * {@link Viewer#createViewpoint | Viewer.createViewpoint()}.\n *\n * @async\n * @param viewpoint - Viewpoint.\n */\n saveViewpoint(viewpoint: any): Promise<any> {\n return json(this.internalPost(\"/viewpoints\", viewpoint));\n }\n\n /**\n * Delete file viewpoint.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @returns Returns the raw data of a deleted viewpoint.\n */\n deleteViewpoint(guid: string): Promise<any> {\n return json(this.internalDelete(`/viewpoints/${guid}`));\n }\n\n /**\n * Returns viewpoint preview image as <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n *\n * @async\n * @param guid - Viewpoint GUID.\n */\n getSnapshot(guid: string): Promise<string> {\n return text(this.internalGet(`/viewpoints/${guid}/snapshot`));\n }\n\n /**\n * Returns viewpoint preview data.\n *\n * @async\n * @param guid - Viewpoint GUID.\n * @param bitmapGuid - Bitmap GUID.\n */\n getSnapshotData(guid: string, bitmapGuid: string): Promise<string> {\n return text(this.internalGet(`/viewpoints/${guid}/bitmaps/${bitmapGuid}`));\n }\n\n /**\n * Download source of active version of the file.\n *\n * @async\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n download(onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Download file resource data of the active version of the file, such as exported file.\n *\n * @example <caption>Export file to DWG.</caption>\n * const job = await file.crateJob(\"dwg\");\n * await job.waitForDone();\n * const resourceId = file.exports.find((x) => x.endsWith(\".dwg\"));\n * const arrayBuffer = await file.downloadResource(resourceId);\n * const blob = new Blob([arrayBuffer]);\n * const fileName = file.name.replace(/\\.[^.]+$/, \"\") + \".dwg\";\n * FileSaver.saveAs(blob, fileName);\n *\n * @param dataId - Resource ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadResource(\n dataId: string,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<ArrayBuffer> {\n return this.internalGet(`/downloads/${dataId}`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Returns a list of references to files used to correct rendering of the current file.\n *\n * @async\n * @param [signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n */\n getReferences(signal?: AbortSignal): Promise<IFileReferences> {\n return json(this.internalGet(\"/references\", signal));\n }\n\n /**\n * Set the file references.\n *\n * @async\n * @param references - File references.\n */\n setReferences(references: IFileReferences): Promise<IFileReferences> {\n return json(this.internalPut(\"/references\", references));\n }\n\n /**\n * Create a new job for the active version of the file.\n *\n * @async\n * @param outputFormat - The job type. Can be one of:\n *\n * - `geometry` - Extract file geometry data into `VSFX`.\n * - `geometryGltf` - Extract file geometry data into `glTF`.\n * - `properties` - Extract file properties.\n * - `validation` - Validate the file. Only for `IFC`.\n * - `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`, `3dpdf` - Export file to the one of the\n * supported format. Use {@link File.exports | File.exports()} to get the list of\n * completed file exports. Use {@link File.downloadResource | File.downloadResource()}\n * to download the exported file.\n * - Other custom job name. Custom job runner must be registered in the job templates table\n * before creating a job.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n createJob(outputFormat: string, parameters?: string | object): Promise<Job> {\n const pathname = this.appendVersionParam(\"/jobs\");\n return this.httpClient\n .post(pathname, {\n fileId: this.id,\n outputFormat,\n parameters: parseArgs(parameters),\n })\n .then((response) => response.json())\n .then((data) => new Job(data, this.httpClient));\n }\n\n /**\n * Create job to extract geometry data of active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"geometry\")}.\n *\n * @async\n * @param type - Geometry data type. Can be one of:\n *\n * - `vsfx` - `VSFX` (default), for opening a file in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, for opening a file in `Three.js` viewer.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n extractGeometry(type?: string, parameters?: string | object): Promise<Job> {\n return this.createJob(type === \"gltf\" ? \"geometryGltf\" : \"geometry\", parameters);\n }\n\n /**\n * Create job to extract properties of the active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"properties\")}.\n *\n * @async\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n extractProperties(parameters?: string | object): Promise<Job> {\n return this.createJob(\"properties\", parameters);\n }\n\n /**\n * Create a job to validate the active version of the file. This is alias to\n * {@link File.createJob | File.createJob(\"validation\")}.\n *\n * To get validation report use\n * {@link File.downloadResource | File.downloadResource(\"validation_report.json\")}.\n *\n * @async\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n validate(parameters?: string | object): Promise<Job> {\n return this.createJob(\"validation\", parameters);\n }\n\n /**\n * Wait for jobs of the active version of the file to be done. Job is done when it changes to\n * `none`, `done` or `failed` status.\n *\n * @async\n * @param {string | string[]} jobs - Job or job array to wait on. Can be `geometry`,\n * `geometryGltf`, `properties`, `validation`, `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`,\n * `3dpdf` or custom job name.\n * @param {Boolean} [waitAll] - If this parameter is `true`, the function returns when all\n * the specified jobs have done. If `false`, the function returns when any one of the jobs are done.\n * @param {Object} [params] - An object containing waiting parameters.\n * @param {Number} [params.timeout] - The time, in milliseconds that the function should wait\n * jobs. If no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param {Number} [params.interval] - The time, in milliseconds, the function should delay\n * in between checking jobs status.\n * @param {AbortSignal} [params.signal] - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param {function} [params.onCheckout] - Waiting progress callback. Return `true` to cancel waiting.\n * @returns {Promise<File>}\n */\n waitForDone(\n jobs,\n waitAll?: boolean,\n params?: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onCheckout?: (file: File, ready: boolean) => boolean;\n }\n ): Promise<this> {\n if (!Array.isArray(jobs)) jobs = [jobs];\n if (waitAll === undefined) waitAll = true;\n\n const checkDone = () =>\n this.checkout().then((file) => {\n const readyJobs = jobs.filter((x: string) =>\n [\"none\", \"done\", \"failed\"].includes(file.status[x]?.state ?? \"none\")\n );\n const ready = waitAll ? readyJobs.length === jobs.length : readyJobs.length > 0;\n const cancel = params?.onCheckout?.(file, ready);\n return cancel || ready;\n });\n\n return waitFor(checkDone, params).then(() => this);\n }\n\n /**\n * Returns a list of file permissions.\n *\n * @async\n */\n getPermissions(): Promise<Permission[]> {\n return json(this.internalGet(\"/permissions\")).then((array) =>\n array.map((data) => new Permission(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the permission information.\n *\n * @async\n * @param permissionId - Permission ID.\n */\n getPermission(permissionId: string): Promise<Permission> {\n return json(this.internalGet(`/permissions/${permissionId}`)).then(\n (data) => new Permission(data, this.id, this.httpClient)\n );\n }\n\n /**\n * Create a new file permission.\n *\n * @async\n * @param actions - Actions are allowed to be performed on a file with this permission. See\n * {@link Permission#actions | Permission.actions} for more details.\n * @param grantedTo - A collection of principials that will get access to the file.\n * @param public = false - Specifies whether all users have access to the file or not.\n */\n createPermission(actions: string | string[], grantedTo: any[], _public: boolean): Promise<Permission> {\n return json(\n this.internalPost(\"/permissions\", {\n actions: typeof actions === \"string\" ? [actions] : actions,\n grantedTo,\n public: _public,\n })\n ).then((data) => new Permission(data, this.id, this.httpClient));\n }\n\n /**\n * Delete file permission.\n *\n * @async\n * @param permissionId - Permission ID.\n * @returns Returns the raw data of a deleted permission.\n */\n deletePermission(permissionId: string): Promise<any> {\n return json(this.internalDelete(`/permissions/${permissionId}`));\n }\n\n /**\n * Upload the new version of the file to the server and extract the geometry and properties as needed.\n *\n * @async\n * @param file - Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object are generally retrieved from a <a\n * href=\"https://developer.mozilla.org/docs/Web/API/FileList\" target=\"_blank\">FileList</a>\n * object returned as a result of a user selecting files using the HTML `<input>` element.\n * @param params - An object containing upload parameters.\n * @param params.geometry=true - Create job to extract file geometry data. The geometry data\n * type is the same as the original file.\n * @param params.properties=false - Create job to extract file properties.\n * @param params.waitForDone=false - Wait for geometry and properties jobs to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait jobs. If\n * no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking jobs status.\n * @param params.signal - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onProgress - Upload progress callback.\n */\n\n async uploadVersion(\n file: globalThis.File,\n params: {\n geometry?: boolean;\n properties?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n waitForDone: false,\n }\n ): Promise<File> {\n const result = await this.httpClient\n .postFile(`${this.path}/versions`, file, (progress) => params.onProgress?.(progress, file))\n .then((xhr: XMLHttpRequest) => JSON.parse(xhr.responseText))\n .then((data) => new File(data, this.httpClient));\n\n if (params.geometry === undefined && this.geometryType !== \"\") params.geometry = true;\n if (params.properties === undefined && this.status.properties.state !== \"none\") params.properties = true;\n\n const jobs: string[] = [];\n if (params.geometry) jobs.push((await result.extractGeometry(this.geometryType)).outputFormat);\n if (params.properties) jobs.push((await result.extractProperties()).outputFormat);\n if (params.waitForDone && jobs.length > 0) await result.waitForDone(jobs, true, params);\n\n await this.checkout();\n\n return result;\n }\n\n /**\n * Returns a list of version files.\n *\n * @async\n */\n getVersions(): Promise<File[]> {\n return this.internalGet(\"/versions\")\n .then((response) => response.json())\n .then((files) => files.map((data) => new File(data, this.httpClient)))\n .then((files) => files.map((file) => (file.id == file.originalFileId ? file.useVersion(0) : file)));\n }\n\n /**\n * Returns the version file.\n *\n * @async\n * @param version - Desired version.\n */\n getVersion(version: number): Promise<File> {\n return this.internalGet(`/versions/${version}`)\n .then((response) => response.json())\n .then((data) => new File(data, this.httpClient))\n .then((file) => (file.id == file.originalFileId ? file.useVersion(0) : file));\n }\n\n /**\n * Delete version file.\n *\n * @async\n * @param version - Version to delete.\n */\n async deleteVersion(version: number): Promise<any> {\n const response = await this.internalDelete(`/versions/${version}`);\n const result = await response.json();\n\n await this.checkout();\n\n return result;\n }\n\n /**\n * Replace the active version of the file with the selected version.\n *\n * @async\n * @param version - Desired active version.\n */\n\n setActiveVersion(version: number): Promise<File> {\n return this.update({ activeVersion: version });\n }\n\n /**\n * Use given version instead of active version for current file on client side. This version\n * change will affect the result:\n *\n * - getModels()\n * - getProperties()\n * - searchProperties()\n * - getCdaTree()\n * - download()\n * - downloadResource()\n * - createJob()\n * - extractGeometry()\n * - extractProperties()\n * - validate()\n * - waitForDone()\n * - Viewer.open()\n *\n * Other clients will still continue to use the currently active version of the file. Use\n * `undefined` to revert back to the active version.\n *\n * Note. You need to update the file data using [File.checkout()]{@link File#checkout} to\n * match the size and status fields to the version you selected.\n */\n useVersion(version?: number): this {\n this._useVersion = version;\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json } from \"./impl/Utils\";\n\n/**\n * A roles determines what permissions {@link User | users} have on a {@link Project | project}.\n */\nexport class Role {\n private _data: any;\n protected projectId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements role data storage.\n * @param projectId - Owner project ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, projectId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.projectId = projectId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/projects/${this.projectId}/roles/${this.name}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/projects/${this.projectId}/roles/${this.name}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/projects/${this.projectId}/roles/${this.name}`);\n }\n\n /**\n * Role description.\n */\n get description(): string {\n return this.data.description;\n }\n\n set description(value: string) {\n this._data.description = value;\n }\n\n /**\n * Raw role data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n set data(value: any) {\n this._data = value;\n }\n\n /**\n * Role name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this._data.name = value;\n }\n\n /**\n * Role actions are allowed to be performed.\n *\n * @property {string[]} projectActions - Actions are allowed to be performed at the project\n * level: `update`, `createTopic`, `createDocument`.\n * @property {string[]} topicActions - Actions are allowed to be performed at the topic\n * level: `update`, `updateBimSnippet`, `updateRelatedTopics`, `updateDocumentReferences`,\n * `updateFiles`, `createComment`, `createViewpoint`, `delete`.\n * @property {string[]} commentActions - Actions are allowed to be performed at the comment\n * level: `update`, `delete`.\n * @property {string[]} viewpointActions - Actions are allowed to be performed at the\n * viewpoint level: `delete`.\n * @property {string[]} odaGroupActions - Actions are allowed to be performed at the members\n * level: `update`, `delete`.\n * @property {string[]} odaRoleActions - Actions are allowed to be performed at the roles\n * level: `update`, `delete`.\n */\n get permissions(): any {\n return this.data.permissions;\n }\n\n set permissions(value: any) {\n this.data.permissions = value || {};\n }\n\n /**\n * Refresh role data.\n *\n * @async\n */\n async checkout(): Promise<Role> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update role data on the server.\n *\n * @async\n * @param data - Raw role data.\n */\n async update(data: any): Promise<Role> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Delete a role from the project.\n *\n * @async\n * @returns Returns the raw data of a deleted role.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save role data changes to the server. Call this method to update role data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<Role> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { json, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * Members are the {@link User | users} who have access to the {@link Project | project}.\n */\nexport class Member {\n private _data: any;\n protected projectId: string;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements member data storage.\n * @param projectId - Owner project ID.\n * @param httpClient - Http client.\n */\n constructor(data: any, projectId: string, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.projectId = projectId;\n this.data = data;\n }\n\n private internalGet() {\n return this.httpClient.get(`/projects/${this.projectId}/members/${this.id}`);\n }\n\n private internalPut(body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null) {\n return this.httpClient.put(`/projects/${this.projectId}/members/${this.id}`, body);\n }\n\n private internalDelete() {\n return this.httpClient.delete(`/projects/${this.projectId}/members/${this.id}`);\n }\n\n /**\n * Raw member data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.user.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.user.userId}/avatar`;\n this._data.user.fullName = userFullName(this._data.user);\n this._data.user.initials = userInitials(this._data.user.fullName);\n }\n\n /**\n * Unique member ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * Member role. See {@link Project#getRoles | Project.getRoles()} for more details.\n */\n get role(): string {\n return this.data.role;\n }\n\n set role(value: string) {\n this.data.role = value;\n }\n\n /**\n * Member type. Can be `owner` or `user`.\n *\n * @readonly\n */\n get type(): string {\n return this.data.type;\n }\n\n /**\n * User information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get user(): IShortUserDescription {\n return this.data.user;\n }\n\n /**\n * Refresh member data.\n *\n * @async\n */\n async checkout(): Promise<Member> {\n this.data = await json(this.internalGet());\n return this;\n }\n\n /**\n * Update member data on the server.\n *\n * @async\n * @param data - Raw member data.\n */\n async update(data: any): Promise<Member> {\n this.data = await json(this.internalPut(data));\n return this;\n }\n\n /**\n * Remove a member from a project.\n *\n * @async\n * @returns Returns the raw data of a deleted member.\n */\n delete(): Promise<any> {\n return json(this.internalDelete());\n }\n\n /**\n * Save member data changes to the server. Call this method to update member data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Member> {\n return this.update(this.data);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { IShortUserDescription } from \"./IUser\";\nimport { Role } from \"./Role\";\nimport { Member } from \"./Member\";\nimport { json, text, userFullName, userInitials } from \"./impl/Utils\";\n\n/**\n * Projects are used to collaborate on models and track issues.\n */\nexport class Project {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements project data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n protected internalGet(relativePath: string) {\n return this.httpClient.get(`/projects/${this.id}${relativePath}`);\n }\n\n protected internalPost(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n return this.httpClient.post(`/projects/${this.id}${relativePath}`, body);\n }\n\n protected internalPut(\n relativePath: string,\n body?: ArrayBuffer | Blob | globalThis.File | FormData | object | string | null\n ) {\n return this.httpClient.put(`/projects/${this.id}${relativePath}`, body);\n }\n\n protected internalDelete(relativePath: string) {\n return this.httpClient.delete(`/projects/${this.id}${relativePath}`);\n }\n\n /**\n * Project features the user has access to.\n *\n * @property {string[]} project_actions - Actions are allowed to be performed: `update`,\n * `createTopic`, `createDocument`.\n * @readonly\n */\n get authorization(): any {\n return this.data.authorization;\n }\n\n /**\n * Project creation time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createdAt(): string {\n return this.data.createdAt;\n }\n\n /**\n * Project custom fields object, to store custom data.\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this.data.customFields = value;\n }\n\n /**\n * Raw project data received from the server.\n *\n * @readonly\n */\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.previewUrl = value.avatarUrl ? `${this.httpClient.serverUrl}/projects/${this._data.id}/preview` : \"\";\n this._data.owner.avatarUrl = `${this.httpClient.serverUrl}/users/${this._data.owner.userId}/avatar`;\n this._data.owner.fullName = userFullName(this._data.owner);\n this._data.owner.initials = userInitials(this._data.owner.fullName);\n }\n\n /**\n * Project description.\n */\n get description(): string {\n return this.data.description;\n }\n\n set description(value: string) {\n this.data.description = value;\n }\n\n /**\n * Project end date in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get endDate(): string {\n return this.data.endDate;\n }\n\n set endDate(value: string | Date) {\n this.data.endDate = value instanceof Date ? value.toISOString() : value;\n }\n\n /**\n * Unique project ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * The number of members in the project.\n *\n * @readonly\n */\n get memberCount(): number {\n return this.data.memberCount;\n }\n\n /**\n * The number of models in the project.\n *\n * @readonly\n */\n get modelCount(): number {\n return this.data.modelCount;\n }\n\n /**\n * Project name.\n */\n get name(): string {\n return this.data.name;\n }\n\n set name(value: string) {\n this.data.name = value;\n }\n\n /**\n * Project owner information.\n *\n * @property {string} userId - User ID.\n * @property {string} userName - User name.\n * @property {string} name - First name.\n * @property {string} lastName - Last name.\n * @property {string} fullName - Full name.\n * @property {string} initials - Initials.\n * @property {string} email - User email.\n * @property {string} avatarUrl - User avatar image URL.\n * @readonly\n */\n get owner(): IShortUserDescription {\n return this.data.owner;\n }\n\n /**\n * Project preview image URL. Use [setPreview()]{@link Project#setPreview} to change preview image.\n *\n * @readonly\n */\n get previewUrl(): string {\n return this._data.previewUrl;\n }\n\n /**\n * `true` if project is public (shared) project.\n */\n get public(): boolean {\n return this.data.public;\n }\n\n set public(value: boolean) {\n this.data.public = value;\n }\n\n /**\n * Project start date in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get startDate(): string {\n return this.data.startDate;\n }\n\n set startDate(value: string | Date) {\n this.data.startDate = value instanceof Date ? value.toISOString() : value;\n }\n\n /**\n * The number of topics in the project.\n *\n * @readonly\n */\n get topicCount(): number {\n return this.data.topicCount;\n }\n\n /**\n * Project last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get updatedAt(): string {\n return this.data.updatedAt;\n }\n\n /**\n * Refresh project data.\n *\n * @async\n */\n async checkout(): Promise<Project> {\n this.data = await json(this.internalGet(\"\"));\n return this;\n }\n\n /**\n * Update project data on the server.\n *\n * @async\n * @param data - Raw project data.\n */\n async update(data: any): Promise<Project> {\n this.data = await json(this.internalPut(\"\", data));\n return this;\n }\n\n /**\n * Delete the project from the server.\n *\n * @async\n * @returns Returns the raw data of a deleted project.\n */\n delete(): Promise<any> {\n return text(this.internalDelete(\"\")).then((text) => {\n // TODO fix for server 23.5 and below\n try {\n return JSON.parse(text);\n } catch {\n return { id: this.id };\n }\n });\n }\n\n /**\n * Save project data changes to the server. Call this method to update project data on the\n * server after any changes.\n *\n * @async\n */\n save(): Promise<Project> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the project preview.\n *\n * @async\n * @param image - Preview image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the preview.\n */\n\n async setPreview(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null) {\n if (image) {\n this.data = await json(this.internalPost(\"/preview\", image));\n } else {\n this.data = await json(this.internalDelete(\"/preview\"));\n }\n return this;\n }\n\n /**\n * Returns a list of project roles. Project {@link Member | members} have different abilities\n * depending on the role they have in a project.\n *\n * @async\n */\n getRoles(): Promise<Role[]> {\n return json(this.internalGet(\"/roles\")).then((array) =>\n array.map((data) => new Role(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the role information.\n *\n * @async\n * @param name - Role name.\n */\n getRole(name: string): Promise<Role> {\n return json(this.internalGet(`/roles/${name}`)).then((data) => new Role(data, this.id, this.httpClient));\n }\n\n /**\n * Create a new project role.\n *\n * @async\n * @param name - Role name.\n * @param description - Role description.\n * @param permissions - Actions are allowed to be performed. See\n * {@link Role#permissions | Role.permissions} for more details.\n */\n createRole(name: string, description: string, permissions: any): Promise<Role> {\n return json(\n this.internalPost(\"/roles\", {\n name,\n description,\n permissions: permissions || {},\n })\n ).then((data) => new Role(data, this.id, this.httpClient));\n }\n\n /**\n * Delete project role.\n *\n * @async\n * @param name - Role name.\n * @returns Returns the raw data of a deleted role.\n */\n deleteRole(name: string): Promise<any> {\n return json(this.internalDelete(`/roles/${name}`));\n }\n\n /**\n * Returns a list of project members.\n *\n * @async\n */\n getMembers(): Promise<Member[]> {\n return json(this.internalGet(\"/members\")).then((array) =>\n array.map((data) => new Member(data, this.id, this.httpClient))\n );\n }\n\n /**\n * Returns the member information.\n *\n * @async\n * @param memberId - Member ID.\n */\n getMember(memberId: string): Promise<Member> {\n return json(this.internalGet(`/members/${memberId}`)).then((data) => new Member(data, this.id, this.httpClient));\n }\n\n /**\n * Add a user to the project to become a member and have permission to perform actions.\n *\n * @async\n * @param userId - User ID.\n * @param role - User role from the list of project roles.\n */\n addMember(userId: string, role: string): Promise<Member> {\n return json(this.internalPost(\"/members\", { userId, role })).then(\n (data) => new Member(data, this.id, this.httpClient)\n );\n }\n\n /**\n * Remove a member from a project.\n *\n * @async\n * @param memberId - Member ID.\n * @returns Returns the raw data of a deleted member.\n */\n removeMember(memberId: string): Promise<any> {\n return json(this.internalDelete(`/members/${memberId}`));\n }\n\n /**\n * Information about the file (model) that can be reference in the project topics.\n *\n * @typedef {any} FileInformation\n * @property {any[]} display_information - The list of fields to allow users to associate the\n * file with a server model.\n * @property {string} display_information.field_display_name - Field display name.\n * @property {string} display_information.field_value - Field value.\n * @property {any} file - The file reference object.\n * @property {string} file.file_name - File name.\n * @property {string} file.reference - File ID.\n */\n\n /**\n * Returns a list of project files. To add a file to this list, create a `project` permission\n * on the file using {@link File#createPermission | File.createPermission()}.\n *\n * @async\n */\n getFilesInformation(): Promise<any[]> {\n return json(this.httpClient.get(`/bcf/3.0/projects/${this.data.id}/files_information`)).then((items) => {\n items.forEach((item) => {\n const getFieldValue = (displayName: string) => {\n return (item.display_information.find((x) => x.field_display_name === displayName) || {}).field_value;\n };\n\n const previewUrl = `${this.httpClient.serverUrl}/files/${item.file.reference}/preview`;\n const ownerAvatarUrl = `${this.httpClient.serverUrl}/users/${getFieldValue(\"Owner\")}/avatar`;\n\n const ownerFirstName = getFieldValue(\"Owner First Name\");\n const ownerLastName = getFieldValue(\"Owner Last Name\");\n const ownerUserName = getFieldValue(\"Owner User Name\");\n const ownerFullName = userFullName(ownerFirstName, ownerLastName, ownerUserName);\n const ownerInitials = userInitials(ownerFullName);\n\n item.display_information.push({ field_display_name: \"Preview URL\", field_value: previewUrl });\n item.display_information.push({ field_display_name: \"Owner Avatar URL\", field_value: ownerAvatarUrl });\n item.display_information.push({ field_display_name: \"Owner Full Name\", field_value: ownerFullName });\n item.display_information.push({ field_display_name: \"Owner Initials\", field_value: ownerInitials });\n\n // updatedBy since 24.10\n\n const updatedByAvatarUrl = `${this.httpClient.serverUrl}/users/${getFieldValue(\"Updated By\")}/avatar`;\n\n const updatedByFirstName = getFieldValue(\"Updated By First Name\");\n const updatedByLastName = getFieldValue(\"Updated By Last Name\");\n const updatedByUserName = getFieldValue(\"Updated By User Name\");\n const updatedByFullName = userFullName(updatedByFirstName, updatedByLastName, updatedByUserName);\n const updatedByInitials = userInitials(updatedByFullName);\n\n item.display_information.push({ field_display_name: \"Updated By Avatar URL\", field_value: updatedByAvatarUrl });\n item.display_information.push({ field_display_name: \"Updated By Full Name\", field_value: updatedByFullName });\n item.display_information.push({ field_display_name: \"Updated By Initials\", field_value: updatedByInitials });\n\n // geometryType since 24.12\n\n const geometry = getFieldValue(\"Geometry Status\");\n const geometryGltf = getFieldValue(\"GeometryGltf Status\");\n const geometryType = geometry === \"done\" ? \"vsfx\" : geometryGltf === \"done\" ? \"gltf\" : \"\";\n\n item.display_information.push({ field_display_name: \"Geometry Type\", field_value: geometryType });\n });\n return items;\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IHttpClient } from \"./IHttpClient\";\nimport { json, userFullName, userInitials } from \"./impl/Utils\";\n\nexport interface UserParams {\n /**\n * `true` if user is an administrator\n */\n isAdmin?: boolean;\n\n /**\n * User name\n */\n userName?: string;\n\n /**\n * First name\n */\n firstName?: string;\n\n /**\n * Last name\n */\n lastName?: string;\n\n /**\n * `true` if user is allowed to create a project\n */\n canCreateProject?: boolean;\n\n /**\n * The maximum number of projects that the user can create\n */\n projectsLimit?: number;\n\n /**\n * The size of the file storage available to the user\n */\n storageLimit?: number;\n}\n\n/**\n * The class representing a `user` entity.\n */\nexport class User {\n private _data: any;\n protected httpClient: IHttpClient;\n\n /**\n * @param data - An object that implements user data storage.\n * @param httpClient - Http client.\n */\n constructor(data: any, httpClient: IHttpClient) {\n this.httpClient = httpClient;\n this.data = data;\n }\n\n /**\n * User avatar image URL. Use {@link User#setAvatar | setAvatar()} to change avatar image.\n *\n * @readonly\n */\n get avatarUrl(): string {\n return this._data.avatarUrl;\n }\n\n /**\n * `true` if user is allowed to create a project.\n *\n * @readonly\n */\n get canCreateProject(): boolean {\n return this.data.canCreateProject;\n }\n\n /**\n * User account registration time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n *\n * @readonly\n */\n get createAt(): string {\n return this.data.createAt;\n }\n\n /**\n * User custom fields object, to store custom data.\n */\n get customFields(): any {\n return this.data.customFields;\n }\n\n set customFields(value: any) {\n this._data.customFields = value;\n }\n\n /**\n * Raw user data received from the server.\n *\n * @readonly\n */\n\n get data(): any {\n return this._data;\n }\n\n private set data(value: any) {\n this._data = value;\n this._data.avatarUrl = value.avatarImage ? `${this.httpClient.serverUrl}/users/${this._data.id}/avatar` : \"\";\n this._data.fullName = userFullName(this._data);\n this._data.initials = userInitials(this._data.fullName);\n }\n\n /**\n * User email.\n *\n * @readonly\n */\n get email(): string {\n return this.data.email;\n }\n\n /**\n * The user's email confirmation code, or an empty string if the email has already been confirmed.\n *\n * @readonly\n */\n get emailConfirmationId(): string {\n return this.data.emailConfirmationId;\n }\n\n /**\n * First name.\n */\n get firstName(): string {\n return this.data.firstName;\n }\n\n set firstName(value: string) {\n this._data.firstName = value;\n }\n\n /**\n * Full name. Returns the user's first and last name. If first name and last names are empty,\n * returns the user name.\n */\n get fullName(): string {\n return this.data.fullName;\n }\n\n /**\n * Unique user ID.\n *\n * @readonly\n */\n get id(): string {\n return this.data.id;\n }\n\n /**\n * User initials. Returns a first letters of the user's first and last names. If first name\n * and last names are empty, returns the first letter of the user name.\n */\n get initials(): string {\n return this.data.initials;\n }\n\n /**\n * `false` if the user has not yet confirmed his email address.\n *\n * @readonly\n */\n get isEmailConfirmed(): boolean {\n return this.data.isEmailConfirmed;\n }\n\n /**\n * User last update time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get lastModified(): string {\n return this.data.lastModified;\n }\n\n /**\n * Last name.\n */\n get lastName(): string {\n return this.data.lastName;\n }\n\n set lastName(value: string) {\n this._data.lastName = value;\n }\n\n /**\n * User last sign in time (UTC) in the format specified in <a\n * href=\"https://www.wikipedia.org/wiki/ISO_8601\" target=\"_blank\">ISO 8601</a>.\n */\n get lastSignIn(): string {\n return this.data.lastSignIn;\n }\n\n /**\n * The maximum number of projects that a user can create.\n *\n * @readonly\n */\n get projectsLimit(): number {\n return this.data.projectsLimit;\n }\n\n /**\n * The user's API key.\n *\n * @readonly\n */\n get token(): string {\n return this.data.tokenInfo.token;\n }\n\n /**\n * User name.\n */\n get userName(): string {\n return this.data.userName;\n }\n\n set userName(value: string) {\n this._data.userName = value;\n }\n\n /**\n * Refresh user data. Only admins can checkout other users, if the current logged in user\n * does not have administrator rights, hi can only checkout himself, otherwise an exception\n * will be thrown.\n */\n async checkout(): Promise<User> {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.get(\"/user\"));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.get(`/users/${this.id}`));\n this.data = { id: data.id, ...data.userBrief };\n }\n return this;\n }\n\n /**\n * Update user data on the server. Only admins can update other users, if the current logged\n * in user does not have administrator rights, hi can only update himself, otherwise an\n * exception will be thrown.\n *\n * @async\n * @param data - Raw user data.\n */\n async update(data: any) {\n if (this.id === this.httpClient.signInUserId) {\n const newData = await json(this.httpClient.put(\"/user\", data));\n this.data = { id: this.id, ...newData };\n } else {\n const newData = await json(this.httpClient.put(`/users/${this.id}`, { userBrief: data }));\n this.data = { id: newData.id, ...newData.userBrief };\n }\n return this;\n }\n\n /**\n * Delete a user from the server. Only admins can delete users, if the current logged in user\n * does not have administrator rights, an exception will be thrown.\n *\n * Admins can delete themselves or other admins. An admin can only delete himself if he is\n * not the last administrator.\n *\n * You need to re-login to continue working after deleting the current logged in user.\n *\n * @async\n * @returns Returns the raw data of a deleted user.\n */\n delete(): Promise<any> {\n return json(this.httpClient.delete(`/users/${this.id}`)).then((data) => {\n if (this.id === this.httpClient.signInUserId) {\n this.httpClient.headers = {};\n this.httpClient.signInUserId = \"\";\n }\n return data;\n });\n }\n\n /**\n * Save user data changes to the server. Call this method to update user data on the server\n * after any changes.\n *\n * @async\n */\n save(): Promise<User> {\n return this.update(this.data);\n }\n\n /**\n * Set or remove the user avatar. Only admins can set the avatar of other users, if the\n * current logged in user does not have administrator rights, he can only set his own avatar,\n * otherwise an exception will be thrown.\n *\n * @async\n * @param image - Avatar image. Can be a <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a> string, <a\n * href=\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"\n * target=\"_blank\">ArrayBuffer</a>, <a\n * href=\"https://developer.mozilla.org/docs/Web/API/Blob/Blob\" target=\"_blank\">Blob</a> or\n * Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object. Setting the `image` to `null` will remove the avatar.\n */\n async setAvatar(image?: ArrayBuffer | Blob | globalThis.File | FormData | string | null): Promise<User> {\n if (image) {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.post(\"/user/avatar\", image));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.post(`/users/${this.id}/avatar`, image));\n this.data = { id: data.id, ...data.userBrief };\n }\n } else {\n if (this.id === this.httpClient.signInUserId) {\n const data = await json(this.httpClient.delete(\"/user/avatar\"));\n this.data = { id: this.id, ...data };\n } else {\n const data = await json(this.httpClient.delete(`/users/${this.id}/avatar`));\n this.data = { id: data.id, ...data.userBrief };\n }\n }\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { EventEmitter2 } from \"../Viewer/EventEmitter2\";\nimport { IHttpClient } from \"./IHttpClient\";\nimport { HttpClient } from \"./HttpClient\";\nimport { ClientEventMap } from \"./ClientEvents\";\nimport { Assembly } from \"./Assembly\";\nimport { File } from \"./File\";\nimport { Job } from \"./Job\";\nimport { Project } from \"./Project\";\nimport { User } from \"./User\";\nimport { downloadProgress, json, text, parseArgs } from \"./impl/Utils\";\n\n/**\n * The `Client.js` library class that provides methods to access the [Open Cloud\n * Server](https://cloud.opendesign.com/docs/index.html#/opencloud_server) resources like\n * Projects, Files, Issues etc.\n */\nexport class Client extends EventEmitter2<ClientEventMap> {\n private _serverUrl: string;\n\n private _httpClient: IHttpClient;\n private _user: User | null;\n\n public eventEmitter: EventEmitter2;\n\n /**\n * @param params - An object containing client configuration parameters.\n * @param params.serverUrl - Open Cloud Server URL.\n */\n constructor(params: { serverUrl?: string; url?: string } = {}) {\n super();\n this.configure(params);\n this.eventEmitter = this;\n this._user = null;\n }\n\n /**\n * Open Cloud Server URL. Use {@link Client#configure | configure()} to change server URL.\n *\n * @readonly\n */\n get serverUrl(): string {\n return this._serverUrl;\n }\n\n /**\n * Deprecated since `25.3`. Use [Viewer.options]{@link Viewer#options} instead to change\n * Viewer parameters.\n */\n get options(): any {\n console.warn(\n \"Client.options has been deprecated since 25.3 and will be removed in a future release, use Viewer.options instead.\"\n );\n const data = {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: { red: 0xff, green: 0x98, blue: 0x00 },\n edgesColor: { r: 0xff, g: 0x98, b: 0x00 },\n facesColor: { r: 0xff, g: 0x98, b: 0x00 },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n };\n return {\n ...data,\n data,\n defaults: () => data,\n resetToDefaults: () => {},\n saveToStorage: () => {},\n loadFromStorage: () => {},\n };\n }\n\n /**\n * Change the client configuration parameters.\n *\n * @param params - An object containing new configuration parameters.\n * @param params.serverUrl - Open Cloud Server URL.\n * @returns Returns a reference to the `Client`.\n */\n configure(params: { serverUrl?: string }): this {\n this._serverUrl = (params.serverUrl || \"\").replace(/\\/+$/, \"\");\n this._httpClient = new HttpClient(this.serverUrl);\n this._user = null;\n return this;\n }\n\n /**\n * The Object represents server version information.\n *\n * @typedef {any} VersionResult\n * @property {string} version - The server version.\n * @property {string} hash - Build hash.\n */\n\n /**\n * Returns server version.\n *\n * @async\n */\n version(): Promise<any> {\n return this._httpClient\n .get(\"/version\")\n .then((response) => response.json())\n .then((data) => ({\n ...data,\n server: data.version,\n client: \"CLIENT_JS_VERSION\",\n }));\n }\n\n /**\n * Register a new user with the specified email and password.\n *\n * @async\n * @param email - User email. Cannot be empty.\n * @param password - User password. Cannot be empty. Password can only contain letters (a-z,\n * A-Z), numbers (0-9), and special characters (~!@#$%^&*()_-+={}[]:;\"'`<>,.?|/\\ ).\n * @param userName - User name. Cannot be empty or blank if defined. Leave undefined to use\n * `username` from email.\n */\n registerUser(email: string, password: string, userName?: string): Promise<any> {\n return this._httpClient\n .post(\"/register\", {\n email,\n password,\n userName: userName ?? (email + \"\").split(\"@\").at(0),\n })\n .then((response) => response.json());\n }\n\n /**\n * Resend the Confirmation Email to new user. If the user's email is already confirmed, an\n * exception will be thrown.\n *\n * @async\n * @param email - User email.\n * @param password - User password.\n */\n resendConfirmationEmail(email: string, password: string): Promise<any> {\n return this._httpClient\n .post(\"/register/email-confirmation\", { email, password })\n .then((response) => response.json());\n }\n\n /**\n * Confirm the user's email. If the user's email is already confirmed, an exception will be thrown.\n *\n * @async\n * @param emailConfirmationId - Confirmation code from the Confirmation Email.\n */\n confirmUserEmail(emailConfirmationId: string): Promise<any> {\n return this._httpClient\n .get(`/register/email-confirmation/${emailConfirmationId}`)\n .then((response) => response.json());\n }\n\n /**\n * Log in an existing user using email or user name.\n *\n * @async\n * @param email - An email or user name for authentication request.\n * @param password - Password for authentication request.\n */\n async signInWithEmail(email: string, password: string): Promise<User> {\n const credentials = btoa(unescape(encodeURIComponent(email + \":\" + password)));\n this._httpClient.headers = { Authorization: \"Basic \" + credentials };\n const data = await json(this._httpClient.get(\"/token\"));\n return this.setCurrentUser(data);\n }\n\n /**\n * Log in an existing user using API Key.\n *\n * @async\n * @param token - An access token for authentication request. See\n * {@link User#token | User.token} for more details.\n */\n async signInWithToken(token: string): Promise<User> {\n this._httpClient.headers = { Authorization: token };\n const data = await json(this._httpClient.get(\"/user\"));\n return this.setCurrentUser(data);\n }\n\n // Save the current logged in user information for internal use.\n\n private setCurrentUser(data: any): User {\n this._user = new User(data, this._httpClient);\n this._httpClient.headers = { Authorization: data.tokenInfo.token };\n this._httpClient.signInUserId = this._user.id;\n return this._user;\n }\n\n private clearCurrentUser(): void {\n this._user = null;\n this._httpClient.headers = {};\n this._httpClient.signInUserId = \"\";\n }\n\n /**\n * Returns the current logged in user information. Returns `null` if the user is not logged\n * in or the logged in user has deleted himself.\n */\n getCurrentUser(): User | null {\n if (this._user && !this._httpClient.signInUserId) this._user = null;\n return this._user;\n }\n\n /**\n * Returns a list of server users. Only admins can get a list of users, if the current logged\n * in user does not have administrator rights, an exception will be thrown.\n *\n * @async\n */\n getUsers(): Promise<User[]> {\n return json(this._httpClient.get(\"/users\"))\n .then((array) => array.map((data) => ({ id: data.id, ...data.userBrief })))\n .then((array) => array.map((data) => new User(data, this._httpClient)));\n }\n\n /**\n * Returns the user information. Only admins can get other users, if the current logged in\n * user does not have administrator rights, hi can only get himself, otherwise an exception\n * will be thrown.\n *\n * @async\n * @param userId - User ID.\n */\n getUser(userId: string): Promise<User> {\n if (userId === this._httpClient.signInUserId) {\n return json(this._httpClient.get(\"/user\"))\n .then((data) => ({ id: userId, ...data }))\n .then((data) => new User(data, this._httpClient));\n } else {\n return json(this._httpClient.get(`/users/${userId}`))\n .then((data) => ({ id: data.id, ...data.userBrief }))\n .then((data) => new User(data, this._httpClient));\n }\n }\n\n /**\n * Create a new user. Only admins can create users, if the current logged in user does not\n * have administrator rights, an exception will be thrown.\n *\n * @async\n * @param email - User email. Cannot be empty.\n * @param password - User password. Cannot be empty. Password can only contain latin letters\n * (a-z, A-Z), numbers (0-9), and special characters (~!@#$%^&*()_-+={}[]:;\"'`<>,.?|/\\ ).\n * @param params - Additional user data.\n * @param params.isAdmin - `true` if user is an administrator.\n * @param params.userName - User name. Cannot be empty or blank if defined. Leave undefined\n * to use `username` from email.\n * @param params.firstName - First name.\n * @param params.lastName - Last name.\n * @param params.canCreateProject - `true` if user is allowed to create a project.\n * @param params.projectsLimit - The maximum number of projects that the user can create.\n * @param params.storageLimit - The size of the file storage available to the user.\n */\n createUser(\n email: string,\n password: string,\n params: {\n isAdmin?: boolean;\n userName?: string;\n firstName?: string;\n lastName?: string;\n canCreateProject?: boolean;\n projectsLimit?: number;\n storageLimit?: number;\n } = {}\n ): Promise<User> {\n const { isAdmin, userName, ...rest } = params;\n return json(\n this._httpClient.post(\"/users\", {\n isAdmin,\n userBrief: {\n ...rest,\n email,\n userName: userName ?? (email + \"\").split(\"@\").at(0),\n },\n password,\n })\n )\n .then((data) => ({ id: data.id, ...data.userBrief }))\n .then((data) => new User(data, this._httpClient));\n }\n\n /**\n * Delete a user from the server. Only admins can delete users, if the current logged in user\n * does not have administrator rights, an exception will be thrown.\n *\n * Admins can delete themselves or other admins. An admin can only delete himself if he is\n * not the last administrator.\n *\n * You need to re-login to continue working after deleting the current logged in user.\n *\n * @async\n * @param userId - User ID.\n * @returns Returns the raw data of a deleted user.\n */\n deleteUser(userId: string): Promise<any> {\n return json(this._httpClient.delete(`/users/${userId}`)).then((data) => {\n if (userId === this._httpClient.signInUserId) {\n this.clearCurrentUser();\n }\n return data;\n });\n }\n\n /**\n * Result for file list.\n *\n * @typedef {any} FilesResult\n * @property {number} allSize - Total number of files the user has access to.\n * @property {number} start - The starting index in the file list in the request.\n * @property {number} limit - The maximum number of requested files.\n * @property {File[]} result - Result file list.\n * @property {number} size - The number of files in the result list.\n */\n\n /**\n * Returns a list of files the user has access to.\n *\n * @async\n * @param start - The starting index in the file list. Used for paging.\n * @param limit - The maximum number of files that should be returned per request. Used for paging.\n * @param name - Filter the files by part of the name.\n * @param ext - Filter the files by extension. Extension can be `dgn`, `dwf`, `dwg`, `dxf`,\n * `ifc`, `ifczip`, `nwc`, `nwd`, `obj`, `rcs`, `rfa`, `rvt`, `step`, `stl`, `stp`, `vsf`,\n * or any other drawing or reference file type extension. You can specify multiple\n * extensions on one `string` by separating them with a \"|\".\n * @param ids - List of file IDs to return. You can specify multiple IDs on one `string` by\n * separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default,\n * files are sorted by name in ascending order.\n * @param {string} sortField - Allows to specify sort field.\n */\n getFiles(\n start?: number,\n limit?: number,\n name?: string,\n ext?: string | string[],\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: File[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ext) {\n if (Array.isArray(ext)) ext = ext.join(\"|\");\n if (typeof ext === \"string\") ext = ext.toLowerCase();\n if (ext) searchParams.set(\"ext\", ext);\n }\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/files${queryString}`)).then((files) => {\n return {\n ...files,\n result: files.result.map((data) => new File(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Returns the file information.\n *\n * @async\n * @param fileId - File ID.\n */\n getFile(fileId: string): Promise<File> {\n return json(this._httpClient.get(`/files/${fileId}`)).then((data) => new File(data, this._httpClient));\n }\n\n /**\n * Upload a drawing or reference file to the server.\n *\n * Fires:\n *\n * - {@link UploadProgressEvent | uploadprogress}\n *\n * @async\n * @param file - Web API <a href=\"https://developer.mozilla.org/docs/Web/API/File\"\n * target=\"_blank\">File</a> object are generally retrieved from a <a\n * href=\"https://developer.mozilla.org/docs/Web/API/FileList\" target=\"_blank\">FileList</a>\n * object returned as a result of a user selecting files using the HTML `<input>` element.\n * @param params - An object containing upload parameters.\n * @param params.geometry=true - Create job to extract file geometry data. Can be:\n *\n * - `true` - Extract file geometry data into `VSFX` to open the file in `VisualizeJS` viewer.\n * - `vsfx` - Extract file geometry data into `VSFX` to open the file in `VisualizeJS` viewer.\n * - `gltf` - Extract file geometry data into `glTF` to open the file in `Three.js` viewer.\n *\n * @param params.properties=false - Create job to extract file properties.\n * @param params.waitForDone=false - Wait for geometry and properties jobs to complete.\n * @param params.timeout - The time, in milliseconds that the function should wait jobs. If\n * no one jobs are done during this time, the `TimeoutError` exception will be thrown.\n * @param params.interval - The time, in milliseconds, the function should delay in between\n * checking jobs status.\n * @param params.signal - An <a\n * href=\"https://developer.mozilla.org/docs/Web/API/AbortController\">AbortController</a>\n * signal object instance, which can be used to abort waiting as desired.\n * @param params.onProgress - Upload progress callback.\n */\n async uploadFile(\n file: globalThis.File,\n params: {\n geometry?: boolean | string;\n properties?: boolean;\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n onProgress?: (progress: number, file: globalThis.File) => void;\n } = {\n geometry: true,\n properties: false,\n waitForDone: false,\n }\n ): Promise<File> {\n const result = await this._httpClient\n .postFile(\"/files\", file, (progress) => {\n this.emitEvent({ type: \"uploadprogress\", data: progress, file });\n params.onProgress?.(progress, file);\n })\n .then((xhr: XMLHttpRequest) => JSON.parse(xhr.responseText))\n .then((data) => new File(data, this._httpClient));\n\n const geometryType = typeof params.geometry === \"string\" ? params.geometry : \"vsfx\";\n\n const jobs: string[] = [];\n if (params.geometry) jobs.push((await result.extractGeometry(geometryType)).outputFormat);\n if (params.properties) jobs.push((await result.extractProperties()).outputFormat);\n if (params.waitForDone && jobs.length > 0) await result.waitForDone(jobs, true, params);\n\n return result;\n }\n\n /**\n * Delete the drawing or reference file from the server.\n *\n * @async\n * @param fileId - File ID.\n * @returns Returns the raw data of a deleted file.\n */\n deleteFile(fileId: string): Promise<any> {\n return json(this._httpClient.delete(`/files/${fileId}`));\n }\n\n /**\n * Download the drawing or reference file.\n *\n * @async\n * @param fileId - File ID.\n * @param onProgress - Download progress callback.\n * @param signal - An <a href=\"https://developer.mozilla.org/docs/Web/API/AbortSignal\" target\n * =\"_blank\">AbortSignal</a> object instance. Allows to communicate with a fetch request\n * and abort it if desired.\n */\n downloadFile(fileId: string, onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ArrayBuffer> {\n return this._httpClient\n .get(`/files/${fileId}/downloads`, signal)\n .then((response) => downloadProgress(response, onProgress))\n .then((response) => response.arrayBuffer());\n }\n\n /**\n * Result for job list.\n *\n * @typedef {any} JobsResult\n * @property {number} allSize - Total number of jobs created by the user.\n * @property {number} start - The starting index in the job list in the request.\n * @property {number} limit - The maximum number of requested jobs.\n * @property {Job[]} result - Result job list.\n * @property {number} size - The number of jobs in the result list.\n */\n\n /**\n * Returns a list of jobs created by current user.\n *\n * @async\n * @param status - Filter the jobs by status. Status can be `waiting`, `inpogress`, `done` or\n * `failed`. You can specify multiple statuses on one `string` by separating them with a \"|\".\n * @param limit - The maximum number of jobs that should be returned per request. Used for paging.\n * @param start - The starting index in the job list. Used for paging.\n * @param sortByDesc - Allows to specify the descending order of the result. By default, jobs\n * are sorted by creation time in ascending order.\n * @param {boolean} sortField - Allows to specify sort field.\n */\n getJobs(\n status?: string | string[],\n limit?: number,\n start?: number,\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: Job[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (status) {\n if (Array.isArray(status)) status = status.join(\"|\");\n if (typeof status === \"string\") status = status.trim().toLowerCase();\n if (status) searchParams.set(\"status\", status);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/jobs${queryString}`)).then((jobs) => ({\n ...jobs,\n result: jobs.result.map((data) => new Job(data, this._httpClient)),\n }));\n }\n\n /**\n * Returns the job information.\n *\n * @async\n * @param jobId - Job ID.\n */\n getJob(jobId: string): Promise<Job> {\n return json(this._httpClient.get(`/jobs/${jobId}`)).then((data) => new Job(data, this._httpClient));\n }\n\n /**\n * Create a new job.\n *\n * @async\n * @param fileId - File ID.\n * @param outputFormat - The job type. Can be one of:\n *\n * - `geometry` - Extract file geometry data into `VSFX`.\n * - `geometryGltf` - Extract file geometry data into `glTF`.\n * - `properties` - Extract file properties.\n * - `validation` - Validate the file. Only for `IFC`.\n * - `dwg`, `obj`, `gltf`, `glb`, `vsf`, `pdf`, `3dpdf` - Export file to the one of the supported format.\n * - Other custom job name. Custom job runner must be registered in the job templates table\n * before creating a job.\n *\n * @param parameters - Parameters for the job runner. Can be given as command line arguments\n * for the File Converter tool in form \"--arg=value\".\n */\n createJob(fileId: string, outputFormat: string, parameters?: string | object): Promise<Job> {\n return this._httpClient\n .post(\"/jobs\", {\n fileId,\n outputFormat,\n parameters: parseArgs(parameters),\n })\n .then((response) => response.json())\n .then((data) => new Job(data, this._httpClient));\n }\n\n /**\n * Remove a job from the server job list. The method does not delete or stop jobs that are\n * already being executed.\n *\n * @async\n * @param jobId - Job ID.\n * @returns Returns the raw data of a deleted job.\n */\n deleteJob(jobId: string): Promise<any> {\n return json(this._httpClient.delete(`/jobs/${jobId}`));\n }\n\n /**\n * Result for assembly list.\n *\n * @typedef {any} AssembliesResult\n * @property {number} allSize - Total number of assemblies the user has access to.\n * @property {number} start - The starting index in the assembly list in the request.\n * @property {number} limit - The maximum number of requested assemblies.\n * @property {Assembly[]} result - Result assembly list.\n * @property {number} size - The number of assemblies in the result list.\n */\n\n /**\n * Returns a list of assemblies the user has access to.\n *\n * @async\n * @param start - The starting index in the assembly list. Used for paging.\n * @param limit - The maximum number of assemblies that should be returned per request. Used\n * for paging.\n * @param name - Filter the assemblies by part of the name.\n * @param ids - List of assembly IDs to return. You can specify multiple IDs on one `string`\n * by separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default\n * assemblies are sorted by name in ascending order.\n * @param sortField - Allows to specify sort field.\n */\n getAssemblies(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean,\n sortField?: string\n ): Promise<{ allSize: number; start: number; limit: number; result: Assembly[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n if (sortField) searchParams.set(\"sortField\", sortField);\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n\n return json(this._httpClient.get(`/assemblies${queryString}`)).then((assemblies) => {\n return {\n ...assemblies,\n result: assemblies.result.map((data) => new Assembly(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Get assembly information.\n *\n * @async\n * @param assemblyId - Assembly ID.\n */\n getAssembly(assemblyId: string): Promise<Assembly> {\n return json(this._httpClient.get(`/assemblies/${assemblyId}`)).then((data) => new Assembly(data, this._httpClient));\n }\n\n /**\n * Create a new assembly.\n *\n * @async\n * @param files - List of file IDs.\n * @param name - Assembly name.\n * @param params - An object containing upload parameters.\n * @param params.waitForDone=false - Wait for assembly to be created.\n */\n createAssembly(\n files: string[],\n name: string,\n params?: {\n waitForDone?: boolean;\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n }\n ): Promise<Assembly> {\n const { waitForDone } = params ?? {};\n return this._httpClient\n .post(\"/assemblies\", { name, files })\n .then((response) => response.json())\n .then((data) => new Assembly(data, this._httpClient))\n .then((result) => (waitForDone ? result.waitForDone(params) : result));\n }\n\n /**\n * Delete the assembly from the server.\n *\n * @async\n * @param assemblyId - Assembly ID.\n * @returns Returns the raw data of a deleted assembly.\n */\n deleteAssembly(assemblyId: string): Promise<any> {\n return json(this._httpClient.delete(`/assemblies/${assemblyId}`));\n }\n\n /**\n * Result for project list.\n *\n * @typedef {any} ProjectsResult\n * @property {number} allSize - Total number of projects the user has access to.\n * @property {number} start - The starting index in the project list in the request.\n * @property {number} limit - The maximum number of requested projects.\n * @property {Project[]} result - Result project list.\n * @property {number} size - The number of projects in the result list.\n */\n\n /**\n * Returns a list of projects the user has access to.\n *\n * @async\n * @param start - The starting index in the project list. Used for paging.\n * @param limit - The maximum number of projects that should be returned per request. Used for paging.\n * @param name - Filter the projects by part of the name.\n * @param ids - List of project IDs to return. You can specify multiple IDs on one `string`\n * by separating them with a \"|\".\n * @param sortByDesc - Allows to specify the descending order of the result. By default\n * projects are sorted by name in ascending order.\n */\n getProjects(\n start?: number,\n limit?: number,\n name?: string,\n ids?: string | string[],\n sortByDesc?: boolean\n ): Promise<{ allSize: number; start: number; limit: number; result: Project[]; size: number }> {\n const searchParams = new URLSearchParams();\n if (start > 0) searchParams.set(\"start\", start.toString());\n if (limit > 0) searchParams.set(\"limit\", limit.toString());\n if (name) searchParams.set(\"name\", name);\n if (ids) {\n if (Array.isArray(ids)) ids = ids.join(\"|\");\n if (typeof ids === \"string\") ids = ids.trim();\n if (ids) searchParams.set(\"id\", ids);\n }\n if (sortByDesc !== undefined) searchParams.set(\"sortBy\", sortByDesc ? \"desc\" : \"asc\");\n\n let queryString = searchParams.toString();\n if (queryString) queryString = \"?\" + queryString;\n return json(this._httpClient.get(`/projects${queryString}`))\n .then((projects) => {\n // fix for server 23.5 and below\n if (Array.isArray(projects)) {\n let result = projects;\n if (ids) result = result.filter((x) => ids.includes(x.id));\n if (name) result = result.filter((x) => x.name.includes(name));\n if (limit > 0) {\n const begin = start > 0 ? start : 0;\n result = result.slice(begin, begin + limit);\n }\n return {\n allSize: projects.length,\n start,\n limit,\n result,\n size: result.length,\n };\n }\n return projects;\n })\n .then((projects) => {\n return {\n ...projects,\n result: projects.result.map((data) => new Project(data, this._httpClient)),\n };\n });\n }\n\n /**\n * Returns the project information.\n *\n * @async\n * @param projectId - Project ID.\n */\n getProject(projectId: string): Promise<Project> {\n return json(this._httpClient.get(`/projects/${projectId}`)).then((data) => new Project(data, this._httpClient));\n }\n\n /**\n * Create a new project.\n *\n * @async\n * @param name - Project name.\n * @param description - Project description.\n * @param startDate - Project start date.\n * @param endDate - Project end date.\n * @param avatarUrl - Project preview image URL. Can be <a\n * href=\"https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\"\n * target=\"_blank\">Data URL</a>.\n */\n createProject(\n name: string,\n description?: string,\n startDate?: Date | string,\n endDate?: Date | string,\n avatarUrl?: string\n ): Promise<Project> {\n return json(\n this._httpClient.post(\"/projects\", {\n name,\n description,\n startDate: startDate instanceof Date ? startDate.toISOString() : startDate,\n endDate: endDate instanceof Date ? endDate.toISOString() : endDate,\n avatarUrl,\n })\n ).then((data) => new Project(data, this._httpClient));\n }\n\n /**\n * Delete the project from the server.\n *\n * @async\n * @param projectId - Project ID.\n * @returns Returns the raw data of a deleted project.\n */\n deleteProject(projectId: string): Promise<any> {\n return text(this._httpClient.delete(`/projects/${projectId}`)).then((text) => {\n // fix for server 23.5 and below\n try {\n return JSON.parse(text);\n } catch {\n return { id: projectId };\n }\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IViewer } from \"./IViewer\";\nimport { ICommand, ICommandHandler, ICommandDescription, ICommandsMap, ICommands } from \"./ICommands\";\n\nclass Commands implements ICommands {\n private readonly _commands = new Map<string, ICommand>();\n\n registerCommand(id: string, handler: ICommandHandler, description?: ICommandDescription, thisArg?: any): void {\n this._commands.set(id, { id, handler, thisArg, description });\n }\n\n registerCommandAlias(id: string, alias: string): void {\n this.registerCommand(alias, (viewer: IViewer, ...args) => this.executeCommand(id, viewer, ...args));\n }\n\n getCommand(id: string): ICommand | undefined {\n return this._commands.get(id);\n }\n\n getCommands(): ICommandsMap {\n const map = new Map<string, ICommand>();\n this._commands.forEach((value, key) => map.set(key, value));\n return map;\n }\n\n executeCommand(id: string, viewer: IViewer, ...args: any[]): any {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n\n const { handler, thisArg } = command;\n const result = handler.apply(thisArg, [viewer, ...args]);\n\n viewer?.emit({ type: \"command\", data: id, args });\n\n return result;\n }\n}\n\nconst _commands = new Map<string, Commands>();\n\nexport function commands(viewerType: string): ICommands {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands();\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", () => {});\ncommands(\"ThreeJS\").registerCommand(\"noop\", () => {});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Matrix3d, OdTvPlane, Point3d, Vector3d } from \"./Geometry\";\n\nexport type ViewParams = {\n position: number[];\n target: number[];\n upVector: number[];\n viewFieldWidth: number;\n viewFieldHeight: number;\n perspective: boolean;\n};\n\nexport class OdaGeAction {\n protected m_module;\n\n constructor(module: any) {\n this.m_module = module;\n }\n\n protected getViewer(): any {\n return this.m_module.getViewer();\n }\n\n protected getModel(): any {\n return this.getViewer().getMarkupModel();\n }\n\n protected copyPoint(point: Point3d): Point3d {\n const p: Point3d = new this.m_module.Point3d();\n p.set(point.x, point.y, point.z);\n return p;\n }\n\n protected createVector3d(): Vector3d {\n return new this.m_module.Vector3d();\n }\n\n protected createPoint3d(): Point3d {\n return new this.m_module.Point3d();\n }\n\n protected createMatrix3d(): Matrix3d {\n return new this.m_module.Matrix3d();\n }\n\n protected createPlane(): OdTvPlane {\n return new this.m_module.OdTvPlane();\n }\n\n protected toVector(geVector): Vector3d {\n return this.m_module.Vector3d.createFromArray(geVector);\n }\n\n protected toGeVector(v: Vector3d): number[] {\n return [v.x, v.y, v.z];\n }\n\n protected toGePoint(point: Point3d): number[] {\n return [point.x, point.y, point.z];\n }\n\n protected toPoint(gePoint: number[]): Point3d {\n return this.m_module.Point3d.createFromArray(gePoint);\n }\n\n protected screenToWorld(x: number, y: number): Point3d {\n return this.toPoint(this.m_module.getViewer().screenToWorld(x, y));\n }\n\n protected toDoubleArray(points: Point3d[]): number[] {\n const p: number[] = [];\n for (let i = 0; i < points.length; i++) {\n p.push(points[i].x);\n p.push(points[i].y);\n p.push(points[i].z);\n }\n return p;\n }\n\n protected correctCameraTarget(): void {\n const params = this.getViewParams();\n const ext = this.m_module.getViewer().getActiveExtents();\n const { min, max } = ext;\n const target = this.toPoint(params.target);\n\n const contains =\n target.x >= min.x &&\n target.y >= min.y &&\n target.z >= min.z &&\n target.x <= max.x &&\n target.y <= max.y &&\n target.z <= max.z;\n if (!contains) {\n params.target = ext.center();\n this.setViewParams(params);\n }\n }\n\n protected setViewParams = (params: ViewParams) => {\n const extView = this.m_module.getViewer().getActiveTvExtendedView();\n extView.setView(\n params.position,\n params.target,\n params.upVector,\n params.viewFieldWidth,\n params.viewFieldHeight,\n params.perspective\n );\n extView.delete?.();\n };\n\n protected getViewParams = () => {\n const view = this.m_module.getViewer().activeView;\n const obj = {\n position: view.viewPosition,\n target: view.viewTarget,\n upVector: view.upVector,\n viewFieldWidth: view.viewFieldWidth,\n viewFieldHeight: view.viewFieldHeight,\n perspective: view.perspective,\n } as ViewParams;\n view.delete?.();\n return obj;\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\n\nimport { Viewer } from \"../../Viewer\";\nimport { CANVAS_EVENTS } from \"../../CanvasEvents\";\nimport { Point2d } from \"./Geometry\";\nimport { OdaGeAction } from \"./OdaGeAction\";\n\nconst CLICK_DELTA = 5;\n\nconst INTERACTIVITY_FPS = 24;\n\n/**\n * A [Viewer]{@link Viewer} event that fires when the viewer needs to be updated.\n *\n * @property {string} type - `update`\n * @event update\n */\n\n/**\n * A [Viewer]{@link Viewer} event that fires when the user selects an entity with the mouse.\n *\n * @property {string} type - `select`\n * @property {OdTvSelectionSet} data - The set of selected entities. For more information, see\n * [OdTvSelectionSet](https://cloud.opendesign.com/docs/index.html#/vis/OdTvSelectionSet?id=odtvselectionset).\n * @event select\n */\n\nexport class OdBaseDragger extends OdaGeAction {\n protected subject: Viewer;\n protected needInputText: boolean;\n protected mouseDownPosition: Point2d;\n protected autoSelect: boolean;\n protected onmessage: (event: any) => boolean;\n protected canvasEvents: string[];\n protected isDragging: boolean;\n protected press: boolean;\n\n public name: string;\n\n constructor(subject: Viewer) {\n super(subject.visualizeJs);\n this.subject = subject;\n this.needInputText = false;\n this.mouseDownPosition = { x: 0, y: 0 };\n this.autoSelect = false;\n\n this.onmessage = (event) => this.subject.emitEvent(event);\n this.canvasEvents = CANVAS_EVENTS;\n }\n\n public initialize(): void {\n this.canvasEvents = this.canvasEvents.filter((x) => typeof this[x] === \"function\");\n this.canvasEvents.forEach((x) => (this[x] = this[x].bind(this)));\n this.canvasEvents.forEach((x) => this.subject.on(x, this[x]));\n\n this.getViewer().setEnableAutoSelect(!!this.autoSelect);\n }\n\n public dispose(): void {\n this.canvasEvents.forEach((x) => this.subject.off(x, this[x]));\n }\n\n protected relativeCoords(event: MouseEvent): Point2d {\n return { x: event.offsetX * window.devicePixelRatio, y: event.offsetY * window.devicePixelRatio };\n }\n\n protected pointerdown(ev: PointerEvent): void {\n if (!ev.isPrimary || OdBaseDragger.isGestureActive) {\n return;\n }\n\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n\n const relCoord = this.relativeCoords(ev);\n this.isDragging = true;\n this.mouseDownPosition = { x: relCoord.x, y: relCoord.y };\n this.start(relCoord.x, relCoord.y, ev.clientX, ev.clientY);\n this.subject.update();\n }\n\n protected pointerup(ev: PointerEvent): void {\n if (OdBaseDragger.needSkipPointerUp) {\n return;\n }\n\n if (!ev.isPrimary) {\n return;\n }\n\n (ev.target as HTMLElement).releasePointerCapture(ev.pointerId);\n\n const relCoord = this.relativeCoords(ev);\n this.end(relCoord.x, relCoord.y);\n this.isDragging = false;\n this.subject.update();\n }\n\n protected pointercancel(ev: PointerEvent): void {\n if (!ev.isPrimary) {\n return;\n }\n\n this.m_module.canvas.dispatchEvent(new PointerEvent(\"pointerup\", ev));\n }\n\n protected pointermove(ev: PointerEvent): void {\n if (!ev.isPrimary || OdBaseDragger.isGestureActive) {\n return;\n }\n\n const relCoord = this.relativeCoords(ev);\n this.drag(relCoord.x, relCoord.y, ev.movementX, ev.movementY);\n if (this.isDragging) {\n this.subject.update();\n }\n }\n\n protected click(ev: MouseEvent): void {\n const viewer = this.getViewer();\n const relCoord = this.relativeCoords(ev);\n const x = relCoord.x;\n const y = relCoord.y;\n\n const isNotDragging =\n Math.abs(x - this.mouseDownPosition.x) < CLICK_DELTA && Math.abs(y - this.mouseDownPosition.y) < CLICK_DELTA;\n\n if (viewer && viewer.getEnableAutoSelect() && isNotDragging) {\n viewer.unselect();\n viewer.select(x, y, x, y);\n this.subject.update();\n\n const selectionSet = viewer.getSelected();\n const handles = this.subject.getSelected();\n this.onmessage({ type: \"select\", data: selectionSet, handles });\n }\n }\n\n protected dblclick(ev: MouseEvent): void {\n const viewer = this.getViewer();\n const relCoord = this.relativeCoords(ev);\n const x = relCoord.x;\n const y = relCoord.y;\n\n const device = viewer.getActiveDevice();\n const clickView = device.viewAt([x, y]);\n if (clickView && !clickView.active) {\n viewer.activeView = clickView;\n clickView.delete();\n this.subject.update();\n } else {\n if (viewer && viewer.getEnableAutoSelect()) {\n const pSelected = viewer.getSelected();\n\n if (!pSelected.isNull() && pSelected.numItems() !== 0) {\n const itr = pSelected.getIterator();\n const entity = itr.getEntity();\n viewer.zoomToEntity(entity);\n\n this.onmessage({ type: \"zoomtoentity\", data: entity });\n this.subject.update();\n\n this.deleteAll([itr, entity]);\n }\n }\n }\n\n device.delete();\n }\n\n protected start(x: number, y: number, absoluteX = 0, absoluteY = 0): void {}\n\n protected drag(x: number, y: number, absoluteX = 0, absoluteY = 0): void {}\n\n protected end(x: number, y: number): void {}\n\n protected beginInteractivity = () => {\n const viewer = this.getViewer();\n const view = viewer.activeView;\n if (view[\"beginInteractivity\"]) {\n view.beginInteractivity(INTERACTIVITY_FPS);\n this.subject.update();\n }\n view.delete();\n };\n\n protected endInteractivity = () => {\n const viewer = this.getViewer();\n const view = viewer.activeView;\n if (view[\"endInteractivity\"]) {\n view.endInteractivity();\n\n const device = this.getViewer().getActiveDevice();\n const canvas = this.m_module.canvas;\n device.invalidate([0, 0, canvas.width, canvas.height]);\n device.delete();\n this.subject.update();\n }\n view.delete();\n };\n\n protected getActiveMarkupEntity(entityName: string): any {\n return this.subject.addMarkupEntity(entityName);\n }\n\n private syncOverlayView(): any {\n return this.subject.syncOverlay();\n }\n\n protected deleteAll(objects): void {\n for (const obj of objects) {\n obj?.delete?.();\n }\n }\n\n public updatePreview(): void {}\n\n private static _isGestureActive = false;\n\n protected static set isGestureActive(value: boolean) {\n if (OdBaseDragger._isGestureActive === value) {\n return;\n }\n\n OdBaseDragger._isGestureActive = value;\n if (OdBaseDragger._isGestureActive) {\n OdBaseDragger.needSkipPointerUp = true;\n }\n }\n\n protected static get isGestureActive() {\n return OdBaseDragger._isGestureActive;\n }\n\n private static _needSkipPointerUp = false;\n\n private static get needSkipPointerUp() {\n if (OdBaseDragger._needSkipPointerUp) {\n OdBaseDragger.needSkipPointerUp = false;\n return true;\n }\n\n return false;\n }\n\n private static set needSkipPointerUp(value: boolean) {\n OdBaseDragger._needSkipPointerUp = value;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { EventEmitter2 } from \"./EventEmitter2\";\n\nexport interface RGB {\n red: number;\n green: number;\n blue: number;\n}\n\n/**\n * `VisualizeJS` parameters.\n */\nexport interface OptionsData {\n /**\n * Show WCS\n *\n * @defaultValue true\n */\n showWCS?: boolean;\n\n /**\n * Enable camera animation\n *\n * @defaultValue true\n */\n cameraAnimation?: boolean;\n\n /**\n * Enable antialiasing use FXAA\n *\n * @defaultValue true\n */\n antialiasing?: boolean;\n\n /**\n * Enable ground shadows\n *\n * @defaultValue false\n */\n groundShadow?: boolean;\n\n /**\n * Enable shadows\n *\n * @defaultValue false\n */\n shadows?: boolean;\n\n /**\n * Camera speed on X axis\n *\n * @defaultValue 4\n */\n cameraAxisXSpeed?: number;\n\n /**\n * Camera speed on Y axis\n *\n * @defaultValue 1\n */\n cameraAxisYSpeed?: number;\n\n /**\n * Ambient occlusion\n *\n * @defaultValue false\n */\n ambientOcclusion?: boolean;\n\n /**\n * Enable streaming mode\n *\n * If enableStreamingMode is true then enablePartialMode will be used, otherwise -\n * enablePartialMode will be ignored and file / assembly will be loaded in one go\n *\n * @defaultValue true\n */\n enableStreamingMode?: boolean;\n\n /**\n * Enable partial load mode to be able open large drawing If enablePartialMode enabled, then\n * sceneGraph will be switched off\n *\n * @defaultValue false\n */\n enablePartialMode?: boolean;\n\n /**\n * The size of the memory buffer that the Viewer can use for graphics data\n *\n * @defaultValue 3294967296\n */\n memoryLimit?: number;\n\n /**\n * Cutting plane fill color\n *\n * @defaultValue { red: 0xff, green: 0x98, blue: 0x00 }\n */\n cuttingPlaneFillColor?: RGB;\n\n /**\n * Outline edges color in RGB format.\n */\n edgesColor?: { r: number; g: number; b: number };\n\n /**\n * Faces color in the RGB format.\n */\n facesColor?: { r: number; g: number; b: number };\n\n /**\n * Show or hide edges.\n */\n edgesVisibility?: boolean;\n\n /**\n * Show edges over drawing.\n */\n edgesOverlap?: boolean;\n\n /**\n * Show faces over drawing.\n */\n facesOverlap?: boolean;\n\n /**\n * Faces transparency value from 0 to 255.\n */\n facesTransparancy?: number;\n\n /**\n * Enable custom highlight settings.\n */\n enableCustomHighlight?: boolean;\n\n /**\n * Enable or disable scene graph, it increases perfomance improvement, but consumes memory\n * Large drawings can take up a lot of memory. If sceneGraph enabled, then enablePartialMode\n * will be switched off\n */\n sceneGraph: boolean;\n\n /**\n * Edge display models. No edges is usefull for less memory consumption: `false` - no edges\n * are displayed, `true` - display isolines.\n */\n edgeModel: boolean;\n\n /**\n * Reverse the mouse wheel direction for zooming: false - moving the wheel up zooms in,\n * moving down zooms out, `true` - moving the wheel up zooms out, moving down zooms in.\n */\n reverseZoomWheel: boolean;\n\n /**\n * Enable mouse wheel zooming.\n */\n enableZoomWheel: boolean;\n\n /**\n * Enable touch gestures. This option will be ignored when enableZoomWheel is disabled, since\n * gestures contains touch zoom.\n */\n enableGestures: boolean;\n\n /**\n * Default file geometry data type. Can be one of:\n *\n * - `vsfx` - `VSFX` (default), for opening a file in `VisualizeJS` viewer.\n * - `gltf` - `glTF`, for opening a file in `Three.js` viewer.\n */\n geometryType?: string;\n}\n\nexport class Options {\n protected _emitter?: EventEmitter2;\n protected _data: OptionsData;\n\n constructor(emitter?: EventEmitter2) {\n this._emitter = emitter;\n this._data = Options.defaults();\n this.loadFromStorage();\n }\n\n static defaults(): OptionsData {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: { red: 0xff, green: 0x98, blue: 0x00 },\n edgesColor: { r: 0xff, g: 0x98, b: 0x00 },\n facesColor: { r: 0xff, g: 0x98, b: 0x00 },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\",\n };\n }\n\n notifierChangeEvent(): void {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({ type: \"optionschange\", data: this });\n }\n }\n\n saveToStorage(): void {\n if (typeof window !== \"undefined\")\n try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n\n loadFromStorage(): void {\n if (typeof window !== \"undefined\")\n try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = { ...data };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n\n /**\n * Reset options to default\n *\n * @param fields - Name of fields to be reset\n */\n resetToDefaults(fields?: string[]): void {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }, {});\n\n this.data = { ...this.data, ...resetData };\n } else {\n this.data = { ...this.data, ...Options.defaults() };\n }\n }\n\n get data(): OptionsData {\n return this._data;\n }\n\n set data(value: OptionsData) {\n const sceneGraph = value.enablePartialMode ? false : value.sceneGraph;\n this._data = { ...Options.defaults(), ...this._data, ...value, sceneGraph };\n this.notifierChangeEvent();\n }\n\n get showWCS(): boolean {\n return this._data.showWCS;\n }\n\n set showWCS(value: boolean) {\n this._data.showWCS = value;\n this.notifierChangeEvent();\n }\n\n get cameraAnimation(): boolean {\n return this._data.cameraAnimation;\n }\n\n set cameraAnimation(value: boolean) {\n this._data.cameraAnimation = value;\n this.notifierChangeEvent();\n }\n\n get antialiasing(): boolean {\n return this._data.antialiasing;\n }\n\n set antialiasing(value: boolean) {\n this._data.antialiasing = value;\n this.notifierChangeEvent();\n }\n\n get groundShadow(): boolean {\n return this._data.groundShadow;\n }\n\n set groundShadow(value: boolean) {\n this._data.groundShadow = value;\n this.notifierChangeEvent();\n }\n\n get shadows(): boolean {\n return this._data.shadows;\n }\n\n set shadows(value: boolean) {\n this._data.shadows = value;\n this.notifierChangeEvent();\n }\n\n get cameraAxisXSpeed(): number {\n return this._data.cameraAxisXSpeed;\n }\n\n set cameraAxisXSpeed(value: number) {\n this._data.cameraAxisXSpeed = value;\n this.notifierChangeEvent();\n }\n\n get cameraAxisYSpeed(): number {\n return this._data.cameraAxisYSpeed;\n }\n\n set cameraAxisYSpeed(value: number) {\n this.cameraAxisYSpeed = value;\n this.notifierChangeEvent();\n }\n\n get ambientOcclusion(): boolean {\n return this._data.ambientOcclusion;\n }\n\n set ambientOcclusion(value: boolean) {\n this._data.ambientOcclusion = value;\n this.notifierChangeEvent();\n }\n\n get enableStreamingMode(): boolean {\n return this._data.enableStreamingMode;\n }\n\n set enableStreamingMode(value: boolean) {\n this._data.enableStreamingMode = value;\n\n if (this._data.enableStreamingMode) {\n this._data.enablePartialMode = false;\n }\n\n this.notifierChangeEvent();\n }\n\n get enablePartialMode(): boolean {\n return this._data.enablePartialMode;\n }\n\n set enablePartialMode(value: boolean) {\n this._data.enablePartialMode = value;\n if (value) this._data.sceneGraph = false;\n this.notifierChangeEvent();\n }\n\n get memoryLimit(): number {\n return this._data.memoryLimit;\n }\n\n set memoryLimit(value: number) {\n this._data.memoryLimit = value;\n this.notifierChangeEvent();\n }\n\n get cuttingPlaneFillColor(): RGB {\n return this._data.cuttingPlaneFillColor;\n }\n\n set cuttingPlaneFillColor(value: RGB) {\n this._data.cuttingPlaneFillColor = value;\n this.notifierChangeEvent();\n }\n\n get edgesColor() {\n return this._data.edgesColor;\n }\n\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.notifierChangeEvent();\n }\n\n get facesColor() {\n return this._data.facesColor;\n }\n\n set facesColor(value) {\n this._data.facesColor = value;\n this.notifierChangeEvent();\n }\n\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.notifierChangeEvent();\n }\n\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.notifierChangeEvent();\n }\n\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.notifierChangeEvent();\n }\n\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.notifierChangeEvent();\n }\n\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.notifierChangeEvent();\n }\n\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.notifierChangeEvent();\n }\n\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.notifierChangeEvent();\n }\n\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n\n set reverseZoomWheel(value: boolean) {\n this._data.reverseZoomWheel = !!value;\n this.notifierChangeEvent();\n }\n\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n\n set enableZoomWheel(value: boolean) {\n this._data.enableZoomWheel = !!value;\n this.notifierChangeEvent();\n }\n\n get enableGestures() {\n return this._data.enableGestures;\n }\n\n set enableGestures(value: boolean) {\n this._data.enableGestures = !!value;\n this.notifierChangeEvent();\n }\n\n get geometryType() {\n return this._data.geometryType;\n }\n\n set geometryType(value: string) {\n this._data.geometryType = value;\n this.notifierChangeEvent();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point2d } from \"../Common/Geometry\";\n\nexport function createHtmlElementIfNeed(\n element: HTMLElement,\n targetElement: HTMLElement,\n dataTestId: string\n): HTMLElement {\n if (!element) {\n element = document.createElement(\"div\");\n element.setAttribute(\"data-testid\", dataTestId);\n\n targetElement.appendChild(element);\n }\n return element;\n}\n\nexport function destroyHtmlElement(element: HTMLElement, targetElement: HTMLElement) {\n if (element) {\n targetElement.removeChild(element);\n }\n return null;\n}\n\nexport function worldToScreen(gePoint: number[], moduleInstance, viewer): Point2d {\n const worldPoint = moduleInstance.Point3d.createFromArray(gePoint);\n const avp = viewer.activeView;\n const mtx = avp.worldToDeviceMatrix;\n\n const devicePoint = worldPoint.transformBy(mtx);\n\n const res = { x: devicePoint.x / window.devicePixelRatio, y: devicePoint.y / window.devicePixelRatio };\n\n mtx.delete();\n worldPoint.delete();\n devicePoint.delete();\n avp.delete();\n return res;\n}\n\nexport function getDistance(gePoint1: number[], gePoint2: number[], moduleInstance: any) {\n const tvPoint1 = moduleInstance.Point3d.createFromArray(gePoint1);\n const tvPoint2 = moduleInstance.Point3d.createFromArray(gePoint2);\n\n const distance = tvPoint1.distanceTo(tvPoint2).toFixed(2);\n\n tvPoint1.delete();\n tvPoint2.delete();\n\n return distance;\n}\n\nexport function getAngle(geStart: number[], geOrigin: number[], geEnd: number[], moduleInstance: any): number {\n const tvStart = moduleInstance.Point3d.createFromArray(geStart);\n const tvOrigin = moduleInstance.Point3d.createFromArray(geOrigin);\n const tvEnd = moduleInstance.Point3d.createFromArray(geEnd);\n\n const s1 = tvStart.sub(tvOrigin);\n const s2 = tvEnd.sub(tvOrigin);\n\n const v1 = s1.asVector();\n const v2 = s2.asVector();\n\n const angle = (180 * v1.angleTo(v2)) / Math.PI;\n\n return angle;\n}\n\nexport function getDataForDrawLine(p1: Point2d, p2: Point2d) {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n let angle = (180 * Math.atan(dy / dx)) / Math.PI;\n if (dx < 0) {\n angle -= 180;\n }\n const width = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n return { angle, width };\n}\n\nfunction normalizeFloat(value: number): number {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n}\n\nconst lineSegmentsIntersect = (p1: Point2d, p2: Point2d, p3: Point2d, p4: Point2d): false | Point2d => {\n const a_dx = p2.x - p1.x;\n const a_dy = p2.y - p1.y;\n const b_dx = p4.x - p3.x;\n const b_dy = p4.y - p3.y;\n const s = (-a_dy * (p1.x - p3.x) + a_dx * (p1.y - p3.y)) / (-b_dx * a_dy + a_dx * b_dy);\n const t = (+b_dx * (p1.y - p3.y) - b_dy * (p1.x - p3.x)) / (-b_dx * a_dy + a_dx * b_dy);\n return s >= 0 && s <= 1 && t >= 0 && t <= 1\n ? {\n x: normalizeFloat(p1.x + t * a_dx),\n y: normalizeFloat(p1.y + t * a_dy),\n }\n : false;\n};\n\nfunction checkSegmentsIntersect(p1: Point2d, p2: Point2d, p3: Point2d, p4: Point2d, res: Point2d[]): void {\n const r = lineSegmentsIntersect(p1, p2, p3, p4);\n if (r) {\n res.push(r);\n }\n}\n\nexport function isInsideRect(p: Point2d, width: number, height: number): boolean {\n return p.x <= width && p.x >= 0 && p.y <= height && p.y >= 0;\n}\n\nexport function getDataForDrawLineWithFixed(p1: Point2d, p2: Point2d, width: number, height: number) {\n const pLU = { x: 0, y: 0 };\n const pRU = { x: width, y: 0 };\n\n const pLB = { x: 0, y: height };\n const pRB = { x: width, y: height };\n\n const intersects: Point2d[] = [];\n\n checkSegmentsIntersect(p1, p2, pLU, pRU, intersects);\n checkSegmentsIntersect(p1, p2, pLU, pLB, intersects);\n checkSegmentsIntersect(p1, p2, pLB, pRB, intersects);\n checkSegmentsIntersect(p1, p2, pRB, pRU, intersects);\n\n let fixedP1: Point2d = null;\n let fixedP2: Point2d = null;\n\n if (intersects.length === 0) {\n fixedP1 = p1;\n fixedP2 = p2;\n } else if (intersects.length === 1) {\n if (isInsideRect(p1, width, height)) {\n fixedP1 = p1;\n fixedP2 = intersects[0];\n } else {\n fixedP1 = intersects[0];\n fixedP2 = p2;\n }\n } else {\n fixedP1 = intersects[0];\n fixedP2 = intersects[1];\n }\n\n const dx = fixedP2.x - fixedP1.x;\n const dy = fixedP2.y - fixedP1.y;\n let angle = (180 * Math.atan(dy / dx)) / Math.PI;\n if (dx < 0) {\n angle -= 180;\n }\n const size = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n return { angle, width: size, p1: fixedP1, p2: fixedP2 };\n}\n\nexport function onSetCallback(element: HTMLElement, cb: () => void): void {\n if (element) {\n element.onclick = cb ? () => cb() : () => {};\n }\n}\n\nexport function onSetSelectivity(element: HTMLElement, enable: boolean): void {\n element.style.pointerEvents = enable ? \"auto\" : \"none\";\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport * as utils from \"./MeasureUtils\";\n\nexport class MeasureLineItem {\n protected htmlElemStartPoint: HTMLElement;\n protected htmlElemEndPoint: HTMLElement;\n protected htmlElemLine: HTMLElement;\n protected htmlElemTitle: HTMLElement;\n protected startPoint: number[];\n protected endPoint: number[];\n protected unit: string;\n protected scale: number;\n protected size: number;\n protected style: CSSStyleDeclaration;\n protected viewer: any;\n protected moduleInstance: any;\n protected targetElement: HTMLElement;\n protected isFinishDraw: boolean;\n\n public lineThickness: number;\n\n constructor(targetElement: HTMLElement, viewer: any, moduleInstance: any) {\n this.htmlElemStartPoint = null;\n this.htmlElemEndPoint = null;\n this.htmlElemLine = null;\n this.htmlElemTitle = null;\n\n this.startPoint = null;\n this.endPoint = null;\n\n this.unit = \"\";\n this.scale = 1.0;\n this.size = 10.0;\n this.lineThickness = 2;\n\n this.style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n color: \"white\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n } as CSSStyleDeclaration;\n\n this.htmlElemStartPoint = utils.createHtmlElementIfNeed(this.htmlElemStartPoint, targetElement, \"ruler-start\");\n this.htmlElemEndPoint = utils.createHtmlElementIfNeed(this.htmlElemEndPoint, targetElement, \"ruler-end\");\n this.htmlElemLine = utils.createHtmlElementIfNeed(this.htmlElemLine, targetElement, \"ruler-line\");\n this.htmlElemTitle = utils.createHtmlElementIfNeed(this.htmlElemTitle, targetElement, \"ruler-value\");\n\n this.viewer = viewer;\n this.moduleInstance = moduleInstance;\n this.targetElement = targetElement;\n this.isFinishDraw = false;\n }\n\n drawMeasureLine(): void {\n const pointSize = this.size;\n const rect = this.moduleInstance.canvas.getBoundingClientRect();\n\n // draw start point\n if (this.startPoint) {\n this.htmlElemStartPoint = utils.createHtmlElementIfNeed(\n this.htmlElemStartPoint,\n this.targetElement,\n \"ruler-start\"\n );\n\n const pScreenStart = utils.worldToScreen(this.startPoint, this.moduleInstance, this.viewer);\n if (utils.isInsideRect(pScreenStart, rect.width, rect.height)) {\n this.htmlElemStartPoint.style.display = \"block\";\n this.htmlElemStartPoint.style.cursor = \"pointer\";\n this.htmlElemStartPoint.style.position = \"absolute\";\n this.htmlElemStartPoint.style.top = `${pScreenStart.y - pointSize / 2}px`;\n this.htmlElemStartPoint.style.left = `${pScreenStart.x - pointSize / 2}px`;\n this.htmlElemStartPoint.style.borderRadius = `${pointSize}px`;\n this.htmlElemStartPoint.style.border = this.style.border;\n this.htmlElemStartPoint.style.background = this.style.background;\n this.htmlElemStartPoint.style.zIndex = \"2\";\n this.htmlElemStartPoint.style.width = `${pointSize}px`;\n this.htmlElemStartPoint.style.height = `${pointSize}px`;\n this.htmlElemStartPoint.style.boxShadow = this.style.boxShadow;\n } else {\n this.htmlElemStartPoint.style.display = \"none\";\n }\n }\n\n // draw end point\n if (this.endPoint && this.isFinishDraw) {\n this.htmlElemEndPoint = utils.createHtmlElementIfNeed(this.htmlElemEndPoint, this.targetElement, \"ruler-end\");\n\n const pScreenEnd = utils.worldToScreen(this.endPoint, this.moduleInstance, this.viewer);\n\n if (utils.isInsideRect(pScreenEnd, rect.width, rect.height)) {\n this.htmlElemEndPoint.style.display = \"block\";\n this.htmlElemEndPoint.style.cursor = \"pointer\";\n this.htmlElemEndPoint.style.position = \"absolute\";\n this.htmlElemEndPoint.style.top = `${pScreenEnd.y - pointSize / 2}px`;\n this.htmlElemEndPoint.style.left = `${pScreenEnd.x - pointSize / 2}px`;\n this.htmlElemEndPoint.style.borderRadius = `${pointSize}px`;\n this.htmlElemEndPoint.style.border = this.style.border;\n this.htmlElemEndPoint.style.background = this.style.background;\n this.htmlElemEndPoint.style.zIndex = \"2\";\n this.htmlElemEndPoint.style.width = `${pointSize}px`;\n this.htmlElemEndPoint.style.height = `${pointSize}px`;\n this.htmlElemEndPoint.style.boxShadow = this.style.boxShadow;\n } else {\n this.htmlElemEndPoint.style.display = \"none\";\n }\n }\n\n if (this.endPoint && this.startPoint) {\n const point1 = utils.worldToScreen(this.startPoint, this.moduleInstance, this.viewer);\n const point2 = utils.worldToScreen(this.endPoint, this.moduleInstance, this.viewer);\n\n const { p1, p2, angle, width } = utils.getDataForDrawLineWithFixed(point1, point2, rect.width, rect.height);\n\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n\n const height = this.lineThickness;\n if (utils.isInsideRect(p1, rect.width, rect.height) && utils.isInsideRect(p2, rect.width, rect.height)) {\n this.htmlElemLine = utils.createHtmlElementIfNeed(this.htmlElemLine, this.targetElement, \"ruler-line\");\n this.htmlElemLine.style.display = \"block\";\n this.htmlElemLine.style.cursor = \"pointer\";\n this.htmlElemLine.style.position = \"absolute\";\n this.htmlElemLine.style.top = `${p1.y}px`;\n this.htmlElemLine.style.left = `${p1.x}px`;\n this.htmlElemLine.style.width = `${width}px`;\n this.htmlElemLine.style.transform = `rotate(${angle}deg)`;\n this.htmlElemLine.style.transformOrigin = `0px ${height / 2}px`;\n this.htmlElemLine.style.boxShadow = this.style.boxShadow;\n this.htmlElemLine.style.border = \"none\";\n this.htmlElemLine.style.background = this.style.background;\n this.htmlElemLine.style.zIndex = \"1\";\n this.htmlElemLine.style.height = `${height}px`;\n\n const distance = `${this.getDistance()} ${this.unit}`;\n\n const pX = p1.x + dx / 2;\n const pY = p1.y + dy / 2;\n\n const widthTitle = distance.length * 10;\n\n this.htmlElemTitle = utils.createHtmlElementIfNeed(this.htmlElemTitle, this.targetElement, \"ruler-value\");\n this.htmlElemTitle.style.display = \"block\";\n this.htmlElemTitle.style.cursor = \"pointer\";\n this.htmlElemTitle.style.font = \"10px\";\n this.htmlElemTitle.style.color = \"white\";\n this.htmlElemTitle.style.position = \"Absolute\";\n this.htmlElemTitle.style.top = `${pY}px`;\n this.htmlElemTitle.style.left = `${pX - widthTitle / 2}px`;\n this.htmlElemTitle.style.width = `${widthTitle}px`;\n this.htmlElemTitle.style.transformOrigin = \"0px 0px\";\n this.htmlElemTitle.style.borderRadius = \"5px\";\n this.htmlElemTitle.style.boxShadow = this.style.boxShadow;\n this.htmlElemTitle.style.border = \"none\";\n this.htmlElemTitle.style.background = this.style.background;\n this.htmlElemTitle.style.zIndex = \"3\";\n this.htmlElemTitle.style.padding = \"2px\";\n this.htmlElemTitle.style.textAlign = \"center\";\n this.htmlElemTitle.innerHTML = `${distance}`;\n } else {\n this.htmlElemLine.style.display = \"none\";\n this.htmlElemTitle.style.display = \"none\";\n }\n }\n }\n\n getDistance(): number {\n return utils.getDistance(this.startPoint, this.endPoint, this.moduleInstance) / this.scale;\n }\n\n setStartPoint(gePoint: number[]): void {\n this.startPoint = gePoint;\n this.drawMeasureLine();\n }\n\n setEndPoint(gePoint: number[], isFinish: boolean): void {\n this.isFinishDraw = isFinish === undefined ? true : isFinish;\n this.endPoint = gePoint;\n this.drawMeasureLine();\n }\n\n update(): void {\n this.drawMeasureLine();\n }\n\n setSize(size: number): void {\n this.size = size;\n this.drawMeasureLine();\n }\n\n clear(): void {\n this.endPoint = null;\n this.startPoint = null;\n this.htmlElemStartPoint = utils.destroyHtmlElement(this.htmlElemStartPoint, this.targetElement);\n this.htmlElemEndPoint = utils.destroyHtmlElement(this.htmlElemEndPoint, this.targetElement);\n this.htmlElemLine = utils.destroyHtmlElement(this.htmlElemLine, this.targetElement);\n this.htmlElemTitle = utils.destroyHtmlElement(this.htmlElemTitle, this.targetElement);\n }\n\n setUnit(unit: string): void {\n this.unit = unit;\n this.drawMeasureLine();\n }\n\n setConversionFactor(scale: number): void {\n this.scale = scale;\n this.drawMeasureLine();\n }\n\n setStyle(style: CSSStyleDeclaration): void {\n this.style = style;\n this.drawMeasureLine();\n }\n\n setSelectionReactor(reactor: any): void {\n utils.onSetCallback(this.htmlElemStartPoint, reactor ? reactor.onStartPoint : null);\n utils.onSetCallback(this.htmlElemEndPoint, reactor ? reactor.onEndPoint : null);\n utils.onSetCallback(this.htmlElemTitle, reactor ? reactor.onTitle : null);\n }\n\n setSelectability(enable: boolean): void {\n utils.onSetSelectivity(this.htmlElemStartPoint, enable);\n utils.onSetSelectivity(this.htmlElemEndPoint, enable);\n utils.onSetSelectivity(this.htmlElemLine, enable);\n utils.onSetSelectivity(this.htmlElemTitle, enable);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../../Viewer\";\nimport { OdBaseDragger } from \"../Common/OdBaseDragger\";\nimport { MeasureLineItem } from \"./MeasureLineItem\";\n\nfunction renameUnit(table, unit) {\n return table[unit] || unit;\n}\n\nexport class MeasureLineDragger extends OdBaseDragger {\n protected lineThickness: number;\n protected gripingRadius: number;\n protected firstPoint: number[];\n protected secondPoint: number[];\n protected renameUnitTable: any;\n protected items: MeasureLineItem[];\n protected m_overlayElement: HTMLElement;\n protected previewMeasureLine: MeasureLineItem;\n\n constructor(subject: Viewer) {\n super(subject);\n this.lineThickness = 2;\n this.press = false;\n this.gripingRadius = 5.0;\n this.firstPoint = null;\n this.secondPoint = null;\n\n this.renameUnitTable = {\n Millimeters: \"mm\",\n Centimeters: \"cm\",\n Meters: \"m\",\n Feet: \"ft\",\n Inches: \"in\",\n Yards: \"yd\",\n Kilometers: \"km\",\n Miles: \"mi\",\n Micrometers: \"µm\",\n MicroInches: \"µin\",\n Undefined: \" \",\n };\n\n this.items = [];\n\n this.canvasEvents.push(\"resize\");\n }\n\n override initialize(): void {\n super.initialize();\n\n this.m_overlayElement = document.createElement(\"div\");\n this.m_overlayElement.style.background = \"rgba(0,0,0,0)\";\n this.m_overlayElement.style.position = \"fixed\";\n this.m_overlayElement.style.zIndex = \"1\";\n this.m_overlayElement.style.pointerEvents = \"none\";\n document.body.appendChild(this.m_overlayElement);\n\n this.resize();\n }\n\n override dispose(): void {\n super.dispose();\n this.m_overlayElement.remove();\n }\n\n override updatePreview(): void {\n this.items.forEach((item) => item.update());\n }\n\n resize(): void {\n const rect = this.m_module.canvas.getBoundingClientRect();\n\n this.m_overlayElement.style.top = `${rect.top}px`;\n this.m_overlayElement.style.left = `${rect.left}px`;\n this.m_overlayElement.style.width = `${rect.width}px`;\n this.m_overlayElement.style.height = `${rect.height}px`;\n }\n\n getSnapPointRadius(): number {\n const view = this.getViewer().activeView;\n const corners = view.viewDcCorners();\n\n const pt1 = corners.lowerLeft;\n const pt2 = corners.upperRight;\n\n pt2[0] -= pt1[0];\n pt2[1] -= pt1[1];\n\n return Math.min(pt2[0], pt2[1]) / 120;\n }\n\n override drag(x: number, y: number): void {\n this.createNewMeasureIfNeed();\n const point = this.getViewer().getSnapPoint(x, y, this.gripingRadius);\n\n if (this.isDragging) {\n if (point) {\n if (this.firstPoint) {\n this.secondPoint = point;\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n this.previewMeasureLine.setEndPoint(this.secondPoint, true);\n } else {\n this.firstPoint = point;\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n }\n } else {\n this.secondPoint = null;\n this.previewMeasureLine.clear();\n this.previewMeasureLine.setStartPoint(this.firstPoint);\n this.previewMeasureLine.setEndPoint(this.getViewer().screenToWorld(x, y), false);\n }\n } else {\n if (point) {\n this.previewMeasureLine.setStartPoint(point);\n } else {\n this.previewMeasureLine.clear();\n }\n }\n }\n\n override end(): void {\n if (this.firstPoint && this.secondPoint) {\n const newLineMeasure = this.createMeasureLine();\n newLineMeasure.setStartPoint(this.firstPoint);\n newLineMeasure.setEndPoint(this.secondPoint, true);\n }\n this.firstPoint = null;\n this.secondPoint = null;\n this.previewMeasureLine.clear();\n }\n\n createNewMeasureIfNeed(): void {\n if (!this.previewMeasureLine) {\n this.previewMeasureLine = this.createMeasureLine();\n }\n }\n\n createMeasureLine(): MeasureLineItem {\n const viewer = this.m_module.getViewer();\n const item = new MeasureLineItem(this.m_overlayElement, viewer, this.m_module);\n item.lineThickness = this.lineThickness || item.lineThickness;\n item.setUnit(renameUnit(this.renameUnitTable, viewer.getUnit()));\n this.items.push(item);\n return item;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point2d, Vector3 } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nconst FocalLengthConst = 42.0;\n\nconst calcFocalLength = (lensLength: number, fieldWidth: number, fieldHeight: number): number => {\n return (lensLength / FocalLengthConst) * Math.sqrt(fieldWidth * fieldWidth + fieldHeight * fieldHeight);\n};\n\nexport class OdaWalkDragger extends OdBaseDragger {\n protected lastCoord: Point2d;\n protected speed: number;\n protected delta: number;\n protected keyPressMap: Set<string>;\n protected oldWCSEnableValue: boolean;\n protected viewParams: any;\n protected cameraId: any;\n protected cameraWalker: any;\n protected viewer: any;\n protected multiplier: number;\n protected lastFrameTS: number;\n protected animationId: any;\n protected deltaAngle: number;\n protected enableZoomWheelPreviousValue: boolean;\n\n constructor(subject: Viewer) {\n super(subject);\n this.viewer = undefined;\n\n this.multiplier = 5;\n this.speed = 1;\n\n this.keyPressMap = new Set();\n this.keydown = this.keydown.bind(this);\n this.keyup = this.keyup.bind(this);\n\n this.lastFrameTS = 0;\n this.animationId = undefined;\n this.processMovement = this.processMovement.bind(this);\n\n this.deltaAngle = Math.PI / 3600;\n this.autoSelect = true;\n }\n\n override initialize() {\n super.initialize();\n this.viewer = this.getViewer();\n\n window.addEventListener(\"keydown\", this.keydown, false);\n window.addEventListener(\"keyup\", this.keyup, false);\n\n this.oldWCSEnableValue = this.viewer.getEnableWCS();\n this.viewer.setEnableWCS(false);\n\n const view = this.viewer.activeView;\n const maxDimension = this.getMaxDimension(view);\n this.speed = maxDimension / 30000;\n\n this.subject.emitEvent({ type: \"walkstart\" });\n\n this.viewParams = this.getViewParams();\n //this.viewParams.lensLength = view.lensLength;\n\n this.setViewParams(this.viewParams);\n //view.lensLength = (view.lensLength * 42) / 120;\n\n const model = this.viewer.getActiveModel();\n this.cameraId = model.appendCamera(\"Camera0\");\n this.setupCamera(view);\n model.delete();\n\n //pCamera.setAdjustLensLength(true);\n this.cameraWalker = new this.m_module.OdTvCameraWalker();\n this.cameraWalker.setCamera(this.cameraId);\n\n this.subject.update();\n this.enableZoomWheelPreviousValue = this.subject.options.enableZoomWheel;\n this.subject.options.enableZoomWheel = false;\n }\n\n override dispose() {\n this.oldWCSEnableValue =\n this.oldWCSEnableValue !== undefined ? this.oldWCSEnableValue : this.subject.options.showWCS;\n this.viewer.setEnableWCS(this.oldWCSEnableValue);\n\n super.dispose();\n\n this.keyPressMap.clear();\n\n window.removeEventListener(\"keydown\", this.keydown);\n window.removeEventListener(\"keyup\", this.keyup);\n\n if (this.animationId) {\n window.cancelAnimationFrame(this.animationId);\n this.animationId = undefined;\n }\n\n if (this.cameraId) {\n const model = this.viewer.getActiveModel();\n model.removeEntity(this.cameraId);\n model.delete();\n this.cameraWalker?.delete();\n }\n\n if (this.viewParams) {\n this.setViewParams(this.viewParams);\n\n const avp = this.viewer.activeView;\n //avp.lensLength = this.viewParams.lensLength;\n avp.delete();\n }\n\n this.subject.update();\n this.subject.options.enableZoomWheel = this.enableZoomWheelPreviousValue;\n }\n\n keydown(ev) {\n switch (ev.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.subject.emitEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.subject.emitEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n case \"KeyW\":\n case \"KeyA\":\n case \"KeyS\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.keyPressMap.add(ev.code);\n if (!this.animationId) this.processMovement(0);\n break;\n }\n }\n\n keyup(ev) {\n this.keyPressMap.delete(ev.code);\n if (this.keyPressMap.size < 1 && this.animationId) {\n window.cancelAnimationFrame(this.animationId);\n this.animationId = undefined;\n this.lastFrameTS = 0;\n }\n }\n\n processMovement(timestamp) {\n this.animationId = requestAnimationFrame(this.processMovement);\n\n if (this.lastFrameTS !== 0) {\n const deltaTS = timestamp - this.lastFrameTS;\n const currentDelta = this.multiplier * deltaTS * this.speed;\n\n for (const keyCode of this.keyPressMap) {\n switch (keyCode) {\n case \"KeyW\":\n this.cameraWalker.moveForward(currentDelta);\n break;\n case \"KeyS\":\n this.cameraWalker.moveBackward(currentDelta);\n break;\n case \"KeyA\":\n this.cameraWalker.moveLeft(currentDelta);\n break;\n case \"KeyD\":\n this.cameraWalker.moveRight(currentDelta);\n break;\n case \"KeyQ\":\n this.cameraWalker.moveUp(currentDelta);\n break;\n case \"KeyE\":\n this.cameraWalker.moveDown(currentDelta);\n break;\n }\n }\n this.subject.update();\n }\n\n this.lastFrameTS = timestamp;\n }\n\n override drag(x, y, dltX, dltY) {\n if (this.cameraId && this.isDragging) {\n if (dltX !== 0.0) this.turnLeft(-dltX * this.deltaAngle);\n if (dltY !== 0.0) this.cameraWalker.turnDown(dltY * this.deltaAngle);\n this.subject.update();\n }\n }\n\n turnLeft(angle) {\n //TODO: migrate to VisualizeJS\n const pCamera = this.cameraWalker.camera().openObjectAsCamera();\n const dir = this.toVector(pCamera.direction());\n const up = this.toVector(pCamera.upVector());\n\n const pos = pCamera.position();\n\n const rotMatrix = this.createMatrix3d();\n const zAxisVector: Vector3 = [0, 0, 1];\n rotMatrix.setToRotation(angle, zAxisVector, pos);\n dir.transformBy(rotMatrix);\n up.transformBy(rotMatrix);\n pCamera.setupCameraByDirection(pos, dir.toArray(), up.toArray());\n pCamera.delete();\n }\n\n setupCamera(view) {\n const pCamera = this.cameraId.openObjectAsCamera();\n const target = view.viewTarget;\n\n pCamera.setDisplayGlyph(false);\n pCamera.setDisplayTarget(false);\n pCamera.setAutoAdjust(true);\n pCamera.setupCamera(view.viewPosition, target, view.upVector);\n pCamera.setNearClip(false, 1.0);\n pCamera.setFarClip(false, 0);\n pCamera.setViewParameters(view.viewFieldWidth, view.viewFieldHeight, true);\n\n const focalL = calcFocalLength(view.lensLength, view.viewFieldWidth, view.viewFieldHeight);\n\n const pTarget = this.toPoint(view.viewTarget);\n const viewDir = this.toPoint(view.viewPosition);\n const viewDirSub = viewDir.sub(pTarget);\n const viewDirVec = viewDirSub.asVector();\n const viewDirVecNormal = viewDirVec.normalize();\n\n const geViewDir = this.toGeVector(viewDirVecNormal);\n const newGeViewDir = [geViewDir[0] * focalL, geViewDir[1] * focalL, geViewDir[2] * focalL];\n\n const pTarget2 = this.toPoint(view.viewTarget);\n const newGeViewDirPt = this.toPoint(newGeViewDir);\n\n const newPos = pTarget2.add(newGeViewDirPt);\n pCamera.setupCamera(this.toGePoint(newPos), view.viewTarget, view.upVector);\n\n this.deleteAll([pTarget, viewDir, viewDirSub, viewDirVec, viewDirVecNormal, pTarget2, newGeViewDirPt, newPos]);\n\n pCamera.assignView(view);\n pCamera.delete();\n }\n\n getMaxDimension(view) {\n const [xmax, ymax, zmax] = view.sceneExtents.max();\n const [xmin, ymin, zmin] = view.sceneExtents.min();\n const volume = [xmax - xmin, ymax - ymin, zmax - zmin];\n return Math.max(...volume);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point2d, Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdBaseCuttingPlaneDragger extends OdBaseDragger {\n protected m_size_x: number;\n protected m_size_y: number;\n protected m_size_z: number;\n protected m_center: Point3d;\n protected m_normal: number[];\n protected index: number;\n protected m_model: any;\n protected m_entity: any;\n protected planePreview: any;\n protected m_last: Point3d;\n protected m_click: Point2d;\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n\n //this.getViewer().getMarkupController().clear();\n\n const ext = this.getViewer().getActiveExtents();\n const min = ext.min();\n const max = ext.max();\n\n this.m_size_x = Math.abs(max[0] - min[0]) / 2;\n this.m_size_y = Math.abs(max[1] - min[1]) / 2;\n this.m_size_z = Math.abs(max[2] - min[2]) / 2;\n\n this.m_center = this.toPoint(ext.center());\n this.m_normal = this.createNormal();\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n plane.set(this.toGePoint(this.m_center), this.m_normal);\n\n avp.addCuttingPlane(plane);\n this.index = avp.numCuttingPlanes() - 1;\n\n const { red, green, blue } = this.subject.options.cuttingPlaneFillColor;\n avp.setEnableCuttingPlaneFill(true, red, green, blue);\n avp.setCuttingPlaneFillPatternEnabled(true, this.m_module.CuttingPlaneFillStyle.kHorizontalBars, 0x0, 0x0, 0x0);\n\n this.m_model = this.getModel();\n this.createPreview();\n\n this.deleteAll([ext, avp, plane]);\n }\n\n override dispose(): void {\n super.dispose();\n\n if (this.m_entity) {\n this.m_model.removeEntity(this.m_entity);\n this.deleteAll([this.m_model, this.m_entity, this.planePreview, this.m_center]);\n this.m_entity = null;\n this.planePreview = null;\n this.subject.update();\n }\n }\n\n createNormal(): number[] {\n return [0, 0, 0];\n }\n\n handleDelta(delta: Point3d): Point3d {\n return delta;\n }\n\n getPlanePreviewCoordinate(): any[] {\n return [];\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.m_last = this.screenToWorld(x, y);\n this.m_click = { x, y };\n }\n\n override drag(x: number, y: number): void {\n if (this.press) {\n const point = this.screenToWorld(x, y);\n const delta = this.handleDelta(point.sub(this.m_last));\n\n const oldCenter = this.m_center;\n this.m_center = oldCenter.add(delta);\n\n const oldLast = this.m_last;\n this.m_last = point;\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n const newPlane = plane.set(this.toGePoint(this.m_center), this.m_normal);\n const newCutting = avp.updateCuttingPlane(this.index, plane);\n\n this.drawPreview();\n\n this.deleteAll([avp, plane, oldCenter, delta, oldLast, newPlane, newCutting]);\n\n const device = this.getViewer().getActiveDevice();\n device.invalidate(device.getSize());\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n if (x === this.m_click.x && y === this.m_click.y) {\n this.m_normal = [this.m_normal[0] * -1, this.m_normal[1] * -1, this.m_normal[2] * -1];\n\n const avp = this.getViewer().activeView;\n const plane = this.createPlane();\n plane.set(this.toGePoint(this.m_center), this.m_normal);\n avp.updateCuttingPlane(this.index, plane);\n\n this.deleteAll([avp, plane, this.m_last]);\n\n const device = this.getViewer().getActiveDevice();\n device.invalidate(device.getSize());\n }\n }\n\n createPreview(): void {\n this.m_entity = this.m_model.appendEntity(\"&CuttingPlanePreview\");\n\n const GeometryTypes = this.m_module.GeometryTypes;\n\n const transparencyDef = new this.m_module.OdTvTransparencyDef();\n const colorDef = new this.m_module.OdTvColorDef(112, 112, 112); //0x53, 0x72, 0xAE\n\n transparencyDef.setValue(0.9);\n\n const entityPtr = this.m_entity.openObject();\n entityPtr.setColor(colorDef, GeometryTypes.kFaces.value);\n\n colorDef.setColor(112, 112, 112); //0xcd, 0xe2, 0xff\n entityPtr.setColor(colorDef, GeometryTypes.kEdges.value);\n\n entityPtr.setLineWeight(5);\n\n entityPtr.setTransparency(transparencyDef, GeometryTypes.kFaces);\n transparencyDef.setValue(1.0);\n entityPtr.setTransparency(transparencyDef, GeometryTypes.kEdges);\n\n this.planePreview = entityPtr.appendPolygon(this.getPlanePreviewCoordinate());\n const polygonPtr = this.planePreview.openAsPolygon();\n polygonPtr.setFilled(true);\n\n this.deleteAll([transparencyDef, colorDef, entityPtr, polygonPtr, GeometryTypes]);\n this.subject.syncOverlay();\n }\n\n drawPreview(): void {\n const polygonPtr = this.planePreview.openAsPolygon();\n polygonPtr.setPoints(this.getPlanePreviewCoordinate());\n this.deleteAll([polygonPtr]);\n this.subject.syncOverlay();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneXAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [1, 0, 0];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.y = 0.0;\n delta.z = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x,\n this.m_center.y - this.m_size_y,\n this.m_center.z - this.m_size_z,\n this.m_center.x,\n this.m_center.y + this.m_size_y,\n this.m_center.z - this.m_size_z,\n this.m_center.x,\n this.m_center.y + this.m_size_y,\n this.m_center.z + this.m_size_z,\n this.m_center.x,\n this.m_center.y - this.m_size_y,\n this.m_center.z + this.m_size_z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneYAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [0, 1, 0];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.x = 0.0;\n delta.z = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x - this.m_size_x,\n this.m_center.y,\n this.m_center.z - this.m_size_z,\n this.m_center.x + this.m_size_x,\n this.m_center.y,\n this.m_center.z - this.m_size_z,\n this.m_center.x + this.m_size_x,\n this.m_center.y,\n this.m_center.z + this.m_size_z,\n this.m_center.x - this.m_size_x,\n this.m_center.y,\n this.m_center.z + this.m_size_z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseCuttingPlaneDragger } from \"./OdBaseCuttingPlaneDragger\";\n\nexport class OdCuttingPlaneZAxisDragger extends OdBaseCuttingPlaneDragger {\n override createNormal(): number[] {\n return [0, 0, 1];\n }\n\n override handleDelta(delta: Point3d): Point3d {\n delta.x = 0.0;\n delta.y = 0.0;\n return delta;\n }\n\n override getPlanePreviewCoordinate(): number[] {\n return [\n this.m_center.x - this.m_size_x,\n this.m_center.y - this.m_size_y,\n this.m_center.z,\n this.m_center.x + this.m_size_x,\n this.m_center.y - this.m_size_y,\n this.m_center.z,\n this.m_center.x + this.m_size_x,\n this.m_center.y + this.m_size_y,\n this.m_center.z,\n this.m_center.x - this.m_size_x,\n this.m_center.y + this.m_size_y,\n this.m_center.z,\n ];\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Point2d, Point3d, Vector3d } from \"../Common/Geometry\";\nimport { Viewer } from \"../../Viewer\";\n\nexport class OrbitAction {\n private _m_module: any;\n private _subject: Viewer;\n private _beginInteractivity: () => void;\n private _endInteractivity: () => void;\n private m_viewCenter: any;\n private m_startPoint: Point2d;\n\n constructor(m_module: any, subject: Viewer, beginInteractivity: () => void, endInteractivity: () => void) {\n this._m_module = m_module;\n this._subject = subject;\n this._beginInteractivity = beginInteractivity;\n this._endInteractivity = endInteractivity;\n }\n\n public beginAction(x: number, y: number) {\n this.m_viewCenter = this.getCenter();\n this.m_startPoint = { x, y };\n\n const view = this.getViewer().activeView;\n\n view.delete();\n this._beginInteractivity();\n }\n\n public action(x: number, y: number) {\n const view = this.getViewer().activeView;\n\n const corners = view.vportRect;\n\n const size = Math.max(Math.abs(corners[2] - corners[0]), Math.abs(corners[3] - corners[1]));\n\n const distX = ((this.m_startPoint.x - x) * Math.PI) / size;\n const distY = ((this.m_startPoint.y - y) * Math.PI) / size;\n\n this.m_startPoint.x = x;\n this.m_startPoint.y = y;\n\n const xOrbit = distY;\n const yOrbit = distX;\n\n const viewParams = {\n position: view.viewPosition,\n target: view.viewTarget,\n upVector: view.upVector,\n viewFieldWidth: view.viewFieldWidth,\n viewFieldHeight: view.viewFieldHeight,\n perspective: view.perspective,\n };\n\n view.delete();\n\n const sideVector = this.getSideVector(viewParams);\n\n if (xOrbit !== 0.0) {\n this.calculateXOrbit(viewParams, -xOrbit, sideVector);\n }\n\n if (yOrbit !== 0.0) {\n this.calculateYOrbit(viewParams, yOrbit, sideVector);\n }\n\n sideVector.delete();\n\n const extView = this.getViewer().getActiveTvExtendedView();\n\n extView.setView(\n viewParams.position,\n viewParams.target,\n viewParams.upVector,\n viewParams.viewFieldWidth,\n viewParams.viewFieldHeight,\n viewParams.perspective\n );\n extView.delete();\n\n this._subject.activeDragger()?.updatePreview();\n }\n\n public endAction() {\n this._endInteractivity();\n }\n\n private getSideVector(viewParams: any): any {\n const pUpV = this.toVector(viewParams.upVector);\n const pTarget = this.toPoint(viewParams.target);\n const pPosition = this.toPoint(viewParams.position);\n\n const direct = pTarget.sub(pPosition);\n const vDirect = direct.asVector();\n\n const vCross = pUpV.crossProduct(vDirect);\n const sideVector = vCross.normalize();\n\n this.deleteAll([direct, pUpV, pTarget, pPosition, vDirect, vCross]);\n\n return sideVector;\n }\n\n private calculateXOrbit(viewParams: any, delta: number, sideVector: Vector3d): void {\n {\n const pPoint = this.toPoint(viewParams.position);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const rotatePoint = pPoint.rotateByBasePoint(delta, sideVector, pCenter);\n viewParams.position = rotatePoint.toArray();\n\n this.deleteAll([pPoint, pCenter, rotatePoint]);\n }\n\n {\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const rotatePoint = pTarget.rotateByBasePoint(delta, sideVector, pCenter);\n viewParams.target = rotatePoint.toArray();\n\n this.deleteAll([pTarget, pCenter, rotatePoint]);\n }\n\n {\n const pPoint = this.toPoint(viewParams.position);\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const pUp = pTarget.sub(pPoint);\n const vUp = pUp.asVector();\n\n const crossProduct = vUp.crossProduct(sideVector);\n const crossProductNormal = crossProduct.normalize();\n\n viewParams.upVector = crossProductNormal.toArray();\n\n this.deleteAll([pPoint, pTarget, pCenter, pUp, vUp, crossProduct, crossProductNormal]);\n }\n }\n\n private calculateYOrbit(viewParams: any, delta: number, sideVector: any): void {\n {\n const pPoint = this.toPoint(viewParams.position);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n\n const rotatePoint = pPoint.rotateByBasePoint(delta, zAxis, pCenter);\n viewParams.position = rotatePoint.toArray();\n\n this.deleteAll([zAxis, pPoint, pCenter, rotatePoint]);\n }\n\n {\n const pTarget = this.toPoint(viewParams.target);\n const pCenter = this.toPoint(this.m_viewCenter);\n\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n\n const rotatePoint = pTarget.rotateByBasePoint(delta, zAxis, pCenter);\n viewParams.target = rotatePoint.toArray();\n\n this.deleteAll([zAxis, pTarget, pCenter, rotatePoint]);\n }\n\n {\n const zAxis = this.toVector(this._m_module.Vector3d.kZAxis);\n const pTarget = this.toPoint(viewParams.target);\n const pPoint = this.toPoint(viewParams.position);\n\n const side = sideVector.rotateBy(delta, zAxis);\n\n const pUp = pTarget.sub(pPoint);\n const vUp = pUp.asVector();\n\n const cross = vUp.crossProduct(side);\n const crossNormal = cross.normalize();\n\n viewParams.upVector = crossNormal.toArray();\n\n this.deleteAll([zAxis, pTarget, pPoint, side, pUp, vUp, cross, crossNormal]);\n }\n }\n\n private getCenter(): any {\n const viewer = this.getViewer();\n let center;\n\n const pSet = viewer.getSelected();\n if (!pSet.isNull() && pSet.numItems() !== 0) {\n const itr = pSet.getIterator();\n let ext, entId, extSelected;\n for (; !itr.done(); itr.step()) {\n entId = itr.getEntity();\n ext = entId.getWCSExtents();\n if (extSelected) extSelected.addExt(ext);\n else extSelected = ext;\n }\n center = extSelected.center();\n\n extSelected.delete();\n itr.delete();\n } else {\n center = viewer.getActiveExtents().center();\n }\n\n return center;\n }\n\n private getViewer(): any {\n return this._m_module.getViewer();\n }\n\n private toVector(geVector): Vector3d {\n return this._m_module.Vector3d.createFromArray(geVector);\n }\n\n private toPoint(gePoint: number[]): Point3d {\n return this._m_module.Point3d.createFromArray(gePoint);\n }\n\n private deleteAll(objects): void {\n for (const obj of objects) {\n obj?.delete?.();\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { OrbitAction } from \"./Actions/OrbitAction\";\nimport { Point2d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdOrbitDragger extends OdBaseDragger {\n private _orbitAction: OrbitAction;\n protected m_viewCenter: any;\n protected m_startPoint: Point2d;\n protected startCameraParams: any;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._orbitAction = new OrbitAction(this.m_module, this.subject, this.beginInteractivity, this.endInteractivity);\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this._orbitAction.beginAction(x, y);\n }\n\n setDefaultViewParams(): void {\n const extView = this.getViewer().getActiveTvExtendedView();\n extView.setView(\n this.startCameraParams.position,\n this.startCameraParams.target,\n this.startCameraParams.upVector,\n this.startCameraParams.viewFieldWidth,\n this.startCameraParams.viewFieldHeight,\n this.startCameraParams.perspective\n );\n extView.delete();\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this._orbitAction.action(x, y);\n }\n }\n\n override end(): void {\n this.press = false;\n this._orbitAction.endAction();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Point2d, Point3d } from \"../Common/Geometry\";\nimport { ViewParams } from \"../Common/OdaGeAction\";\nimport { Viewer } from \"../../Viewer\";\n\nexport class PanAction {\n private _m_module: any;\n private _subject: Viewer;\n private _m_start: Point3d;\n private _deltaScreenPosition: Point2d;\n private _beginInteractivity: () => void;\n private _endInteractivity: () => void;\n private _getViewParams: () => ViewParams;\n private _setViewParams: (params: ViewParams) => void;\n\n constructor(\n m_module: any,\n subject: Viewer,\n beginInteractivity: () => void,\n endInteractivity: () => void,\n getViewParams: () => ViewParams,\n setViewParams: (params: ViewParams) => void\n ) {\n this._m_module = m_module;\n this._subject = subject;\n this._beginInteractivity = beginInteractivity;\n this._endInteractivity = endInteractivity;\n this._getViewParams = getViewParams;\n this._setViewParams = setViewParams;\n }\n\n public beginAction(x: number, y: number) {\n this._m_start = this.screenToWorld(x, y);\n this._deltaScreenPosition = { x, y };\n this._beginInteractivity();\n }\n\n public action(x: number, y: number) {\n const { Vector3d } = this._m_module;\n const params = this._getViewParams();\n const pt = this.screenToWorld(x, y);\n\n const ptSub = this._m_start.sub(pt);\n const delta = ptSub.asVector();\n\n const target = Vector3d.createFromArray(params.target);\n const targetWithDelta = target.add(delta);\n params.target = targetWithDelta.toArray();\n\n const position = Vector3d.createFromArray(params.position);\n const positionWithDelta = position.add(delta);\n params.position = positionWithDelta.toArray();\n\n this._setViewParams(params);\n target.delete();\n\n targetWithDelta.delete();\n position.delete();\n positionWithDelta.delete();\n\n this._subject.activeDragger()?.updatePreview();\n this._subject.emitEvent({\n type: \"pan\",\n x,\n y,\n dX: x - this._deltaScreenPosition.x,\n dY: y - this._deltaScreenPosition.y,\n });\n\n this._deltaScreenPosition = { x, y };\n }\n\n public endAction() {\n this._endInteractivity();\n }\n\n private screenToWorld(x: number, y: number): Point3d {\n return this._m_module.Point3d.createFromArray(this._m_module.getViewer().screenToWorld(x, y));\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { PanAction } from \"./Actions/PanAction\";\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdPanDragger extends OdBaseDragger {\n private _panAction: PanAction;\n protected m_start: Point3d;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._panAction = new PanAction(\n this.m_module,\n this.subject,\n this.beginInteractivity,\n this.endInteractivity,\n this.getViewParams,\n this.setViewParams\n );\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this._panAction.beginAction(x, y);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this._panAction.action(x, y);\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n this._panAction.endAction();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../../Viewer\";\n\nexport class ZoomAction {\n private _m_module: any;\n private _subject: Viewer;\n\n constructor(m_module: any, subject: Viewer) {\n this._m_module = m_module;\n this._subject = subject;\n }\n\n public action(x: number, y: number, zoomFactor: number) {\n const viewer = this._m_module.getViewer();\n viewer.zoomAt(zoomFactor, x, y);\n\n this._subject.activeDragger()?.updatePreview();\n this._subject.emitEvent({\n type: \"zoomat\",\n data: zoomFactor,\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { ZoomAction } from \"./Actions/ZoomAction\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OdZoomDragger extends OdBaseDragger {\n private _zoomAction: ZoomAction;\n protected pressX: number;\n protected pressY: number;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.pressX = x;\n this.pressY = y;\n this.beginInteractivity();\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n const ZOOM_SPEED = 0.025;\n const zoomFactor = dltY > 0 ? 1 + ZOOM_SPEED : 1 - ZOOM_SPEED;\n this._zoomAction.action(this.pressX, this.pressY, zoomFactor);\n }\n }\n\n override end(): void {\n this.press = false;\n this.endInteractivity();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\nimport { ZoomAction } from \"./Actions/ZoomAction\";\n\nconst INTERACTIVITY_TIME_OUT = 100;\n\nexport class OdZoomWheelDragger extends OdBaseDragger {\n private _zoomAction: ZoomAction;\n\n private _endInteractivityTimeOutId;\n\n private _isEnableInteractivityMode: boolean;\n\n constructor(subject: Viewer) {\n super(subject);\n\n // ignore all events except \"wheel\" so as not to interfere with other handlers\n this.canvasEvents = [\"wheel\"];\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n this._endInteractivityTimeOutId = undefined;\n this._isEnableInteractivityMode = false;\n }\n\n wheel(event) {\n if (!this.subject.options.enableZoomWheel) {\n return;\n }\n\n event = event || window.event;\n event.preventDefault();\n\n const zoomReverse = this.subject.options.reverseZoomWheel ? -1 : 1;\n const zoomSpeed = 0.075 * zoomReverse;\n\n const viewer = this.getViewer();\n if (viewer) {\n const zoomFactor = event.deltaY > 0 ? 1 + zoomSpeed : 1 - zoomSpeed;\n\n this._zoomAction.action(\n event.offsetX * window.devicePixelRatio,\n event.offsetY * window.devicePixelRatio,\n zoomFactor\n );\n\n if (!this._isEnableInteractivityMode) {\n this._isEnableInteractivityMode = true;\n this.beginInteractivity();\n }\n\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n }\n\n if (!this._isEnableInteractivityMode) {\n this._isEnableInteractivityMode = true;\n this.beginInteractivity();\n }\n\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n }\n\n this.subject.update(true);\n\n this._endInteractivityTimeOutId = setTimeout(() => {\n this._endInteractivityTimeOutId = undefined;\n this.endInteractivity();\n this._isEnableInteractivityMode = false;\n }, INTERACTIVITY_TIME_OUT);\n }\n }\n\n override dispose(): void {\n if (this._endInteractivityTimeOutId) {\n clearTimeout(this._endInteractivityTimeOutId);\n this.endInteractivity();\n this._isEnableInteractivityMode = false;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Point3d } from \"../Common/Geometry\";\n\nexport class OdSelectionFrame {\n protected m_start: number[];\n protected m_end: number[];\n protected m_model: any;\n protected m_module: any;\n protected m_entity: any;\n protected m_frame: any;\n\n constructor() {\n this.m_start = [0, 0, 0]; // 0\n this.m_end = [0, 0, 0]; // 2\n\n this.m_model = null;\n }\n\n createPoint3d(): Point3d {\n return new this.m_module.Point3d();\n }\n\n init(instance: any, model: any): void {\n this.m_module = instance;\n this.m_model = model;\n }\n\n getViewer() {\n return this.m_module.getViewer();\n }\n\n setValue(value: number[]): void {\n this.m_end = value;\n this.draw();\n }\n\n setStartPoint(point: number[]): void {\n this.m_start = point;\n this.m_end = point;\n this.draw();\n }\n\n toDoubleArray(points: Point3d[]): number[] {\n const p: number[] = [];\n for (let i = 0; i < points.length; i++) {\n p.push(points[i].x);\n p.push(points[i].y);\n p.push(points[i].z);\n }\n return p;\n }\n\n draw(): void {\n const view = this.getViewer().activeView;\n const viewM = view.viewingMatrix;\n\n const points = [];\n points.push(this.m_start);\n points.push(this.createPoint3d());\n points.push(this.m_end);\n points.push(this.createPoint3d());\n\n const p0 = this.createPoint3d();\n p0.set(this.m_start[0], this.m_start[1], this.m_start[2]);\n\n const p2 = this.createPoint3d();\n p2.set(this.m_end[0], this.m_end[1], this.m_end[2]);\n\n p0.transformBy(viewM);\n p2.transformBy(viewM);\n\n points[1].x = p0.x;\n points[3].x = p2.x;\n points[1].y = p2.y;\n points[3].y = p0.y;\n points[1].z = points[3].z = p2.z;\n\n const eyeM = view.eyeToWorldMatrix;\n points[1].transformBy(eyeM);\n points[3].transformBy(eyeM);\n\n if (!this.m_entity) {\n this.m_entity = this.m_model.appendEntity(\"\");\n const entityPtr = this.m_entity.openObject();\n\n entityPtr.setColor(112, 112, 112);\n entityPtr.setLineWeight(2);\n\n this.m_frame = entityPtr.appendPolygon(this.toDoubleArray(points));\n entityPtr.delete();\n } else {\n this.m_frame.openAsPolygon().setPoints(this.toDoubleArray(points));\n }\n }\n\n clear(): void {\n if (this.m_entity) {\n this.m_model.removeEntity(this.m_entity);\n this.m_entity = null;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\n\nimport { Viewer } from \"../../Viewer\";\nimport { OdBaseDragger } from \"../Common/OdBaseDragger\";\nimport { OdSelectionFrame } from \"./OdSelectionFrame\";\n\nexport class OdZoomWindowDragger extends OdBaseDragger {\n protected m_frame: any;\n protected m_minX: number;\n protected m_minY: number;\n protected m_maxX: number;\n protected m_maxY: number;\n\n constructor(subject: Viewer) {\n super(subject);\n this.autoSelect = true;\n this.press = false;\n this.needInputText = false;\n\n this.m_frame = new OdSelectionFrame();\n this.m_frame.init(this.m_module, this.getModel());\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n this.m_minX = x;\n this.m_minY = y;\n\n const startPoint = this.screenToWorld(x, y);\n this.m_frame.setStartPoint(startPoint);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n this.m_maxX = x;\n this.m_maxY = y;\n\n const point = this.screenToWorld(x, y);\n this.m_frame.setValue(point);\n }\n }\n\n override end(x: number, y: number): void {\n this.press = false;\n this.m_maxX = x;\n this.m_maxY = y;\n\n if (this.m_minX !== this.m_maxX && this.m_minY !== this.m_maxY) {\n this.m_frame.clear();\n this.getViewer().zoomWindow(this.m_minX, this.m_minY, this.m_maxX, this.m_maxY);\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n/* eslint-disable no-unused-vars */\nimport { Viewer } from \"../Viewer\";\nimport { Point2d } from \"./Common/Geometry\";\nimport { ViewParams } from \"./Common/OdaGeAction\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport class OrbitAroundBuildingDragger extends OdBaseDragger {\n protected maxPolarAngle: number;\n protected minPolarAngle: number;\n protected m_viewCenter: any;\n protected m_startPoint: Point2d;\n protected startCameraParams: ViewParams;\n protected m_delta: number;\n\n constructor(viewer: Viewer) {\n super(viewer);\n this.autoSelect = true;\n this.press = false;\n this.maxPolarAngle = Math.PI / 2;\n this.minPolarAngle = 0; // radians\n }\n\n override start(x: number, y: number): void {\n this.press = true;\n\n this.m_viewCenter = this.getCenter();\n this.m_startPoint = { x, y };\n\n const view = this.getViewer().activeView;\n\n this.startCameraParams = this.getViewParams();\n\n const corners = view.vportRect;\n\n this.m_delta = Math.max(corners[1] - corners[0], corners[2] - corners[3]);\n\n this.beginInteractivity();\n }\n\n setDefaultViewParams(): void {\n this.setViewParams(this.startCameraParams);\n }\n\n override drag(x: number, y: number, dltX: number, dltY: number): void {\n if (this.press) {\n let dX = x - this.m_startPoint.x;\n let dY = y - this.m_startPoint.y;\n\n dX *= Math.PI / this.m_delta;\n dY *= Math.PI / this.m_delta;\n\n this.setDefaultViewParams();\n\n const { Vector3d, Matrix3d } = this.m_module;\n\n const target = Vector3d.createFromArray(this.startCameraParams.target);\n const offset = Vector3d.createFromArray(this.startCameraParams.position).sub(target);\n const dir = offset.normalize();\n\n const zMatrix = new Matrix3d();\n zMatrix.setToIdentity();\n const xMatrix = new Matrix3d();\n xMatrix.setToIdentity();\n\n // ---- restore start rotation ----\n\n const yAxis = Vector3d.createFromArray([dir.x, dir.y, dir.z]);\n const zAxis = Vector3d.createFromArray(this.startCameraParams.upVector);\n const xAxis = yAxis.crossProduct(zAxis);\n\n // ----------- zAxis rotation restore -----------\n let xyDir = Vector3d.createFromArray([yAxis.x, yAxis.y, 0]);\n\n if (xyDir.length() <= 0.00001) {\n xyDir.set(-xAxis.y, xAxis.x, 0);\n } else {\n xyDir = xyDir.normalize();\n }\n const xyAngle =\n Math.sign(xyDir.dotProduct(Vector3d.createFromArray([-1, 0, 0]))) *\n xyDir.angleTo(Vector3d.createFromArray([0, 1, 0]));\n dX -= xyAngle;\n // ----------- zAxis rotation restore -----------\n\n // ----------- xAxis rotation restore -----------\n let yzDir = Vector3d.createFromArray([dir.x, dir.y, 0]);\n let yzAngle = 0;\n if (yzDir.length() <= 0.00001) {\n yzAngle = (-dir.z * Math.PI) / 2;\n } else {\n yzDir = yzDir.normalize();\n yzAngle = -yzDir.angleTo(dir);\n }\n dY -= yzAngle;\n // ----------- xAxis rotation restore -----------\n\n // ---- restore start rotation ----\n\n zMatrix.setToRotation(-dX, [0, 0, 1], [0, 0, 0]);\n\n const xAngle = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, dY));\n xMatrix.setToRotation(xAngle, [1, 0, 0], [0, 0, 0]);\n\n const endMatrix = zMatrix.postMultBy(xMatrix);\n\n let pos = Vector3d.createFromArray([0, 1, 0]).transformBy(endMatrix);\n const up = Vector3d.createFromArray([0, 0, 1]).transformBy(endMatrix);\n\n pos.setLength(offset.length());\n pos = target.add(pos);\n\n const current = this.getViewParams();\n\n current.position = pos.toArray();\n current.upVector = up.toArray();\n\n this.setViewParams(current);\n }\n }\n\n override end(): void {\n this.press = false;\n this.endInteractivity();\n }\n\n getCenter(): any {\n const viewer = this.getViewer();\n\n let ext = viewer.getActiveExtents();\n\n const pSet = viewer.getSelected();\n if (!pSet.isNull() && pSet.numItems() !== 0) {\n const itr = pSet.getIterator();\n const entId = itr.getEntity();\n\n if (entId.getType() === 1) {\n const obj = entId.openObject();\n\n ext.delete();\n ext = obj.getExtents();\n\n obj.delete();\n } else if (entId.getType() === 2) {\n const obj = entId.openObjectAsInsert();\n const extTuple = obj.getExtents();\n\n ext.delete();\n ext = extTuple.ext;\n\n extTuple.delete();\n obj.delete();\n }\n\n itr.delete();\n }\n\n const center = ext.center();\n\n ext.delete();\n return center;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../../Viewer\";\nimport { OrbitAction } from \"../Actions/OrbitAction\";\nimport { PanAction } from \"../Actions/PanAction\";\nimport { ZoomAction } from \"../Actions/ZoomAction\";\nimport { Point2d } from \"./Geometry\";\nimport { OdBaseDragger } from \"./OdBaseDragger\";\n\nexport enum GestureAction {\n None,\n Orbit,\n Pan,\n Zoom,\n}\n\nexport class GestureManager extends OdBaseDragger {\n private _previousEvents = new Map<number, PointerEvent>();\n private _currentEvents = new Map<number, PointerEvent>();\n private _lastGestureAction = GestureAction.None;\n private _orbitAction: OrbitAction;\n private _panAction: PanAction;\n private _zoomAction: ZoomAction;\n\n private _initialDistance: number;\n private readonly _maxInitialDistanceDifference = 30 * window.devicePixelRatio;\n\n private _isSingleTouchEnabled = false;\n\n public get isSingleTouchEnabled(): boolean {\n return this._isSingleTouchEnabled;\n }\n\n public set isSingleTouchEnabled(value: boolean) {\n this._isSingleTouchEnabled = value;\n }\n\n public constructor(subject: Viewer) {\n super(subject);\n\n this._orbitAction = new OrbitAction(this.m_module, this.subject, this.beginInteractivity, this.endInteractivity);\n this._panAction = new PanAction(\n this.m_module,\n this.subject,\n this.beginInteractivity,\n this.endInteractivity,\n this.getViewParams,\n this.setViewParams\n );\n this._zoomAction = new ZoomAction(this.m_module, this.subject);\n }\n\n private getMiddlePoint(events: Map<number, PointerEvent>): Point2d {\n if (events.size !== 2) {\n return undefined;\n }\n\n const keys = this.getKeys(events);\n const point0 = this.relativeCoords(events.get(keys[0]));\n const point1 = this.relativeCoords(events.get(keys[1]));\n\n return {\n x: Math.floor((point0.x + point1.x) / 2),\n y: Math.floor((point0.y + point1.y) / 2),\n };\n }\n\n private getFirstPoint(events: Map<number, PointerEvent>): Point2d {\n if (events.size < 1) {\n return undefined;\n }\n\n const keys = this.getKeys(events);\n return this.relativeCoords(events.get(keys[0]));\n }\n\n private getDistance(events: Map<number, PointerEvent>): number {\n if (events.size !== 2) {\n return -1;\n }\n\n const keys = this.getKeys(events);\n const point0 = this.relativeCoords(events.get(keys[0]));\n const point1 = this.relativeCoords(events.get(keys[1]));\n\n return Math.hypot(point0.x - point1.x, point0.y - point1.y);\n }\n\n private updateEvent(event: PointerEvent) {\n const eventNotInCurrentEvents = !this._currentEvents.get(event.pointerId);\n if (eventNotInCurrentEvents && this._currentEvents.size === 2) {\n return;\n }\n\n const previousEvent = this._currentEvents.get(event.pointerId);\n if (previousEvent) {\n this._previousEvents.set(previousEvent.pointerId, previousEvent);\n }\n\n this._currentEvents.set(event.pointerId, event);\n\n if (eventNotInCurrentEvents) {\n this._initialDistance = this.getDistance(this._currentEvents);\n }\n }\n\n private removeEvent(event: PointerEvent) {\n this._currentEvents.delete(event.pointerId);\n this._previousEvents.delete(event.pointerId);\n\n if (this._currentEvents.size < 2) {\n this._initialDistance = -1;\n }\n }\n\n private getKeys(map: Map<number, PointerEvent>): number[] {\n return Array.from(map.keys());\n }\n\n private analyzeGesture() {\n if (this._currentEvents.size === 2) {\n const currentDistance = this.getDistance(this._currentEvents);\n const previousDistance = this.getDistance(this._previousEvents);\n\n const currentDistanceEqualsInitialDistance =\n Math.abs(this._initialDistance - currentDistance) <= this._maxInitialDistanceDifference;\n if (currentDistanceEqualsInitialDistance) {\n this.executePanAction(this.getMiddlePoint(this._currentEvents));\n } else {\n if (previousDistance !== -1 && currentDistance !== previousDistance) {\n this.executeZoomAction(currentDistance, previousDistance);\n }\n }\n } else if (this._currentEvents.size === 1 && this.isSingleTouchEnabled) {\n this.executeOrbitAction(this.getFirstPoint(this._currentEvents));\n }\n }\n\n private executeZoomAction(currentDistance: number, previousDistance: number) {\n if (this._lastGestureAction !== GestureAction.Zoom) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Zoom;\n OdBaseDragger.isGestureActive = true;\n }\n\n const zoomSpeed = (currentDistance - previousDistance) / 700;\n const zoomFactor = 1 + zoomSpeed;\n const middlePoint = this.getMiddlePoint(this._currentEvents);\n this._zoomAction.action(middlePoint.x, middlePoint.y, zoomFactor);\n this.subject.update();\n }\n\n private executePanAction(currentPoint: Point2d) {\n if (this._lastGestureAction !== GestureAction.Pan) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Pan;\n OdBaseDragger.isGestureActive = true;\n\n this._panAction.beginAction(currentPoint.x, currentPoint.y);\n }\n\n this._panAction.action(currentPoint.x, currentPoint.y);\n this.subject.update();\n }\n\n private executeOrbitAction(currentPoint: Point2d) {\n if (this._lastGestureAction !== GestureAction.Orbit) {\n this.executeEndAction(this._lastGestureAction);\n this._lastGestureAction = GestureAction.Orbit;\n OdBaseDragger.isGestureActive = true;\n\n this._orbitAction.beginAction(currentPoint.x, currentPoint.y);\n }\n\n this._orbitAction.action(currentPoint.x, currentPoint.y);\n this.subject.update();\n }\n\n private executeEndAction(gestureAction: GestureAction) {\n if (gestureAction === GestureAction.Orbit) this._orbitAction.endAction();\n if (gestureAction === GestureAction.Pan) this._panAction.endAction();\n OdBaseDragger.isGestureActive = false;\n }\n\n private needIgnoreEvent(event: PointerEvent): boolean {\n return (\n !this.subject.options.enableZoomWheel || !this.subject.options.enableGestures || !this.eventIsTouchEvent(event)\n );\n }\n\n private eventIsTouchEvent(event: PointerEvent): boolean {\n return event.pointerType === \"touch\" || event.pointerType === \"\";\n }\n\n override pointerdown(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.updateEvent(event);\n }\n\n override pointermove(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.updateEvent(event);\n this.analyzeGesture();\n }\n\n override pointerup(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.removeEvent(event);\n\n if (this._currentEvents.size < 2) {\n this.executeEndAction(this._lastGestureAction);\n OdBaseDragger.isGestureActive = false;\n }\n\n this._lastGestureAction = GestureAction.None;\n }\n\n override pointercancel(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.pointerup(event);\n }\n\n pointerleave(event: PointerEvent) {\n if (this.needIgnoreEvent(event)) {\n return;\n }\n\n this.pointerup(event);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport function loadScript(url: string) {\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = url;\n script.async = true;\n script.onload = () => resolve(script);\n script.onerror = () => {\n script.remove();\n reject(new Error(`GET ${url} failed to load script`));\n };\n document.body.appendChild(script);\n });\n}\n\nexport const memoize = (f) => {\n const cache = {};\n return (...args) => {\n const argStr = JSON.stringify(args);\n cache[argStr] = cache[argStr] || f(...args);\n return cache[argStr];\n };\n};\n\nfunction loadVisuazlizeJsScript(url) {\n if (window[\"getVisualizeLibInst\"]) {\n const script = window[\"getVisualizeLibInst\"].script;\n if (script) {\n if (script.src === url) return Promise.resolve(script);\n script.remove();\n }\n delete window[\"getVisualizeLibInst\"];\n }\n return loadScript(url);\n}\n\nexport const loadVisualizeJs = (url: string, onprogress) => {\n return loadVisuazlizeJsScript(url).then((script) => {\n return new Promise((resolve, reject) => {\n const instance = window[\"getVisualizeLibInst\"]({\n urlMemFile: url + \".wasm\",\n TOTAL_MEMORY: 134217728,\n onprogress,\n });\n instance[\"loadWasmError\"] = reject;\n instance.postRun.push(() => {\n window[\"getVisualizeLibInst\"].script = script;\n resolve(instance);\n });\n });\n });\n};\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Model } from \"../../Api/Model\";\nimport { OptionsData } from \"../Options\";\nimport { Viewer } from \"../Viewer\";\n\nexport class BaseLoader {\n protected viewer: Viewer;\n protected model: Model;\n protected options: OptionsData;\n\n constructor(viewer: Viewer, model: Model, options: OptionsData) {\n this.viewer = viewer;\n this.model = model;\n this.options = options;\n }\n\n async load(): Promise<void> {}\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\n\nexport class TCSLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n const listFileForDownload = [this.model.database, ...this.model.geometry];\n const chunksProgress = listFileForDownload.map(() => 0);\n\n const calcProgress = (index, progress) => {\n chunksProgress[index] = progress;\n const fileProgress = chunksProgress.reduce((acc, progress) => (acc += progress)) / (chunksProgress.length || 1);\n this.viewer.emitEvent({ type: \"geometryprogress\", data: fileProgress, model: this.model });\n };\n\n this.viewer._abortController = abortController;\n\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n for (let i = 0; i < listFileForDownload.length; i++) {\n const chunk = listFileForDownload[i];\n\n const progressCb = (progress) => calcProgress(i, progress);\n const arrayBuffer = await this.model.downloadResource(chunk, progressCb, abortController.signal);\n\n if (abortController.signal.aborted) {\n await Promise.reject(new Error(`Open model aborted ${this.model.name}`));\n }\n\n visViewer.parseStream(new Uint8Array(arrayBuffer));\n this.viewer.update();\n\n const data = new Uint8Array(arrayBuffer);\n\n if (i === 0) {\n this.viewer.update(true);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n }\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","import { Viewer } from \"../Viewer\";\n\nconst DELAY_TIME_MULTIPLEXER = 2.0;\nconst START_UPDATE_TIME = 1000;\n\nexport enum UpdateType {\n kDelay,\n kNormal,\n kForce,\n}\n\nexport class UpdaterController {\n private lastUpdate: number;\n private viewer: Viewer;\n public delayUpdateTime: number;\n\n constructor() {\n this.delayUpdateTime = START_UPDATE_TIME;\n }\n\n initialize(viewer: Viewer) {\n this.viewer = viewer;\n this.lastUpdate = performance.now();\n }\n\n update(type: UpdateType) {\n const isNeedUpdate = type !== UpdateType.kDelay || performance.now() - this.lastUpdate >= this.delayUpdateTime;\n const isForce = type === UpdateType.kForce;\n\n if (isNeedUpdate) {\n this.viewer.update(isForce);\n this.lastUpdate = performance.now();\n this.delayUpdateTime *= DELAY_TIME_MULTIPLEXER;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\nimport { UpdaterController, UpdateType } from \"./UpdaterController\";\n\nexport class VsfXStreamingLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n const updaterController = new UpdaterController();\n updaterController.initialize(this.viewer);\n\n this.viewer._abortController = abortController;\n\n let isFireDatabaseChunk = false;\n\n const chunkLoadHandler = (progress, data) => {\n if (!this.viewer.visualizeJs) return;\n\n const status = visViewer.parseVsfx(data);\n updaterController.update(UpdateType.kDelay);\n\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n\n let state = false;\n if (\n status === visLib.DatabaseStreamStatus.ReadyServiceData ||\n (status === visLib.DatabaseStreamStatus.Complete && !isFireDatabaseChunk)\n ) {\n isFireDatabaseChunk = true;\n state = true;\n }\n\n if (state) {\n updaterController.update(UpdateType.kForce);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n };\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n await this.model.partialDownloadResource(this.model.database, chunkLoadHandler, abortController.signal);\n console.timeEnd(\"File load time\");\n\n updaterController.update(UpdateType.kNormal);\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\nimport { UpdaterController, UpdateType } from \"./UpdaterController\";\n\nexport class VsfXPartialLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n const abortControllerForRequestMap = new Map();\n let servicePartAborted = false;\n\n const pendingRequestsMap = new Map();\n const PENDING_REQUESTS_SIZE = 50;\n const PENDING_REQUESTS_TIMEOUT = 250;\n let pendingRequestsTimerId = 0;\n const pendingRequestsAbortHandler = () => clearTimeout(pendingRequestsTimerId);\n\n const pendingRequestsAbortController = new AbortController();\n abortControllerForRequestMap.set(0, pendingRequestsAbortController);\n\n const updaterController = new UpdaterController();\n updaterController.initialize(this.viewer);\n\n this.viewer._abortController = abortController;\n this.viewer._abortControllerForRequestMap = abortControllerForRequestMap;\n\n visViewer.memoryLimit = this.options.memoryLimit;\n\n const requestLoadHandler = (progress, data, requestId) => {\n if (!this.viewer.visualizeJs) return;\n\n const state = visViewer.parseVsfxInPartialMode(requestId, data);\n updaterController.update(UpdateType.kDelay);\n\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n\n if (state) {\n updaterController.update(UpdateType.kForce);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data, model: this.model });\n } else {\n this.viewer.emitEvent({ type: \"geometrychunk\", data, model: this.model });\n }\n };\n\n const downloadPartOfFile = async (requestId, records, dataId, isMultipleParts = false) => {\n const abortCtrl = new AbortController();\n abortControllerForRequestMap.set(requestId, abortCtrl);\n try {\n await this.model.downloadFileRange(requestId, records, dataId, requestLoadHandler, abortCtrl.signal);\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n } finally {\n const requests = isMultipleParts ? [...new Set(records.map((item) => item.reqId))] : [requestId];\n requests.forEach((requestId) => visViewer.onRequestResponseComplete(requestId));\n abortControllerForRequestMap.delete(requestId);\n updaterController.update(UpdateType.kNormal);\n }\n };\n\n const recordsToArray = (requestId, records) => {\n const res = [];\n for (let i = 0; i < records.size(); i++) {\n const record = records.get(i);\n res.push({\n reqId: requestId,\n begin: record.begin,\n end: record.end,\n size: parseInt(record.end, 10) - parseInt(record.begin, 10),\n });\n record.delete();\n }\n return res;\n };\n\n const objectHandler = {\n onServicePartReceived: (bHasIndex) => {\n if (bHasIndex) {\n servicePartAborted = true;\n abortController.abort();\n }\n },\n\n onRequest: (requestId, records) => {\n downloadPartOfFile(requestId, records, this.model.database);\n },\n\n onFullLoaded: () => {\n updaterController.update(UpdateType.kNormal);\n console.timeEnd(\"File load time\");\n },\n\n onRequestResponseParsed: (requestId) => {\n abortControllerForRequestMap.delete(requestId);\n updaterController.update(UpdateType.kNormal);\n },\n\n onRequestAborted: (requestId) => {\n const abortCtrl = abortControllerForRequestMap.get(requestId);\n if (abortCtrl) abortCtrl.abort();\n },\n\n onRequestResourceFile: async (requestId, _, records) => {\n const dataId = `${this.model.fileId}${this.model.file.type}`;\n\n let pendingRequests = [];\n let recNumber = 0;\n const pendingRequestsRecord = pendingRequestsMap.get(dataId);\n if (pendingRequestsRecord) {\n pendingRequests = pendingRequestsRecord.array;\n recNumber = pendingRequestsRecord.number;\n }\n\n // first several records of each file are processed without grouping (they usually require to be processed sequentially)\n if (recNumber < 6) {\n pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });\n await downloadPartOfFile(requestId, records, dataId);\n return;\n }\n\n // group requests to each file to launch a combined server request\n if (pendingRequests.length >= PENDING_REQUESTS_SIZE) {\n if (pendingRequestsTimerId) {\n window.clearTimeout(pendingRequestsTimerId);\n pendingRequestsTimerId = 0;\n }\n\n downloadPartOfFile(requestId, pendingRequests, dataId, true);\n pendingRequests = [...recordsToArray(requestId, records)];\n } else {\n pendingRequests = [...pendingRequests, ...recordsToArray(requestId, records)];\n }\n\n pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });\n\n // set timeout to wait for the new requests, after that process the remaining requests\n if (pendingRequestsTimerId === 0) {\n pendingRequestsTimerId = window.setTimeout(() => {\n pendingRequestsAbortController.signal.removeEventListener(\"abort\", pendingRequestsAbortHandler);\n pendingRequestsTimerId = 0;\n\n pendingRequestsMap.forEach((requestsRecord, keyFileName) => {\n const array = requestsRecord.array;\n if (array.length > 0) {\n downloadPartOfFile(requestId, array, keyFileName, true);\n pendingRequestsMap.set(keyFileName, { array: [], number: requestsRecord.number + 1 });\n }\n });\n }, PENDING_REQUESTS_TIMEOUT);\n\n pendingRequestsAbortController.signal.addEventListener(\"abort\", pendingRequestsAbortHandler, { once: true });\n }\n },\n };\n\n visViewer.attachPartialResolver(objectHandler);\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n await this.model\n .downloadFileRange(0, null, this.model.database, requestLoadHandler, abortController.signal)\n .catch((error) => {\n if (!servicePartAborted) throw error;\n });\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n if (pendingRequestsTimerId) {\n window.clearTimeout(pendingRequestsTimerId);\n pendingRequestsTimerId = 0;\n }\n\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { BaseLoader } from \"./BaseLoader\";\n\nexport class VsfXLoader extends BaseLoader {\n override async load(): Promise<void> {\n if (!this.viewer.visualizeJs) return;\n\n const visLib = this.viewer.visLib();\n const visViewer = visLib.getViewer();\n const abortController = new AbortController();\n\n this.viewer._abortController = abortController;\n\n console.time(\"File load time\");\n try {\n this.viewer.emitEvent({ type: \"geometrystart\", model: this.model });\n\n const progressCb = (progress) =>\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, model: this.model });\n const arrayBuffer = await this.model.downloadResource(this.model.database, progressCb, abortController.signal);\n\n if (abortController.signal.aborted) {\n await Promise.reject(new Error(`Open model aborted ${this.model.name}`));\n }\n\n if (this.viewer.visualizeJs) {\n visViewer.parseVsfx(new Uint8Array(arrayBuffer));\n this.viewer.update(true);\n\n this.viewer.syncOpenCloudVisualStyle(false);\n this.viewer.syncOptions();\n this.viewer.resize();\n }\n\n console.timeEnd(\"File load time\");\n\n this.viewer.emitEvent({ type: \"geometryend\", model: this.model });\n } catch (error) {\n this.viewer.emitEvent({ type: \"geometryerror\", data: error, model: this.model });\n throw error;\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { TCSLoader } from \"./TCSLoader\";\nimport { VsfXStreamingLoader } from \"./VsfXStreamingLoader\";\nimport { VsfXPartialLoader } from \"./VsfXPartialLoader\";\nimport { Viewer } from \"../Viewer\";\nimport { Model } from \"../../Api/Model\";\nimport { OptionsData } from \"../Options\";\nimport { VsfXLoader } from \"./VsfXLoader\";\n\nexport class LoaderFactory {\n create(viewer: Viewer, model: Model, options: OptionsData) {\n const geometryType = model.database.split(\".\").pop();\n\n if (model.geometry.length === 0 && geometryType === \"vsfx\") {\n if (!options.enableStreamingMode) return new VsfXLoader(viewer, model, options);\n else if (options.enablePartialMode) return new VsfXPartialLoader(viewer, model, options);\n else return new VsfXStreamingLoader(viewer, model, options);\n }\n\n if (geometryType === \"data\") {\n return new TCSLoader(viewer, model, options);\n }\n throw new Error(`Unknown geometry type: ${geometryType}`);\n }\n}\n","import { OdBaseDragger } from \"../Draggers/Common/OdBaseDragger\";\nimport { Viewer } from \"../Viewer\";\nimport { IMarkupObject } from \"./Api/IMarkupObject\";\nimport { IViewpoint } from \"./IViewpoint\";\n\nexport enum MarkupType {\n Unknown,\n Konva = \"Konva\",\n Visualize = \"Visualize\",\n}\n\nexport enum MarkupMode {\n Line = \"Line\",\n Text = \"Text\",\n Rectangle = \"Rectangle\",\n Ellipse = \"Ellipse\",\n Arrow = \"Arrow\",\n Image = \"Image\",\n Cloud = \"Cloud\",\n}\n\nexport interface IMarkup {\n lineWidth: number;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[]): void;\n dispose(): void;\n\n getDraggers(): Map<string, typeof OdBaseDragger>;\n clearOverlay(): void;\n setMarkupColor(r: number, g: number, b: number): void;\n getMarkupColor(): { r: number; g: number; b: number };\n colorizeAllMarkup(r: number, g: number, b: number): void;\n setViewpoint(viewpoint: IViewpoint): void;\n getViewpoint(): IViewpoint;\n\n createObject(type: string, params: any): IMarkupObject;\n getObjects(): IMarkupObject[];\n getSelectedObjects(): IMarkupObject[];\n selectObjects(objects: IMarkupObject[]): void;\n clearSelected(): void;\n}\n","export class MarkupColor {\n public R: number;\n public G: number;\n public B: number;\n\n private _hex: string;\n\n /**\n * Color in #000000 format\n */\n get HexColor(): string {\n return \"#\" + this._hex;\n }\n\n get RGB(): { r: number; g: number; b: number } {\n return { r: this.R, g: this.G, b: this.B };\n }\n\n constructor(r: number, g: number, b: number) {\n this.setColor(r, g, b);\n }\n\n public setColor(r: number, g: number, b: number): void {\n this.R = r;\n this.G = g;\n this.B = b;\n\n this._hex = this.rgbToHex(r, g, b);\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n const valueToHex = (c) => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupLine } from \"../../IMarkupLine\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\nimport { LineType } from \"../../../IViewpoint\";\n\nconst LineTypeSpecs = new Map<string, number[]>([\n [\"solid\", []],\n [\"dot\", [30, 30, 0.001, 30]],\n [\"dash\", [30, 30]],\n]);\n\nexport class KonvaLine implements IMarkupLine, IMarkupColorable {\n private _ref: Konva.Line;\n\n constructor(\n params: { points: { x: number; y: number }[]; type?: LineType; width?: number; color?: string; id?: string },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.points) return;\n\n const konvaPoints = [];\n params.points.forEach((point) => konvaPoints.push(point.x, point.y));\n\n this._ref = new Konva.Line({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.width ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || [],\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"line\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): number[] {\n return this._ref.points();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n getLineType(): string {\n const typeSpecs = this._ref.dash() || [];\n let type: LineType;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n\n setLineType(type: string) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n\n addPoints(points: [{ x: number; y: number }]) {\n let newPoints = this._ref.points();\n points.forEach((point) => {\n newPoints = newPoints.concat([point.x, point.y]);\n });\n\n this._ref.points(newPoints);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupText } from \"../../IMarkupText\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaText implements IMarkupText, IMarkupColorable {\n private _ref: Konva.Text;\n private readonly TEXT_FONT_FAMILY = \"Calibri\";\n\n constructor(\n params: {\n position: { x: number; y: number };\n text: string;\n rotation?: number;\n fontSize?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params || !params.text) return;\n\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: params.fontSize ?? 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: params.color ?? \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: params.rotation ?? 0,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"text\";\n }\n\n getColor(): string {\n return this._ref.fill();\n }\n\n setColor(hex: string) {\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getText(): string {\n return this._ref.text();\n }\n\n setText(text: string): void {\n this._ref.text(text);\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n getFontSize() {\n return this._ref.fontSize();\n }\n\n setFontSize(size: number) {\n this._ref.fontSize(size);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupRectangle } from \"../../IMarkupRectangle\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaRectangle implements IMarkupRectangle, IMarkupColorable {\n private _ref: Konva.Rect;\n\n constructor(\n params: {\n position: { x: number; y: number };\n width?: number;\n height?: number;\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position) return;\n\n this._ref = new Konva.Rect({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"rectangle\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupEllipse } from \"../../IMarkupEllipse\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaEllipse implements IMarkupEllipse, IMarkupColorable {\n private _ref: Konva.Ellipse;\n\n constructor(\n params: {\n position: { x: number; y: number };\n radius: { x: number; y: number };\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position) return;\n\n this._ref = new Konva.Ellipse({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n\n getRadiusX(): number {\n return this._ref.radiusX();\n }\n\n setRadiusX(r: number) {\n this._ref.radius({ x: r, y: this._ref.radiusY() });\n }\n\n getRadiusY(): number {\n return this._ref.radiusY();\n }\n\n setRadiusY(r: number) {\n this._ref.radius({ x: this._ref.radiusX(), y: r });\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"ellipse\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupArrow } from \"../../IMarkupArrow\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\n\nexport class KonvaArrow implements IMarkupArrow, IMarkupColorable {\n private _ref: Konva.Arrow;\n\n constructor(\n params: {\n start: { x: number; y: number };\n end: { x: number; y: number };\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.start || !params.end) return;\n\n this._ref = new Konva.Arrow({\n stroke: params.color ?? \"#ff0000\",\n fill: params.color ?? \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [params.start.x, params.start.y, params.end.x, params.end.y],\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"arrow\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): { x: number; y: number }[] {\n const points = this._ref.points();\n return [\n { x: points[0], y: points[1] },\n { x: points[2], y: points[3] },\n ];\n }\n\n setPoints(points: { x: number; y: number }[]) {\n if (points.length === 2) {\n this._ref.points([points[0].x, points[0].y, points[1].x, points[1].y]);\n }\n }\n\n getStartPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[0], y: points[1] };\n }\n\n setStartPoint(x: number, y: number) {\n const points = this._ref.points();\n this._ref.points([x, y, points[2], points[3]]);\n }\n\n getEndPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[2], y: points[3] };\n }\n\n setEndPoint(x: number, y: number) {\n const points = this._ref.points();\n this._ref.points([points[0], points[1], x, y]);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupImage } from \"../../IMarkupImage\";\n\nexport class KonvaImage implements IMarkupImage {\n private _ref: Konva.Image;\n private _canvasImage: HTMLImageElement;\n private _ratio = 1;\n\n constructor(\n params: { position: { x: number; y: number }; src: string; width: number; height: number; id?: string },\n ref = null\n ) {\n if (ref) {\n if (ref.height() === 0 || ref.width() === 0) return;\n\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio = this._ref.height() / this._ref.width();\n return;\n }\n\n if (!params.position || !params.src) return;\n this._canvasImage = new Image();\n\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: params.width,\n height: params.height,\n draggable: true,\n });\n\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n this._ratio = this._ref.height() === 0 || this._ref.width() === 0 ? 1 : this._ref.height() / this._ref.width();\n };\n\n this._canvasImage.src = params.src;\n\n this._ref.id(this._ref._id.toString());\n }\n\n getSrc(): string {\n return this._canvasImage.src;\n }\n\n setSrc(src: any) {\n this._canvasImage.src = src;\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n\n getHeight(): number {\n return this._ref.height();\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"image\";\n }\n\n // we can break Liskov Substitution Principle, need to use separate IColorable\n // getColor(): string {\n // return this._ref.fill();\n // }\n\n // setColor(hex: string) {\n // this._ref.fill(hex);\n // }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number) {\n this._ref.setPosition({ x, y });\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupColorable } from \"../../IMarkupColorable\";\nimport { IMarkupCloud } from \"../../IMarkupCloud\";\n\nexport class KonvaCloud implements IMarkupCloud, IMarkupColorable {\n private _ref: Konva.Shape;\n\n constructor(\n params: {\n position: { x: number; y: number };\n width?: number;\n height?: number;\n lineWidth?: number;\n color?: string;\n id?: string;\n },\n ref = null\n ) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params.position || !params.width || !params.height) return;\n\n const arcRadius = 16;\n\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 5,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return { x: midX, y: midY };\n }\n\n const points = [\n { x: 0, y: 0 },\n { x: 0 + this._ref.width(), y: 0 },\n { x: 0 + this._ref.width(), y: 0 + this._ref.height() },\n { x: 0, y: 0 + this._ref.height() },\n { x: 0, y: 0 },\n ];\n\n const midPoint = calculateMidpoint({ x: 0, y: 0 }, this._ref.width(), this._ref.height());\n\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, arcRadius, endAngle, startAngle);\n } else {\n context.arc(pX, pY, arcRadius, startAngle, endAngle);\n }\n\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n\n context.closePath();\n // (!) Konva specific method, it is very important\n // it will apply are required styles\n context.fillStrokeShape(shape);\n },\n });\n\n this._ref.className = \"Cloud\";\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n const minWidth = 100;\n const minHeight = 100;\n\n const newWidth = this._ref.width() * attrs.scaleX;\n const newHeight = this._ref.height() * attrs.scaleY;\n\n if (newWidth < minWidth || newHeight < minHeight) {\n this._ref.scale({ x: 1, y: 1 });\n return;\n }\n\n if (Math.abs(attrs.scaleX - 1) > 10e-6) {\n this._ref.width(newWidth);\n }\n\n if (Math.abs(attrs.scaleY - 1) > 10e-6) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.getSelfRect = () => {\n return {\n x: 0 - arcRadius,\n y: 0 - arcRadius,\n width: this._ref.width() + 2 * arcRadius,\n height: this._ref.height() + 2 * arcRadius,\n };\n };\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean) {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"cloud\";\n }\n\n getColor(): string {\n return this._ref.stroke();\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition() {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number) {\n this._ref.position({ x, y });\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number) {\n this._ref.width(w);\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setHeight(h: number) {\n this._ref.height(h);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkup, MarkupMode } from \"../../IMarkup\";\nimport { Viewer } from \"../../../Viewer\";\nimport { ChangeActiveDraggerEvent, PanEvent } from \"../../../ViewerEvents\";\nimport { MarkupColor } from \"./MarkupColor\";\nimport * as utils from \"../../../Draggers/MeasureLineDragger/MeasureUtils\";\nimport { OdBaseDragger } from \"../../../Draggers/Common/OdBaseDragger\";\nimport { IMarkupObject } from \"../../Api/IMarkupObject\";\nimport { KonvaLine } from \"../../Api/Impl/Konva/KonvaLine\";\nimport { KonvaText } from \"../../Api/Impl/Konva/KonvaText\";\nimport { KonvaRectangle } from \"../../Api/Impl/Konva/KonvaRectangle\";\nimport { KonvaEllipse } from \"../../Api/Impl/Konva/KonvaEllipse\";\nimport { KonvaArrow } from \"../../Api/Impl/Konva/KonvaArrow\";\nimport { KonvaImage } from \"../../Api/Impl/Konva/KonvaImage\";\nimport { KonvaCloud } from \"../../Api/Impl/Konva/KonvaCloud\";\nimport { IViewpoint, LineType } from \"../../IViewpoint\";\n\nclass KonvaShape {\n name: string;\n initializer: (ref: any) => any;\n}\n\n// move to separate class and create factory with enum?\nconst MarkupMode2Konva = new Map<MarkupMode, KonvaShape>([\n [\n MarkupMode.Line,\n {\n name: \"Line\",\n initializer: (ref) => {\n return new KonvaLine(null, ref);\n },\n },\n ],\n [\n MarkupMode.Text,\n {\n name: \"Text\",\n initializer: (ref) => {\n return new KonvaText(null, ref);\n },\n },\n ],\n [\n MarkupMode.Rectangle,\n {\n name: \"Rect\",\n initializer: (ref) => {\n return new KonvaRectangle(null, ref);\n },\n },\n ],\n [\n MarkupMode.Ellipse,\n {\n name: \"Ellipse\",\n initializer: (ref) => {\n return new KonvaEllipse(null, ref);\n },\n },\n ],\n [\n MarkupMode.Arrow,\n {\n name: \"Arrow\",\n initializer: (ref) => {\n return new KonvaArrow(null, ref);\n },\n },\n ],\n [\n MarkupMode.Image,\n {\n name: \"Image\",\n initializer: (ref) => {\n return new KonvaImage(null, ref);\n },\n },\n ],\n [\n MarkupMode.Cloud,\n {\n name: \"Cloud\",\n initializer: (ref) => {\n return new KonvaCloud(null, ref);\n },\n },\n ],\n]);\n\nexport class KonvaMarkup implements IMarkup {\n private _isInitialized = false;\n private _viewer: Viewer;\n private _canvasOriginal: HTMLCanvasElement;\n private _canvasEvents: string[];\n private _markupIsActive: boolean;\n private _markupMode: MarkupMode;\n private _markupColor: MarkupColor;\n private _konvaStage: Konva.Stage;\n private _konvaLayer: Konva.Layer;\n private _konvaTransformer: Konva.Transformer;\n\n private _textInputRef: HTMLTextAreaElement;\n private _textInputPos: Konva.Vector2d;\n private _textInputAngle: number;\n private _markupContainer: HTMLDivElement;\n private _zIndex = 1;\n\n private readonly _markupContainerName = \"markupContainer\";\n\n public lineWidth = 4;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[] = []): void {\n if (!Konva)\n throw new Error(\n 'Konva Markup: Error during Markup Initialization. Konva is not initialized. Update node_modules or add to your page <script src=\"https://unpkg.com/konva@9/konva.min.js\"></script>'\n );\n\n this._viewer = viewer;\n\n this._canvasOriginal = canvas;\n this._canvasEvents = canvasEvents;\n\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = this._markupContainerName;\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n // to eliminate grey box during delete elements\n this._markupContainer.style.outline = \"0px\";\n\n const parentDiv = this._canvasOriginal.parentElement;\n parentDiv.appendChild(this._markupContainer);\n\n this._markupColor = new MarkupColor(255, 0, 0);\n this._markupIsActive = false;\n\n this.initializeKonva();\n this.resize();\n\n this._canvasEvents.forEach((x) => this._markupContainer.addEventListener(x, this.redirectToViewer));\n\n this._viewer.addEventListener(\"resize\", this.resize);\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n\n this._isInitialized = true;\n }\n\n dispose(): void {\n if (!this._isInitialized) return;\n\n this._canvasEvents.forEach((x) => this._markupContainer.removeEventListener(x, this.redirectToViewer));\n\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.removeEventListener(\"resize\", this.resize);\n\n this.destroyKonva();\n\n this._markupContainer.remove();\n\n this._markupContainer = undefined;\n this._canvasOriginal = undefined;\n this._viewer = undefined;\n\n this._isInitialized = false;\n }\n\n changeActiveDragger = (event: ChangeActiveDraggerEvent) => {\n const draggerName = event.data;\n\n this._markupContainer.className = this._canvasOriginal.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${draggerName.toLowerCase()}`)\n .join(\" \");\n\n this.removeTextInput();\n\n const markupMode = MarkupMode[draggerName];\n const konvaMode = MarkupMode2Konva.get(markupMode);\n if (konvaMode) {\n this._markupMode = markupMode;\n this._markupIsActive = true;\n } else {\n this._markupIsActive = false;\n this._konvaTransformer.nodes([]);\n }\n };\n\n resize = () => {\n this._konvaStage?.width(this._canvasOriginal.clientWidth);\n this._konvaStage?.height(this._canvasOriginal.clientHeight);\n };\n\n pan = (event: PanEvent) => {\n const dX = event.dX / window.devicePixelRatio;\n const dY = event.dY / window.devicePixelRatio;\n\n Object.values(MarkupMode).forEach((mode) => this.konvaLayerFind(mode).forEach((x) => x.move({ x: dX, y: dY })));\n };\n\n redirectToViewer = (event) => {\n this._viewer.emit(event);\n };\n\n getDraggers(): Map<string, typeof OdBaseDragger> {\n return null;\n }\n\n clearOverlay(): void {\n this.removeTextInput();\n this._konvaTransformer.nodes([]);\n Object.values(MarkupMode).forEach((mode) => this.konvaLayerFind(mode).forEach((x) => x.destroy()));\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor.RGB;\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n this._markupColor.setColor(r, g, b);\n }\n\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n const hex = new MarkupColor(r, g, b).HexColor;\n Object.values(MarkupMode).forEach((mode) => {\n this.konvaLayerFind(mode).forEach((x) => {\n const konvaObj = MarkupMode2Konva.get(mode).initializer(x);\n if (konvaObj.setColor) konvaObj.setColor(hex);\n });\n });\n\n this._konvaLayer.draw();\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n const markupColor = viewpoint.custom_fields.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n this.loadMarkup(viewpoint);\n }\n\n getViewpoint(): IViewpoint {\n // TODO: at the current 25.2 state we need VisualizeJS here and below. In the future we need to use it as an external interface.\n if (!this._viewer.visualizeJs) return {};\n\n const viewpoint: IViewpoint = {\n lines: [],\n texts: [],\n arrows: [],\n clouds: [],\n ellipses: [],\n images: [],\n rectangles: [],\n };\n\n viewpoint.snapshot = {\n data: this.combineMarkupWithDrawing(),\n };\n\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor(),\n };\n\n this.fillViewpointShapes(viewpoint);\n\n viewpoint.description = new Date().toDateString();\n return viewpoint;\n }\n\n createObject(type: string, params: any): IMarkupObject {\n let object;\n let zIndex = this._zIndex;\n\n // TODO: factory?\n switch (type) {\n case \"line\":\n object = new KonvaLine(params);\n zIndex = 1;\n break;\n case \"text\":\n object = new KonvaText(params);\n break;\n case \"rectangle\":\n object = new KonvaRectangle(params);\n zIndex = 1;\n break;\n case \"ellipse\":\n object = new KonvaEllipse(params);\n zIndex = 1;\n break;\n case \"arrow\":\n object = new KonvaArrow(params);\n break;\n case \"image\":\n object = new KonvaImage(params);\n zIndex = 0;\n break;\n case \"cloud\":\n object = new KonvaCloud(params);\n zIndex = 1;\n break;\n default:\n throw new Error(\"Markup CreateObject - unsupported type has been detected.\");\n }\n\n this.addObject(object);\n\n // Set zIndex only when shape has been added to Layer else we will get \"Konva warning: Node has no parent. zIndex parameter is ignored.\"\n object.setZIndex(zIndex);\n this._zIndex++;\n return object;\n }\n\n getObjects(): IMarkupObject[] {\n const objects = [];\n this.konvaLayerFind(MarkupMode.Line).forEach((line) => {\n objects.push(new KonvaLine(null, line));\n });\n\n this.konvaLayerFind(MarkupMode.Text).forEach((text) => {\n objects.push(new KonvaText(null, text));\n });\n\n this.konvaLayerFind(MarkupMode.Rectangle).forEach((rectangle) => {\n objects.push(new KonvaRectangle(null, rectangle));\n });\n\n this.konvaLayerFind(MarkupMode.Ellipse).forEach((ellipse) => {\n objects.push(new KonvaEllipse(null, ellipse));\n });\n\n this.konvaLayerFind(MarkupMode.Arrow).forEach((arrow) => {\n objects.push(new KonvaArrow(null, arrow));\n });\n\n this.konvaLayerFind(MarkupMode.Image).forEach((image) => {\n objects.push(new KonvaImage(null, image));\n });\n\n this.konvaLayerFind(MarkupMode.Cloud).forEach((cloud) => {\n objects.push(new KonvaCloud(null, cloud));\n });\n\n return objects;\n }\n\n getSelectedObjects(): IMarkupObject[] {\n const objects = [];\n\n this._konvaTransformer.nodes().forEach((obj) => {\n const konvaShapeName = obj.className;\n switch (konvaShapeName) {\n case \"Line\":\n objects.push(new KonvaLine(null, obj));\n break;\n case \"Text\":\n objects.push(new KonvaText(null, obj));\n break;\n case \"Rect\":\n objects.push(new KonvaRectangle(null, obj));\n break;\n case \"Ellipse\":\n objects.push(new KonvaEllipse(null, obj));\n break;\n case \"Arrow\":\n objects.push(new KonvaArrow(null, obj));\n break;\n case \"Image\":\n objects.push(new KonvaImage(null, obj));\n break;\n case \"Cloud\":\n objects.push(new KonvaCloud(null, obj));\n break;\n default:\n break;\n }\n });\n\n return objects;\n }\n\n selectObjects(objects: IMarkupObject[]) {\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x) => x.ref()));\n this._konvaTransformer.nodes(selectedObjs);\n }\n\n clearSelected(): void {\n this._konvaTransformer.nodes([]);\n }\n\n private getPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n private fillViewpointShapes(viewpoint) {\n const markupLines = this.getMarkupLines();\n if (markupLines && markupLines.length > 0) {\n markupLines?.forEach((line) => {\n viewpoint.lines.push(line);\n });\n }\n\n const markupTexts = this.getMarkupTexts();\n if (markupTexts && markupTexts.length > 0) {\n markupTexts?.forEach((text) => {\n viewpoint.texts.push(text);\n });\n }\n\n const markupRectangles = this.getMarkupRectangles();\n if (markupRectangles && markupRectangles.length > 0) {\n markupRectangles?.forEach((rectangle) => {\n viewpoint.rectangles.push(rectangle);\n });\n }\n\n const markupEllipses = this.getMarkupEllipses();\n if (markupEllipses && markupEllipses.length > 0) {\n markupEllipses?.forEach((ellipse) => {\n viewpoint.ellipses.push(ellipse);\n });\n }\n\n const markupArrows = this.getMarkupArrows();\n if (markupArrows && markupArrows.length > 0) {\n markupArrows?.forEach((arrow) => {\n viewpoint.arrows.push(arrow);\n });\n }\n\n const markupImages = this.getMarkupImages();\n if (markupImages && markupImages.length > 0) {\n markupImages?.forEach((image) => {\n viewpoint.images.push(image);\n });\n }\n\n const markupClouds = this.getMarkupClouds();\n if (markupClouds && markupClouds.length > 0) {\n markupClouds?.forEach((cloud) => {\n viewpoint.clouds.push(cloud);\n });\n }\n }\n\n private addObject(object: IMarkupObject): void {\n this._konvaLayer.add(object.ref());\n }\n\n private konvaLayerFind(markupShape: MarkupMode): any {\n const konvaShape = MarkupMode2Konva.get(markupShape);\n if (konvaShape) {\n // for \"draggable\" Konva uses Rectangles in Transformer. We need only Shapes from Layer.\n const konvaShapes = this._konvaLayer.find(konvaShape.name).filter((x) => x.parent instanceof Konva.Layer);\n return konvaShapes;\n }\n }\n\n private initializeKonva(): any {\n // first we need Konva core things: stage and layer\n this._konvaStage = new Konva.Stage({\n container: this._markupContainerName,\n width: this._canvasOriginal.clientWidth,\n height: this._canvasOriginal.clientHeight,\n });\n const stage = this._konvaStage;\n const layer = new Konva.Layer({ pixelRation: window.devicePixelRatio });\n stage.add(layer);\n this._konvaLayer = layer;\n\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n });\n\n this._konvaTransformer = transformer;\n layer.add(transformer);\n\n let isPaint = false;\n let lastLine;\n\n stage.on(\"mousedown touchstart\", (e) => {\n // do nothing if we mousedown on any shape\n if (!this._markupIsActive || e.target !== stage || this._markupMode === MarkupMode.Text) return;\n\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n\n const pos = stage.getPointerPosition();\n\n if (this._markupMode === MarkupMode.Line) {\n // add point twice, so we have some drawings even on a simple click\n lastLine = this.addLine([pos.x, pos.y, pos.x, pos.y]);\n\n isPaint = true;\n }\n // 25.2 - currently only for debug purposes:\n else if (this._markupMode === MarkupMode.Rectangle) {\n this.addRectangle({ x: pos.x, y: pos.y }, 50, 50);\n } else if (this._markupMode === MarkupMode.Ellipse) {\n this.addEllipse({ x: pos.x, y: pos.y }, { x: 50, y: 50 });\n } else if (this._markupMode === MarkupMode.Arrow) {\n this.addArrow({ x: pos.x, y: pos.y }, { x: pos.x + 50, y: pos.y + 50 });\n } else if (this._markupMode === MarkupMode.Cloud) {\n this.addCloud({ x: pos.x, y: pos.y }, 200, 400);\n }\n });\n\n stage.on(\"mouseup touchend\", (e) => {\n if (!this._markupIsActive) return;\n isPaint = false;\n });\n\n stage.on(\"mousemove touchmove\", (e) => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n\n // prevent scrolling on touch devices\n //e.evt.preventDefault();\n\n const pos = stage.getPointerPosition();\n const newPoints = lastLine.points().concat([pos.x, pos.y]);\n lastLine.points(newPoints);\n });\n\n // clicks should select/deselect shapes\n stage.on(\"click tap\", (e) => {\n if (!this._markupIsActive) return;\n\n // if click on empty area - remove all selections\n if (e.target === stage) {\n if (this._markupMode === MarkupMode.Text) {\n if (this._textInputRef) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else if (transformer.nodes().length === 0) {\n const pos = stage.getPointerPosition();\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n }\n transformer.nodes([]);\n return;\n }\n\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else\n this.createTextInput(\n { x: e.target.attrs.x, y: e.target.attrs.y },\n e.evt.pageX,\n e.evt.pageY,\n e.target.attrs.rotation,\n e.target.attrs.text\n );\n return;\n } else {\n this.removeTextInput();\n }\n\n if (transformer.nodes().filter((x) => x.className === \"Cloud\").length > 0 || e.target.className === \"Cloud\") {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n\n // do we pressed shift or ctrl?\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n\n if (!metaPressed && !isSelected) {\n // if no key pressed and the node is not selected\n // select just one\n transformer.nodes([e.target]);\n } else if (metaPressed && isSelected) {\n // if we pressed keys and node was selected\n // we need to remove it from selection:\n const nodes = transformer.nodes().slice(); // use slice to have new copy of array\n // remove node from array\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n // add the node into selection\n const nodes = transformer.nodes().concat([e.target]);\n transformer.nodes(nodes);\n }\n });\n\n const container = stage.container();\n container.tabIndex = 1;\n // focus it\n // also stage will be in focus on its click\n container.focus();\n\n container.addEventListener(\"keydown\", (e) => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n this._konvaTransformer.nodes().forEach((x) => x.destroy());\n this._konvaTransformer.nodes([]);\n }\n layer.draw();\n return;\n }\n e.preventDefault();\n });\n }\n\n private destroyKonva() {\n this.clearOverlay();\n\n this._konvaStage.destroy();\n\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n\n private getMarkupLines() {\n const lines = [];\n this.konvaLayerFind(MarkupMode.Line).forEach((line) => {\n const linePoints = line.points();\n if (!linePoints) return;\n const worldPoints = [];\n const absoluteTransform = line.getAbsoluteTransform();\n for (let i = 0; i < linePoints.length; i += 2) {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n // https://stackoverflow.com/a/57641487 - check answer's comments\n const atPoint = absoluteTransform.point({ x: linePoints[i], y: linePoints[i + 1] });\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(atPoint.x * window.devicePixelRatio, atPoint.y * window.devicePixelRatio);\n worldPoints.push(worldPoint);\n }\n\n const konvaLine = new KonvaLine(null, line);\n lines.push({\n id: konvaLine.id(),\n points: worldPoints.map((p) => this.getPoint3dFromArray(p)),\n color: konvaLine.getColor() || \"ff0000\",\n type: konvaLine.getLineType() || \"solid\",\n width: konvaLine.getLineWidth() || 3,\n });\n });\n\n return lines;\n }\n\n private getMarkupTexts() {\n const texts = [];\n\n const textSize = 0.02;\n let textScale = 1.0;\n\n const projMtrx = this._viewer.visViewer().activeView.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n const tol = 1.0e-6;\n if (mtrxNumber > tol || mtrxNumber < -tol) {\n textScale = 1 / mtrxNumber;\n }\n\n this.konvaLayerFind(MarkupMode.Text).forEach((text) => {\n if (!text) return;\n\n const position = this._viewer\n .visViewer()\n .screenToWorld(text.x() * window.devicePixelRatio, text.y() * window.devicePixelRatio);\n\n const shape = new KonvaText(null, text);\n texts.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(position),\n text: shape.getText(),\n text_size: textSize * textScale,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize(),\n });\n });\n\n return texts;\n }\n\n private getMarkupRectangles() {\n const rectangles = [];\n this.konvaLayerFind(MarkupMode.Rectangle).forEach((rect) => {\n const position = rect.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaRectangle(null, rect);\n rectangles.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n width: shape.getWidth(),\n height: shape.getHeigth(),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return rectangles;\n }\n\n private getMarkupEllipses() {\n const ellipses = [];\n this.konvaLayerFind(MarkupMode.Ellipse).forEach((ellipse) => {\n const position = ellipse.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaEllipse(null, ellipse);\n ellipses.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n radius: { x: ellipse.getRadiusX(), y: ellipse.getRadiusY() },\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return ellipses;\n }\n\n private getMarkupArrows() {\n const arrows = [];\n this.konvaLayerFind(MarkupMode.Arrow).forEach((arrow) => {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n const absoluteTransform = arrow.getAbsoluteTransform();\n\n const atStartPoint = absoluteTransform.point({ x: arrow.points()[0], y: arrow.points()[1] });\n const worldStartPoint = this._viewer\n .visViewer()\n .screenToWorld(atStartPoint.x * window.devicePixelRatio, atStartPoint.y * window.devicePixelRatio);\n\n const atEndPoint = absoluteTransform.point({ x: arrow.points()[2], y: arrow.points()[3] });\n const worldEndPoint = this._viewer\n .visViewer()\n .screenToWorld(atEndPoint.x * window.devicePixelRatio, atEndPoint.y * window.devicePixelRatio);\n\n const shape = new KonvaArrow(null, arrow);\n arrows.push({\n id: shape.id(),\n start: this.getPoint3dFromArray(worldStartPoint),\n end: this.getPoint3dFromArray(worldEndPoint),\n color: shape.getColor(),\n });\n });\n\n return arrows;\n }\n\n private getMarkupImages() {\n const images = [];\n this.konvaLayerFind(MarkupMode.Image).forEach((image) => {\n const position = image.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaImage(null, image);\n images.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n src: shape.getSrc(),\n width: shape.getWidth(),\n height: shape.getHeight(),\n });\n });\n\n return images;\n }\n\n private getMarkupClouds() {\n const clouds = [];\n this.konvaLayerFind(MarkupMode.Cloud).forEach((cloud) => {\n const position = cloud.position();\n const worldPoint = this._viewer\n .visViewer()\n .screenToWorld(position.x * window.devicePixelRatio, position.y * window.devicePixelRatio);\n\n const shape = new KonvaCloud(null, cloud);\n clouds.push({\n id: shape.id(),\n position: this.getPoint3dFromArray(worldPoint),\n width: shape.getWidth(),\n height: shape.getHeigth(),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n });\n });\n\n return clouds;\n }\n\n private loadMarkup(viewpoint: IViewpoint) {\n viewpoint.lines?.forEach((vpLine) => {\n const linePoints = [];\n vpLine.points.forEach((point) => {\n const screenPoint = utils.worldToScreen(\n [point.x, point.y, point.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n });\n\n this.addLine(linePoints, vpLine.color, vpLine.type, vpLine.width, vpLine.id);\n });\n\n viewpoint.texts?.forEach((vpText) => {\n const screenPoint = utils.worldToScreen(\n [vpText.position.x, vpText.position.y, vpText.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n this.addText(vpText.text, screenPoint, vpText.angle, vpText.color, vpText.text_size, vpText.font_size, vpText.id);\n });\n\n viewpoint.rectangles?.forEach((vpRect) => {\n const screenPoint = utils.worldToScreen(\n [vpRect.position.x, vpRect.position.y, vpRect.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addRectangle(\n { x: screenPoint.x, y: screenPoint.y },\n vpRect.width,\n vpRect.height,\n vpRect.line_width,\n vpRect.color,\n vpRect.id\n );\n });\n\n viewpoint.ellipses?.forEach((vpEllipse) => {\n const screenPoint = utils.worldToScreen(\n [vpEllipse.position.x, vpEllipse.position.y, vpEllipse.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addEllipse(\n { x: screenPoint.x, y: screenPoint.y },\n { x: vpEllipse.radius.x, y: vpEllipse.radius.y },\n vpEllipse.line_width,\n vpEllipse.color,\n vpEllipse.id\n );\n });\n\n viewpoint.arrows?.forEach((vpArrow) => {\n const startPoint = utils.worldToScreen(\n [vpArrow.start.x, vpArrow.start.y, vpArrow.start.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n const endPoint = utils.worldToScreen(\n [vpArrow.end.x, vpArrow.end.y, vpArrow.end.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addArrow({ x: startPoint.x, y: startPoint.y }, { x: endPoint.x, y: endPoint.y }, vpArrow.color, vpArrow.id);\n });\n\n viewpoint.clouds?.forEach((vpCloud) => {\n const screenPoint = utils.worldToScreen(\n [vpCloud.position.x, vpCloud.position.y, vpCloud.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addCloud(\n { x: screenPoint.x, y: screenPoint.y },\n vpCloud.width,\n vpCloud.height,\n vpCloud.line_width,\n vpCloud.color,\n vpCloud.id\n );\n });\n\n viewpoint.images?.forEach((vpImage) => {\n const screenPoint = utils.worldToScreen(\n [vpImage.position.x, vpImage.position.y, vpImage.position.z],\n this._viewer.visualizeJs,\n this._viewer.visViewer()\n );\n\n this.addImage({ x: screenPoint.x, y: screenPoint.y }, vpImage.src, vpImage.width, vpImage.height, vpImage.id);\n });\n }\n\n private combineMarkupWithDrawing() {\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n this._konvaTransformer.nodes([]);\n }\n\n const tempCanvas = document.createElement(\"canvas\");\n tempCanvas.height = this._canvasOriginal.height;\n tempCanvas.width = this._canvasOriginal.width;\n const ctx = tempCanvas.getContext(\"2d\");\n ctx.drawImage(this._canvasOriginal, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({ pixelRatio: window.devicePixelRatio }), 0, 0);\n return tempCanvas.toDataURL(\"image/jpeg\", 0.25);\n }\n\n private addLine(\n linePoints: number[],\n color?: string,\n type?: LineType,\n width?: number,\n id?: string\n ): Konva.Line | void {\n if (!linePoints || linePoints.length === 0) return;\n const points: { x: number; y: number }[] = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({ x: linePoints[i], y: linePoints[i + 1] });\n }\n\n const konvaLine = new KonvaLine({\n points,\n type: type || \"solid\",\n width: width || this.lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaLine.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private createTextInput(pos: Konva.Vector2d, inputX: number, inputY: number, angle: number, text: string): void {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.onkeydown = (event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n\n setTimeout(() => {\n this._textInputRef.focus();\n }, 50);\n } else {\n this.removeTextInput();\n }\n }\n\n private removeTextInput(): void {\n this._textInputRef?.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n\n private addText(\n specifiedText: string,\n position: Konva.Vector2d,\n angle?: number,\n color?: string,\n textSize?: number,\n fontSize?: number,\n id?: string\n ): void {\n if (specifiedText) {\n const tol = 1.0e-6;\n\n // in case we have old viewpoint without font_size\n if (textSize && textSize > tol && (!fontSize || fontSize < tol)) {\n const size = 0.02;\n let scale = 1.0;\n\n const projMtrx = this._viewer.visViewer().activeView.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n\n if (mtrxNumber > tol || mtrxNumber < -tol) {\n scale = 1 / mtrxNumber;\n }\n fontSize = textSize / (scale / size) / 34;\n }\n\n const konvaText = new KonvaText({\n position: { x: position.x, y: position.y },\n text: specifiedText,\n rotation: angle,\n fontSize,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n this._konvaLayer.add(konvaText.ref());\n }\n\n const trNodes = this._konvaTransformer.nodes();\n if (trNodes.length > 0) {\n // in case of edit - remove old Konva.Text object\n trNodes[0].destroy();\n this._konvaTransformer.nodes([]);\n }\n\n this.removeTextInput();\n\n return;\n }\n\n private addRectangle(\n position: Konva.Vector2d,\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Rect | void {\n if (!position) return;\n\n const konvaRectangle = new KonvaRectangle({\n position,\n width,\n height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaRectangle.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addEllipse(\n position: { x: number; y: number },\n radius: { x: number; y: number },\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Ellipse | void {\n if (!position) return;\n\n const konvaEllipse = new KonvaEllipse({\n position,\n radius,\n lineWidth,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaEllipse.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addArrow(\n start: { x: number; y: number },\n end: { x: number; y: number },\n color?: string,\n id?: string\n ): Konva.Arrow | void {\n if (!start || !end) return;\n\n const konvaArrow = new KonvaArrow({\n start,\n end,\n color: color || this._markupColor.HexColor,\n id,\n });\n\n const obj = konvaArrow.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addCloud(\n position: { x: number; y: number },\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): Konva.Shape | void {\n if (!position || !width || !height) return;\n\n const konvaCloud = new KonvaCloud({\n position,\n width,\n height,\n color: color || this._markupColor.HexColor,\n lineWidth: lineWidth || this.lineWidth,\n id,\n });\n\n const obj = konvaCloud.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n\n private addImage(\n position: { x: number; y: number },\n src: string,\n width: number,\n height: number,\n id?: string\n ): Konva.Image | void {\n if (!position || !width || !height) return;\n\n const konvaImage = new KonvaImage({\n position,\n src,\n width,\n height,\n id,\n });\n\n const obj = konvaImage.ref();\n this._konvaLayer.add(obj);\n return obj;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport const MARKUP_ENTITY_LINE = \"$MarkupTempEntity_Line\";\n\nexport class OdaLineDragger extends OdBaseDragger {\n protected entity: any;\n protected points: any[];\n protected drawPoints: any[];\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n }\n\n override dispose(): void {\n super.dispose();\n this.end();\n this.points = null;\n this.drawPoints = null;\n }\n\n override start(x: number, y: number): void {\n const point = this.getViewer().screenToWorld(x, y);\n this.drawPoints = [point[0], point[1], point[2]];\n }\n\n override drag(x: number, y: number): void {\n if (this.isDragging) {\n const point = this.getViewer().screenToWorld(x, y);\n this.drawPoints.push(point[0], point[1], point[2]);\n this._updateFrame();\n }\n }\n\n override end(): void {\n if (this.entity) {\n this.entity.delete();\n this.drawPoints = null;\n this.entity = null;\n }\n }\n\n private _updateFrame(): void {\n if (this.entity) {\n const model = this.getViewer().getMarkupModel();\n model.removeEntity(this.entity);\n model.delete();\n this.entity.delete();\n }\n\n this.entity = this.getActiveMarkupEntity(MARKUP_ENTITY_LINE);\n\n const entityPtr = this.entity.openObject();\n entityPtr.appendPolyline(this.drawPoints).delete();\n entityPtr.delete();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2021, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\nimport { Viewer } from \"../Viewer\";\nimport { Point3d } from \"./Common/Geometry\";\nimport { OdBaseDragger } from \"./Common/OdBaseDragger\";\n\nexport const MARKUP_ENTITY_TEXT = \"$MarkupTempEntity_Text\";\n\nexport class OdaTextDragger extends OdBaseDragger {\n protected textRef: HTMLTextAreaElement;\n protected m_center: Point3d;\n protected entity: any;\n protected readonly TEXT_HEIGHT_ALIGN = 24;\n\n constructor(subject: Viewer) {\n super(subject);\n this.press = false;\n }\n\n override dispose(): void {\n super.dispose();\n this.textRef?.remove();\n this.textRef = null;\n }\n\n private _finishInput(): void {\n if (this.textRef && this.textRef.value.trimLeft()) {\n this._updateFrame();\n }\n this.textRef?.remove();\n this.textRef = null;\n }\n\n override start(x: number, y: number, absoluteX: number, absoluteY: number) {\n if (!this.textRef) {\n this.textRef = document.createElement(\"textarea\");\n this.textRef.style.zIndex = \"9999\";\n this.textRef.style.position = \"absolute\";\n this.textRef.style.display = \"block\";\n this.textRef.style.top = absoluteY + \"px\";\n this.textRef.style.left = absoluteX + \"px\";\n this.textRef.onkeypress = (event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n this._finishInput();\n }\n };\n document.body.appendChild(this.textRef);\n\n this.press = true;\n this.m_center = this.screenToWorld(x, y + this.TEXT_HEIGHT_ALIGN);\n this.needInputText = true;\n } else {\n this._finishInput();\n }\n }\n\n private _updateFrame(): void {\n this.entity = this.getActiveMarkupEntity(MARKUP_ENTITY_TEXT);\n const entityPtr = this.entity.openObject();\n\n const view = this.getViewer().activeView;\n const pos = this.toPoint(view.viewPosition);\n const target = this.toPoint(view.viewTarget);\n\n const eyeToWorld = view.eyeToWorldMatrix;\n const eyeDir = pos.sub(target).asVector();\n\n const xDir = this.toVector([1.0, 0.0, 0.0]);\n const direction = xDir.transformBy(eyeToWorld);\n\n const mtrx = this.createMatrix3d();\n mtrx.setToWorldToPlane(this.toGeVector(eyeDir));\n direction.transformBy(mtrx);\n\n const angel = -Math.atan2(-direction.y, direction.x);\n\n const textSize = 0.02;\n let textScale = 1.0;\n\n const projMtrx = view.projectionMatrix;\n const mtrxNumber = projMtrx.get(1, 1);\n const tol = 1.0e-6;\n if (!(mtrxNumber < tol && mtrxNumber > -tol)) {\n textScale = 1 / mtrxNumber;\n }\n\n const geomData = entityPtr.appendText(this.toGePoint(this.m_center), this.textRef.value.trimLeft());\n const textPtr = geomData.openAsText();\n\n textPtr.setNormal(this.toGeVector(eyeDir));\n textPtr.setRotation(angel);\n textPtr.setTextSize(textSize * textScale);\n textPtr.delete();\n geomData.delete();\n entityPtr.delete();\n }\n}\n","import { IMarkup, MarkupMode } from \"../../IMarkup\";\nimport { Viewer } from \"../../../Viewer\";\nimport { OdBaseDragger } from \"../../../Draggers/Common/OdBaseDragger\";\nimport { MARKUP_ENTITY_LINE, OdaLineDragger } from \"../../../Draggers/OdaLineDragger\";\nimport { MARKUP_ENTITY_TEXT, OdaTextDragger } from \"../../../Draggers/OdaTextDragger\";\nimport { IMarkupObject } from \"../../Api/IMarkupObject\";\nimport { ILine, IText, IViewpoint } from \"../../IViewpoint\";\n\nexport class VisualizeMarkup implements IMarkup {\n private _viewer: Viewer;\n protected _markupColor = { r: 255, g: 0, b: 0 };\n\n public lineWidth = 0;\n\n initialize(viewer: Viewer, canvas: HTMLCanvasElement, canvasEvents: string[]): void {\n this._viewer = viewer;\n }\n\n dispose(): void {}\n\n getDraggers(): Map<string, typeof OdBaseDragger> {\n return new Map<string, typeof OdBaseDragger>([\n [MarkupMode.Line, OdaLineDragger],\n [MarkupMode.Text, OdaTextDragger],\n ]);\n }\n\n clearOverlay(): void {\n if (!this._viewer.visualizeJs) return;\n\n const visViewer = this._viewer.visViewer();\n const model = visViewer.getMarkupModel();\n model.clearEntities();\n model.delete();\n\n this._viewer.update();\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor;\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n const color = { r, g, b };\n this._markupColor = color;\n }\n\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n if (!this._viewer.visualizeJs) return;\n\n const visViewer = this._viewer.visViewer();\n const model = visViewer.getMarkupModel();\n const itr = model.getEntitiesIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n const entityPtr = entityId.openObject();\n const entityName = entityPtr.getName();\n\n if (entityName === MARKUP_ENTITY_LINE || entityName === MARKUP_ENTITY_TEXT) {\n entityPtr.setColor(r, g, b);\n }\n\n entityPtr.delete();\n }\n itr.delete();\n\n this._viewer.update();\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n function getLogicalPoint3dAsArray(point3d) {\n return [point3d.x, point3d.y, point3d.z];\n }\n\n function getPoint3d(module, gePoint) {\n return module.Point3d.createFromArray(gePoint);\n }\n\n if (!this._viewer.visualizeJs) return;\n\n const visLib = this._viewer.visLib();\n const visViewer = visLib.getViewer();\n const activeView = visViewer.activeView;\n\n this._viewer.syncOverlay();\n\n const markupColor = viewpoint.custom_fields.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n if (viewpoint.lines) {\n for (const line of viewpoint.lines) {\n const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_LINE);\n const entityPtr = entityId.openObject();\n\n const entityData = [];\n for (const point of line.points) {\n entityData.push(point.x, point.y, point.z);\n }\n const geomData = entityPtr.appendPolyline(entityData);\n\n geomData.delete();\n entityPtr.delete();\n }\n }\n\n if (viewpoint.texts) {\n const pos = getPoint3d(visLib, activeView.viewPosition);\n const target = getPoint3d(visLib, activeView.viewTarget);\n const normal = pos.sub(target).asVector();\n\n for (const text of viewpoint.texts) {\n const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_TEXT);\n const entityPtr = entityId.openObject();\n\n const geomData = entityPtr.appendText(getLogicalPoint3dAsArray(text.position), text.text);\n\n const textPtr = geomData.openAsText();\n textPtr.setNormal(getLogicalPoint3dAsArray(normal));\n textPtr.setRotation(text.angle);\n textPtr.setTextSize(text.text_size);\n\n textPtr.delete();\n geomData.delete();\n entityPtr.delete();\n }\n }\n\n this._viewer.update();\n }\n\n getViewpoint(): IViewpoint {\n function getLogicalPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n if (!this._viewer.visualizeJs) return {};\n\n const visLib = this._viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const viewpoint: IViewpoint = {\n lines: [],\n texts: [],\n };\n\n const model = visViewer.getMarkupModel();\n const itr = model.getEntitiesIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n const entityPtr = entityId.openObject();\n const entityName = entityPtr.getName();\n\n const geomItr = entityPtr.getGeometryDataIterator();\n if (geomItr.done()) {\n entityPtr.delete();\n continue;\n }\n\n const geometryId = geomItr.getGeometryData();\n\n if (entityName === MARKUP_ENTITY_LINE) {\n const polylinePtr = geometryId.openAsPolyline();\n const points = polylinePtr.getPoints();\n\n const line: ILine = {\n points: [],\n };\n for (const point of points) {\n line.points.push(getLogicalPoint3dFromArray(point));\n }\n\n viewpoint.lines.push(line);\n polylinePtr.delete();\n } else if (entityName === MARKUP_ENTITY_TEXT) {\n const textPtr = geometryId.openAsText();\n const position = textPtr.getPosition();\n\n const text: IText = {\n position: getLogicalPoint3dFromArray(position),\n text: textPtr.getString(),\n angle: textPtr.getRotation(),\n text_size: textPtr.getTextSize(),\n };\n\n viewpoint.texts.push(text);\n textPtr.delete();\n }\n\n entityPtr.delete();\n }\n itr.delete();\n\n viewpoint.snapshot = {\n data: visLib.canvas.toDataURL(\"image/jpeg\", 0.25),\n };\n\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor(),\n };\n\n viewpoint.description = new Date().toDateString();\n return viewpoint;\n }\n\n getLayer(): any {\n throw new Error(\"Not implemented yet\");\n }\n\n createObject(type: string, params: any): IMarkupObject {\n throw new Error(\"Not implemented yet\");\n }\n\n getObjects(): IMarkupObject[] {\n throw new Error(\"Not implemented yet\");\n }\n\n getSelectedObjects(): IMarkupObject[] {\n throw new Error(\"Not implemented yet\");\n }\n\n selectObjects(objects: IMarkupObject[]): void {\n throw new Error(\"Not implemented yet\");\n }\n\n clearSelected(): void {\n throw new Error(\"Not implemented yet\");\n }\n}\n","import { IMarkup, MarkupType } from \"./IMarkup\";\nimport { KonvaMarkup } from \"./Impl/Konva/KonvaMarkup\";\nimport { VisualizeMarkup } from \"./Impl/Visualize/VisualizeMarkup\";\n\nexport class MarkupFactory {\n public static createMarkup(markupType: MarkupType): IMarkup {\n let markup;\n switch (markupType) {\n case MarkupType.Konva:\n markup = this.createKonva();\n break;\n\n case MarkupType.Visualize:\n markup = this.createVisualize();\n break;\n\n default:\n throw new Error(\"Error during Markup Initialization. Markup Type is unknown.\");\n break;\n }\n\n return markup;\n }\n\n private static createKonva(): IMarkup {\n return new KonvaMarkup();\n }\n\n private static createVisualize(): IMarkup {\n return new VisualizeMarkup();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IViewer } from \"./IViewer\";\nimport { commands } from \"./Commands\";\nimport { EventEmitter2 } from \"./EventEmitter2\";\nimport { ViewerEventMap } from \"./ViewerEvents\";\nimport { OptionsEventMap } from \"./OptionsEvents\";\nimport { CANVAS_EVENTS } from \"./CanvasEvents\";\n\nimport { OdBaseDragger } from \"./Draggers/Common/OdBaseDragger\";\nimport { MeasureLineDragger } from \"./Draggers/MeasureLineDragger/index\";\nimport { OdaWalkDragger } from \"./Draggers/OdaWalkDragger\";\nimport { OdCuttingPlaneXAxisDragger } from \"./Draggers/OdCuttingPlaneXAxisDragger\";\nimport { OdCuttingPlaneYAxisDragger } from \"./Draggers/OdCuttingPlaneYAxisDragger\";\nimport { OdCuttingPlaneZAxisDragger } from \"./Draggers/OdCuttingPlaneZAxisDragger\";\nimport { OdOrbitDragger } from \"./Draggers/OdOrbitDragger\";\nimport { OdPanDragger } from \"./Draggers/OdPanDragger\";\nimport { OdZoomDragger } from \"./Draggers/OdZoomDragger\";\nimport { OdZoomWheelDragger } from \"./Draggers/OdZoomWheelDragger\";\nimport { OdZoomWindowDragger } from \"./Draggers/OdZoomWindowDragger/index\";\nimport { OrbitAroundBuildingDragger } from \"./Draggers/OrbitAroundBuildingDragger\";\nimport { GestureManager } from \"./Draggers/Common/GestureManager\";\n\nimport { loadVisualizeJs } from \"./utils\";\n\nimport { Client } from \"../Api/Client\";\nimport { File } from \"../Api/File\";\nimport { Assembly } from \"../Api/Assembly\";\nimport { Model } from \"../Api/Model\";\nimport { Options, OptionsData } from \"./Options\";\nimport { LoaderFactory } from \"./Loaders/LoaderFactory\";\nimport { MarkupFactory } from \"./Markup/MarkupFactory\";\nimport { IMarkup, MarkupType } from \"./Markup/IMarkup\";\nimport { IClippingPlane, IOrthogonalCamera, IViewpoint } from \"./Markup/IViewpoint\";\n\nconst OVERLAY_VIEW_NAME = \"$OVERLAY_VIEW_NAME\";\n\nconst isExist = (value) => value !== undefined && value !== null;\n\n/**\n * The `Client.js` library class that provides methods to integrate with the\n * [VisualizeJS](https://cloud.opendesign.com/docs/index.html#/visualizejs) library.\n */\n\nexport class Viewer extends EventEmitter2<ViewerEventMap & OptionsEventMap> implements IViewer {\n private _activeDragger: OdBaseDragger | null;\n private _zoomWheelDragger: OdZoomWheelDragger | null;\n private _gestureManager: GestureManager | null;\n private _enableAutoUpdate: boolean;\n private _isNeedRender: boolean;\n private _isRunAsyncUpdate: boolean;\n private _renderTime: DOMHighResTimeStamp;\n\n protected _options: Options;\n protected _visualizeJsUrl: string;\n protected _abortControllerForReferences: AbortController | undefined;\n\n private canvaseventlistener: (event: Event) => void;\n\n public draggerFactory: Map<string, typeof OdBaseDragger>;\n public canvasEvents: string[];\n private frameId: number;\n private _resizeObserver: ResizeObserver | undefined;\n public canvas: HTMLCanvasElement | undefined;\n public markup: IMarkup;\n\n public visualizeJs: any;\n public _abortController: AbortController | undefined;\n public _abortControllerForRequestMap: Map<string, AbortController> | undefined;\n public client: Client;\n\n /**\n * @param client - The `Client` instance that provides access to a server. Do not specify\n * `Client` if you need a standalone viewer instance without access to server models.\n * @param params - An object containing viewer configuration parameters.\n * @param params.visualizeJsUrl - `VisualizeJS` library URL. Set this URL to use your own\n * library instance, or leave it undefined or blank to use the default URL defined by\n * `Client.js` you are using.\n *\n * _Note: Your own `VisualizeJS` library version must match the version of the `Client.js`\n * you are using._\n * @param params.enableAutoUpdate - Enable auto-update of the viewer after any changes. If\n * the auto-update is disabled, you need to update the `VisualizeJS` viewer and the active\n * dragger manually using the `update` event. Default is `true`.\n */\n constructor(\n client?: Client,\n params: { visualizeJsUrl?: string; enableAutoUpdate?: boolean; markupType?: MarkupType } = {\n markupType: MarkupType.Konva,\n }\n ) {\n super();\n this.configure(params);\n\n this._options = new Options(this);\n\n this.client = client;\n\n this._activeDragger = null;\n this._renderTime = 0;\n\n this.markup = MarkupFactory.createMarkup(params.markupType ?? MarkupType.Konva);\n\n this.draggerFactory = new Map<string, typeof OdBaseDragger>();\n this.registerDragger(\"Pan\", OdPanDragger);\n this.registerDragger(\"Orbit\", OdOrbitDragger);\n this.registerDragger(\"Zoom\", OdZoomDragger);\n this.registerDragger(\"ZoomWindow\", OdZoomWindowDragger);\n this.registerDragger(\"OrbitAroundBuilding\", OrbitAroundBuildingDragger);\n this.registerDragger(\"MeasureLine\", MeasureLineDragger);\n this.registerDragger(\"CuttingPlaneXAxis\", OdCuttingPlaneXAxisDragger);\n this.registerDragger(\"CuttingPlaneYAxis\", OdCuttingPlaneYAxisDragger);\n this.registerDragger(\"CuttingPlaneZAxis\", OdCuttingPlaneZAxisDragger);\n this.registerDragger(\"Walk\", OdaWalkDragger);\n\n const markupDraggers = this.markup.getDraggers();\n markupDraggers?.forEach((value, key) => {\n this.registerDragger(key, value);\n });\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this._enableAutoUpdate = params.enableAutoUpdate ?? true;\n this._isNeedRender = false;\n this._isRunAsyncUpdate = false;\n\n this.render = this.render.bind(this);\n this.resize = this.resize.bind(this);\n }\n\n /**\n * `VisualizeJS` parameters.\n */\n get options(): Options {\n return this._options;\n }\n\n /**\n * `VisualizeJS` library URL. Use {@link Viewer#configure | configure()} to change library URL.\n *\n * @readonly\n */\n get visualizeJsUrl(): string {\n return this._visualizeJsUrl;\n }\n\n /**\n * Change the viewer configuration parameters.\n *\n * @param params - An object containing new configuration parameters.\n * @param params.visualizeJsUrl - `VisualizeJS` library URL. Set this URL to use your own\n * library instance or leave it blank to use the default URL defined by `Client.js`.\n */\n configure(params: { visualizeJsUrl?: string }): this {\n this._visualizeJsUrl = params.visualizeJsUrl || \"VISUALIZE_JS_URL\";\n return this;\n }\n\n /**\n * A [Viewer]{@link Viewer} event measuring progress of loading a `VisualizeJS` library.\n *\n * @property {string} type - `visualizeprogress`\n * @property {number} loaded - A 64-bit unsigned integer value indicating the amount of work\n * already performed by the underlying process. The ratio of work done can be calculated by\n * dividing total by the value of this property.\n * @property {number} total - A 64-bit unsigned integer representing the total amount of work\n * that the underlying process is in the progress of performing.\n * @event visualizeprogress\n */\n\n /**\n * Load `VisualizeJS` module and initialize it with the specified canvas. Call\n * {@link Viewer#dispose | dispose()} to release allocated resources.\n *\n * @async\n * @param canvas - HTML `<canvas>` element for `VisualizeJS`.\n * @param onProgress - A callback function that handles events measuring progress of loading\n * of the `VisualizeJS` library. Retrieves {@link event:visualizeprogress | visualizeprogress} event.\n */\n async initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n if (canvas.style.width === \"\" && canvas.style.height === \"\") {\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n }\n canvas.parentElement.style.touchAction = \"none\";\n canvas.style.touchAction = \"none\";\n\n canvas.width = canvas.clientWidth * window.devicePixelRatio;\n canvas.height = canvas.clientHeight * window.devicePixelRatio;\n\n const visualizeJs: any = await loadVisualizeJs(this.visualizeJsUrl, (ev) => {\n const { loaded, timeStamp, total, lengthComputable } = ev;\n const event = { loaded, timeStamp, total, lengthComputable, type: \"visualizeprogress\" } as ProgressEvent;\n onProgress?.(event);\n });\n\n this.visualizeJs = visualizeJs;\n this.visualizeJs.canvas = canvas;\n this.visualizeJs.Viewer.create();\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this.markup.initialize(this, canvas, this.canvasEvents);\n\n this._resizeObserver = new ResizeObserver(this.resize);\n this._resizeObserver.observe(canvas.parentElement);\n this.resize();\n\n this._zoomWheelDragger = new OdZoomWheelDragger(this);\n this._zoomWheelDragger.name = \"ZoomWheel\";\n this._zoomWheelDragger.initialize();\n\n this._gestureManager = new GestureManager(this);\n this._gestureManager.initialize();\n\n this.syncOpenCloudVisualStyle(true);\n this.syncOptions();\n\n this._renderTime = performance.now();\n this.render(this._renderTime);\n\n return this;\n }\n\n /**\n * Releases all resources allocated by this `Viewer` instance. Call this method before\n * release the `Viewer` instance.\n */\n dispose(): this {\n this.cancel();\n this.emitEvent({ type: \"dispose\" });\n\n if (this.frameId) cancelAnimationFrame(this.frameId);\n this.frameId = 0;\n\n this.setActiveDragger(\"\");\n\n this._zoomWheelDragger?.dispose();\n this._gestureManager?.dispose();\n\n this.removeAllListeners();\n\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n\n this.markup.dispose();\n\n this.canvasEvents.forEach((x) => this.canvas?.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n\n this.visualizeJs?.getViewer().clear();\n this.visualizeJs = undefined;\n\n return this;\n }\n\n /**\n * Returns `true` if `VisualizeJS` module has been loaded andinitialized.\n */\n isInitialized(): boolean {\n return !!this.visualizeJs;\n }\n\n // internal render/resize routines\n\n private render(time: DOMHighResTimeStamp) {\n this.frameId = requestAnimationFrame(this.render);\n\n if (!this.visualizeJs) return;\n\n if (this._isRunAsyncUpdate) return;\n\n const visViewer = this.visualizeJs.getViewer();\n if (visViewer.isRunningAnimation() || this._isNeedRender) {\n visViewer.update();\n this._activeDragger?.updatePreview();\n this._isNeedRender = !visViewer.getActiveDevice().isValid();\n\n const deltaTime = (time - this._renderTime) / 1000;\n this._renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n }\n\n public resize(): this {\n if (!this.visualizeJs) return this;\n\n const { clientWidth, clientHeight } = this.canvas;\n this.canvas.width = clientWidth * window.devicePixelRatio;\n this.canvas.height = clientHeight * window.devicePixelRatio;\n\n const visViewer = this.visualizeJs.getViewer();\n visViewer.resize(0, this.canvas.width, this.canvas.height, 0);\n\n this.update(true);\n this.emitEvent({ type: \"resize\", width: clientWidth, height: clientHeight });\n\n return this;\n }\n\n /**\n * Updates the viewer. Do nothing if the auto-update mode is disabled in the constructor (use\n * the `update` event to update viewer manually).\n *\n * Fires:\n *\n * - {@link UpdateEvent | update}\n *\n * @param force - If `true` updates the viewer immidietly. Otherwise updates on next\n * animation frame. Default is `false`.\n */\n update(force?: boolean) {\n if (this._enableAutoUpdate) {\n if (force) {\n this.visViewer()?.update();\n this.activeDragger()?.updatePreview();\n } else {\n this._isNeedRender = true;\n }\n }\n this.emitEvent({ type: \"update\", data: force });\n }\n\n /**\n * Update with internal schedule, need after change operation when have long update for\n * update without lock UI\n *\n * @param maxScheduleUpdateTimeInMs - Maximum time for one update, by default 30 ms\n * @param maxScheduleUpdateCount - Maximum count of schedule update\n * @returns return void Promise\n */\n\n private scheduleUpdateAsync(maxScheduleUpdateTimeInMs = 50): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n setTimeout(() => {\n try {\n this.visViewer()?.update(maxScheduleUpdateTimeInMs);\n this.activeDragger()?.updatePreview();\n resolve();\n } catch (e) {\n console.error(e);\n reject();\n }\n }, 0);\n });\n }\n\n async updateAsync(maxScheduleUpdateTimeInMs = 50, maxScheduleUpdateCount = 50): Promise<void> {\n this._isRunAsyncUpdate = true;\n const device = this.visViewer().getActiveDevice();\n try {\n for (let iterationCount = 0; !device.isValid() && iterationCount < maxScheduleUpdateCount; iterationCount++) {\n await this.scheduleUpdateAsync(maxScheduleUpdateTimeInMs);\n }\n await this.scheduleUpdateAsync(maxScheduleUpdateTimeInMs);\n } catch (e) {\n console.error(e);\n } finally {\n this._isRunAsyncUpdate = false;\n }\n }\n\n /**\n * Returns `VisualizeJS`\n * {@link https://cloud.opendesign.com/docs/index.html#/visualizejs_api | module} instance.\n */\n visLib(): any {\n return this.visualizeJs;\n }\n\n /**\n * Returns `VisualizeJS`\n * {@link https://cloud.opendesign.com/docs/index.html#/vis/Viewer | Viewer} instance.\n */\n visViewer(): any {\n return this.visualizeJs?.getViewer();\n }\n\n // update the VisualizeJS options\n\n syncOpenCloudVisualStyle(isInitializing: boolean): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (device.isNull()) return this;\n\n const view = device.getActiveView();\n\n // setup light\n view.enableDefaultLighting(true, visLib.DefaultLightingType.kTwoLights);\n view.setDefaultLightingIntensity(1.25);\n\n let visualStyleId;\n try {\n visualStyleId = visViewer.findVisualStyle(\"OpenCloud\");\n } catch (e) {\n if (!isInitializing) {\n console.log(\"OpenCloud visual style not found, creating it on client side\");\n }\n visualStyleId = visViewer.createVisualStyle(\"OpenCloud\");\n\n const colorDef = new visLib.OdTvColorDef(66, 66, 66);\n const shadedVsId = visViewer.findVisualStyle(\"Realistic\");\n\n const visualStylePtr = visualStyleId.openObject();\n visualStylePtr.copyFrom(shadedVsId);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kFaceModifiers, 0, visLib.VisualStyleOperations.kSet);\n //visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModel, 1, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModel, 2, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionDouble(visLib.VisualStyleOptions.kEdgeCreaseAngle, 60, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeStyles, 0, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionInt32(visLib.VisualStyleOptions.kEdgeModifiers, 8, visLib.VisualStyleOperations.kSet);\n visualStylePtr.setOptionColor(\n visLib.VisualStyleOptions.kEdgeColorValue,\n colorDef,\n visLib.VisualStyleOperations.kSet\n );\n visualStylePtr.delete();\n }\n\n view.visualStyle = visualStyleId;\n\n view.delete();\n device.delete();\n\n return this;\n }\n\n syncOptions(options: OptionsData = this.options.data): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (device.isNull()) return this;\n\n if (options.showWCS !== visViewer.getEnableWCS()) {\n visViewer.setEnableWCS(options.showWCS);\n }\n if (options.cameraAnimation !== visViewer.getEnableAnimation()) {\n visViewer.setEnableAnimation(options.cameraAnimation);\n }\n if (options.antialiasing !== visViewer.fxaaAntiAliasing3d) {\n visViewer.fxaaAntiAliasing3d = options.antialiasing;\n visViewer.fxaaQuality = 5;\n }\n\n if (options.shadows !== visViewer.shadows) {\n visViewer.shadows = options.shadows;\n\n const canvas = visLib.canvas;\n device.invalidate([0, canvas.clientWidth, canvas.clientHeight, 0]);\n }\n\n if (options.groundShadow !== visViewer.groundShadow) {\n visViewer.groundShadow = options.groundShadow;\n }\n\n if (options.ambientOcclusion !== device.getOptionBool(visLib.DeviceOptions.kSSAOEnable)) {\n device.setOptionBool(visLib.DeviceOptions.kSSAOEnable, options.ambientOcclusion);\n device.setOptionBool(visLib.DeviceOptions.kSSAODynamicRadius, true);\n device.setOptionDouble(visLib.DeviceOptions.kSSAORadius, 1);\n device.setOptionInt32(visLib.DeviceOptions.kSSAOLoops, 32);\n device.setOptionDouble(visLib.DeviceOptions.kSSAOPower, 2);\n device.setOptionInt32(visLib.DeviceOptions.kSSAOBlurRadius, 2);\n\n const activeView = visViewer.activeView;\n activeView.setSSAOEnabled(options.ambientOcclusion);\n activeView.delete();\n }\n\n if (isExist(options.edgeModel)) {\n const activeView = device.getActiveView();\n\n const visualStyleId = visViewer.findVisualStyle(\"OpenCloud\");\n const visualStylePtr = visualStyleId.openObject();\n\n visualStylePtr.setOptionInt32(\n visLib.VisualStyleOptions.kEdgeModel,\n options.edgeModel ? 2 : 0,\n visLib.VisualStyleOperations.kSet\n );\n\n activeView.visualStyle = visualStyleId;\n\n visualStylePtr.delete();\n visualStyleId.delete();\n activeView.delete();\n }\n\n device.delete();\n\n this.syncHighlightingOptions(options);\n this.update();\n\n return this;\n }\n\n syncHighlightingOptions(options: OptionsData = this.options.data): this {\n if (!this.visualizeJs) return this;\n\n const params = options.enableCustomHighlight ? options : Options.defaults();\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n const { Entry, OdTvRGBColorDef } = visLib;\n\n const highlightStyleId = visViewer.findHighlightStyle(\"Web_Default\");\n const highlightStylePtr = highlightStyleId.openObject();\n\n if (isExist(params.facesColor)) {\n const color = new OdTvRGBColorDef(params.facesColor.r, params.facesColor.g, params.facesColor.b);\n highlightStylePtr.setFacesColor(Entry.k3D.value | Entry.k3DTop.value, color);\n color.delete();\n }\n\n if (isExist(params.facesOverlap)) {\n highlightStylePtr.setFacesVisibility(Entry.k3DTop.value, params.facesOverlap);\n }\n if (isExist(params.facesTransparancy)) {\n highlightStylePtr.setFacesTransparency(Entry.k3D.value | Entry.k3DTop.value, params.facesTransparancy);\n }\n\n if (isExist(params.edgesColor)) {\n const color = new OdTvRGBColorDef(params.edgesColor.r, params.edgesColor.g, params.edgesColor.b);\n highlightStylePtr.setEdgesColor(\n Entry.k3DTop.value | Entry.k3D.value | Entry.k2D.value | Entry.k2DTop.value,\n color\n );\n color.delete();\n }\n\n if (isExist(params.edgesVisibility)) {\n highlightStylePtr.setEdgesVisibility(\n Entry.k2D.value | Entry.k2DTop.value | Entry.k3DTop.value | Entry.k3D.value,\n params.edgesVisibility\n );\n }\n if (isExist(params.edgesOverlap)) {\n const visibility = !isExist(params.edgesVisibility) ? true : params.edgesVisibility;\n highlightStylePtr.setEdgesVisibility(Entry.k2DTop.value | Entry.k3DTop.value, params.edgesOverlap && visibility);\n }\n\n const device = visViewer.getActiveDevice();\n if (!device.isNull()) {\n const canvas = visLib.canvas;\n\n device.invalidate([0, canvas.clientWidth, canvas.clientHeight, 0]);\n device.delete();\n }\n\n return this;\n }\n\n /**\n * List of names of available draggers:\n *\n * - `Line`\n * - `Text`\n * - `Pan`\n * - `Orbit`\n * - `Zoom`\n * - `ZoomWindow`\n * - `OrbitAroundBuilding`\n * - `MeasureLine`\n * - `CuttingPlaneXAxis`\n * - `CuttingPlaneYAxis`\n * - `CuttingPlaneZAxis`\n * - `Walk`\n *\n * @readonly\n */\n get draggers(): string[] {\n return [...this.draggerFactory.keys()];\n }\n\n /**\n * Register dragger on draggerFactory.\n *\n * @param name - Dragger name.\n * @param dragger - Dragger class.\n */\n public registerDragger(name: string, dragger: typeof OdBaseDragger): void {\n this.draggerFactory.set(name, dragger);\n }\n\n /**\n * Returns active dragger instance or `null` if there is no active dragger.\n */\n activeDragger(): any | null {\n return this._activeDragger;\n }\n\n /**\n * Set active dragger. `Viewer` must be {@link Viewer#initialize | initialized} before enable\n * dragger or exception is thrown.\n *\n * Fires:\n *\n * - {@link ChangeActiveDragger | changeactivedragger}\n *\n * @param name - Dragger name. Can be one of the {@link Viewer#draggers | draggers} list.\n * @returns Returns active dragger instance or `null` if there is no dragger with the given name.\n */\n setActiveDragger(name: string): OdBaseDragger | null {\n if (this._activeDragger?.name !== name) {\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n const Constructor = this.draggerFactory.get(name);\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n this._activeDragger.initialize();\n }\n const canvas = this.canvas;\n if (canvas) {\n canvas.className = canvas.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${name.toLowerCase()}`)\n .join(\" \");\n }\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n }\n return this._activeDragger;\n }\n\n /**\n * Reset the state of the active dragger.\n */\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger(\"\");\n this.setActiveDragger(dragger.name);\n }\n }\n\n /**\n * Remove all cutting planes.\n */\n clearSlices(): void {\n if (!this.visualizeJs) return;\n\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n activeView.removeCuttingPlanes();\n activeView.delete();\n\n this.update();\n }\n\n /**\n * Remove markup overlay.\n */\n clearOverlay(): void {\n this.markup.clearOverlay();\n }\n\n /**\n * Synchronize markup overlay.\n */\n syncOverlay(): any {\n if (!this.visualizeJs) return;\n\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n let overlayView = visViewer.getViewByName(OVERLAY_VIEW_NAME);\n if (!overlayView) {\n const overlayModel = visViewer.getMarkupModel();\n const pDevice = visViewer.getActiveDevice();\n\n overlayView = pDevice.createView(OVERLAY_VIEW_NAME, false);\n overlayView.addModel(overlayModel);\n\n activeView.addSibling(overlayView);\n pDevice.addView(overlayView);\n }\n\n overlayView.viewPosition = activeView.viewPosition;\n overlayView.viewTarget = activeView.viewTarget;\n overlayView.upVector = activeView.upVector;\n overlayView.viewFieldWidth = activeView.viewFieldWidth;\n overlayView.viewFieldHeight = activeView.viewFieldHeight;\n\n const viewPort = overlayView.getViewport();\n overlayView.setViewport(viewPort.lowerLeft, viewPort.upperRight);\n overlayView.vportRect = activeView.vportRect;\n\n this.update();\n\n return overlayView;\n }\n\n /**\n * Returns `true` if current drawing is 3D drawing.\n */\n is3D(): boolean {\n if (!this.visualizeJs) return false;\n\n const visViewer = this.visViewer();\n const ext = visViewer.getActiveExtents();\n const min = ext.min();\n const max = ext.max();\n const extHeight = max[2] - min[2];\n return extHeight !== 0;\n\n //return visViewer.activeView.upVector[1] >= 0.95;\n }\n\n /**\n * Returns a list of original handles for the selected entities.\n */\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n /**\n * Select model entities by original handles that are obtained using\n * {@link File.getProperties | File.getProperties()} or\n * {@link File.searchProperties | File.searchProperties()} methods.\n *\n * Fires:\n *\n * - {@link SelectEvent | select}\n *\n * @param handles - The list of original handles.\n */\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n /**\n * Load model references into the viewer. References are images, fonts, or any other files to\n * correct rendering of the model.\n *\n * @async\n * @param model - Instance of model with references. If a `File` instance is specified\n * instead of a model, the file references will be loaded.\n */\n async loadReferences(model: Model | File | Assembly): Promise<this> {\n if (!this.visualizeJs) return this;\n\n const abortController = new AbortController();\n this._abortControllerForReferences?.abort();\n this._abortControllerForReferences = abortController;\n\n let references = [];\n await model\n .getReferences(abortController.signal)\n .then((data) => (references = data.references))\n .catch((e) => console.error(\"Cannot load model references.\", e));\n\n for (const file of references) {\n await this.client\n .downloadFile(file.id, undefined, abortController.signal)\n .then((arrayBuffer) => this.visualizeJs?.getViewer().addEmbeddedFile(file.name, new Uint8Array(arrayBuffer)))\n .catch((e) => console.error(`Cannot load reference file ${file.name}.`, e));\n }\n\n return this;\n }\n\n // Internal loading routines\n\n applyModelTransformMatrix(model: Model | Assembly) {\n this.executeCommand(\"applyModelTransform\", model);\n }\n\n applySceneGraphSettings(options = this.options) {\n if (!this.visualizeJs) return;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const device = visViewer.getActiveDevice();\n if (isExist(options.sceneGraph)) {\n device.setOptionBool(visLib.DeviceOptions.kDelaySceneGraphProc, !options.sceneGraph);\n }\n // if (options.enablePartialMode && visLib.HpTrc.Usd >= visViewer.memoryLimit) {\n // device.setOptionBool(visLib.DeviceOptions.kDelaySceneGraphProc, true);\n // }\n device.delete();\n\n this.update();\n }\n\n /**\n * Loads a model of a file or assembly into the viewer.\n *\n * This method requires a [Client]{@link Client | Client} instance to work. For standalone\n * viewer instance use {@link Viewer#openVsfFile | openVsfFile()} or\n * {@link Viewer#openVsfxFile | openVsfxFile()}.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @async\n * @param model - Model instance to load. If a `File` instance with multiple models is\n * specified, the default model will be loaded. If there is no default model, first\n * availiable model will be loaded.\n */\n async open(model: Model | File | Assembly): Promise<this> {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", model });\n\n if (model instanceof File || model instanceof Assembly) {\n const models = (await model.getModels()) ?? [];\n model = models.find((model) => model.default) ?? models[0];\n }\n if (!model) throw new Error(\"No default model found\");\n\n await this.loadReferences(model);\n\n const overrideOptions = new Options();\n overrideOptions.data = this.options.data;\n if (model.file.type === \".rcs\") {\n console.log(\"Partial load mode is forced for RCS file\");\n overrideOptions.enablePartialMode = true;\n }\n\n const loaderFactory = new LoaderFactory();\n const loader = loaderFactory.create(this, model, overrideOptions.data);\n await loader.load();\n\n if (this.visualizeJs) {\n this.applyModelTransformMatrix(model);\n this.applySceneGraphSettings();\n }\n\n return this;\n }\n\n /**\n * Loads a VSF file into the viewer.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param buffer - Binary data buffer to load.\n */\n openVsfFile(buffer: Uint8Array | ArrayBuffer): this {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", buffer });\n\n try {\n this.emitEvent({ type: \"geometrystart\", buffer });\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n visViewer.parseFile(data);\n\n this.syncOpenCloudVisualStyle(false);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"geometryprogress\", data: 1, buffer });\n this.emitEvent({ type: \"databasechunk\", data, buffer });\n this.emitEvent({ type: \"geometryend\", buffer });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error, buffer });\n throw error;\n }\n\n return this;\n }\n\n /**\n * Loads a VSFX file into the viewer.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param buffer - Binary data buffer to load.\n */\n openVsfxFile(buffer: Uint8Array | ArrayBuffer): this {\n if (!this.visualizeJs) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", buffer });\n\n try {\n this.emitEvent({ type: \"geometrystart\", buffer });\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n visViewer.parseVsfx(data);\n\n this.syncOpenCloudVisualStyle(false);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"geometryprogress\", data: 1, buffer });\n this.emitEvent({ type: \"databasechunk\", data, buffer });\n this.emitEvent({ type: \"geometryend\", buffer });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error, buffer });\n throw error;\n }\n\n return this;\n }\n\n /**\n * Cancels asynchronous model loading started by {@link Viewer#open | open()}.\n */\n cancel(): this {\n this._abortControllerForReferences?.abort();\n this._abortControllerForReferences = undefined;\n\n this._abortController?.abort();\n this._abortController = undefined;\n\n this._abortControllerForRequestMap?.forEach((controller) => controller.abort());\n this._abortControllerForRequestMap = undefined;\n\n this.emitEvent({ type: \"cancel\" });\n\n return this;\n }\n\n /**\n * Unloads the model and clears the viewer.\n */\n clear(): this {\n if (!this.visualizeJs) return this;\n\n const visLib = this.visLib();\n const visViewer = visLib.getViewer();\n\n this.clearOverlay();\n\n visViewer.clear();\n visViewer.createLocalDatabase();\n\n this.syncOpenCloudVisualStyle(true);\n this.syncOptions();\n this.resize();\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n /**\n * Get markup color.\n *\n * @returns Color with `RGB` values.\n */\n getMarkupColor(): { r: number; g: number; b: number } {\n return this.markup.getMarkupColor();\n }\n\n /**\n * Set markup color.\n *\n * @param r - `Red` part of color.\n * @param g - `Green` part of color.\n * @param b - `Blue` part of color.\n */\n setMarkupColor(r = 255, g = 0, b = 0): void {\n this.markup.setMarkupColor(r, g, b);\n const color = { r, g, b };\n this.emitEvent({ type: \"changemarkupcolor\", data: color });\n }\n\n /**\n * Colorize all markup entities with the specified color.\n *\n * @param r - `Red` part of color.\n * @param g - `Green` part of color.\n * @param b - `Blue` part of color.\n */\n colorizeAllMarkup(r = 255, g = 0, b = 0): void {\n this.markup.colorizeAllMarkup(r, g, b);\n }\n\n /**\n * Add an empty markup entity to the overlay.\n */\n addMarkupEntity(entityName: string) {\n if (!this.visualizeJs) return null;\n\n this.syncOverlay();\n\n const visViewer = this.visViewer();\n const model = visViewer.getMarkupModel();\n const entityId = model.appendEntity(entityName);\n const entityPtr = entityId.openObject();\n\n const color = this.getMarkupColor();\n entityPtr.setColor(color.r, color.g, color.b);\n entityPtr.setLineWeight(2);\n entityPtr.delete();\n\n this.update();\n\n return entityId;\n }\n\n /**\n * Draw a viewpoint. To get a list of available model viewpoints, use the\n * {@link Model#getViewpoints | Model.getViewpoints()} or\n * {@link File#getViewpoints | File.getViewpoints()}.\n *\n * @param viewpoint - Viewpoint.\n */\n drawViewpoint(viewpoint: IViewpoint): void {\n this.setOrthogonalCameraSettings(viewpoint.orthogonal_camera);\n this.setClippingPlanes(viewpoint.clipping_planes);\n this.markup.setViewpoint(viewpoint);\n }\n\n /**\n * Create a viewpoint. To add a viewpoint to the list of model viewpoints, use the\n * {@link Model#saveViewpoint | Model.saveViewpoint()} or\n * {@link File#saveViewpoint | File.saveViewpoint()}.\n */\n createViewpoint(): IViewpoint {\n const vp = this.markup.getViewpoint();\n vp.orthogonal_camera = this.getOrthogonalCameraSettings();\n vp.clipping_planes = this.getClippingPlanes();\n\n return vp;\n }\n\n private getPoint3dFromArray(array) {\n return { x: array[0], y: array[1], z: array[2] };\n }\n\n private getLogicalPoint3dAsArray(point3d) {\n return [point3d.x, point3d.y, point3d.z];\n }\n\n private getOrthogonalCameraSettings(): IOrthogonalCamera {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n return {\n view_point: this.getPoint3dFromArray(activeView.viewPosition),\n direction: this.getPoint3dFromArray(activeView.viewTarget),\n up_vector: this.getPoint3dFromArray(activeView.upVector),\n field_width: activeView.viewFieldWidth,\n field_height: activeView.viewFieldHeight,\n };\n }\n\n private setOrthogonalCameraSettings(settings: IOrthogonalCamera) {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n this.resetActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n if (settings) {\n activeView.setView(\n this.getLogicalPoint3dAsArray(settings.view_point),\n this.getLogicalPoint3dAsArray(settings.direction),\n this.getLogicalPoint3dAsArray(settings.up_vector),\n settings.field_width,\n settings.field_height,\n true\n );\n }\n\n this.syncOverlay();\n }\n\n private getClippingPlanes(): IClippingPlane[] {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n const clipping_planes = [];\n for (let i = 0; i < activeView.numCuttingPlanes(); i++) {\n const cuttingPlane = activeView.getCuttingPlane(i);\n\n const plane = {\n location: this.getPoint3dFromArray(cuttingPlane.getOrigin()),\n direction: this.getPoint3dFromArray(cuttingPlane.normal()),\n };\n\n clipping_planes.push(plane);\n }\n\n return clipping_planes;\n }\n\n private setClippingPlanes(clippingPlanes: IClippingPlane[]) {\n if (clippingPlanes) {\n const visViewer = this.visViewer();\n const activeView = visViewer.activeView;\n\n for (const plane of clippingPlanes) {\n const cuttingPlane = new (this.visLib().OdTvPlane)();\n cuttingPlane.set(this.getLogicalPoint3dAsArray(plane.location), this.getLogicalPoint3dAsArray(plane.direction));\n\n activeView.addCuttingPlane(cuttingPlane);\n activeView.setEnableCuttingPlaneFill(true, 0x66, 0x66, 0x66);\n }\n }\n }\n\n /**\n * Executes the command denoted by the given command identifier.\n *\n * @param id - Identifier of the command to execute.\n * @param args - Parameters passed to the command function.\n * @returns A returned value of the given command. Returns `undefined` when the command doesn't exists.\n */\n executeCommand(id: string, ...args: any[]): any {\n return commands(\"VisualizeJS\").executeCommand(id, this, ...args);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\nimport { Model } from \"../../Api/Model\";\nimport { Assembly } from \"../../Api/Assembly\";\n\nexport const composeMatrixFromTransform = (translate, rotate, scale, modelCenter, matrix) => {\n const translateMatrix = matrix.setTranslation([translate.x, translate.y, translate.z]);\n const rotateMatrix = matrix.setToRotation(rotate.angle, [rotate.x, rotate.y, rotate.z], modelCenter);\n const scaleMatrix = matrix.setToScaling(scale, modelCenter);\n return translateMatrix.postMultBy(rotateMatrix).postMultBy(scaleMatrix);\n};\n\nfunction applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n if (!viewer.visualizeJs) return;\n\n const assembly = model instanceof Model ? model.assembly : model;\n if (!(assembly instanceof Assembly)) return;\n\n const visLib = viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n\n const transform = assembly.getModelTransformMatrix(modelPtr.getDatabaseHandle());\n if (transform) {\n const extents = modelPtr.getExtents();\n const matrix = composeMatrixFromTransform(\n transform.translate,\n transform.rotation,\n transform.scale,\n extents.center(),\n new visLib.Matrix3d()\n );\n\n modelPtr.setModelingMatrix(matrix, true);\n }\n }\n modelItr.delete();\n\n visViewer.clearViewExtentsCache?.();\n\n viewer.update();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"applyModelTransform\", applyModelTransform);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"clearMarkup\", (viewer: Viewer) => viewer.clearOverlay());\ncommands(\"VisualizeJS\").registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"clearSlices\", (viewer: Viewer) => viewer.clearSlices());\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n if (!viewer.visualizeJs) return \"\";\n\n return viewer.canvas?.toDataURL(type, encoderOptions) || \"\";\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"createPreview\", createPreview);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction explode(viewer: Viewer, index = 0): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.explode(index);\n\n viewer.update();\n viewer.emit({ type: \"explode\", data: index });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"explode\", explode);\ncommands(\"VisualizeJS\").registerCommand(\"collect\", (viewer: any) => explode(viewer, 0));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getDefaultViewPositions(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visLib = viewer.visLib();\n\n const defViewPos = visLib.DefaultViewPosition;\n return Object.keys(defViewPos).filter((x) => x !== \"values\");\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getModels(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visViewer = viewer.visViewer();\n\n const handles: string[] = [];\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n if (modelPtr.getName()[0] !== \"$\") handles.push(modelPtr.getDatabaseHandle());\n }\n modelItr.delete();\n\n return handles;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getModels\", getModels);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction getSelected(viewer: Viewer): string[] {\n if (!viewer.visualizeJs) return [];\n\n const visViewer = viewer.visViewer();\n\n const handles: string[] = [];\n const selectionSet = visViewer.getSelected();\n if (!selectionSet.isNull() && selectionSet.numItems() !== 0) {\n const itr = selectionSet.getIterator();\n for (; !itr.done(); itr.step()) {\n const entityId = itr.getEntity();\n\n const entityPtr =\n entityId.getType() === 1\n ? entityId.openObject()\n : entityId.getType() === 2\n ? entityId.openObjectAsInsert()\n : null;\n\n if (entityPtr) {\n const handle = entityPtr.getNativeDatabaseHandle();\n if (handle !== \"-1\") handles.push(handle);\n entityPtr.delete();\n }\n }\n itr.delete();\n }\n\n return handles;\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"getSelected\", getSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction hideSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.hideSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"hide\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"hideSelected\", hideSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction isolateSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.isolateSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"isolate\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"isolateSelected\", isolateSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction regenerateAll(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.regenAll();\n\n viewer.update();\n viewer.emit({ type: \"regenerateall\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"regenerateAll\", regenerateAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction resetView(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n viewer.executeCommand(\"setActiveDragger\", \"\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"unselect\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n viewer.executeCommand(\"k3DViewSW\");\n\n viewer.emit({ type: \"resetview\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"resetView\", resetView);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction selectModel(viewer: Viewer, handle: string): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n const activeView = visViewer.activeView;\n\n const modelItr = visViewer.getModelIterator();\n for (; !modelItr.done(); modelItr.step()) {\n const modelPtr = modelItr.getModel();\n if (modelPtr.getDatabaseHandle() === handle) {\n const selectionSet = activeView.selectCrossing([0, 9999, 9999, 0], modelPtr);\n\n visViewer.setSelected(selectionSet);\n const handles = viewer.getSelected();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: selectionSet, handles });\n\n selectionSet.delete();\n break;\n }\n }\n modelItr.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"selectModel\", selectModel);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"setActiveDragger\", (viewer: Viewer, dragger = \"\") => {\n viewer.setActiveDragger(dragger);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction setDefaultViewPosition(viewer: Viewer, position = \"\"): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = viewer.visViewer();\n\n const defViewPos = visLib.DefaultViewPosition;\n visViewer.setDefaultViewPositionWithAnimation(defViewPos[position]);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewTop\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewTop\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewBottom\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewBottom\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewLeft\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewLeft\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewRight\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewRight\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewFront\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewFront\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewBack\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewBack\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewSE\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewSE\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewSW\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewSW\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewNE\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewNE\"));\ncommands(\"VisualizeJS\").registerCommand(\"k3DViewNW\", (viewer) => setDefaultViewPosition(viewer, \"k3DViewNW\"));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\ncommands(\"VisualizeJS\").registerCommand(\"setMarkupColor\", (viewer: Viewer, r = 255, g = 0, b = 0) => {\n viewer.setMarkupColor(r, g, b);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction setSelected(viewer: Viewer, handles: string[] = []): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = visLib.getViewer();\n\n const selectionSet = new visLib.OdTvSelectionSet();\n handles?.forEach((handle) => {\n const entityId = visViewer.getEntityByOriginalHandle(handle + \"\");\n if (!entityId.isNull()) selectionSet.appendEntity(entityId);\n });\n\n visViewer.setSelected(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: selectionSet, handles });\n\n selectionSet.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"setSelected\", setSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction showAll(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.unisolateSelectedObjects(false);\n\n viewer.update();\n viewer.emit({ type: \"showall\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"showAll\", showAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction unselect(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n visViewer.unselect();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: visViewer.getSelected(), handles: [] });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"unselect\", unselect);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToExtents(viewer: Viewer, force = false, animate = viewer.options.cameraAnimation): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n const saveEnableAmination = visViewer.getEnableAnimation();\n\n visViewer.setEnableAnimation(animate);\n visViewer.zoomExtents(force);\n visViewer.update();\n visViewer.setEnableAnimation(saveEnableAmination);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands(\"VisualizeJS\").registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n if (!viewer.visualizeJs) return;\n\n const visLib = viewer.visLib();\n const visViewer = viewer.visViewer();\n\n const selectionSet = new visLib.OdTvSelectionSet();\n handles.forEach((handle) => {\n const entityId = visViewer.getEntityByOriginalHandle(handle + \"\");\n if (!entityId.isNull()) selectionSet.appendEntity(entityId);\n });\n\n visViewer.zoomToObjects?.(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n\n selectionSet.delete();\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToObjects\", zoomToObjects);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Viewer } from \"../Viewer\";\nimport { commands } from \"../Commands\";\n\nfunction zoomToSelected(viewer: Viewer): void {\n if (!viewer.visualizeJs) return;\n\n const visViewer = viewer.visViewer();\n\n const selectionSet = visViewer.getSelected();\n visViewer.zoomToObjects?.(selectionSet);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"VisualizeJS\").registerCommand(\"zoomToSelected\", zoomToSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2023, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nexport { Assembly } from \"./Api/Assembly\";\nexport { CANVAS_EVENTS } from \"./Viewer/CanvasEvents\";\nexport { Client } from \"./Api/Client\";\nexport { ClashTest } from \"./Api/ClashTest\";\nexport { commands } from \"./Viewer/Commands\";\nexport { EventEmitter2 } from \"./Viewer/EventEmitter2\";\nexport { File } from \"./Api/File\";\nexport { IViewer } from \"./Viewer/IViewer\";\nexport { Job } from \"./Api/Job\";\nexport { Member } from \"./Api/Member\";\nexport { Model } from \"./Api/Model\";\nexport { OdBaseDragger } from \"./Viewer/Draggers/Common/OdBaseDragger\";\nexport { Options, OptionsData } from \"./Viewer/Options\";\nexport { Permission } from \"./Api/Permission\";\nexport { Project } from \"./Api/Project\";\nexport { Role } from \"./Api/Role\";\nexport { User } from \"./Api/User\";\nexport { Viewer, Viewer as VisualizejsViewer } from \"./Viewer/Viewer\";\n\nexport * from \"./Api/ClientEvents\";\nexport * from \"./Viewer/Markup/IViewpoint\";\nexport * from \"./Viewer/OptionsEvents\";\nexport * from \"./Viewer/ViewerCommands\";\nexport * from \"./Viewer/ViewerEvents\";\n\nexport const version = \"CLIENT_JS_VERSION\";\n"],"names":["Model","constructor","data","file","this","path","httpClient","_file","_data","assembly","value","database","default","fileId","geometry","id","name","version","getViewpoints","then","array","filter","custom_fields","modelId","modelName","saveViewpoint","viewpoint","deleteViewpoint","guid","getSnapshot","getSnapshotData","bitmapGuid","downloadResource","dataId","onProgress","signal","partialDownloadResource","downloadFileRange","requestId","records","getReferences","STATUS_CODES","statusText","status","FetchError","Error","message","super","json","request","response","text","error400","_default","JSON","parse","description","handleXMLHttpError","xhr","Promise","reject","console","error","responseText","resolve","handleFetchError","ok","$init","method","headers","body","FormData","File","Blob","formData","append","ArrayBuffer","blob","stringify","result","globalThis","$fetch","url","init","fetch","$get","$put","$post","$delete","streamProgress","stream","onprogress","reader","getReader","current","calc","ev","done","read","catch","length","downloadProgress","contentLength","_a","get","total","parseInt","tee","bytesCount","Response","$XMLHttp","uploadProgress","XMLHttpRequest","open","key","setRequestHeader","calcProgress","event","lengthComputable","loaded","upload","onloadend","target","send","delay","ms","timeoutId","abortHandler","clearTimeout","window","setTimeout","removeEventListener","addEventListener","once","async","waitFor","func","params","timeout","interval","_b","_c","AbortController","abortError","_d","DOMException","timeoutError","_e","end","performance","now","count","aborted","downloadPartOfFile","defHeaders","isMultipleResourceParts","ranges","i","record","push","begin","size","delete","join","curRecordIndex","curRecordPos","totalLeft","byteLength","loadedPos","curRecord","recLeft","buf","subarray","reqId","parseArgs","args","firstArg","indexOf","slice","argArray","split","map","x","y","flat","concat","Object","fromEntries","userFullName","firstName","lastName","userName","trim","userInitials","fullName","names","reduce","initials","index","charAt","toUpperCase","ClashTest","basePath","internalGet","relativePath","internalPut","put","internalDelete","clearance","createdAt","owner","avatarUrl","serverUrl","userId","lastModifiedAt","selectionSetA","selectionTypeA","selectionSetB","selectionTypeB","tolerance","checkout","update","save","waitForDone","checkDone","test","includes","getReport","Assembly","appendVersionParam","_useVersion","undefined","delimiter","internalPost","post","pathname","activeVersion","associatedFiles","created","forEach","link","files","geometryType","originalAssemblyId","previewUrl","relatedJobs","type","versions","setPreview","image","warn","getModels","getModelTransformMatrix","handle","transform","setModelTransformMatrix","obj","getProperties","handles","searchProperties","searchPattern","getCdaTree","arrayBuffer","references","ready","cancel","onCheckout","call","getClashTests","start","limit","ids","sortByDesc","sortField","searchParams","URLSearchParams","set","toString","Array","isArray","queryString","tests","getClashTest","testId","createClashTest","deleteClashTest","updateVersion","getVersions","getVersion","deleteVersion","setActiveVersion","useVersion","CANVAS_EVENTS","EventEmitter2","_listeners","listener","listeners","removeAllListeners","emitEvent","invoke","on","off","emit","HttpClient","postFile","Permission","actions","grantedTo","public","Job","assemblyId","authorId","lastUpdate","outputFormat","parameters","statusMessage","startedAt","job","customFields","preview","_l","_m","_o","state","geometryStatus","_p","properties","_f","propertiesStatus","_g","_q","validation","_h","validationStatus","_j","_r","updatedBy","_k","_s","geometryGltf","exports","originalFileId","sizeTotal","updatedAt","viewpoints","download","setReferences","createJob","extractGeometry","extractProperties","validate","jobs","waitAll","readyJobs","getPermissions","getPermission","permissionId","createPermission","_public","deletePermission","uploadVersion","progress","Role","projectId","permissions","Member","user","role","Project","authorization","endDate","Date","toISOString","memberCount","modelCount","startDate","topicCount","getRoles","getRole","createRole","deleteRole","getMembers","getMember","memberId","addMember","removeMember","getFilesInformation","items","item","getFieldValue","displayName","display_information","find","field_display_name","field_value","reference","ownerAvatarUrl","ownerFirstName","ownerLastName","ownerUserName","ownerFullName","ownerInitials","updatedByAvatarUrl","updatedByFirstName","updatedByLastName","updatedByUserName","updatedByFullName","updatedByInitials","User","canCreateProject","createAt","avatarImage","email","emailConfirmationId","isEmailConfirmed","lastModified","lastSignIn","projectsLimit","token","tokenInfo","signInUserId","userBrief","newData","setAvatar","Client","configure","eventEmitter","_user","_serverUrl","options","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","defaults","resetToDefaults","saveToStorage","loadFromStorage","replace","_httpClient","server","client","registerUser","password","at","resendConfirmationEmail","confirmUserEmail","signInWithEmail","credentials","btoa","unescape","encodeURIComponent","Authorization","setCurrentUser","signInWithToken","clearCurrentUser","getCurrentUser","getUsers","getUser","createUser","isAdmin","rest","deleteUser","getFiles","ext","toLowerCase","getFile","uploadFile","deleteFile","downloadFile","getJobs","getJob","jobId","deleteJob","getAssemblies","assemblies","getAssembly","createAssembly","deleteAssembly","getProjects","projects","allSize","getProject","createProject","deleteProject","Commands","_commands","Map","registerCommand","handler","thisArg","registerCommandAlias","alias","viewer","executeCommand","getCommand","getCommands","command","isDraggerCommand","draggers","setActiveDragger","apply","commands","viewerType","OdaGeAction","module","setViewParams","extView","m_module","getViewer","getActiveTvExtendedView","setView","position","upVector","viewFieldWidth","viewFieldHeight","perspective","getViewParams","view","activeView","viewPosition","viewTarget","getModel","getMarkupModel","copyPoint","point","p","Point3d","z","createVector3d","Vector3d","createPoint3d","createMatrix3d","Matrix3d","createPlane","OdTvPlane","toVector","geVector","createFromArray","toGeVector","v","toGePoint","toPoint","gePoint","screenToWorld","toDoubleArray","points","correctCameraTarget","getActiveExtents","min","max","contains","center","CLICK_DELTA","INTERACTIVITY_FPS","OdBaseDragger","subject","visualizeJs","beginInteractivity","endInteractivity","device","getActiveDevice","canvas","invalidate","width","height","needInputText","mouseDownPosition","autoSelect","onmessage","canvasEvents","initialize","bind","setEnableAutoSelect","dispose","relativeCoords","offsetX","devicePixelRatio","offsetY","pointerdown","isPrimary","isGestureActive","setPointerCapture","pointerId","relCoord","isDragging","clientX","clientY","pointerup","needSkipPointerUp","releasePointerCapture","pointercancel","dispatchEvent","PointerEvent","pointermove","drag","movementX","movementY","click","isNotDragging","Math","abs","getEnableAutoSelect","unselect","select","selectionSet","getSelected","dblclick","clickView","viewAt","active","pSelected","isNull","numItems","itr","getIterator","entity","getEntity","zoomToEntity","deleteAll","absoluteX","absoluteY","getActiveMarkupEntity","entityName","addMarkupEntity","syncOverlayView","syncOverlay","objects","updatePreview","_isGestureActive","_needSkipPointerUp","Options","emitter","_emitter","notifierChangeEvent","localStorage","setItem","getItem","fields","resetData","acc","field","Boolean","createHtmlElementIfNeed","element","targetElement","dataTestId","document","createElement","setAttribute","appendChild","destroyHtmlElement","removeChild","worldToScreen","moduleInstance","worldPoint","avp","mtx","worldToDeviceMatrix","devicePoint","transformBy","res","getDistance","gePoint1","gePoint2","tvPoint1","tvPoint2","distance","distanceTo","toFixed","normalizeFloat","ceil","floor","lineSegmentsIntersect","p1","p2","p3","p4","a_dx","a_dy","b_dx","b_dy","s","t","checkSegmentsIntersect","isInsideRect","getDataForDrawLineWithFixed","pLU","pRU","pLB","pRB","intersects","fixedP1","fixedP2","dx","dy","angle","atan","PI","sqrt","pow","onSetCallback","cb","onclick","onSetSelectivity","enable","style","pointerEvents","MeasureLineItem","htmlElemStartPoint","htmlElemEndPoint","htmlElemLine","htmlElemTitle","startPoint","endPoint","unit","scale","lineThickness","border","background","color","boxShadow","utils.createHtmlElementIfNeed","isFinishDraw","drawMeasureLine","pointSize","rect","getBoundingClientRect","pScreenStart","utils.worldToScreen","utils.isInsideRect","display","cursor","top","left","borderRadius","zIndex","pScreenEnd","point1","point2","utils.getDataForDrawLineWithFixed","transformOrigin","pX","pY","widthTitle","font","padding","textAlign","innerHTML","utils.getDistance","setStartPoint","setEndPoint","isFinish","setSize","clear","utils.destroyHtmlElement","setUnit","setConversionFactor","setStyle","setSelectionReactor","reactor","utils.onSetCallback","onStartPoint","onEndPoint","onTitle","setSelectability","utils.onSetSelectivity","renameUnit","table","MeasureLineDragger","press","gripingRadius","firstPoint","secondPoint","renameUnitTable","Millimeters","Centimeters","Meters","Feet","Inches","Yards","Kilometers","Miles","Micrometers","MicroInches","Undefined","m_overlayElement","resize","remove","getSnapPointRadius","corners","viewDcCorners","pt1","lowerLeft","pt2","upperRight","createNewMeasureIfNeed","getSnapPoint","previewMeasureLine","newLineMeasure","createMeasureLine","getUnit","FocalLengthConst","calcFocalLength","lensLength","fieldWidth","fieldHeight","OdaWalkDragger","multiplier","speed","keyPressMap","Set","keydown","keyup","lastFrameTS","animationId","processMovement","deltaAngle","oldWCSEnableValue","getEnableWCS","setEnableWCS","maxDimension","getMaxDimension","viewParams","model","getActiveModel","cameraId","appendCamera","setupCamera","cameraWalker","OdTvCameraWalker","setCamera","enableZoomWheelPreviousValue","cancelAnimationFrame","removeEntity","code","add","timestamp","requestAnimationFrame","deltaTS","currentDelta","keyCode","moveForward","moveBackward","moveLeft","moveRight","moveUp","moveDown","dltX","dltY","turnLeft","turnDown","pCamera","camera","openObjectAsCamera","dir","direction","up","pos","rotMatrix","zAxisVector","setToRotation","setupCameraByDirection","toArray","setDisplayGlyph","setDisplayTarget","setAutoAdjust","setNearClip","setFarClip","setViewParameters","focalL","pTarget","viewDir","viewDirSub","sub","viewDirVec","asVector","viewDirVecNormal","normalize","geViewDir","newGeViewDir","pTarget2","newGeViewDirPt","newPos","assignView","xmax","ymax","zmax","sceneExtents","xmin","ymin","zmin","volume","OdBaseCuttingPlaneDragger","m_size_x","m_size_y","m_size_z","m_center","m_normal","createNormal","plane","addCuttingPlane","numCuttingPlanes","setEnableCuttingPlaneFill","setCuttingPlaneFillPatternEnabled","CuttingPlaneFillStyle","kHorizontalBars","m_model","createPreview","m_entity","planePreview","handleDelta","delta","getPlanePreviewCoordinate","m_last","m_click","oldCenter","oldLast","newPlane","newCutting","updateCuttingPlane","drawPreview","getSize","appendEntity","GeometryTypes","transparencyDef","OdTvTransparencyDef","colorDef","OdTvColorDef","setValue","entityPtr","openObject","setColor","kFaces","kEdges","setLineWeight","setTransparency","appendPolygon","polygonPtr","openAsPolygon","setFilled","setPoints","OdCuttingPlaneXAxisDragger","OdCuttingPlaneYAxisDragger","OdCuttingPlaneZAxisDragger","OrbitAction","_m_module","_subject","_beginInteractivity","_endInteractivity","beginAction","m_viewCenter","getCenter","m_startPoint","action","vportRect","distX","distY","xOrbit","yOrbit","sideVector","getSideVector","calculateXOrbit","calculateYOrbit","activeDragger","endAction","pUpV","pPosition","direct","vDirect","vCross","crossProduct","pPoint","pCenter","rotatePoint","rotateByBasePoint","pUp","vUp","crossProductNormal","zAxis","kZAxis","side","rotateBy","cross","crossNormal","pSet","entId","extSelected","step","getWCSExtents","addExt","OdOrbitDragger","_orbitAction","setDefaultViewParams","startCameraParams","PanAction","_getViewParams","_setViewParams","_m_start","_deltaScreenPosition","pt","ptSub","targetWithDelta","positionWithDelta","dX","dY","OdPanDragger","_panAction","ZoomAction","zoomFactor","zoomAt","OdZoomDragger","_zoomAction","pressX","pressY","ZOOM_SPEED","INTERACTIVITY_TIME_OUT","OdZoomWheelDragger","_endInteractivityTimeOutId","_isEnableInteractivityMode","wheel","preventDefault","zoomReverse","zoomSpeed","deltaY","OdSelectionFrame","m_start","m_end","instance","draw","viewM","viewingMatrix","p0","eyeM","eyeToWorldMatrix","m_frame","OdZoomWindowDragger","m_minX","m_minY","m_maxX","m_maxY","zoomWindow","OrbitAroundBuildingDragger","maxPolarAngle","minPolarAngle","m_delta","offset","zMatrix","setToIdentity","xMatrix","yAxis","xAxis","xyDir","xyAngle","sign","dotProduct","angleTo","yzDir","yzAngle","xAngle","endMatrix","postMultBy","setLength","getType","getExtents","openObjectAsInsert","extTuple","GestureAction","GestureManager","isSingleTouchEnabled","_isSingleTouchEnabled","_previousEvents","_currentEvents","_lastGestureAction","None","_maxInitialDistanceDifference","getMiddlePoint","events","keys","getKeys","point0","getFirstPoint","hypot","updateEvent","eventNotInCurrentEvents","previousEvent","_initialDistance","removeEvent","from","analyzeGesture","currentDistance","previousDistance","currentDistanceEqualsInitialDistance","executePanAction","executeZoomAction","executeOrbitAction","Zoom","executeEndAction","middlePoint","currentPoint","Pan","Orbit","gestureAction","needIgnoreEvent","eventIsTouchEvent","pointerType","pointerleave","loadScript","script","src","onload","onerror","loadVisuazlizeJsScript","loadVisualizeJs","urlMemFile","TOTAL_MEMORY","postRun","BaseLoader","load","TCSLoader","visLib","visViewer","abortController","listFileForDownload","chunksProgress","fileProgress","_abortController","chunk","progressCb","parseStream","Uint8Array","syncOpenCloudVisualStyle","syncOptions","DELAY_TIME_MULTIPLEXER","START_UPDATE_TIME","UpdateType","UpdaterController","delayUpdateTime","isNeedUpdate","kDelay","isForce","kForce","VsfXStreamingLoader","updaterController","isFireDatabaseChunk","chunkLoadHandler","parseVsfx","DatabaseStreamStatus","ReadyServiceData","Complete","time","timeEnd","kNormal","VsfXPartialLoader","abortControllerForRequestMap","servicePartAborted","pendingRequestsMap","PENDING_REQUESTS_SIZE","PENDING_REQUESTS_TIMEOUT","pendingRequestsTimerId","pendingRequestsAbortHandler","pendingRequestsAbortController","_abortControllerForRequestMap","requestLoadHandler","parseVsfxInPartialMode","isMultipleParts","abortCtrl","requests","onRequestResponseComplete","recordsToArray","objectHandler","onServicePartReceived","bHasIndex","abort","onRequest","onFullLoaded","onRequestResponseParsed","onRequestAborted","onRequestResourceFile","_","pendingRequests","recNumber","pendingRequestsRecord","number","requestsRecord","keyFileName","attachPartialResolver","VsfXLoader","LoaderFactory","create","pop","MarkupType","MarkupMode","MarkupColor","HexColor","_hex","RGB","R","G","B","rgbToHex","valueToHex","c","hex","LineTypeSpecs","KonvaLine","ref","_ref","konvaPoints","Konva","Line","stroke","strokeWidth","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","_id","enableMouseEditing","getColor","getRotation","rotation","setRotation","degrees","getZIndex","setZIndex","destroy","getPoints","setLineWidth","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","KonvaText","TEXT_FONT_FAMILY","Text","fontSize","fontFamily","fill","align","getText","setText","getPosition","setPosition","getFontSize","setFontSize","KonvaRectangle","Rect","lineWidth","getWidth","getHeigth","setWidth","w","setHeight","h","KonvaEllipse","Ellipse","radiusX","radius","radiusY","getRadiusX","setRadiusX","getRadiusY","setRadiusY","KonvaArrow","Arrow","getStartPoint","getEndPoint","KonvaImage","_ratio","_canvasImage","Image","getSrc","setSrc","getHeight","KonvaCloud","arcRadius","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","arcCount","lengthMod","pEndX","pEndY","endAngle","startAngle","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","e","attrs","minWidth","minHeight","newWidth","scaleX","newHeight","scaleY","getSelfRect","MarkupMode2Konva","initializer","Rectangle","Cloud","KonvaMarkup","_isInitialized","_zIndex","_markupContainerName","changeActiveDragger","draggerName","_markupContainer","_canvasOriginal","startsWith","removeTextInput","markupMode","konvaMode","_markupMode","_markupIsActive","_konvaTransformer","nodes","_konvaStage","clientWidth","clientHeight","pan","values","mode","konvaLayerFind","move","redirectToViewer","_viewer","_canvasEvents","outline","parentDiv","parentElement","_markupColor","initializeKonva","destroyKonva","getDraggers","clearOverlay","getMarkupColor","setMarkupColor","colorizeAllMarkup","konvaObj","_konvaLayer","setViewpoint","markupColor","markup_color","loadMarkup","getViewpoint","lines","texts","arrows","clouds","ellipses","images","rectangles","snapshot","combineMarkupWithDrawing","fillViewpointShapes","toDateString","createObject","object","addObject","getObjects","line","rectangle","ellipse","arrow","cloud","getSelectedObjects","konvaShapeName","selectObjects","selectedObjs","clearSelected","getPoint3dFromArray","markupLines","getMarkupLines","markupTexts","getMarkupTexts","markupRectangles","getMarkupRectangles","markupEllipses","getMarkupEllipses","markupArrows","getMarkupArrows","markupImages","getMarkupImages","markupClouds","getMarkupClouds","markupShape","konvaShape","konvaShapes","parent","Layer","Stage","container","stage","layer","pixelRation","transformer","Transformer","shouldOverdrawWholeArea","isPaint","lastLine","getPointerPosition","addLine","addRectangle","addEllipse","addArrow","addCloud","_textInputRef","addText","_textInputPos","_textInputAngle","createTextInput","evt","pageX","pageY","rotateEnabled","metaPressed","shiftKey","ctrlKey","metaKey","isSelected","splice","tabIndex","focus","trNodes","linePoints","worldPoints","absoluteTransform","getAbsoluteTransform","atPoint","konvaLine","textSize","textScale","projMtrx","projectionMatrix","mtrxNumber","tol","text_size","font_size","line_width","atStartPoint","worldStartPoint","atEndPoint","worldEndPoint","vpLine","screenPoint","vpText","vpRect","vpEllipse","vpArrow","vpCloud","vpImage","addImage","tempCanvas","ctx","getContext","drawImage","toCanvas","pixelRatio","toDataURL","inputX","inputY","onkeydown","specifiedText","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage","MARKUP_ENTITY_LINE","OdaLineDragger","drawPoints","_updateFrame","appendPolyline","MARKUP_ENTITY_TEXT","OdaTextDragger","TEXT_HEIGHT_ALIGN","textRef","_finishInput","trimLeft","onkeypress","eyeToWorld","eyeDir","xDir","mtrx","setToWorldToPlane","angel","atan2","geomData","appendText","textPtr","openAsText","setNormal","setTextSize","VisualizeMarkup","clearEntities","getEntitiesIterator","entityId","getName","getLogicalPoint3dAsArray","point3d","getPoint3d","entityData","normal","getLogicalPoint3dFromArray","geomItr","getGeometryDataIterator","geometryId","getGeometryData","polylinePtr","openAsPolyline","getString","getTextSize","getLayer","MarkupFactory","createMarkup","markupType","markup","createKonva","Visualize","createVisualize","OVERLAY_VIEW_NAME","isExist","Viewer","_options","_activeDragger","_renderTime","draggerFactory","registerDragger","markupDraggers","canvaseventlistener","_enableAutoUpdate","enableAutoUpdate","_isNeedRender","_isRunAsyncUpdate","render","visualizeJsUrl","_visualizeJsUrl","touchAction","timeStamp","_resizeObserver","ResizeObserver","observe","_zoomWheelDragger","_gestureManager","frameId","disconnect","isInitialized","isRunningAnimation","isValid","deltaTime","force","scheduleUpdateAsync","maxScheduleUpdateTimeInMs","updateAsync","maxScheduleUpdateCount","iterationCount","isInitializing","getActiveView","enableDefaultLighting","DefaultLightingType","kTwoLights","setDefaultLightingIntensity","visualStyleId","findVisualStyle","log","createVisualStyle","shadedVsId","visualStylePtr","copyFrom","setOptionInt32","VisualStyleOptions","kFaceModifiers","VisualStyleOperations","kSet","kEdgeModel","setOptionDouble","kEdgeCreaseAngle","kEdgeStyles","kEdgeModifiers","setOptionColor","kEdgeColorValue","visualStyle","getEnableAnimation","setEnableAnimation","fxaaAntiAliasing3d","fxaaQuality","getOptionBool","DeviceOptions","kSSAOEnable","setOptionBool","kSSAODynamicRadius","kSSAORadius","kSSAOLoops","kSSAOPower","kSSAOBlurRadius","setSSAOEnabled","syncHighlightingOptions","Entry","OdTvRGBColorDef","highlightStyleId","findHighlightStyle","highlightStylePtr","setFacesColor","k3D","k3DTop","setFacesVisibility","setFacesTransparency","setEdgesColor","k2D","k2DTop","setEdgesVisibility","visibility","dragger","Constructor","resetActiveDragger","clearSlices","removeCuttingPlanes","overlayView","getViewByName","overlayModel","pDevice","createView","addModel","addSibling","addView","viewPort","getViewport","setViewport","is3D","extHeight","setSelected","loadReferences","_abortControllerForReferences","addEmbeddedFile","applyModelTransformMatrix","applySceneGraphSettings","kDelaySceneGraphProc","models","overrideOptions","loaderFactory","loader","openVsfFile","buffer","parseFile","openVsfxFile","controller","createLocalDatabase","drawViewpoint","setOrthogonalCameraSettings","orthogonal_camera","setClippingPlanes","clipping_planes","createViewpoint","vp","getOrthogonalCameraSettings","getClippingPlanes","view_point","up_vector","field_width","field_height","settings","cuttingPlane","getCuttingPlane","location","getOrigin","clippingPlanes","composeMatrixFromTransform","translate","rotate","modelCenter","matrix","translateMatrix","setTranslation","rotateMatrix","scaleMatrix","setToScaling","applyModelTransform","modelItr","getModelIterator","modelPtr","getDatabaseHandle","extents","setModelingMatrix","clearViewExtentsCache","encoderOptions","explode","getDefaultViewPositions","defViewPos","DefaultViewPosition","getNativeDatabaseHandle","hideSelected","hideSelectedObjects","isolateSelected","isolateSelectedObjects","regenerateAll","regenAll","resetView","selectModel","selectCrossing","setDefaultViewPosition","setDefaultViewPositionWithAnimation","OdTvSelectionSet","getEntityByOriginalHandle","showAll","unisolateSelectedObjects","zoomToExtents","animate","saveEnableAmination","zoomExtents","zoomToObjects","zoomToSelected"],"mappings":"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"}
|