You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2108 lines
83 KiB
2108 lines
83 KiB
var Glodon$1 = window.Glodon || {}; |
|
window.Glodon = Glodon$1; |
|
|
|
/****************************************************************************** |
|
Copyright (c) Microsoft Corporation. |
|
|
|
Permission to use, copy, modify, and/or distribute this software for any |
|
purpose with or without fee is hereby granted. |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH |
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY |
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, |
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM |
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR |
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
|
PERFORMANCE OF THIS SOFTWARE. |
|
***************************************************************************** */ |
|
/* global Reflect, Promise */ |
|
|
|
var extendStatics = function(d, b) { |
|
extendStatics = Object.setPrototypeOf || |
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || |
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; |
|
return extendStatics(d, b); |
|
}; |
|
|
|
function __extends(d, b) { |
|
if (typeof b !== "function" && b !== null) |
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); |
|
extendStatics(d, b); |
|
function __() { this.constructor = d; } |
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); |
|
} |
|
|
|
var __assign = function() { |
|
__assign = Object.assign || function __assign(t) { |
|
for (var s, i = 1, n = arguments.length; i < n; i++) { |
|
s = arguments[i]; |
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; |
|
} |
|
return t; |
|
}; |
|
return __assign.apply(this, arguments); |
|
}; |
|
|
|
/** @deprecated */ |
|
function __spreadArrays() { |
|
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; |
|
for (var r = Array(s), k = 0, i = 0; i < il; i++) |
|
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) |
|
r[k] = a[j]; |
|
return r; |
|
} |
|
|
|
// 事件处理基类 |
|
var EventManager = /** @class */ (function () { |
|
function EventManager() { |
|
this._eventContainer = {}; |
|
} |
|
// 添加监听事件 |
|
EventManager.prototype.addEvent = function (type, fn) { |
|
this._eventContainer[type] = this._eventContainer[type] || []; |
|
this._eventContainer[type].push(fn); |
|
return this; |
|
}; |
|
// 删除监听事件 |
|
EventManager.prototype.removeEvent = function (type, fn) { |
|
if (this._eventContainer[type]) { |
|
var index = this._eventContainer[type].indexOf(fn); |
|
index >= 0 && this._eventContainer[type].splice(index, 1); |
|
} |
|
return this; |
|
}; |
|
// 触发监听事件 |
|
EventManager.prototype.fireEvent = function (type) { |
|
var args = []; |
|
for (var _i = 1; _i < arguments.length; _i++) { |
|
args[_i - 1] = arguments[_i]; |
|
} |
|
if (type && this._eventContainer[type]) { |
|
__spreadArrays(this._eventContainer[type]).forEach(function (fn) { |
|
fn.apply(null, args); |
|
}); |
|
} |
|
return this; |
|
}; |
|
// reset |
|
EventManager.prototype.reset = function () { |
|
this._eventContainer = {}; |
|
}; |
|
return EventManager; |
|
}()); |
|
|
|
// 事件处理类 |
|
var EventEmmiter = /** @class */ (function (_super) { |
|
__extends(EventEmmiter, _super); |
|
function EventEmmiter() { |
|
var _this = _super !== null && _super.apply(this, arguments) || this; |
|
_this._onceEvents = {}; |
|
_this._pausedEvents = {}; |
|
return _this; |
|
} |
|
// 增加监听事件 |
|
EventEmmiter.prototype.on = function (type, fn) { |
|
return this.addEvent(type, fn); |
|
}; |
|
// 删除监听事件 |
|
EventEmmiter.prototype.off = function (type, fn) { |
|
var index; |
|
if (this._onceEvents[type]) { // once列表中查找并删除此事件 |
|
(index = this._onceEvents[type].indexOf(fn)) >= 0 && this._onceEvents[type].splice(index, 1); |
|
this._onceEvents[type].length === 0 && delete this._onceEvents[type]; |
|
} |
|
if (this._pausedEvents[type]) { // pause列表中查找并删除此事件 |
|
(index = this._pausedEvents[type].indexOf(fn)) >= 0 && this._pausedEvents[type].splice(index, 1); |
|
this._pausedEvents[type].length === 0 && delete this._pausedEvents[type]; |
|
} |
|
return this.removeEvent(type, fn); |
|
}; |
|
// 触发一类监听事件 |
|
EventEmmiter.prototype.trigger = function (type) { |
|
var _this = this; |
|
var args = []; |
|
for (var _i = 1; _i < arguments.length; _i++) { |
|
args[_i - 1] = arguments[_i]; |
|
} |
|
if (!this._eventContainer[type]) |
|
return this; |
|
var originEvents = __spreadArrays(this._eventContainer[type]); |
|
if (this._pausedEvents[type]) { // 此类监听事件中存在pause项时,另外记录完整的事件数组,并在现有的数组中删除pause项 |
|
this._pausedEvents[type].forEach(function (fn) { |
|
_this.removeEvent(type, fn); |
|
}); |
|
} |
|
this.fireEvent.apply(this, __spreadArrays([type], args)); |
|
this._eventContainer[type] = originEvents; // 恢复完整的事件数组 |
|
if (this._onceEvents[type]) { // 单次执行的事件,执行后从数组中删除 |
|
this._onceEvents[type].forEach(function (fn) { |
|
(!_this._pausedEvents[type] || _this._pausedEvents[type].indexOf(fn) < 0) && _this.off(type, fn); // 排除once事件pause状态 |
|
}); |
|
} |
|
return this; |
|
}; |
|
// 增加单次执行的事件 |
|
EventEmmiter.prototype.once = function (type, fn) { |
|
this.on(type, fn); |
|
this._onceEvents[type] = this._onceEvents[type] || []; |
|
this._onceEvents[type].indexOf(fn) < 0 && this._onceEvents[type].push(fn); |
|
return this; |
|
}; |
|
// 暂停事件 |
|
EventEmmiter.prototype.pause = function (type, fn) { |
|
this._pausedEvents[type] = this._pausedEvents[type] || []; |
|
this._pausedEvents[type].indexOf(fn) < 0 && this._pausedEvents[type].push(fn); |
|
return this; |
|
}; |
|
// 恢复事件 |
|
EventEmmiter.prototype.resume = function (type, fn) { |
|
if (!this._pausedEvents[type]) |
|
return this; |
|
var index = this._pausedEvents[type].indexOf(fn); |
|
index >= 0 && this._pausedEvents[type].splice(index, 1); |
|
this._pausedEvents[type].length === 0 && delete this._pausedEvents[type]; |
|
return this; |
|
}; |
|
EventEmmiter.prototype.reset = function () { |
|
this._onceEvents = {}; |
|
this._pausedEvents = {}; |
|
_super.prototype.reset.call(this); |
|
}; |
|
return EventEmmiter; |
|
}(EventManager)); |
|
|
|
var InteractionEvent; |
|
(function (InteractionEvent) { |
|
InteractionEvent["TransformStarted"] = "TransformStarted"; |
|
InteractionEvent["TransformChanged"] = "TransformChanged"; |
|
InteractionEvent["TransformFinished"] = "TransformFinished"; |
|
InteractionEvent["TransformModeChanged"] = "TransformModeChanged"; |
|
InteractionEvent["DrawFinished"] = "DrawFinished"; |
|
InteractionEvent["Exit"] = "Exit"; |
|
InteractionEvent["ExitEdit"] = "ExitEdit"; |
|
InteractionEvent["EditCompleted"] = "EditCompleted"; |
|
InteractionEvent["WarningHint"] = "WarningHint"; |
|
})(InteractionEvent || (InteractionEvent = {})); |
|
var InteractionEvent$1 = InteractionEvent; |
|
|
|
// 此对象用于简化处理各类数据,包括判断数据类型、判断属性、及数据的各类其他操作等,待丰富 |
|
var DataUtil = { |
|
// 用于判断数据类型 |
|
assertType: function (param, typeName) { |
|
var assert = function (fullTypeName) { return Object.prototype.toString.call(param) === "[object " + fullTypeName + "]"; }; |
|
switch (typeName) { |
|
case 'obj': |
|
case 'Obj': |
|
case 'object': |
|
case 'Object': |
|
return assert('Object'); |
|
case 'arr': |
|
case 'Arr': |
|
case 'array': |
|
case 'Array': |
|
return assert('Array'); |
|
case 'num': |
|
case 'Num': |
|
case 'number': |
|
case 'Number': |
|
return assert('Number'); |
|
case 'func': |
|
case 'Func': |
|
case 'function': |
|
case 'Function': |
|
return assert('Function'); |
|
case 'str': |
|
case 'Str': |
|
case 'string': |
|
case 'String': |
|
return assert('String'); |
|
default: |
|
return assert(typeName); |
|
} |
|
}, |
|
// 判断多个参数是否都是某个数据类型(参数平铺传入,最后一个参数是类型名) |
|
assertParamsType: function () { |
|
var _this = this; |
|
var params = []; |
|
for (var _i = 0; _i < arguments.length; _i++) { |
|
params[_i] = arguments[_i]; |
|
} |
|
if (params.length > 1) { |
|
var typeName_1 = params.splice(params.length - 1, 1)[0]; |
|
var result_1 = true; |
|
params.every(function (param) { |
|
result_1 = _this.assertType(param, typeName_1); |
|
return result_1; |
|
}); |
|
return result_1; |
|
} |
|
}, |
|
// 判断对象是否包含某属性 |
|
hasProperty: function (param, propertyName) { |
|
if (this.assertType(param, 'obj')) { |
|
return param[propertyName] !== undefined; |
|
} |
|
}, |
|
// 颜色转换 hex to rgb |
|
hexToRgb: function (hex) { |
|
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); |
|
return result ? { |
|
red: parseInt(result[1], 16), |
|
green: parseInt(result[2], 16), |
|
blue: parseInt(result[3], 16) |
|
} : null; |
|
}, |
|
componentToHex: function (c) { |
|
var hex = c.toString(16); |
|
return hex.length == 1 ? "0" + hex : hex; |
|
}, |
|
// 颜色转换 rgb to hex |
|
rgbToHex: function (r, g, b) { |
|
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b); |
|
} |
|
}; |
|
|
|
var _a, _b, _c, _d; |
|
var SDM = (_d = (_c = (_b = (_a = window.Glodon) === null || _a === void 0 ? void 0 : _a.Bimface) === null || _b === void 0 ? void 0 : _b.Data) === null || _c === void 0 ? void 0 : _c.StatisticsDataManager) === null || _d === void 0 ? void 0 : _d.getInstance(); |
|
|
|
/* |
|
* @namespace Glodon.Bimface.Module.Scene.EditorEvent |
|
* @classdesc 常量:Editor的事件 |
|
*/ |
|
var EditorEvent; |
|
(function (EditorEvent) { |
|
EditorEvent["Loaded"] = "Loaded"; |
|
EditorEvent["ViewChanged"] = "ViewChanged"; |
|
EditorEvent["ModelAdded"] = "ModelAdded"; |
|
EditorEvent["ModelRemoved"] = "ModelRemoved"; |
|
EditorEvent["LayerTreeNodeClicked"] = "LayerTreeNodeClicked"; |
|
EditorEvent["SceneAdded"] = "SceneAdded"; |
|
EditorEvent["PropertiesShow"] = "PropertiesShow"; |
|
EditorEvent["PropertiesHide"] = "PropertiesHide"; |
|
EditorEvent["HideEffectsPanels"] = "HideEffectsPanels"; |
|
EditorEvent["EffectsShow"] = "EffectsShow"; |
|
EditorEvent["EffectsHide"] = "EffectsHide"; |
|
EditorEvent["EffectFolderShow"] = "EffectFolderShow"; |
|
EditorEvent["EffectFolderHide"] = "EffectFolderHide"; |
|
EditorEvent["EffectCrossHairShow"] = "EffectCrossHairShow"; |
|
EditorEvent["EffectCrossHairHide"] = "EffectCrossHairHide"; |
|
EditorEvent["EffectPanelShow"] = "EffectPanelShow"; |
|
EditorEvent["EffectPanelHide"] = "EffectPanelHide"; |
|
EditorEvent["EffectShow"] = "EffectShow"; |
|
EditorEvent["EffectHide"] = "EffectHide"; |
|
EditorEvent["SaveEffect"] = "SaveEffect"; |
|
EditorEvent["AnchorPointUpdate"] = "AnchorPointUpdate"; |
|
EditorEvent["AnchorPointDestroy"] = "AnchorPointDestroy"; |
|
EditorEvent["TempAnchorDestroy"] = "TempAnchorDestroy"; |
|
EditorEvent["AnchorEffectShow"] = "AnchorEffectShow"; |
|
EditorEvent["AnchorEffectHide"] = "AnchorEffectHide"; |
|
EditorEvent["AnchorSizeUpdate"] = "AnchorSizeUpdate"; |
|
EditorEvent["SaveAnchorEffect"] = "SaveAnchorEffect"; |
|
EditorEvent["FireEffectShow"] = "FireEffectShow"; |
|
EditorEvent["FireEffectHide"] = "FireEffectHide"; |
|
EditorEvent["FireEffectDrawExit"] = "FireEffectDrawExit"; |
|
EditorEvent["FireEffectDestroy"] = "FireEffectDestroy"; |
|
EditorEvent["SaveFireEffect"] = "SaveFireEffect"; |
|
EditorEvent["CurveHide"] = "CurveHide"; |
|
EditorEvent["CurveInit"] = "CurveInit"; |
|
EditorEvent["CurveAnimationDestroy"] = "CurveAnimationDestroy"; |
|
EditorEvent["TempCurveDestroy"] = "TempCurveDestroy"; |
|
EditorEvent["CurveEffectShow"] = "CurveEffectShow"; |
|
EditorEvent["CurveEffectHide"] = "CurveEffectHide"; |
|
EditorEvent["SaveCurveEffect"] = "SaveCurveEffect"; |
|
EditorEvent["FanScanDrawExit"] = "FanScanDrawExit"; |
|
EditorEvent["FanScanDestroy"] = "FanScanDestroy"; |
|
EditorEvent["FanScanShow"] = "FanScanShow"; |
|
EditorEvent["FanScanHide"] = "FanScanHide"; |
|
EditorEvent["SaveFanScan"] = "SaveFanScan"; |
|
EditorEvent["RingScanDrawExit"] = "RingScanDrawExit"; |
|
EditorEvent["RingScanDestroy"] = "RingScanDestroy"; |
|
EditorEvent["RingScanShow"] = "RingScanShow"; |
|
EditorEvent["RingScanHide"] = "RingScanHide"; |
|
EditorEvent["SaveRingScan"] = "SaveRingScan"; |
|
EditorEvent["WaterEffectDrawExit"] = "WaterEffectDrawExit"; |
|
EditorEvent["WaterEffectDestroy"] = "WaterEffectDestroy"; |
|
EditorEvent["WaterEffectShow"] = "WaterEffectShow"; |
|
EditorEvent["WaterEffectHide"] = "WaterEffectHide"; |
|
EditorEvent["SaveWaterEffect"] = "SaveWaterEffect"; |
|
EditorEvent["MapEffectDestroy"] = "MapEffectDestroy"; |
|
EditorEvent["MapEffectShow"] = "MapEffectShow"; |
|
EditorEvent["MapEffectHide"] = "MapEffectHide"; |
|
EditorEvent["SaveMapEffect"] = "SaveMapEffect"; |
|
EditorEvent["SkyBoxShow"] = "SkyBoxShow"; |
|
EditorEvent["SkyBoxHide"] = "SkyBoxHide"; |
|
EditorEvent["SaveSkyBox"] = "SaveSkyBox"; |
|
EditorEvent["RainEffectShow"] = "RainEffectShow"; |
|
EditorEvent["RainEffectHide"] = "RainEffectHide"; |
|
EditorEvent["SaveRainEffect"] = "SaveRainEffect"; |
|
EditorEvent["RainEffectDestroy"] = "RainEffectDestroy"; |
|
EditorEvent["handleStartDrawOrEditEvent"] = "handleStartDrawOrEditEvent"; |
|
EditorEvent["handleExitDrawOrEditEvent"] = "handleExitDrawOrEditEvent"; |
|
EditorEvent["LayerTreeNodeSelectionChanged"] = "LayerTreeNodeSelectionChanged"; |
|
EditorEvent["EffectTreeNodeSelectionChanged"] = "EffectTreeNodeSelectionChanged"; |
|
EditorEvent["AddResourceByViewToken"] = "AddResourceByViewToken"; |
|
EditorEvent["AddResourcePanelShow"] = "AddResourcePanelShow"; |
|
EditorEvent["UpdateResourcePanelShow"] = "UpdateResourcePanelShow"; |
|
EditorEvent["LayerNameChanged"] = "LayerNameChanged"; |
|
EditorEvent["EffectNameChanged"] = "EffectNameChanged"; |
|
EditorEvent["EffectNamePanelChanged"] = "EffectNamePanelChanged"; |
|
EditorEvent["LayerAdjustmentShow"] = "LayerAdjustmentShow"; |
|
EditorEvent["LayerAdjustmentHide"] = "LayerAdjustmentHide"; |
|
EditorEvent["TileLayerSourceChanged"] = "TileLayerSourceChanged"; |
|
EditorEvent["ModelLayerTransformed"] = "ModelLayerTransformed"; |
|
EditorEvent["ClearInvalidLayers"] = "ClearInvalidLayers"; |
|
EditorEvent["PropertiesShowPanel"] = "PropertiesShowPanel"; |
|
EditorEvent["LayerTreeNodeVisibleChanged"] = "LayerTreeNodeVisibleChanged"; |
|
EditorEvent["layerEditNotificationShow"] = "layerEditNotificationShow"; |
|
EditorEvent["layerEditNotificationHide"] = "layerEditNotificationHide"; |
|
EditorEvent["LayerEditInit"] = "LayerEditInit"; |
|
EditorEvent["ExitLayerEffectDrawOrEdit"] = "ExitLayerEffectDrawOrEdit"; |
|
EditorEvent["LayerEditTreeUnselect"] = "LayerEditTreeUnselect"; |
|
EditorEvent["DrawFlatEffect"] = "DrawFlatEffect"; |
|
EditorEvent["DrawFlatEffectExit"] = "DrawFlatEffectExit"; |
|
EditorEvent["EditFlatEffectExit"] = "EditFlatEffectExit"; |
|
EditorEvent["initFlatEffect"] = "initFlatEffect"; |
|
EditorEvent["DrawClippingEffect"] = "DrawClippingEffect"; |
|
EditorEvent["DrawClippingEffectExit"] = "DrawClippingEffectExit"; |
|
EditorEvent["EditClippingEffectExit"] = "EditClippingEffectExit"; |
|
EditorEvent["initClippingEffect"] = "initClippingEffect"; |
|
EditorEvent["LayerEditHideLayer"] = "LayerEditHideLayer"; |
|
EditorEvent["RestoreLayerVisible"] = "RestoreLayerVisible"; |
|
EditorEvent["SetDirectoryTreeState"] = "SetDirectoryTreeState"; |
|
EditorEvent["ExitEditTool"] = "ExitEditTool"; |
|
EditorEvent["ReinitEditFan"] = "ReinitEditFan"; |
|
EditorEvent["ReinitEditLine"] = "ReinitEditLine"; |
|
EditorEvent["ReinitEditRing"] = "ReinitEditRing"; |
|
EditorEvent["ReinitEditWater"] = "ReinitEditWater"; |
|
EditorEvent["ReinitEditFlapSurface"] = "ReinitEditFlapSurface"; |
|
EditorEvent["ReinitEditFlapSurfaceForWall"] = "ReinitEditFlapSurfaceForWall"; |
|
EditorEvent["ExitEditFlatEffect"] = "ExitEditFlatEffect"; |
|
EditorEvent["ExitEditWallEffect"] = "ExitEditWallEffect"; |
|
EditorEvent["ReinitEditClippingSurface"] = "ReinitEditClippingSurface"; |
|
EditorEvent["ExitEditClippingEffect"] = "ExitEditClippingEffect"; |
|
})(EditorEvent || (EditorEvent = {})); |
|
|
|
var eventBus = new EventEmmiter(); |
|
|
|
// DomElement操作工具类 |
|
var Dom = /** @class */ (function () { |
|
function Dom(element) { |
|
this.eventMap = {}; |
|
this.element = element; |
|
} |
|
// 创建DomElement对象(使用空的Dom对象初始化时调用) |
|
Dom.prototype.createElement = function (param) { |
|
var element = document.createElement(param.elementType); |
|
var className = param.className; |
|
if (className) { |
|
DataUtil.assertType(className, 'arr') && (className = className.join(' ')); |
|
element.className = className; |
|
} |
|
param.id && (element.id = param.id); |
|
var domObject = new Dom(element); |
|
if (param.parent) { |
|
var parent_1 = param.parent instanceof Dom ? param.parent : new Dom(param.parent); |
|
parent_1.append(domObject); |
|
} |
|
domObject.visible = true; |
|
return domObject; // 返回一个新的以DomElement为参数创建的Dom对象以进行后续的链式操作 |
|
}; |
|
// 获取HTTPElement对象 |
|
Dom.prototype.getElement = function () { |
|
return this.element; |
|
}; |
|
// 获取父元素HTTPElement对象 |
|
Dom.prototype.getParent = function () { |
|
return this.element.parentElement; |
|
}; |
|
// 末尾附加一个子元素 |
|
Dom.prototype.append = function (childElement) { |
|
this.element.appendChild(childElement.element); |
|
return this; |
|
}; |
|
// 附加一个子元素到指定位置 |
|
Dom.prototype.insert = function (childElement, index) { |
|
if (index !== undefined && this.element.childNodes.length > index) { |
|
this.element.insertBefore(childElement.element, this.element.childNodes[index]); |
|
} |
|
else { |
|
this.append(childElement); |
|
} |
|
return this; |
|
}; |
|
// 删除一个子元素 |
|
Dom.prototype.remove = function (childElement) { |
|
this.element.removeChild(childElement.element); |
|
return this; |
|
}; |
|
// 删除所有子元素 |
|
Dom.prototype.clear = function () { |
|
while (this.element.childNodes.length > 0) { |
|
this.element.removeChild(this.element.childNodes[0]); |
|
} |
|
return this; |
|
}; |
|
// 替换元素 |
|
Dom.prototype.replace = function (newElement, oldElement) { |
|
this.element.replaceChild(newElement.getElement(), oldElement.getElement()); |
|
return this; |
|
}; |
|
// 显示对象 |
|
Dom.prototype.show = function () { |
|
if (this.visible) |
|
return this; |
|
this.element.style.display = this.displayType; |
|
this.visible = true; |
|
return this; |
|
}; |
|
// 隐藏对象 |
|
Dom.prototype.hide = function () { |
|
if (!this.visible) |
|
return this; |
|
if (this.element) { |
|
this.displayType = this.element.style.display; |
|
this.displayType === 'none' && (this.displayType = undefined); |
|
this.element.style.display = 'none'; |
|
this.visible = false; |
|
} |
|
return this; |
|
}; |
|
// 获取可见性 |
|
Dom.prototype.isVisible = function () { |
|
return this.visible; |
|
}; |
|
// 添加dom事件监听 |
|
Dom.prototype.on = function (eventType, fn, option) { |
|
if (option === void 0) { option = null; } |
|
this.element.addEventListener(eventType, fn, option); |
|
this.eventMap[eventType] = this.eventMap[eventType] || []; |
|
this.eventMap[eventType].push(fn); |
|
return this; |
|
}; |
|
// 删除dom事件监听 |
|
Dom.prototype.off = function (eventType, fn) { |
|
this.element.removeEventListener(eventType, fn); |
|
if (this.eventMap[eventType]) { |
|
var index = this.eventMap[eventType].indexOf(fn); |
|
index >= 0 && this.eventMap[eventType].splice(index, 1); |
|
} |
|
return this; |
|
}; |
|
// 销毁对象 |
|
Dom.prototype.destroy = function () { |
|
var _this = this; |
|
var _loop_1 = function (eventType) { |
|
this_1.eventMap[eventType].forEach(function (fn) { |
|
_this.off(eventType, fn); |
|
}); |
|
}; |
|
var this_1 = this; |
|
for (var eventType in this.eventMap) { |
|
_loop_1(eventType); |
|
} |
|
this.element.parentElement && this.element.parentElement.removeChild(this.element); |
|
this.eventMap = undefined; |
|
this.displayType = undefined; |
|
this.themeType = undefined; |
|
this.element = undefined; |
|
}; |
|
Dom.prototype.getClass = function () { |
|
return this.getElement().getAttribute('class'); |
|
}; |
|
Dom.prototype.hasClass = function (className) { |
|
var currentClassName = this.getClass(); |
|
if (!currentClassName) |
|
return false; |
|
var arr = currentClassName && currentClassName.split(' '); |
|
if (arr.indexOf(className) > -1) { |
|
return true; |
|
} |
|
else { |
|
return false; |
|
} |
|
}; |
|
// 添加一个或多个css class |
|
Dom.prototype.addClass = function () { |
|
var _a; |
|
var classes = []; |
|
for (var _i = 0; _i < arguments.length; _i++) { |
|
classes[_i] = arguments[_i]; |
|
} |
|
(_a = this.element.classList).add.apply(_a, classes); |
|
return this; |
|
}; |
|
// 删除一个或多个css class |
|
Dom.prototype.removeClass = function () { |
|
var _a; |
|
var classes = []; |
|
for (var _i = 0; _i < arguments.length; _i++) { |
|
classes[_i] = arguments[_i]; |
|
} |
|
(_a = this.element.classList).remove.apply(_a, classes); |
|
return this; |
|
}; |
|
Dom.prototype.toggleClass = function (className, enable) { |
|
this.getClass(); var hasClassName = this.hasClass(className); |
|
if (enable != undefined) { |
|
if (enable && !hasClassName) { |
|
this.addClass(className); |
|
} |
|
if (!enable) { |
|
this.removeClass(className); |
|
} |
|
} |
|
else { |
|
if (hasClassName) { |
|
this.removeClass(className); |
|
} |
|
else { |
|
this.addClass(className); |
|
} |
|
} |
|
return !hasClassName; |
|
}; |
|
// toggle一个css class |
|
Dom.prototype.toggle = function (classname) { |
|
this.element.classList.toggle(classname); |
|
return this; |
|
}; |
|
// 获取元素当前在页面中的位置 |
|
Dom.prototype.getPosition = function () { |
|
var _a = this.element.getBoundingClientRect(), top = _a.top, left = _a.left, right = _a.right, bottom = _a.bottom; |
|
return { top: top, left: left, right: right, bottom: bottom }; |
|
}; |
|
// 获取元素的尺寸信息 |
|
Dom.prototype.getDimensions = function () { |
|
var _a = this.element.getBoundingClientRect(), width = _a.width, height = _a.height; |
|
return { width: width, height: height }; |
|
}; |
|
// 获取元素宽度 |
|
Dom.prototype.getWidth = function () { |
|
var width = this.element.getBoundingClientRect().width; |
|
return width; |
|
}; |
|
// 获取元素高度 |
|
Dom.prototype.getHeight = function () { |
|
var height = this.element.getBoundingClientRect().height; |
|
return height; |
|
}; |
|
// 获取或设置元素的内容 |
|
Dom.prototype.html = function (htmlContent) { |
|
if (htmlContent != undefined) { |
|
this.element.innerHTML = htmlContent; |
|
return this; |
|
} |
|
else { |
|
return this.element.innerHTML; |
|
} |
|
}; |
|
// 获取单个css属性或设置单个/多个css属性 |
|
Dom.prototype.css = function (key, value) { |
|
if (DataUtil.assertType(key, 'str')) { |
|
if (value) { |
|
this.element.style[key] = value; |
|
return this; |
|
} |
|
else { |
|
return this.element.style[key]; |
|
} |
|
} |
|
else if (DataUtil.assertType(key, 'obj')) { |
|
var cssOptions = key; |
|
for (var cssKey in cssOptions) { |
|
this.element.style[cssKey] = cssOptions[cssKey]; |
|
} |
|
return this; |
|
} |
|
}; |
|
// 获取单个attribute属性或设置单个/多个attribute属性 |
|
Dom.prototype.attribute = function (key, value) { |
|
if (DataUtil.assertType(key, 'str')) { |
|
if (value != undefined) { |
|
this.element[key] = value; |
|
return this; |
|
} |
|
else { |
|
return this.element[key]; |
|
} |
|
} |
|
else if (DataUtil.assertType(key, 'obj')) { |
|
var attrOptions = key; |
|
for (var attrKey in attrOptions) { |
|
this.element[attrKey] = attrOptions[attrKey]; |
|
} |
|
return this; |
|
} |
|
}; |
|
// 获取或设置元素的主题 |
|
Dom.prototype.theme = function (themeType) { |
|
if (themeType) { |
|
this.themeType && this.removeClass(this.themeType); |
|
this.themeType = themeType; |
|
this.addClass(themeType); |
|
return this; |
|
} |
|
else { |
|
return this.themeType; |
|
} |
|
}; |
|
// 点击组件 |
|
Dom.prototype.click = function () { |
|
this.element.click(); |
|
return this; |
|
}; |
|
return Dom; |
|
}()); |
|
|
|
var UIEvents; |
|
(function (UIEvents) { |
|
UIEvents["ValueChanged"] = "ValueChanged"; |
|
UIEvents["Clicked"] = "Clicked"; |
|
UIEvents["RightClicked"] = "RightClicked"; |
|
UIEvents["MouseOver"] = "MouseOver"; |
|
UIEvents["MouseOut"] = "MouseOut"; |
|
UIEvents["CheckedChanged"] = "CheckedChanged"; |
|
UIEvents["SelectionChanged"] = "SelectionChanged"; |
|
UIEvents["ExpendChanged"] = "ExpendChanged"; |
|
UIEvents["IsolateChanged"] = "IsolateChanged"; // 是否隔离 |
|
})(UIEvents || (UIEvents = {})); |
|
var UIEvents$1 = UIEvents; |
|
|
|
/** |
|
* @namespace Glodon.Bimface.Tiles.UI.ControlAnchor |
|
* @classdesc 常量:UI锚点(用以进行控件定位) |
|
* @description Glodon.Bimface.Tiles.UI.ControlAnchor |
|
* @property {String} TopLeft 视图左上角 |
|
* @property {String} TopCenter 视图中上侧 |
|
* @property {String} TopRight 视图右上角 |
|
* @property {String} MiddleLeft 视图左中侧 |
|
* @property {String} MiddleRight 视图右中侧 |
|
* @property {String} BottomLeft 视图左下角 |
|
* @property {String} BottomCenter 视图中下侧 |
|
* @property {String} BottomRight 视图右下角 |
|
* @property {String} MiddleCenter 视图中心 |
|
*/ |
|
var ControlAnchor; |
|
(function (ControlAnchor) { |
|
ControlAnchor["TopLeft"] = "TopLeft"; |
|
ControlAnchor["TopCenter"] = "TopCenter"; |
|
ControlAnchor["TopRight"] = "TopRight"; |
|
ControlAnchor["MiddleLeft"] = "MiddleLeft"; |
|
ControlAnchor["MiddleRight"] = "MiddleRight"; |
|
ControlAnchor["BottomLeft"] = "BottomLeft"; |
|
ControlAnchor["BottomCenter"] = "BottomCenter"; |
|
ControlAnchor["BottomRight"] = "BottomRight"; |
|
ControlAnchor["MiddleCenter"] = "MiddleCenter"; |
|
})(ControlAnchor || (ControlAnchor = {})); |
|
var ControlAnchor$1 = ControlAnchor; |
|
|
|
// UI组件基类 |
|
var Control = /** @class */ (function (_super) { |
|
__extends(Control, _super); |
|
function Control(param) { |
|
var _this = _super.call(this) || this; |
|
_this._domElement = param.element || new Dom().createElement(param.elementParam); |
|
if (param.parent) { |
|
var parentElement = param.parent instanceof Control ? param.parent._domElement |
|
: param.parent instanceof Dom ? param.parent : new Dom(param.parent); |
|
parentElement.append(_this._domElement); |
|
param.parent instanceof Control && (_this._parent = param.parent); |
|
} |
|
_this.id = param.id; // || uuid |
|
_this.type = param.type; |
|
_this.position = { anchor: 'TopLeft', offset: { x: 0, y: 0 } }; |
|
return _this; |
|
} |
|
// |
|
Control.prototype.getParent = function () { |
|
return this._parent; |
|
}; |
|
// 设置本对象的父级Control对象 |
|
Control.prototype.setParent = function (control) { |
|
this._parent = control; |
|
}; |
|
// 获取DomElement对象 |
|
Control.prototype.getDomElement = function () { |
|
return this._domElement; |
|
}; |
|
// 设置点击事件 |
|
Control.prototype.onClick = function (fn) { |
|
var _this = this; |
|
this._domElement.on('click', function (eventData) { |
|
fn(eventData); |
|
_this.trigger(UIEvents$1.Clicked, _this); |
|
}); |
|
return this; |
|
}; |
|
// 设置鼠标移入事件 |
|
Control.prototype.onMouseOver = function (fn) { |
|
var _this = this; |
|
this._domElement.on('mouseover', function (eventData) { |
|
fn(eventData); |
|
_this.trigger(UIEvents$1.MouseOver, _this); |
|
}); |
|
return this; |
|
}; |
|
// 设置鼠标移出事件 |
|
Control.prototype.onMouseOut = function (fn) { |
|
var _this = this; |
|
this._domElement.on('mouseout', function (eventData) { |
|
fn(eventData); |
|
_this.trigger(UIEvents$1.MouseOut, _this); |
|
}); |
|
return this; |
|
}; |
|
/** |
|
* 显示 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.show |
|
*/ |
|
Control.prototype.show = function () { |
|
this._domElement.show(); |
|
return this; |
|
}; |
|
/** |
|
* 隐藏 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.hide |
|
*/ |
|
Control.prototype.hide = function () { |
|
this._domElement.hide(); |
|
return this; |
|
}; |
|
/** |
|
* 获取可见性状态 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.isVisible |
|
* @returns {Boolean} 可见性状态 |
|
*/ |
|
Control.prototype.isVisible = function () { |
|
return this._domElement.isVisible(); |
|
}; |
|
// 销毁 |
|
Control.prototype.destroy = function () { |
|
this._domElement.destroy(); |
|
}; |
|
/** |
|
* 对组件增加CSS样式 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.addClass |
|
* @param {String} class CSS类名 |
|
*/ |
|
Control.prototype.addClass = function () { |
|
var _a; |
|
var classes = []; |
|
for (var _i = 0; _i < arguments.length; _i++) { |
|
classes[_i] = arguments[_i]; |
|
} |
|
(_a = this._domElement).addClass.apply(_a, classes); |
|
return this; |
|
}; |
|
/** |
|
* 对组件移除CSS样式 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.removeClass |
|
* @param {String} class CSS类名 |
|
*/ |
|
Control.prototype.removeClass = function () { |
|
var _a; |
|
var classes = []; |
|
for (var _i = 0; _i < arguments.length; _i++) { |
|
classes[_i] = arguments[_i]; |
|
} |
|
(_a = this._domElement).removeClass.apply(_a, classes); |
|
return this; |
|
}; |
|
// 删除一个或多个css class |
|
Control.prototype.toggleClass = function (className) { |
|
this._domElement.toggleClass(className); |
|
return this; |
|
}; |
|
/** |
|
* 设置组件的位置信息 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.setPosition |
|
* @param {Object} position 组件的位置信息 |
|
* @param {Glodon.Bimface.Tiles.UI.ControlAnchor} position.anchor 定位组件位置的锚点 |
|
* @param {Object} position.offset 基于锚点的偏移值 |
|
* @param {Number} position.offset.x X方向偏移值,单位为px |
|
* @param {Number} position.offset.y Y方向偏移值,单位为px |
|
*/ |
|
Control.prototype.setPosition = function (position) { |
|
if (position.anchor && ControlAnchor$1.hasOwnProperty(position.anchor)) { |
|
for (var key in ControlAnchor$1) { |
|
this.removeClass("bfui-anchor-" + key.toLowerCase()); |
|
} |
|
var anchor = position.anchor.toLowerCase(); |
|
this.addClass("bfui-anchor-" + anchor); |
|
this.position.anchor = position.anchor; |
|
} |
|
this.setOffset(position.offset); |
|
return this; |
|
}; |
|
Control.prototype.setOffset = function (offset) { |
|
if (offset) { |
|
var offsetX = offset.x || 0; |
|
var offsetY = offset.y || 0; |
|
var anchor = this.position.anchor.toLowerCase(); |
|
this.setStyle(anchor.indexOf('right') >= 0 ? { marginRight: -offsetX + "px" } : { marginLeft: offsetX + "px" }) |
|
.setStyle(anchor.indexOf('bottom') >= 0 ? { marginBottom: -offsetY + "px" } : { marginTop: offsetY + "px" }); |
|
this.position.offset.x = offsetX; |
|
this.position.offset.y = offsetY; |
|
} |
|
return this; |
|
}; |
|
Control.prototype.getPositionParam = function () { |
|
return this.position; |
|
}; |
|
/** |
|
* 获取ID |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.getId |
|
* @returns {String} ID |
|
*/ |
|
Control.prototype.getId = function () { |
|
return this.id; |
|
}; |
|
// 获取Control类型 |
|
Control.prototype.getType = function () { |
|
return this.type; |
|
}; |
|
/** |
|
* 获取组件的位置信息 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.getPosition |
|
* @returns {Object} 组件的位置信息 |
|
*/ |
|
Control.prototype.getPosition = function () { |
|
return this._domElement.getPosition(); |
|
}; |
|
/** |
|
* 获取组件的尺寸信息 |
|
* @function Glodon.Bimface.Tiles.UI.Control.prototype.getDimensions |
|
* @returns {Object} 组件的尺寸信息 |
|
*/ |
|
Control.prototype.getDimensions = function () { |
|
return this._domElement.getDimensions(); |
|
}; |
|
// 获取元素宽度 |
|
Control.prototype.getWidth = function () { |
|
return this._domElement.getWidth(); |
|
}; |
|
// 获取元素高度 |
|
Control.prototype.getHeight = function () { |
|
return this._domElement.getHeight(); |
|
}; |
|
// 设置css style(传入多个键值对组成的对象参数) |
|
Control.prototype.setStyle = function (style) { |
|
this._domElement.css(style); |
|
return this; |
|
}; |
|
Control.prototype.getTooltip = function () { |
|
return this.tooltip; |
|
}; |
|
Control.prototype.setTooltip = function (tooltip) { |
|
this.tooltip = tooltip; |
|
this.getDomElement().attribute('title', tooltip); |
|
return this; |
|
}; |
|
/** |
|
* 通过HTML字符串初始化Control内容,支持在字符串中插入Control对象标记,配合controlMap实现html与Control混合结构的整体初始化 |
|
* @param {string} html Control的内容html字符串。如需插入Control对象,则在插入的位置写入<Control id="abc"></Control>作为标记,id与controlMap中的key对应 |
|
* @param {IControlMap} controlMap 通过key、value方式提供需插入html中的各个Control对象,key与html字符串中标记处的id对应 |
|
*/ |
|
Control.prototype.setHTML = function (html, controlMap) { |
|
var controlReg = /<[C,c]ontrol id="(.*?)".*?>.*?<\/[C,c]ontrol>/g; |
|
var computedHtml = html.replace(controlReg, function (value) { |
|
var execResult = controlReg.exec(value); |
|
controlReg.lastIndex = 0; |
|
var id = execResult[1]; |
|
var replaceHtml = "<div class=\"BFUI_Control_" + id + "\"></div>"; |
|
return replaceHtml; |
|
}); |
|
var dom = this.getDomElement(); |
|
dom.html(computedHtml); |
|
for (var id in controlMap) { |
|
var elements = dom.getElement().getElementsByClassName("BFUI_Control_" + id); |
|
if (elements.length === 1) { |
|
var element = elements[0]; |
|
var parent_1 = new Dom(element.parentElement); |
|
parent_1.replace(controlMap[id].getDomElement && controlMap[id].getDomElement() || controlMap[id], new Dom(element)); |
|
} |
|
} |
|
return this; |
|
}; |
|
/** |
|
* 点击组件 |
|
*/ |
|
Control.prototype.click = function () { |
|
this.getDomElement().click(); |
|
return this; |
|
}; |
|
return Control; |
|
}(EventEmmiter)); |
|
|
|
/** |
|
* @classdesc 类:Message组件类 |
|
* @class Glodon.Bimface.Tiles.UI.Message |
|
* @constructs Glodon.Bimface.Tiles.UI.Message |
|
* @description 构造消息组件 |
|
* @extends Glodon.Bimface.Tiles.UI.Control |
|
* @param {Object} option 构造消息的配置项 |
|
* @param {String} option.id 消息组件ID |
|
* @param {String} option.text 消息的文字内容 |
|
*/ |
|
var Message = /** @class */ (function (_super) { |
|
__extends(Message, _super); |
|
function Message(param) { |
|
var _this = this; |
|
param = param || {}; |
|
var elementParam = { |
|
elementType: 'div', |
|
className: 'bfui-message' |
|
}; |
|
var controlParam = { |
|
elementParam: elementParam, |
|
type: 'Message', |
|
id: param.id, |
|
parent: param.parent |
|
}; |
|
_this = _super.call(this, controlParam) || this; |
|
param.text && _this.setText(param.text); |
|
param.className && _this.addClass(param.className); |
|
setTimeout(function () { |
|
_this.getDomElement().addClass('hide'); |
|
_this.getDomElement().on('transitionend', function () { return _this.destroy(); }); |
|
}, param.duration || 3000); |
|
return _this; |
|
} |
|
/** |
|
* 获取文字内容 |
|
* @function Glodon.Bimface.Tiles.UI.Message.prototype.getText |
|
* @returns {String} 文字内容 |
|
*/ |
|
Message.prototype.getText = function () { |
|
return this._domElement.html(); |
|
}; |
|
/** |
|
* 设置文字内容 |
|
* @function Glodon.Bimface.Tiles.UI.Message.prototype.setText |
|
* @param {String} text 文字内容 |
|
*/ |
|
Message.prototype.setText = function (text) { |
|
this._domElement.html(text); |
|
return this; |
|
}; |
|
return Message; |
|
}(Control)); |
|
|
|
var SNS = 'bf_interaction.sceneEditor'; |
|
var CLOUD = window.CLOUD; |
|
var Glodon = window.Glodon; |
|
// 工具基类 |
|
var BaseTool = /** @class */ (function (_super) { |
|
__extends(BaseTool, _super); |
|
function BaseTool(config) { |
|
var _this = _super.call(this) || this; |
|
_this._destroyed = false; |
|
_this.helperEvents = {}; |
|
var viewer = config.viewer, hasToolbar = config.hasToolbar, controlId = config.controlId, controlType = config.controlType, controlParams = config.controlParams, reinitTriggerName = config.reinitTriggerName, hasCustomIntEvt = config.hasCustomIntEvt; |
|
_this.viewer = viewer; |
|
_this.controlId = controlId; |
|
_this.controlType = controlType; |
|
_this.controlParams = controlParams; |
|
_this.reinitTriggerName = reinitTriggerName; |
|
_this.hasCustomIntEvt = hasCustomIntEvt; |
|
_this.initControl(); |
|
_this.initEvents(); |
|
hasToolbar !== false && _this.initToolbar(); |
|
return _this; |
|
} |
|
// 初始化三维交互组件 |
|
BaseTool.prototype.initControl = function () { |
|
this.helper = CLOUD.Interaction.InteractionHelper.getInstance(this.viewer.getViewer()); |
|
this.helper.addControl(this.controlId, this.controlType, this.controlParams); |
|
}; |
|
// 添加交互组件监听 |
|
BaseTool.prototype.initEvents = function () { |
|
var _this = this; |
|
this.helperEvents.WarningHint = function (_a) { |
|
var id = _a.id, text = _a.text; |
|
if ([_this.getControl().translateControlId, _this.getControl().pointTranslateControlId, _this.getControl().controlId].indexOf(id) >= 0) { |
|
new Message({ |
|
parent: _this.viewer.getDomElement(), |
|
className: "bfui-effect-warning", |
|
text: text, |
|
duration: 2000, |
|
}); |
|
} |
|
_this.fireEvent(InteractionEvent$1.WarningHint, { id: id, text: text }); |
|
}; |
|
for (var key in this.helperEvents) { |
|
var listener = this.helperEvents[key]; |
|
this.helper.addEventListener(key, listener); |
|
} |
|
}; |
|
// 初始化工具栏(默认只包含退出按钮) |
|
BaseTool.prototype.initToolbar = function () { |
|
var _this = this; |
|
var modelEditorContainer = document.createElement('div'); |
|
modelEditorContainer.classList.add('bf-effectToolbar'); |
|
this.domElement = modelEditorContainer; |
|
modelEditorContainer.addEventListener('mousedown', function (event) { |
|
event.stopPropagation(); |
|
return false; |
|
}); |
|
// 退出的toolbar |
|
var modelEditorConfig = new Glodon.Bimface.UI.Toolbar.ToolbarConfig(); |
|
modelEditorConfig.element = modelEditorContainer; |
|
modelEditorConfig.className = "bf-toolbar bf-toolbar-effectToolbar switch-btn"; |
|
var operationToolbar = new Glodon.Bimface.UI.Toolbar.Toolbar(modelEditorConfig); |
|
//退出按钮 |
|
var exitButtonConfig = new Glodon.Bimface.UI.Button.ButtonConfig(); |
|
exitButtonConfig.className = "bf-button bimface-icon gld-bf-edit-24"; |
|
exitButtonConfig.title = '点击隐藏编辑控件'; // 后期做国际化处理 |
|
exitButtonConfig.checkedState = true; |
|
var exitButton = new Glodon.Bimface.UI.Button.ToggleButton(exitButtonConfig); |
|
exitButton.addEventListener("StateChange", function (isChecked) { |
|
if (isChecked) { |
|
exitButton.element.title = '点击隐藏编辑控件'; |
|
SDM.send(SNS, "editorStatusOn"); |
|
} |
|
else { |
|
exitButton.element.title = '点击显示编辑控件'; |
|
SDM.send(SNS, "editorStatusOff"); |
|
} |
|
if (isChecked) { |
|
_this.initControl(); |
|
_this.initEvents(); |
|
eventBus.trigger(_this.reinitTriggerName); |
|
} |
|
else { |
|
// 退出按钮点击时触发Exit事件 |
|
_this.hasCustomIntEvt ? _this.fireEvent(InteractionEvent$1.ExitEdit) : _this.fireEvent(InteractionEvent$1.Exit); |
|
_this.helper.removeControl(_this.controlId); |
|
for (var key in _this.helperEvents) { |
|
var listener = _this.helperEvents[key]; |
|
_this.helper.removeEventListener(key, listener); |
|
} |
|
} |
|
_this.toggleOtherButtons(isChecked); |
|
}); |
|
operationToolbar.addControl(exitButton); |
|
var toolbarConfig = Glodon.Bimface.UI.Toolbar.ToolbarConfig(); |
|
toolbarConfig.className = "bf-toolbar bf-toolbar-effectToolbar"; |
|
toolbarConfig.element = modelEditorContainer; |
|
toolbarConfig.buttons = ['ModelEditingTranslate']; |
|
this.toolbar = new Glodon.Bimface.Application.UI.Toolbar.Toolbar(toolbarConfig); |
|
// 初始化按钮状态 |
|
var toggleButtons = this.toolbar.getControls(); |
|
var controlEvent = Glodon.Bimface.UI.Control.ControlEvent; |
|
var _loop_1 = function (i) { |
|
var toggleButton = toggleButtons[i]; |
|
toggleButton.setCheckedState(true); |
|
toggleButton.addEventListener(controlEvent.Click, function () { |
|
toggleButton.setCheckedState(true); |
|
}); |
|
}; |
|
for (var i = 0; i < toggleButtons.length; i++) { |
|
_loop_1(i); |
|
} |
|
var domElement = this.viewer.getDomElement(); |
|
domElement.appendChild(modelEditorContainer); |
|
}; |
|
// 获取三维交互组件对象 |
|
BaseTool.prototype.getControl = function () { |
|
return this.helper.getControl(this.controlId); |
|
}; |
|
// 添加本工具的监听 |
|
BaseTool.prototype.addEventListener = function (type, event) { |
|
this.addEvent(type, event); |
|
}; |
|
// 移除本工具的监听 |
|
BaseTool.prototype.removeEventListener = function (type, event) { |
|
this.removeEvent(type, event); |
|
}; |
|
// 退出工具 |
|
BaseTool.prototype.exit = function () { |
|
this.destroy(); |
|
}; |
|
// 销毁工具 |
|
BaseTool.prototype.destroy = function () { |
|
if (this._destroyed) { |
|
return; |
|
} |
|
this._destroyed = true; |
|
for (var key in this.helperEvents) { |
|
var listener = this.helperEvents[key]; |
|
this.helper.removeEventListener(key, listener); |
|
} |
|
if (this.domElement) { |
|
this.domElement.remove(); |
|
this.domElement = null; |
|
} |
|
this.viewer = null; |
|
this.helper.removeControl(this.controlId); |
|
}; |
|
// 显示/隐藏其它按钮 |
|
BaseTool.prototype.toggleOtherButtons = function (isChecked) { |
|
var btns = this.toolbar.getControls(); |
|
var btn; |
|
if (btns.length) { |
|
btn = btns[0]; |
|
if (isChecked) { |
|
btn.element.parentElement.style.display = 'flex'; |
|
} |
|
else { |
|
btn.element.parentElement.style.display = 'none'; |
|
} |
|
} |
|
for (var i = 0; i < btns.length; i++) { |
|
btn = btns[i]; |
|
if (isChecked) { |
|
if (i === 0) { |
|
btn.setCheckedState(true); |
|
} |
|
else { |
|
btn.setCheckedState(false); |
|
} |
|
} |
|
} |
|
}; |
|
return BaseTool; |
|
}(EventEmmiter)); |
|
|
|
var DrawRectangleTool = /** @class */ (function (_super) { |
|
__extends(DrawRectangleTool, _super); |
|
function DrawRectangleTool(config) { |
|
var _this = this; |
|
config.controlId = "DrawRectangleTool_" + Glodon$1.Web.Lang.Utility.UUID.createUUID(); |
|
config.controlType = "DrawRectangleControl"; |
|
config.hasToolbar = false; |
|
config.elevation = config.elevation; |
|
config.controlParams = { |
|
elevation: config.elevation, |
|
viewer: config.viewer, |
|
enableAxisGrids: config.enableAxisGrids, |
|
}; |
|
_this = _super.call(this, config) || this; |
|
_this._config = config; |
|
return _this; |
|
} |
|
DrawRectangleTool.prototype.initEvents = function () { |
|
var _this = this; |
|
this.helperEvents = { |
|
DrawFinished: function (_a) { |
|
var id = _a.id; |
|
if (id === _this.controlId) { |
|
var points = _this.getData(); |
|
_this.fireEvent(InteractionEvent$1.DrawFinished, { ringData: points }); |
|
} |
|
} |
|
}; |
|
_super.prototype.initEvents.call(this); |
|
}; |
|
DrawRectangleTool.prototype.getData = function () { |
|
var data = this.getControl().getPoints(); |
|
if (!data) |
|
return null; |
|
return [data[1], data[3], data[4], data[5]]; |
|
}; |
|
return DrawRectangleTool; |
|
}(BaseTool)); |
|
|
|
var DrawPolyLineTool = /** @class */ (function (_super) { |
|
__extends(DrawPolyLineTool, _super); |
|
function DrawPolyLineTool(config) { |
|
var _this = this; |
|
config.controlId = "DrawPolyLineTool_" + Glodon$1.Web.Lang.Utility.UUID.createUUID(); |
|
config.controlType = "DrawPolyLineControl"; |
|
config.hasToolbar = false; |
|
config.elevation = config.elevation; |
|
config.controlParams = { |
|
elevation: config.elevation, |
|
viewer: config.viewer, |
|
enableAxisGrids: config.enableAxisGrids, |
|
}; |
|
_this = _super.call(this, config) || this; |
|
_this._config = config; |
|
return _this; |
|
} |
|
DrawPolyLineTool.prototype.initEvents = function () { |
|
var _this = this; |
|
this.helperEvents = { |
|
DrawFinished: function (_a) { |
|
var id = _a.id; |
|
if (id === _this.controlId) { |
|
_this.fireEvent(InteractionEvent$1.DrawFinished, { ringData: _this.getData() }); |
|
} |
|
} |
|
}; |
|
_super.prototype.initEvents.call(this); |
|
}; |
|
DrawPolyLineTool.prototype.getData = function () { |
|
var res = []; |
|
var data; |
|
if (!this.editPolygon) { |
|
data = this.getControl().getPoints(); |
|
if (!data) |
|
return null; |
|
} |
|
else { |
|
data = this.editPolygon.getPointsData(); |
|
} |
|
// remove duplicate object data from data |
|
for (var i = 0; i < data.length; i++) { |
|
var item = data[i]; |
|
var isExist = false; |
|
for (var j = 0; j < res.length; j++) { |
|
var resItem = res[j]; |
|
if (item.x === resItem.x && item.y === resItem.y && item.z === resItem.z) { |
|
isExist = true; |
|
break; |
|
} |
|
} |
|
if (!isExist) { |
|
res.push(item); |
|
} |
|
} |
|
return res; |
|
}; |
|
return DrawPolyLineTool; |
|
}(BaseTool)); |
|
|
|
// 编辑贴地裁切面的工具 |
|
var EditClipSurfaceTool = /** @class */ (function (_super) { |
|
__extends(EditClipSurfaceTool, _super); |
|
function EditClipSurfaceTool(config) { |
|
var _this = this; |
|
config.controlId = 'EditClipSurfaceTool_' + Glodon$1.Web.Lang.Utility.UUID.createUUID(); |
|
config.controlType = 'SurfaceControl'; |
|
config.reinitTriggerName = 'ReinitEditClippingSurface'; |
|
config.hasCustomIntEvt = true; |
|
config.controlParams = { |
|
points: config.points, |
|
layerInfo: config.layerInfo, |
|
hidePlane: config.hidePlane, |
|
color: config.color, |
|
showEdge: config.showEdge, |
|
}; |
|
_this = _super.call(this, config) || this; |
|
return _this; |
|
} |
|
// 编辑工具包含TransformFinished事件 |
|
EditClipSurfaceTool.prototype.initEvents = function () { |
|
var _this = this; |
|
this.helperEvents = { |
|
TransformFinished: function (_a) { |
|
var id = _a.id; |
|
if ([_this.getControl().pointTranslateControlId].indexOf(id) >= 0) { |
|
_this.fireEvent(InteractionEvent$1.TransformFinished); |
|
} |
|
}, |
|
TransformChanged: function (_a) { |
|
var id = _a.id; |
|
if ([_this.getControl().pointTranslateControlId].indexOf(id) >= 0) { |
|
_this.fireEvent(InteractionEvent$1.TransformChanged); |
|
} |
|
}, |
|
EditCompleted: function (_a) { |
|
var id = _a.id; |
|
if ([_this.getControl().controlId].indexOf(id) >= 0) { |
|
_this.fireEvent(InteractionEvent$1.EditCompleted); |
|
} |
|
}, |
|
}; |
|
_super.prototype.initEvents.call(this); |
|
}; |
|
// 获取面的控制点信息 |
|
EditClipSurfaceTool.prototype.getPointsData = function () { |
|
return this.getControl().getPointsData(); |
|
}; |
|
// 根据传入的Points更新组件 |
|
EditClipSurfaceTool.prototype.setPoints = function (points) { |
|
this.getControl().setPoints(points); |
|
}; |
|
return EditClipSurfaceTool; |
|
}(BaseTool)); |
|
|
|
var DrawableItem = /** @class */ (function () { |
|
function DrawableItem() { |
|
this.xmlns = "http://www.w3.org/2000/svg"; |
|
this.material = null; |
|
this.svgNode = null; |
|
this.children = []; |
|
this.glodonColor = '#11DAB7'; |
|
this.position = new THREE.Vector2(); |
|
} |
|
DrawableItem.prototype.add = function (item) { |
|
this.children.push(item); |
|
}; |
|
DrawableItem.prototype.getSvgNode = function () { |
|
return this.svgNode; |
|
}; |
|
DrawableItem.prototype.abtainRenderables = function (container) { |
|
container.appendChild(this.svgNode); |
|
}; |
|
DrawableItem.prototype.isMatch = function (name) { |
|
return this.name == name; |
|
}; |
|
DrawableItem.prototype.highlight = function () { |
|
this.svgNode.setAttribute('style', 'stroke:' + this.glodonColor); |
|
}; |
|
DrawableItem.prototype.cancelHighlight = function () { |
|
this.svgNode.setAttribute('style', 'stroke:' + this.material.color.getStyle()); |
|
}; |
|
DrawableItem.prototype.locate = function (posX, posY) { |
|
this.position.set(posX, posY); |
|
this.move(0, 0); |
|
}; |
|
DrawableItem.prototype.move = function (deltaX, deltaY) { |
|
var offsetX = this.position.x + deltaX; |
|
var offsetY = this.position.y + deltaY; |
|
this.svgNode.setAttribute("transform", "translate(" + offsetX + "," + offsetY + ")"); |
|
}; |
|
return DrawableItem; |
|
}()); |
|
|
|
var EditorName; |
|
(function (EditorName) { |
|
EditorName["Default"] = "Editor"; |
|
EditorName["PICK_Editor"] = "Pick"; |
|
EditorName["RECTPICK_Editor"] = "RectPick"; |
|
EditorName["PAN_Editor"] = "Pan"; |
|
EditorName["Zoom_Editor"] = "Zoom"; |
|
})(EditorName || (EditorName = {})); |
|
var Editor = /** @class */ (function () { |
|
function Editor() { |
|
this.bIsMouseDown = false; |
|
this.name = EditorName.Default; |
|
} |
|
Editor.prototype.onMouseDown = function (event) { |
|
}; |
|
Editor.prototype.onMouseMove = function (event) { |
|
}; |
|
Editor.prototype.onMouseUp = function (event) { |
|
}; |
|
Editor.prototype.onMouseWheel = function (event) { |
|
}; |
|
Editor.prototype.getName = function () { |
|
return this.name; |
|
}; |
|
return Editor; |
|
}()); |
|
|
|
var EventType; |
|
(function (EventType) { |
|
EventType[EventType["RECTPICK_MOUSE_DOWN"] = 1000] = "RECTPICK_MOUSE_DOWN"; |
|
EventType[EventType["RECTPICK_MOUSE_MOVE"] = 1001] = "RECTPICK_MOUSE_MOVE"; |
|
EventType[EventType["RECTPICK_MOUSE_UP"] = 1002] = "RECTPICK_MOUSE_UP"; |
|
EventType[EventType["PICK_MOUSE_DOWN"] = 2000] = "PICK_MOUSE_DOWN"; |
|
EventType[EventType["PICK_MOUSE_MOVE"] = 2001] = "PICK_MOUSE_MOVE"; |
|
EventType[EventType["PICK_MOUSE_UP"] = 2002] = "PICK_MOUSE_UP"; |
|
EventType[EventType["Floor_Plane_Changed"] = 3000] = "Floor_Plane_Changed"; |
|
EventType[EventType["Floor_Plane_Changed_For_Panel"] = 3001] = "Floor_Plane_Changed_For_Panel"; |
|
EventType[EventType["Resize"] = 4000] = "Resize"; |
|
EventType[EventType["Camera_Height_Changed"] = 5000] = "Camera_Height_Changed"; |
|
EventType[EventType["ZOOM_MOUSE_WHEEL"] = 6000] = "ZOOM_MOUSE_WHEEL"; |
|
EventType[EventType["PAN_MOUSE_MOVE"] = 7000] = "PAN_MOUSE_MOVE"; |
|
// 小地图框选 |
|
EventType[EventType["Minimap_Rect_Changed"] = 8000] = "Minimap_Rect_Changed"; |
|
EventType[EventType["Minimap_Rect_Destroyed"] = 8001] = "Minimap_Rect_Destroyed"; |
|
})(EventType || (EventType = {})); |
|
var MouseEventType; |
|
(function (MouseEventType) { |
|
MouseEventType[MouseEventType["Left"] = 0] = "Left"; |
|
MouseEventType[MouseEventType["Middle"] = 1] = "Middle"; |
|
MouseEventType[MouseEventType["Right"] = 2] = "Right"; |
|
})(MouseEventType || (MouseEventType = {})); |
|
|
|
var VFSizeMode; |
|
(function (VFSizeMode) { |
|
VFSizeMode["Min"] = "Min"; |
|
VFSizeMode["Max"] = "Max"; |
|
})(VFSizeMode || (VFSizeMode = {})); |
|
//按鼠标进行缩放 |
|
var ZoomEditor = /** @class */ (function (_super) { |
|
__extends(ZoomEditor, _super); |
|
function ZoomEditor(vfViewer, eventManager) { |
|
var _this = _super.call(this) || this; |
|
_this.totalZoomFactors = []; |
|
_this.zoomFactors = []; |
|
_this.lastZoomFactor = 1; |
|
_this.currentIdx = 0; |
|
_this.name = EditorName.Zoom_Editor; |
|
_this.eventManager = eventManager; |
|
_this.vfData = vfViewer.getData(); |
|
_this.vfViewer = vfViewer; |
|
return _this; |
|
} |
|
ZoomEditor.prototype.onMouseWheel = function (event) { |
|
var deltaY = event.deltaY || -event.wheelDelta || event.detail; |
|
var bIsZoomIn = (deltaY < 0) ? true : false; |
|
var multiplyZoomFactor = -1; |
|
if (bIsZoomIn) { |
|
if (this.currentIdx < this.zoomFactors.length - 1) { |
|
this.currentIdx++; |
|
multiplyZoomFactor = this.zoomFactors[this.currentIdx]; |
|
} |
|
} |
|
else { |
|
if (this.currentIdx > 0) { |
|
this.currentIdx--; |
|
multiplyZoomFactor = this.zoomFactors[this.currentIdx]; |
|
} |
|
} |
|
if (multiplyZoomFactor < 0 || this.lastZoomFactor == multiplyZoomFactor) { |
|
return; |
|
} |
|
this.lastZoomFactor = multiplyZoomFactor; |
|
if (multiplyZoomFactor == 1) { |
|
PanEditor.clear(); |
|
} |
|
var originPanelSize = this.vfData.getOriginSize(); |
|
var mouseWheelOffset = new THREE.Vector2(event.offsetX - originPanelSize[0] / 2, event.offsetY - originPanelSize[1] / 2); |
|
var curZoomFactor = this.zoomFactors[this.currentIdx]; |
|
var panDeltaX = 0, panDeltaY = 0; |
|
// zoom in |
|
if (bIsZoomIn) { |
|
var lastZoomFactor = this.zoomFactors[this.currentIdx - 1]; |
|
var multiplier = curZoomFactor / lastZoomFactor; |
|
var currentZoomOffset = []; |
|
var restoreZoomOffset = this.vfData.getCorner('Virtual', 'LB'); |
|
restoreZoomOffset[0] -= mouseWheelOffset.x; |
|
restoreZoomOffset[1] -= mouseWheelOffset.y; |
|
currentZoomOffset.push(restoreZoomOffset[0] * multiplier + mouseWheelOffset.x); |
|
currentZoomOffset.push(restoreZoomOffset[1] * multiplier + mouseWheelOffset.y); |
|
this.vfData.setZoomFactor(curZoomFactor); |
|
var panelCornerLB = this.vfData.getCorner('Virtual', 'LB'); |
|
this.vfData.setZoomFactor(lastZoomFactor); |
|
panDeltaX = currentZoomOffset[0] - panelCornerLB[0]; |
|
panDeltaY = currentZoomOffset[1] - panelCornerLB[1]; |
|
} |
|
// zoom out , need bounds checking |
|
else { |
|
var lastZoomFactor = this.zoomFactors[this.currentIdx + 1]; |
|
var additionOffset = this.boundsChecking(curZoomFactor, lastZoomFactor, mouseWheelOffset); |
|
panDeltaX = additionOffset[0]; |
|
panDeltaY += additionOffset[1]; |
|
} |
|
PanEditor.panOffsetX += panDeltaX; |
|
PanEditor.panOffsetY += panDeltaY; |
|
PanEditor.panOffsetXForCamera += panDeltaX; |
|
PanEditor.panOffsetYForCamera += panDeltaY; |
|
this.vfData.setZoomFactor(multiplyZoomFactor); |
|
this.vfViewer.destroy(); |
|
this.vfData.destroy(); |
|
this.vfData.build(); |
|
this.vfViewer.update(); |
|
this.vfData.updateMovement(); |
|
this.updateZoomAndPan(); |
|
this.eventManager.dispatchEvent({ |
|
type: EventType.ZOOM_MOUSE_WHEEL, |
|
data: { |
|
offsetX: PanEditor.panOffsetX, |
|
offsetY: PanEditor.panOffsetY, |
|
zoomFactor: multiplyZoomFactor, |
|
} |
|
}); |
|
}; |
|
//checking when zoom out |
|
ZoomEditor.prototype.boundsChecking = function (curZoomFactor, lastZoomFactor, mouseWheelOffset) { |
|
var multiplier = curZoomFactor / lastZoomFactor; |
|
var cornerLB = this.vfData.getCorner('Virtual', 'LB'); |
|
var cornerLT = this.vfData.getCorner('Virtual', 'LT'); |
|
var cornerRT = this.vfData.getCorner('Virtual', 'RT'); |
|
var cornerRB = this.vfData.getCorner('Virtual', 'RB'); |
|
var additionOffset = [0, 0]; |
|
var offsetX = (cornerLB[0] - mouseWheelOffset.x) * multiplier + mouseWheelOffset.x, offsetY = (cornerLB[1] - mouseWheelOffset.y) * multiplier + mouseWheelOffset.y; |
|
this.vfData.setZoomFactor(curZoomFactor); |
|
var panelCornerLB = this.vfData.getCorner('Virtual', 'LB'); |
|
this.vfData.setZoomFactor(lastZoomFactor); |
|
additionOffset[0] = (offsetX - panelCornerLB[0]); |
|
additionOffset[1] = (offsetY - panelCornerLB[1]); |
|
var xCounts = 0, yCounts = 0; |
|
//corner left bottom |
|
var originCornerLB = this.vfData.getCorner('Origin', 'LB'); |
|
if (offsetX > originCornerLB[0]) { |
|
additionOffset[0] += (originCornerLB[0] - offsetX); |
|
xCounts++; |
|
} |
|
if (offsetY < originCornerLB[1]) { |
|
additionOffset[1] += (originCornerLB[1] - offsetY); |
|
yCounts++; |
|
} |
|
//corner left top |
|
offsetX = (cornerLT[0] - mouseWheelOffset.x) * multiplier + mouseWheelOffset.x; |
|
offsetY = (cornerLT[1] - mouseWheelOffset.y) * multiplier + mouseWheelOffset.y; |
|
var originCornerLT = this.vfData.getCorner('Origin', 'LT'); |
|
if (offsetX > originCornerLT[0]) { |
|
if (xCounts == 0) { |
|
additionOffset[0] += (originCornerLT[0] - offsetX); |
|
xCounts++; |
|
} |
|
} |
|
if (offsetY > originCornerLT[1]) { |
|
if (yCounts == 0) { |
|
additionOffset[1] += (originCornerLT[1] - offsetY); |
|
yCounts++; |
|
} |
|
} |
|
//corner right top |
|
offsetX = (cornerRT[0] - mouseWheelOffset.x) * multiplier + mouseWheelOffset.x; |
|
offsetY = (cornerRT[1] - mouseWheelOffset.y) * multiplier + mouseWheelOffset.y; |
|
var originCornerRT = this.vfData.getCorner('Origin', 'RT'); |
|
if (offsetX < originCornerRT[0]) { |
|
if (xCounts == 0) { |
|
additionOffset[0] += (originCornerRT[0] - offsetX); |
|
xCounts++; |
|
} |
|
} |
|
if (offsetY > originCornerRT[1]) { |
|
if (yCounts == 0) { |
|
additionOffset[1] += (originCornerRT[1] - offsetY); |
|
yCounts++; |
|
} |
|
} |
|
//corner right bottom |
|
offsetX = (cornerRB[0] - mouseWheelOffset.x) * multiplier + mouseWheelOffset.x; |
|
offsetY = (cornerRB[1] - mouseWheelOffset.y) * multiplier + mouseWheelOffset.y; |
|
var origincornerRB = this.vfData.getCorner('Origin', 'RB'); |
|
if (offsetX < origincornerRB[0]) { |
|
if (xCounts == 0) { |
|
additionOffset[0] += (origincornerRB[0] - offsetX); |
|
xCounts++; |
|
} |
|
} |
|
if (offsetY < origincornerRB[1]) { |
|
if (yCounts == 0) { |
|
additionOffset[1] += (origincornerRB[1] - offsetY); |
|
yCounts++; |
|
} |
|
} |
|
return additionOffset; |
|
}; |
|
ZoomEditor.prototype.enableMode = function (mode) { |
|
if (mode == VFSizeMode.Min) { |
|
this.zoomFactors = this.totalZoomFactors; |
|
} |
|
else if (mode == VFSizeMode.Max) { |
|
this.zoomFactors = this.totalZoomFactors.slice(1, this.totalZoomFactors.length); |
|
for (var i = 1; i < this.zoomFactors.length; i++) { |
|
this.zoomFactors[i] /= this.zoomFactors[0]; |
|
} |
|
this.zoomFactors[0] = 1; |
|
} |
|
this.currentIdx = 0; |
|
}; |
|
ZoomEditor.prototype.setZoomFactors = function (zoomFactors) { |
|
this.totalZoomFactors = zoomFactors; |
|
this.zoomFactors = zoomFactors; |
|
}; |
|
ZoomEditor.prototype.setZoonIndex = function (index) { |
|
this.currentIdx = index; |
|
}; |
|
ZoomEditor.prototype.getZoonIndex = function () { |
|
return this.currentIdx; |
|
}; |
|
ZoomEditor.prototype.updateZoomAndPan = function () { |
|
var originCornerLT = this.vfData.getCorner('Origin', 'LT'); |
|
var virtualCornerLT = this.vfData.getCorner('Virtual', 'LT'); |
|
ZoomEditor.offsetXForZoomAndPan = originCornerLT[0] - virtualCornerLT[0]; |
|
ZoomEditor.offsetYForZoomAndPan = originCornerLT[1] - virtualCornerLT[1]; |
|
}; |
|
ZoomEditor.clear = function () { |
|
ZoomEditor.offsetXForZoomAndPan = 0; |
|
ZoomEditor.offsetYForZoomAndPan = 0; |
|
}; |
|
ZoomEditor.offsetXForZoomAndPan = 0; |
|
ZoomEditor.offsetYForZoomAndPan = 0; |
|
return ZoomEditor; |
|
}(Editor)); |
|
|
|
var PanEditor = /** @class */ (function (_super) { |
|
__extends(PanEditor, _super); |
|
function PanEditor(vfViewer, eventManager) { |
|
var _this = _super.call(this) || this; |
|
_this.name = EditorName.PAN_Editor; |
|
_this.eventManager = eventManager; |
|
_this.vfData = vfViewer.getData(); |
|
_this.bIsMouseDown = false; |
|
_this.mouseDownPos = new THREE.Vector2(); |
|
PanEditor.panOffsetX = 0; |
|
PanEditor.panOffsetY = 0; |
|
return _this; |
|
} |
|
PanEditor.prototype.onMouseDown = function (event) { |
|
this.bIsMouseDown = true; |
|
this.mouseDownPos.setX(event.clientX); |
|
this.mouseDownPos.setY(event.clientY); |
|
}; |
|
PanEditor.prototype.onMouseMove = function (event) { |
|
if (this.bIsMouseDown == false) { |
|
return; |
|
} |
|
if (this.vfData.getZoomFactor() == 1) { |
|
return; |
|
} |
|
// 当右键或中键在进行拖动时,根据鼠标位置进行实时更新定位 |
|
var deltaX = (event.clientX - this.mouseDownPos.x); |
|
var deltaY = (event.clientY - this.mouseDownPos.y); |
|
var boundsOffset = this.boundsChecking(deltaX, deltaY); |
|
deltaX = boundsOffset[0]; |
|
deltaY = boundsOffset[1]; |
|
PanEditor.panOffsetX += deltaX; |
|
PanEditor.panOffsetY += deltaY; |
|
PanEditor.panOffsetXForCamera += deltaX; |
|
PanEditor.panOffsetYForCamera += deltaY; |
|
this.vfData.updateMovement(); |
|
this.updateZoomAndPan(); |
|
this.mouseDownPos.setX(event.clientX); |
|
this.mouseDownPos.setY(event.clientY); |
|
}; |
|
PanEditor.prototype.onMouseUp = function (event) { |
|
if (this.bIsMouseDown == false) { |
|
return; |
|
} |
|
if (this.vfData.getZoomFactor() == 1) { |
|
return; |
|
} |
|
var deltaX = (event.clientX - this.mouseDownPos.x); |
|
var deltaY = (event.clientY - this.mouseDownPos.y); |
|
//对新的offset做bounds check |
|
var boundsOffset = this.boundsChecking(deltaX, deltaY); |
|
deltaX = boundsOffset[0]; |
|
deltaY = boundsOffset[1]; |
|
PanEditor.panOffsetX += deltaX; |
|
PanEditor.panOffsetY += deltaY; |
|
PanEditor.panOffsetXForCamera += deltaX; |
|
PanEditor.panOffsetYForCamera += deltaY; |
|
this.vfData.updateMovement(); |
|
this.updateZoomAndPan(); |
|
this.eventManager.dispatchEvent({ |
|
type: EventType.PAN_MOUSE_MOVE, |
|
data: { |
|
offsetX: PanEditor.panOffsetX, |
|
offsetY: PanEditor.panOffsetY, |
|
zoomFactor: this.vfData.getZoomFactor() |
|
} |
|
}); |
|
this.bIsMouseDown = false; |
|
}; |
|
//deltaX 大于0 ---> 检查LB.x |
|
// 小于0 ---> 检查RT.x |
|
//deltaY 大于0 ---> 检查LB.y |
|
// 小于0 ---> 检查RT.y |
|
PanEditor.prototype.boundsChecking = function (deltaX, deltaY) { |
|
var originCornerLB = this.vfData.getCorner('Origin', 'LB'); |
|
var virtualCornerLB = this.vfData.getCorner('Virtual', 'LB'); |
|
var originCornerRT = this.vfData.getCorner('Origin', 'RT'); |
|
var virtualCornerRT = this.vfData.getCorner('Virtual', 'RT'); |
|
//横向检查 |
|
if (deltaX > 0) { |
|
var maxOffsetX = originCornerLB[0] - virtualCornerLB[0]; |
|
if (maxOffsetX <= deltaX) { |
|
deltaX = maxOffsetX; |
|
} |
|
} |
|
else if (deltaX < 0) { |
|
var maxOffsetX = originCornerRT[0] - virtualCornerRT[0]; |
|
if (maxOffsetX >= deltaX) { |
|
deltaX = maxOffsetX; |
|
} |
|
} |
|
//纵向检查 |
|
if (deltaY < 0) { |
|
var maxOffsetY = originCornerLB[1] - virtualCornerLB[1]; |
|
if (maxOffsetY >= deltaY) { |
|
deltaY = maxOffsetY; |
|
} |
|
} |
|
else if (deltaY > 0) { |
|
var maxOffsetY = originCornerRT[1] - virtualCornerRT[1]; |
|
if (maxOffsetY <= deltaY) { |
|
deltaY = maxOffsetY; |
|
} |
|
} |
|
return [deltaX, deltaY]; |
|
}; |
|
PanEditor.prototype.updateZoomAndPan = function () { |
|
var originCornerLT = this.vfData.getCorner('Origin', 'LT'); |
|
var virtualCornerLT = this.vfData.getCorner('Virtual', 'LT'); |
|
ZoomEditor.offsetXForZoomAndPan = originCornerLT[0] - virtualCornerLT[0]; |
|
ZoomEditor.offsetYForZoomAndPan = originCornerLT[1] - virtualCornerLT[1]; |
|
}; |
|
PanEditor.clear = function () { |
|
PanEditor.panOffsetX = 0; |
|
PanEditor.panOffsetY = 0; |
|
PanEditor.panOffsetXForCamera = 0; |
|
PanEditor.panOffsetYForCamera = 0; |
|
}; |
|
return PanEditor; |
|
}(Editor)); |
|
|
|
/** @class */ ((function (_super) { |
|
__extends(CameraNode, _super); |
|
function CameraNode() { |
|
var _this = _super.call(this) || this; |
|
_this.cameraCircleNode = null; |
|
_this.cameraArrowNode = null; |
|
_this.rotateAngle = 0; |
|
_this.panelSize = [298, 198]; |
|
_this.build(); |
|
return _this; |
|
} |
|
CameraNode.prototype.build = function () { |
|
var svgNode = document.createElementNS(this.xmlns, 'g'); |
|
svgNode.setAttribute('fill', 'none'); |
|
svgNode.setAttribute('fill-rule', 'evenodd'); |
|
svgNode.setAttribute('stroke-width', '1'); |
|
var circle = document.createElementNS(this.xmlns, 'circle'); |
|
circle.setAttribute('r', '4.5'); |
|
circle.setAttribute('stroke', '#FFFFFF'); |
|
circle.setAttribute('fill', '#32D3A6'); |
|
this.cameraCircleNode = circle; |
|
var path = document.createElementNS(this.xmlns, 'path'); |
|
//path.setAttribute('d', 'M 7 6 Q 10 0, 7 -6 L 19 0 Z'); |
|
path.setAttribute('d', 'M5.94925387,0 C18.4132389,0 28.6581001,9.50119823 29.8362478,21.6560048 L5.94925387,25 Z'); |
|
path.setAttribute('fill', 'url(#radialGradient-1)'); |
|
path.setAttribute('transform', 'translate(13,-21)rotate(50)'); |
|
this.cameraArrowNode = path; |
|
// 渐变 |
|
var defs = document.createElementNS(this.xmlns, 'defs'); |
|
var radialGradient = document.createElementNS(this.xmlns, 'radialGradient'); |
|
var stop1 = document.createElementNS(this.xmlns, 'stop'); |
|
var stop2 = document.createElementNS(this.xmlns, 'stop'); |
|
radialGradient.setAttribute('cx', '0%'); |
|
radialGradient.setAttribute('cy', '100%'); |
|
radialGradient.setAttribute('fx', '0%'); |
|
radialGradient.setAttribute('fy', '100%'); |
|
radialGradient.setAttribute('r', '104.321936%'); |
|
radialGradient.setAttribute('id', 'radialGradient-1'); |
|
stop1.setAttribute('stop-color', '#36D4A8'); |
|
stop1.setAttribute('offset', '0%'); |
|
stop2.setAttribute('stop-color', '#36D4A8'); |
|
stop2.setAttribute('offset', '100%'); |
|
stop2.setAttribute('stop-opacity', '0'); |
|
defs.append(radialGradient); |
|
radialGradient.append(stop1); |
|
radialGradient.append(stop2); |
|
svgNode.appendChild(defs); |
|
svgNode.appendChild(circle); |
|
svgNode.appendChild(path); |
|
this.svgNode = svgNode; |
|
}; |
|
CameraNode.prototype.setCircleAttribute = function (key, value) { |
|
this.cameraCircleNode.setAttribute(key, value); |
|
}; |
|
CameraNode.prototype.setArrowAttribute = function (key, value) { |
|
this.cameraArrowNode.setAttribute(key, value); |
|
}; |
|
CameraNode.prototype.rotate = function (angle) { |
|
if (angle) { |
|
this.rotateAngle = angle; |
|
} |
|
var transform = this.svgNode.getAttribute('transform'); |
|
transform += "rotate" + "(" + this.rotateAngle + ")"; |
|
this.svgNode.setAttribute("transform", transform); |
|
}; |
|
CameraNode.prototype.setOffsetAndRotate = function (offsetX, offsetY, angle) { |
|
var offset = this.setOffsetBoundary(offsetX, offsetY); |
|
this.locate(offset.X, offset.Y); |
|
this.rotate(angle); |
|
PanEditor.panOffsetXForCamera = 0; |
|
PanEditor.panOffsetYForCamera = 0; |
|
}; |
|
CameraNode.prototype.move = function (deltaX, deltaY) { |
|
var offsetX = this.position.x + deltaX; |
|
var offsetY = this.position.y + deltaY; |
|
var offset = this.setOffsetBoundary(offsetX, offsetY); |
|
this.svgNode.setAttribute("transform", "translate(" + offset.X + "," + offset.Y + ")"); |
|
}; |
|
CameraNode.prototype.setOpacity = function (opacity) { |
|
this.svgNode.setAttribute('opacity', opacity); |
|
}; |
|
CameraNode.prototype.setCameraArrowOpacity = function (opacity) { |
|
this.cameraArrowNode.setAttribute('opacity', opacity); |
|
}; |
|
CameraNode.prototype.setCameraCircleOpacity = function (opacity) { |
|
this.cameraCircleNode.setAttribute('opacity', opacity); |
|
}; |
|
CameraNode.prototype.setBigCamera = function () { |
|
this.cameraCircleNode.setAttribute('r', '4.5'); |
|
this.cameraArrowNode.setAttribute('transform', 'translate(13,-21)rotate(50)'); |
|
}; |
|
CameraNode.prototype.setSmallCamera = function () { |
|
this.cameraCircleNode.setAttribute('r', '2'); |
|
this.cameraArrowNode.setAttribute('transform', 'translate(20,-21)rotate(50)'); |
|
}; |
|
CameraNode.prototype.setPanelSize = function (panelSize) { |
|
this.panelSize = panelSize; |
|
}; |
|
CameraNode.prototype.setOffsetBoundary = function (offsetX, offsetY) { |
|
var offsetXmax = this.panelSize[0] / 2 - 6; |
|
var offsetXmin = -this.panelSize[0] / 2 + 6; |
|
var offsetYmax = this.panelSize[1] / 2 - 6; |
|
var offsetYmin = -this.panelSize[1] / 2 + 6; |
|
if (offsetX >= offsetXmax || offsetX <= offsetXmin || offsetY >= offsetYmax || offsetY <= offsetYmin) { |
|
this.setSmallCamera(); |
|
} |
|
else { |
|
this.setBigCamera(); |
|
} |
|
offsetX > offsetXmax ? offsetX = offsetXmax : ''; |
|
offsetX < offsetXmin ? offsetX = offsetXmin : ''; |
|
offsetY > offsetYmax ? offsetY = offsetYmax : ''; |
|
offsetY < offsetYmin ? offsetY = offsetYmin : ''; |
|
return { X: offsetX, Y: offsetY }; |
|
}; |
|
return CameraNode; |
|
})(DrawableItem)); |
|
|
|
// 初始化剖切 |
|
var initSectionPlane = function (viewer3D) { |
|
delete viewer3D._sectionPlane; |
|
var config = new window.Glodon.Bimface.Plugins.Section.SectionPlaneConfig(); |
|
config.plane = window.Glodon.Bimface.Plugins.Section.SectionPlanePlane.Z; |
|
config.viewer = viewer3D; |
|
config.id = "SectionPlane"; |
|
config.exitSectionBox = false; |
|
config.enableSnap = true; |
|
var sectionPlane = new window.Glodon.Bimface.Plugins.Section.SectionPlane(config); |
|
sectionPlane.hidePlane(); |
|
viewer3D._sectionPlane = sectionPlane; |
|
}; |
|
|
|
var TYPE; |
|
(function (TYPE) { |
|
TYPE[TYPE["RECTANGLE"] = 1] = "RECTANGLE"; |
|
TYPE[TYPE["POLYLINE"] = 2] = "POLYLINE"; |
|
})(TYPE || (TYPE = {})); |
|
var Separation = /** @class */ (function (_super) { |
|
__extends(Separation, _super); |
|
function Separation(config) { |
|
var _this = _super.call(this) || this; |
|
_this._config = config; |
|
_this.type = config.type || null; |
|
config.elevation != null && _this.setSectionPlane(config); |
|
_this.showAxisGrid(); |
|
_this.available = true; |
|
_this.visible = true; |
|
return _this; |
|
} |
|
// construct new section based on elevation |
|
Separation.prototype.setSectionPlane = function (config) { |
|
var viewer = config.viewer, modelId = config.modelId; config.roomId; config.elevation; config.unit; var fileId = config.fileId; |
|
var model = viewer.getModel(modelId); |
|
model.getBoundingBox(fileId ? fileId : model.modelId, function (data) { |
|
var unit = config.unit || config.viewer.getGlobalUnit(); |
|
if (!viewer._sectionPlane) |
|
initSectionPlane(viewer); |
|
var fullHeight = data.originalBoundingBox.max.z - data.originalBoundingBox.min.z; |
|
var sectionHeight = data.originalBoundingBox.max.z - (unit == 'Meter' ? config.elevation : config.elevation * 1000) - (unit == 'Meter' ? config.height - 0.12 : config.height - 12) - config.viewer.getModel(config.modelId).getModelTransformationAdaptedUnit()[14]; |
|
var progress = sectionHeight / fullHeight * 100; |
|
viewer._sectionPlane.setProgress(progress); |
|
viewer._sectionPlane.enableHatch(false); |
|
}); |
|
}; |
|
Separation.prototype.showAxisGrid = function () { |
|
this._config.viewer.getModel(this._config.modelId).showAxisGridsByFloor(this._config.fileId, this._config.floor); |
|
}; |
|
Separation.prototype.removeAllAxisGrids = function () { |
|
this._config.viewer.getModel(this._config.modelId).removeAllAxisGrids(); |
|
}; |
|
Separation.prototype.drawRectangle = function () { |
|
var _this = this; |
|
if (this.type) |
|
return; |
|
this.drawRectangleTool = new DrawRectangleTool(this._config); |
|
this.type = TYPE.RECTANGLE; |
|
this.drawRectangleTool.addEventListener('DrawFinished', function () { |
|
_this.addNewSolid(); |
|
_this.fireEvent('DrawFinished'); |
|
}); |
|
}; |
|
Separation.prototype.drawPolyLine = function () { |
|
var _this = this; |
|
if (this.type) |
|
return; |
|
this.drawPolyLineTool = new DrawPolyLineTool(this._config); |
|
this.type = TYPE.POLYLINE; |
|
this.drawPolyLineTool.addEventListener('DrawFinished', function () { |
|
_this.addNewSolid(); |
|
_this.fireEvent('DrawFinished'); |
|
}); |
|
}; |
|
Separation.prototype.edit = function (points) { |
|
var _this = this; |
|
if (!this.visible || !this.available) { |
|
this._config.viewer.unlockAxis(Glodon$1.Bimface.Viewer.AxisOption.Z); |
|
return; |
|
} |
|
!points && (points = this.room ? this.exchangeBimtileMmToM(this.translateRoom(this.room.getBoundary().outer, false)) : this.getSolid()); |
|
this.drawRectangleTool && this.drawRectangleTool.exit(); |
|
this.drawPolyLineTool && this.drawPolyLineTool.exit(); |
|
this.editPolygon && this.editPolygon.exit(); |
|
this.roomManager && this.roomManager.hideRoomsById([this.room.roomId]); |
|
this._config.controlType = "EditPolygonControl"; |
|
this._config.points = points; |
|
this._config.color = '#32D3A6'; |
|
this._config.hidePlane = true; |
|
this._config.showEdge = true; |
|
var newTool = new EditClipSurfaceTool(this._config); |
|
this.editPolygon = newTool; |
|
newTool.setPoints(points); |
|
var self = this; |
|
this.editPolygon.addEventListener('EditCompleted', function () { |
|
self.room && self.room.setBoundary({ outer: self.translateRoom(self.getSolid()) }, self._config.unit); |
|
self.roomManager && self.roomManager.loadAndCalculateOverLap(self._config.roomId, self._config.overlapType || 'plus'); |
|
self.roomManager && self.roomManager.showRoomsById([_this.room.roomId]); |
|
self._config.viewer.unlockAxis(Glodon$1.Bimface.Viewer.AxisOption.Z); |
|
self.fireEvent('EditCompleted'); |
|
}); |
|
this.editPolygon.addEventListener('WarningHint', function () { |
|
self.fireEvent('WarningHint'); |
|
}); |
|
}; |
|
// match room position changed, an inverted matrix is applied |
|
Separation.prototype.translateRoom = function (res, reverse) { |
|
if (reverse === void 0) { reverse = true; } |
|
var matrix = new window.THREE.Matrix4(); |
|
matrix.elements = this._config.viewer.getModel(this._config.modelId).getModelTransformationAdaptedUnit(); |
|
var positions = []; |
|
res.map(function (position) { |
|
var newPoint = new window.THREE.Vector3(position.x, position.y, position.z).applyMatrix4(reverse ? matrix.clone().invert() : matrix.clone()); |
|
positions.push(newPoint); |
|
}); |
|
return positions; |
|
}; |
|
// bimtile special exchange |
|
Separation.prototype.exchangeBimtileMmToM = function (points) { |
|
if (this._config.viewer.getModel(this._config.modelId)._manifest.Metadata.Content.Type == 'bimtiles' |
|
&& this._config.viewer.getGlobalUnit() == 'Millimeter') { |
|
points = points.map(function (point) { |
|
point.x = point.x / 1000; |
|
point.y = point.y / 1000; |
|
point.z = point.z / 1000; |
|
return point; |
|
}); |
|
} |
|
return points; |
|
}; |
|
Separation.prototype.getSolid = function () { |
|
var res = []; |
|
var data; |
|
if (!this.editPolygon) { |
|
if (this.type == TYPE.RECTANGLE) { |
|
data = this.drawRectangleTool.getControl().getPoints(); |
|
if (!data) |
|
return null; |
|
data = [data[1], data[3], data[4], data[5]]; |
|
} |
|
if (this.type == TYPE.POLYLINE) { |
|
data = this.drawPolyLineTool.getControl().getPoints(); |
|
if (!data) |
|
return null; |
|
} |
|
} |
|
else { |
|
data = this.editPolygon.getPointsData(); |
|
} |
|
// remove duplicate object data from data |
|
for (var i = 0; i < data.length; i++) { |
|
var item = data[i]; |
|
var isExist = false; |
|
for (var j = 0; j < res.length; j++) { |
|
var resItem = res[j]; |
|
if (item.x === resItem.x && item.y === resItem.y && item.z === resItem.z) { |
|
isExist = true; |
|
break; |
|
} |
|
} |
|
if (!isExist) { |
|
var newItem = __assign({}, item); |
|
if (this._config.viewer.getGlobalUnit() == 'Millimeter' && this._config.viewer.getModel(this._config.modelId)._manifest.Metadata.Content.Type == 'bimtiles') { |
|
newItem.x = newItem.x * 1000; |
|
newItem.y = newItem.y * 1000; |
|
newItem.z = newItem.z * 1000; |
|
} |
|
res.push(newItem); |
|
} |
|
} |
|
return res; |
|
}; |
|
Separation.prototype.hide = function () { |
|
if (!this.available) |
|
return; |
|
this.visible = false; |
|
if (!this.editPolygon) { |
|
this.drawRectangleTool && this.drawRectangleTool.getControl().hide(); |
|
this.drawPolyLineTool && this.drawPolyLineTool.getControl().hide(); |
|
} |
|
else { |
|
this.editPolygon.getControl().hide(); |
|
} |
|
this._config.viewer && this._config.viewer.render(); |
|
}; |
|
Separation.prototype.show = function () { |
|
if (!this.available) |
|
return; |
|
this.visible = true; |
|
if (!this.editPolygon) { |
|
this.drawRectangleTool && this.drawRectangleTool.getControl().show(); |
|
this.drawPolyLineTool && this.drawPolyLineTool.getControl().show(); |
|
} |
|
else { |
|
this.editPolygon.getControl().show(); |
|
} |
|
this._config.viewer && this._config.viewer.render(); |
|
}; |
|
Separation.prototype.exit = function () { |
|
this.hide(); |
|
this.visible = false; |
|
this.available = false; |
|
this.drawRectangleTool && this.drawRectangleTool.exit(); |
|
this.drawPolyLineTool && this.drawPolyLineTool.exit(); |
|
this.editPolygon && this.editPolygon.exit(); |
|
}; |
|
Separation.prototype.addNewSolid = function () { |
|
var positions = this.translateRoom(this.getSolid()); |
|
var roomConfig = new Glodon$1.Bimface.Plugins.Rooms.RoomConfig(); |
|
roomConfig.viewer = this._config.viewer; |
|
roomConfig.roomId = this._config.roomId; |
|
roomConfig.modelId = this._config.modelId; |
|
roomConfig.geometry = { |
|
type: 'extrusion', |
|
boundary: { |
|
outer: positions, |
|
}, |
|
height: this._config.height, |
|
unit: this._config.unit |
|
}; |
|
roomConfig.roomColor = this._config.fillColor; |
|
roomConfig.frameColor = this._config.frameColor; |
|
this.room = new Glodon$1.Bimface.Plugins.Rooms.Room(roomConfig); |
|
this.room.name = this._config.name; |
|
this.room.conditions = this._config.conditions; |
|
this.room.floor = this._config.floor; |
|
this.room.drawTool = this; |
|
this.roomManager = this._config.viewer.getModel(this._config.modelId).getRoomManager(); |
|
this.roomManager.addRoom(this.room); |
|
// bind manager to room in order to allow room to update itself |
|
this.room.roomModelManager = this.roomManager; |
|
this.roomManager.loadAndCalculateOverLap(this._config.roomId, this._config.overlapType || 'plus'); |
|
this._config.viewer.render(); |
|
}; |
|
Separation.prototype.getRoom = function () { |
|
if (!this.available) |
|
return; |
|
return this.room; |
|
}; |
|
// 添加本工具的监听 |
|
Separation.prototype.addEventListener = function (type, event) { |
|
this.addEvent(type, event); |
|
}; |
|
// 移除本工具的监听 |
|
Separation.prototype.removeEventListener = function (type, event) { |
|
this.removeEvent(type, event); |
|
}; |
|
return Separation; |
|
}(EventEmmiter)); |
|
|
|
Glodon$1.Bimface = Glodon$1.Bimface || {}; |
|
Glodon$1.Bimface.Interactions = Glodon$1.Bimface.Interactions || {}; |
|
Glodon$1.Bimface.Interactions.DrawRectangleTool = DrawRectangleTool; |
|
Glodon$1.Bimface.Interactions.DrawPolyLineTool = DrawPolyLineTool; |
|
Glodon$1.Bimface.Interactions.Separation = Separation;
|
|
|