@inweb/client
Version:
JavaScript REST API client for the Open Cloud Server
289 lines (262 loc) • 8.39 kB
text/typescript
///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002-2026, Open Design Alliance (the "Alliance").
// All rights reserved.
//
// This software and its documentation and related materials are owned by
// the Alliance. The software may only be incorporated into application
// programs owned by members of the Alliance, subject to a signed
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable
// trade secrets of the Alliance and its suppliers. The software is also
// protected by copyright law and international treaty provisions. Application
// programs incorporating this software must include the following statement
// with their copyright notices:
//
// This application incorporates Open Design Alliance software pursuant to a
// license agreement with Open Design Alliance.
// Open Design Alliance Copyright (C) 2002-2026 by Open Design Alliance.
// All rights reserved.
//
// By use of this software, its documentation or related materials, you
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
import { Endpoint } from "./Endpoint";
import type { File } from "./File";
import type { Assembly } from "./Assembly";
import type { IFileReferences } from "./IFile";
import type { IModelTransformMatrix } from "./IAssembly";
/**
* Provides properties and methods for working with view of the {@link File | file} or
* {@link Assembly| assembly}. For example, for `dwg` it is a `Model` space or layout, and for `rvt` files
* it is a `3D` view.
*/
export class Model extends Endpoint {
private _data: any;
private _file: File | Assembly;
/**
* @param data - Raw model data received from the server.
* @param file - The file/assembly instance that owns the model.
*/
constructor(data: any, file: File | Assembly) {
super(`${file.path}/downloads`, file.httpClient);
this._data = data;
this._file = file;
}
/**
* The `Assembly` instance that owns the model.
*
* @readonly
*/
get assembly(): Assembly {
return this._file as Assembly;
}
/**
* Raw model data received from the server.
*
* @readonly
*/
get data(): any {
return this._data;
}
private set data(value: any) {
this._data = value;
}
/**
* Scene description resource file name. Use {@link downloadResource | downloadResource()} to download
* scene description file.
*
* @readonly
*/
get database(): string {
return this.data.database;
}
/**
* `true` if this is default model.
*
* @readonly
*/
get default(): boolean {
return this.data.default;
}
/**
* The `File` instance that owns the model.
*
* @readonly
*/
get file(): File {
return this._file as File;
}
/**
* The ID of the file that owns the model.
*
* @readonly
*/
get fileId(): string {
return this.data.fileId;
}
/**
* The list of geometry data resource files. Use {@link downloadResource | downloadResource()} to
* download geometry data files.
*
* @readonly
*/
get geometry(): string[] {
return this.data.geometry;
}
/**
* Unique model ID.
*
* @readonly
*/
get id(): string {
return this.data.id;
}
/**
* Model name.
*
* @readonly
*/
get name(): string {
return this.data.name;
}
/**
* Model owner type, matches the file extension this is model of the file, or `assembly` for
* assemblies.
*
* @readonly
*/
get type(): string {
return this.file.type;
}
// Reserved for future use.
get version(): string {
return this.data.version;
}
/**
* Returns model list with one item `self`.
*/
getModels(): Promise<Model[]> {
return Promise.resolve([this]);
}
/**
* Returns a model transformation.
*
* @param handle - Model handle.
*/
getModelTransformMatrix(handle: string): IModelTransformMatrix {
return this.file.getModelTransformMatrix(handle);
}
/**
* Sets or removes a model transformation.
*
* @param handle - Model handle.
* @param transform - Transformation matrix. Specify `undefined` to remove transformation.
*/
setModelTransformMatrix(handle: string, transform?: IModelTransformMatrix): Promise<this> {
return this.file.setModelTransformMatrix(handle, transform).then(() => this);
}
/**
* Returns a list of viewpoints of the owner file/assembly.
*/
getViewpoints(): Promise<any[]> {
return this._file
.getViewpoints()
.then((array) =>
array.filter(
({ custom_fields = {} }) => custom_fields.modelId === this.id || custom_fields.modelName === this.name
)
);
}
/**
* Saves a new model owner file/assembly viewpoint to the server. To create a new viewpoint use
* `Viewer.createViewpoint()`.
*
* @param viewpoint - Viewpoint object.
*/
saveViewpoint(viewpoint: any): Promise<any> {
return this._file.saveViewpoint({
...viewpoint,
custom_fields: { ...viewpoint.custom_fields, modelId: this.id, modelName: this.name },
});
}
/**
* Deletes the specified viewpoint from the owner file/assembly.
*
* @param guid - Viewpoint GUID.
* @returns Returns the raw data of a deleted viewpoint.
*/
deleteViewpoint(guid: string): Promise<any> {
return this._file.deleteViewpoint(guid);
}
/**
* Returns viewpoint snapshot as base64-encoded
* {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL}.
*
* @param guid - Viewpoint GUID.
*/
getSnapshot(guid: string): Promise<string> {
return this._file.getSnapshot(guid);
}
/**
* Returns viewpoint snapshot data.
*
* @param guid - Viewpoint GUID.
* @param bitmapGuid - Bitmap GUID.
*/
getSnapshotData(guid: string, bitmapGuid: string): Promise<string> {
return this._file.getSnapshotData(guid, bitmapGuid);
}
/**
* Downloads a resource file. Resource files are files that contain model scene descriptions, or
* geometry data.
*
* @param dataId - Resource file name.
* @param onProgress - Download progress callback.
* @param signal - An
* {@link https://developer.mozilla.org/docs/Web/API/AbortController | AbortController} signal. Allows
* to communicate with a fetch request and abort it if desired.
*/
downloadResource(
dataId: string,
onProgress?: (progress: number, chunk: Uint8Array) => void,
signal?: AbortSignal
): Promise<ArrayBuffer> {
return this._file.downloadResource(dataId, onProgress, signal);
}
/**
* Downloads a part of resource file. Resource files are files that contain model scene descriptions,
* or geometry data.
*
* @param dataId - Resource file name.
* @param requestId - Specify a non-empty `requestId` to append the `?requestId=` search parameter to
* the server request. If specified, server-side caching may not work.
* @param ranges - Ranges of resource file contents to download. See
* {@link https://developer.mozilla.org/docs/Web/HTTP/Guides/Range_requests | HTTP range requests} for
* more details.
* @param onProgress - Download progress callback.
* @param signal - An
* {@link https://developer.mozilla.org/docs/Web/API/AbortController | AbortController} signal. Allows
* to communicate with a fetch request and abort it if desired.
*/
downloadResourceRange(
dataId: string,
requestId: number,
ranges: Array<{ begin: number; end: number; requestId: number }>,
onProgress?: (progress: number, chunk: Uint8Array, requestId: number) => void,
signal?: AbortSignal
): Promise<ArrayBuffer> {
return this._file.downloadResourceRange(dataId, requestId, ranges, onProgress, signal);
}
/**
* Returns a list of references of the owner file/assembly.
*
* References are images, fonts, external models or any other files to correct rendering of the file.
*
* @param signal - An
* {@link https://developer.mozilla.org/docs/Web/API/AbortController | AbortController} signal, which
* can be used to abort waiting as desired.
*/
getReferences(signal?: AbortSignal): Promise<IFileReferences> {
return this._file.getReferences(signal);
}
}