Home Reference Source

viewer/bimsurfer.js

import { BimServerViewer } from "./bimserverviewer.js";
import { EventHandler } from "./eventhandler.js";
import { Stats } from "./stats.js";


/**
 * Entry point for the public BimSurfer API.
 *
 * @class BimSurfer
 * @extends {EventHandler}
 */
export class BimSurfer extends EventHandler {
	constructor(settings) {
		super();

		this.settings = settings || {};

		this._api = null;
	}

	/**
	 * Loads project meta-data} from a BIMserver and searches for the
	 * specified revision id.
	 * 
	 * @private
	 * @param {Number} roid Revision id to load
	 * @return
	 * @memberof BimSurfer
	 */
	loadProjects(roid) {
		return new Promise((resolve, reject) => {
			this._api.call("ServiceInterface", "getAllProjects", {
				onlyTopLevel: false,
				onlyActive: true
			}, (projects) => {
				let found = false;
				for (var p of projects) {
					if (p.revisions.indexOf(roid) !== -1) {
						resolve(p);
						found = true;
						break;
					}
				}
				if (!found) {
					reject("Revision id not found");
				}
			});
		});
	}

	/**
	 * @private
	 * @param {Object} project Project meta-data object
	 * @param {HTMLElement} domNode The parent HTMLElement in which to create a CANVAS for WebGL rendering
	 * @return
	 * @memberof BimSurfer
	 */
	loadModel(project, domNode, gltfBuffer) {


		var stats = new Stats();
		stats.setParameter("Models", "Name", project.name);

		this._bimServerViewer = new BimServerViewer(this.settings, domNode, null, null, stats);

		this._bimServerViewer.setProgressListener((percentage) => {
			console.log(percentage + "% loaded")
		});


		return this._bimServerViewer.loadModel(this._api, project, gltfBuffer);
	}

	/**
	 * @private
	 * @param {Object} project Project meta-data object
	 * @param {HTMLElement} domNode The parent HTMLElement in which to create a CANVAS for WebGL rendering
	 * @return
	 * @memberof BimSurfer
	 */
	loadRevision(roid, domNode) {
		var stats = new Stats();

		this._bimServerViewer = new BimServerViewer(this.settings, domNode, null, null, stats);

		this._bimServerViewer.setProgressListener((percentage) => {
			console.log(percentage + "% loaded")
		});

		return this._bimServerViewer.loadRevisionByRoid(roid);
	}

	/**
	 * Loads a BIMserver project into the specified domNode for rendering.
	 * 
	 * @param {{username: String, password: String, roid: Number, domNode: HTMLElement}} params Function arguments
	 * @return {Promise}
	 * @memberof BimSurfer
	 */
	load(params) {

		return new Promise((resolve, reject) => {

			this._api = params.api;
			if (params.loadertype == 'fromserver') {
				this.loadProjects(params.roid).then((project) => {
					this.loadModel(project, params.domNode).then(resolve).catch(reject);
				}).catch(reject);
			}
			else if (params.loadertype == 'gltf') {
				var gltfBuffer = params.buffer;
				var project = 4;
				this.loadModel(project, params.domNode, gltfBuffer).then(resolve).catch(reject);




			}
		});
	}

	/**
	 * Sets the visibility for the specified elements
	 *
	 * @param {{ids: Number[], visible: Boolean}} params Function arguments
	 * @memberof BimSurfer
	 */
	setVisibility(params) {
		let v = this._bimServerViewer.viewer;
		if (params.ids) {
			return v.setVisibility(params.ids, params.visible);
		} else if (params.types) {
			return v.callByType(v.setVisibility, params.types, params.visible);
		}
	}

	/**
	 * Sets the selection state for the specified elements
	 *
	 * @param {{ids: Number[], selected: Boolean, clear: ?Boolean}} params Function arguments
	 * @memberof BimSurfer
	 */
	setSelectionState(params) {
		let v = this._bimServerViewer.viewer;
		return v.setSelectionState(params.ids, params.selected, params.clear);
	}

	/**
	 * Gets the currently selected elements
	 *
	 * @return {Number[]} Identifiers of selected elements
	 * @memberof BimSurfer
	 */
	getSelected() {
		let v = this._bimServerViewer.viewer;
		return v.getSelected();
	}

	/**
	 * Sets the color for the specified elements
	 *
	 * @param {{ids: Number[], color:{r:Number, g:Number, b:Number, a:Number}}} params
	 * @memberof BimSurfer
	 */
	setColor(params) {
		let v = this._bimServerViewer.viewer;
		let clr = Array.from("rgba").map((x) => {
			let v = params.color[x];
			return typeof (v) === "undefined" ? 1. : v;
		});
		return v.setColor(params.ids, clr);
	}

	/**
	 * Resets the color for the specified elements (to their original color)
	 *
	 * @param {{ids: Number[]}} params
	 * @memberof BimSurfer
	 */
	resetColor(params) {
		let v = this._bimServerViewer.viewer;
		return v.resetColor(params.ids);
	}

	/**
	 * Zooms the current camera in or out the fit the specified elements in the viewport
	 *
	 * @param {{ids: Number[]}} params
	 * @memberof BimSurfer
	 */
	viewFit(params) {
		let v = this._bimServerViewer.viewer;
		return v.viewFit(params.ids);
	}

	/**
	 * Gets a javascript representation of the current camera orientation
	 *
	 * @return {{type: String, eye: Float32Array, target: Float32Array, up: Float32Array, fovy: ?Number}} Camera parameters
	 * @memberof BimSurfer
	 */
	getCamera() {
		let v = this._bimServerViewer.viewer;
		let projectionType = v.camera.projectionType;
		let json = {
			type: projectionType,
			eye: v.camera._eye.get().slice(0),
			target: v.camera._target.get().slice(0),
			up: v.camera._up.slice(0)
		}
		if (projectionType === "persp") {
			json.fovy = v.camera.projection.fov;
		}
		return json;
	}

	/**
	 * Sets the current camera orientation based on specified parameters
	 *
	 * @param {{type: String, eye: Float32Array, target: Float32Array, up: Float32Array, fovy: ?Number}} params Camera parameters
	 * @memberof BimSurfer
	 */
	setCamera(params) {
		let v = this._bimServerViewer.viewer;
		v.camera.restore(params);
	}

	/**
	 * Resets part of the viewer to its default state.
	 *
	 * @param {{cameraPosition: ?Boolean, colors: ?Boolean, visibility: ?Boolean}} params Parts of the viewer state to reset
	 * @memberof BimSurfer
	 */
	reset(params) {
		let v = this._bimServerViewer.viewer;
		if (params.cameraPosition) {
			v.resetCamera();
		}
		if (params.colors) {
			v.resetColors();
		}
		if (params.visibility) {
			v.resetVisibility();
		}
	}

	/**
	 * Add a handler which is called when an object is selected in the viewer
	 *
	 * @param {{handler: ?Function}} handler Handler (function)
	 * @memberof BimSurfer
	 */
	addSelectedHandler(handler) {
		this._bimServerViewer.addSelectionListener(handler);
	}

	cleanup() {
		this._bimServerViewer.cleanup();
	}
}