ng-plan
Version:
This module will draw a 2D plan drawing from a geoJSON object. It was built to visualize 2D space boundaries from the Building Information Modeling (BIM) authring tool, Revit. It is quite generic, but does have some features that are mainly related to the
224 lines (223 loc) • 16.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Directive, Output, HostListener, EventEmitter } from '@angular/core';
var CanvasEventsDirective = /** @class */ (function () {
function CanvasEventsDirective() {
this.zoomOut = new EventEmitter();
this.zoomIn = new EventEmitter();
this.moveInit = new EventEmitter();
this.move = new EventEmitter();
this.moveEnd = new EventEmitter();
this.panMode = new EventEmitter();
this.addNodeMode = new EventEmitter();
this.mouseDown = false;
this.dragMode = false;
}
/**
* @param {?} event
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseWheelChrome = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.mouseWheelFunc(event);
};
/**
* @param {?} event
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseWheelFirefox = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.mouseWheelFunc(event);
};
/**
* @param {?} event
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseWheelIE = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.mouseWheelFunc(event);
};
/**
* @param {?} ev
* @return {?}
*/
CanvasEventsDirective.prototype.onKeyDown = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (ev.key == "ArrowDown") {
this.zoomIn.emit(ev);
}
if (ev.key == "ArrowUp") {
this.zoomOut.emit(ev);
}
if (ev.key == "Alt") {
// enable drag mode if holding Alt
this.dragMode = true;
this.panMode.emit(true);
}
if (ev.key == "Control") {
this.addNodeMode.emit(true);
}
};
/**
* @param {?} ev
* @return {?}
*/
CanvasEventsDirective.prototype.onKeyUp = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (ev.key == "Alt") {
// disable drag mode if releasing Alt
this.dragMode = false;
this.panMode.emit(false);
}
if (ev.key == "Control") {
this.addNodeMode.emit(false);
}
};
/**
* @param {?} ev
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseClick = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
this.mouseDown = true;
// enable drag mode if clicking middle button
if (ev.button == 1)
this.dragMode = true;
if (this.dragMode) {
this.clickX = ev.offsetX;
this.clickY = ev.offsetY;
this.panMode.emit(true);
this.moveInit.emit([ev.offsetX, ev.offsetY]);
}
};
/**
* @param {?} ev
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseMove = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
if (this.dragMode && this.mouseDown) {
this.move.emit([ev.offsetX - this.clickX, ev.offsetY - this.clickY]);
}
};
/**
* @param {?} ev
* @return {?}
*/
CanvasEventsDirective.prototype.onMouseUp = /**
* @param {?} ev
* @return {?}
*/
function (ev) {
this.mouseDown = false;
if (this.dragMode) {
this.dragMode = false;
this.panMode.emit(false);
this.moveEnd.emit([ev.offsetX - this.clickX, ev.offsetY - this.clickY]);
}
};
/**
* @param {?} event
* @return {?}
*/
CanvasEventsDirective.prototype.mouseWheelFunc = /**
* @param {?} event
* @return {?}
*/
function (event) {
var /** @type {?} */ event = window.event || event; // old IE support
var /** @type {?} */ delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
if (delta > 0) {
this.zoomIn.emit(event);
}
else if (delta < 0) {
this.zoomOut.emit(event);
}
// for IE
event.returnValue = false;
// for Chrome and Firefox
if (event.preventDefault) {
event.preventDefault();
}
};
CanvasEventsDirective.decorators = [
{ type: Directive, args: [{ selector: '[canvasEvents]' },] },
];
/** @nocollapse */
CanvasEventsDirective.propDecorators = {
"zoomOut": [{ type: Output },],
"zoomIn": [{ type: Output },],
"moveInit": [{ type: Output },],
"move": [{ type: Output },],
"moveEnd": [{ type: Output },],
"panMode": [{ type: Output },],
"addNodeMode": [{ type: Output },],
"onMouseWheelChrome": [{ type: HostListener, args: ['mousewheel', ['$event'],] },],
"onMouseWheelFirefox": [{ type: HostListener, args: ['DOMMouseScroll', ['$event'],] },],
"onMouseWheelIE": [{ type: HostListener, args: ['onmousewheel', ['$event'],] },],
"onKeyDown": [{ type: HostListener, args: ['document:keydown', ['$event'],] },],
"onKeyUp": [{ type: HostListener, args: ['document:keyup', ['$event'],] },],
"onMouseClick": [{ type: HostListener, args: ['mousedown', ['$event'],] },],
"onMouseMove": [{ type: HostListener, args: ['mousemove', ['$event'],] },],
"onMouseUp": [{ type: HostListener, args: ['mouseup', ['$event'],] },],
};
return CanvasEventsDirective;
}());
export { CanvasEventsDirective };
function CanvasEventsDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
CanvasEventsDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
CanvasEventsDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
CanvasEventsDirective.propDecorators;
/** @type {?} */
CanvasEventsDirective.prototype.zoomOut;
/** @type {?} */
CanvasEventsDirective.prototype.zoomIn;
/** @type {?} */
CanvasEventsDirective.prototype.moveInit;
/** @type {?} */
CanvasEventsDirective.prototype.move;
/** @type {?} */
CanvasEventsDirective.prototype.moveEnd;
/** @type {?} */
CanvasEventsDirective.prototype.panMode;
/** @type {?} */
CanvasEventsDirective.prototype.addNodeMode;
/** @type {?} */
CanvasEventsDirective.prototype.mouseDown;
/** @type {?} */
CanvasEventsDirective.prototype.dragMode;
/** @type {?} */
CanvasEventsDirective.prototype.clickX;
/** @type {?} */
CanvasEventsDirective.prototype.clickY;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWV2ZW50cy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1wbGFuLyIsInNvdXJjZXMiOlsibGliL2NhbnZhcy1ldmVudHMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7dUJBS3hELElBQUksWUFBWSxFQUFFO3NCQUNuQixJQUFJLFlBQVksRUFBRTt3QkFDaEIsSUFBSSxZQUFZLEVBQUU7b0JBQ3RCLElBQUksWUFBWSxFQUFFO3VCQUNmLElBQUksWUFBWSxFQUFFO3VCQUNsQixJQUFJLFlBQVksRUFBRTsyQkFDZCxJQUFJLFlBQVksRUFBRTt5QkFFYixLQUFLO3dCQUNOLEtBQUs7Ozs7OztJQUtPLGtEQUFrQjs7OztjQUFDLEtBQVU7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBR2UsbURBQW1COzs7O2NBQUMsS0FBVTtRQUN4RSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFHYSw4Q0FBYzs7OztjQUFDLEtBQVU7UUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBSTdCLHlDQUFTOzs7O2NBQUMsRUFBZ0I7UUFDdEIsRUFBRSxDQUFBLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsRUFBRSxDQUFBLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsQ0FBQSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsRUFBRSxDQUFBLENBQUMsRUFBRSxD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c3RMaXN0ZW5lciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2FudmFzRXZlbnRzXScgfSlcclxuZXhwb3J0IGNsYXNzIENhbnZhc0V2ZW50c0RpcmVjdGl2ZSB7XHJcblxyXG4gIEBPdXRwdXQoKSB6b29tT3V0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSB6b29tSW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG1vdmVJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBtb3ZlRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBwYW5Nb2RlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBhZGROb2RlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcHJpdmF0ZSBtb3VzZURvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGRyYWdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2xpY2tYO1xyXG4gIHByaXZhdGUgY2xpY2tZO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXdoZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsQ2hyb21lKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMubW91c2VXaGVlbEZ1bmMoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBbJyRldmVudCddKSBvbk1vdXNlV2hlZWxGaXJlZm94KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMubW91c2VXaGVlbEZ1bmMoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignb25tb3VzZXdoZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsSUUoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5tb3VzZVdoZWVsRnVuYyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZXY6S2V5Ym9hcmRFdmVudCl7XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkFycm93RG93blwiKXtcclxuICAgICAgICB0aGlzLnpvb21Jbi5lbWl0KGV2KTtcclxuICAgICAgfVxyXG4gICAgICBpZihldi5rZXkgPT0gXCJBcnJvd1VwXCIpe1xyXG4gICAgICAgIHRoaXMuem9vbU91dC5lbWl0KGV2KTtcclxuICAgICAgfVxyXG4gICAgICBpZihldi5rZXkgPT0gXCJBbHRcIil7XHJcbiAgICAgICAgLy8gZW5hYmxlIGRyYWcgbW9kZSBpZiBob2xkaW5nIEFsdFxyXG4gICAgICAgIHRoaXMuZHJhZ01vZGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGFuTW9kZS5lbWl0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkNvbnRyb2xcIil7XHJcbiAgICAgICAgdGhpcy5hZGROb2RlTW9kZS5lbWl0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlVcChldjpLZXlib2FyZEV2ZW50KXtcclxuICAgICAgaWYoZXYua2V5ID09IFwiQWx0XCIpe1xyXG4gICAgICAgIC8vIGRpc2FibGUgZHJhZyBtb2RlIGlmIHJlbGVhc2luZyBBbHRcclxuICAgICAgICB0aGlzLmRyYWdNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wYW5Nb2RlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkNvbnRyb2xcIil7XHJcbiAgICAgICAgdGhpcy5hZGROb2RlTW9kZS5lbWl0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZUNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICB0aGlzLm1vdXNlRG93biA9IHRydWU7XHJcblxyXG4gICAgICAvLyBlbmFibGUgZHJhZyBtb2RlIGlmIGNsaWNraW5nIG1pZGRsZSBidXR0b25cclxuICAgICAgaWYoZXYuYnV0dG9uID09IDEpIHRoaXMuZHJhZ01vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYodGhpcy5kcmFnTW9kZSl7XHJcbiAgICAgICAgdGhpcy5jbGlja1ggPSBldi5vZmZzZXRYO1xyXG4gICAgICAgIHRoaXMuY2xpY2tZID0gZXYub2Zmc2V0WTtcclxuICAgICAgICB0aGlzLnBhbk1vZGUuZW1pdCh0cnVlKTtcclxuICAgICAgICB0aGlzLm1vdmVJbml0LmVtaXQoW2V2Lm9mZnNldFgsZXYub2Zmc2V0WV0pO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VNb3ZlKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgIGlmKHRoaXMuZHJhZ01vZGUgJiYgdGhpcy5tb3VzZURvd24pe1xyXG4gICAgICAgICAgdGhpcy5tb3ZlLmVtaXQoW2V2Lm9mZnNldFgtdGhpcy5jbGlja1gsZXYub2Zmc2V0WS10aGlzLmNsaWNrWV0pO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlVXAoZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcclxuICAgICAgaWYodGhpcy5kcmFnTW9kZSl7XHJcbiAgICAgICAgdGhpcy5kcmFnTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGFuTW9kZS5lbWl0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1vdmVFbmQuZW1pdChbZXYub2Zmc2V0WC10aGlzLmNsaWNrWCxldi5vZmZzZXRZLXRoaXMuY2xpY2tZXSk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlV2hlZWxGdW5jKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBldmVudCA9IHdpbmRvdy5ldmVudCB8fCBldmVudDsgLy8gb2xkIElFIHN1cHBvcnRcclxuICAgIHZhciBkZWx0YSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCAoZXZlbnQud2hlZWxEZWx0YSB8fCAtZXZlbnQuZGV0YWlsKSkpO1xyXG4gICAgaWYoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy56b29tSW4uZW1pdChldmVudCk7XHJcbiAgICB9IGVsc2UgaWYoZGVsdGEgPCAwKSB7XHJcbiAgICAgICAgdGhpcy56b29tT3V0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gZm9yIElFXHJcbiAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgLy8gZm9yIENocm9tZSBhbmQgRmlyZWZveFxyXG4gICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==