@inweb/viewer-visualize
Version:
JavaScript library for rendering CAD and BIM files in a browser using VisualizeJS
248 lines (194 loc) • 7.62 kB
text/typescript
///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
// All rights reserved.
//
// This software and its documentation and related materials are owned by
// the Alliance. The software may only be incorporated into application
// programs owned by members of the Alliance, subject to a signed
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable
// trade secrets of the Alliance and its suppliers. The software is also
// protected by copyright law and international treaty provisions. Application
// programs incorporating this software must include the following statement
// with their copyright notices:
//
// This application incorporates Open Design Alliance software pursuant to a
// license agreement with Open Design Alliance.
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
// All rights reserved.
//
// By use of this software, its documentation or related materials, you
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
import { IEventEmitter } from "@inweb/eventemitter2";
import { ILine, IText, IViewpoint } from "@inweb/viewer-core";
import { IMarkup, IMarkupObject, IWorldTransform, MarkupMode } from "@inweb/markup";
import { Viewer } from "../../Viewer";
import { MARKUP_ENTITY_LINE, OdaLineDragger } from "../../Draggers/OdaLineDragger";
import { MARKUP_ENTITY_TEXT, OdaTextDragger } from "../../Draggers/OdaTextDragger";
export class VisualizeMarkup implements IMarkup {
private _viewer: Viewer;
protected _markupColor = { r: 255, g: 0, b: 0 };
public lineWidth = 4;
public lineType: "solid";
public fontSize = 34;
initialize(
container: HTMLElement,
containerEvents: string[],
viewer?: IEventEmitter,
worldTransformer?: IWorldTransform
): void {
this._viewer = viewer as Viewer;
this._viewer.registerDragger("Line", OdaLineDragger);
this._viewer.registerDragger("Text", OdaTextDragger);
}
dispose(): void {}
syncOverlay(): void {}
clearOverlay(): void {
if (!this._viewer.visualizeJs) return;
const visViewer = this._viewer.visViewer();
const model = visViewer.getMarkupModel();
model.clearEntities();
model.delete();
}
getMarkupColor(): { r: number; g: number; b: number } {
return this._markupColor;
}
setMarkupColor(r: number, g: number, b: number): void {
const color = { r, g, b };
this._markupColor = color;
this._viewer.emitEvent({ type: "changemarkupcolor", data: color });
}
colorizeAllMarkup(r = 255, g = 0, b = 0): void {
if (!this._viewer.visualizeJs) return;
const visViewer = this._viewer.visViewer();
const model = visViewer.getMarkupModel();
const itr = model.getEntitiesIterator();
for (; !itr.done(); itr.step()) {
const entityId = itr.getEntity();
const entityPtr = entityId.openObject();
const entityName = entityPtr.getName();
if (entityName === MARKUP_ENTITY_LINE || entityName === MARKUP_ENTITY_TEXT) {
entityPtr.setColor(r, g, b);
}
entityPtr.delete();
}
itr.delete();
this._viewer.update();
}
colorizeSelectedMarkups(r = 255, g = 0, b = 0): void {
throw new Error("Not implemented yet");
}
setViewpoint(viewpoint: IViewpoint): void {
function getLogicalPoint3dAsArray(point3d) {
return [point3d.x, point3d.y, point3d.z];
}
function getPoint3d(module, gePoint) {
return module.Point3d.createFromArray(gePoint);
}
if (!this._viewer.visualizeJs) return;
const visLib = this._viewer.visLib();
const visViewer = this._viewer.visViewer();
const activeView = visViewer.activeView;
this._viewer.syncOverlay();
const markupColor = viewpoint.custom_fields.markup_color || { r: 255, g: 0, b: 0 };
this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);
if (viewpoint.lines) {
for (const line of viewpoint.lines) {
const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_LINE);
const entityPtr = entityId.openObject();
const entityData = [];
for (const point of line.points) {
entityData.push(point.x, point.y, point.z);
}
const geomData = entityPtr.appendPolyline(entityData);
geomData.delete();
entityPtr.delete();
}
}
if (viewpoint.texts) {
const pos = getPoint3d(visLib, activeView.viewPosition);
const target = getPoint3d(visLib, activeView.viewTarget);
const normal = pos.sub(target).asVector();
for (const text of viewpoint.texts) {
const entityId = this._viewer.addMarkupEntity(MARKUP_ENTITY_TEXT);
const entityPtr = entityId.openObject();
const geomData = entityPtr.appendText(getLogicalPoint3dAsArray(text.position), text.text);
const textPtr = geomData.openAsText();
textPtr.setNormal(getLogicalPoint3dAsArray(normal));
textPtr.setRotation(text.angle);
textPtr.setTextSize(text.text_size);
textPtr.delete();
geomData.delete();
entityPtr.delete();
}
}
this._viewer.update();
}
getViewpoint(viewpoint: IViewpoint): IViewpoint {
if (!this._viewer.visualizeJs) return {};
function getLogicalPoint3dFromArray(array) {
return { x: array[0], y: array[1], z: array[2] };
}
const visLib = this._viewer.visLib();
const visViewer = this._viewer.visViewer();
if (!viewpoint) viewpoint = { custom_fields: {} };
viewpoint.lines = [];
viewpoint.texts = [];
const model = visViewer.getMarkupModel();
const itr = model.getEntitiesIterator();
for (; !itr.done(); itr.step()) {
const entityId = itr.getEntity();
const entityPtr = entityId.openObject();
const entityName = entityPtr.getName();
const geomItr = entityPtr.getGeometryDataIterator();
if (geomItr.done()) {
entityPtr.delete();
continue;
}
const geometryId = geomItr.getGeometryData();
if (entityName === MARKUP_ENTITY_LINE) {
const polylinePtr = geometryId.openAsPolyline();
const points = polylinePtr.getPoints();
const line: ILine = {
points: [],
};
for (const point of points) {
line.points.push(getLogicalPoint3dFromArray(point));
}
viewpoint.lines.push(line);
polylinePtr.delete();
} else if (entityName === MARKUP_ENTITY_TEXT) {
const textPtr = geometryId.openAsText();
const position = textPtr.getPosition();
const text: IText = {
position: getLogicalPoint3dFromArray(position),
text: textPtr.getString(),
angle: textPtr.getRotation(),
text_size: textPtr.getTextSize(),
};
viewpoint.texts.push(text);
textPtr.delete();
}
entityPtr.delete();
}
itr.delete();
viewpoint.snapshot = { data: visLib.canvas.toDataURL("image/jpeg", 0.25) };
viewpoint.custom_fields.markup_color = this.getMarkupColor();
return viewpoint;
}
enableEditMode(mode: MarkupMode | false): this {
return this;
}
createObject(type: string, params: any): IMarkupObject {
return undefined;
}
getObjects(): IMarkupObject[] {
return [];
}
getSelectedObjects(): IMarkupObject[] {
return [];
}
selectObjects(objects: IMarkupObject[]): void {}
clearSelected(): void {}
}