UNPKG

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

186 lines (185 loc) 15.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Directive, Output, HostListener, EventEmitter } from '@angular/core'; export class CanvasEventsDirective { constructor() { 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 {?} */ onMouseWheelChrome(event) { this.mouseWheelFunc(event); } /** * @param {?} event * @return {?} */ onMouseWheelFirefox(event) { this.mouseWheelFunc(event); } /** * @param {?} event * @return {?} */ onMouseWheelIE(event) { this.mouseWheelFunc(event); } /** * @param {?} ev * @return {?} */ onKeyDown(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 {?} */ onKeyUp(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 {?} */ onMouseClick(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 {?} */ onMouseMove(ev) { if (this.dragMode && this.mouseDown) { this.move.emit([ev.offsetX - this.clickX, ev.offsetY - this.clickY]); } } /** * @param {?} ev * @return {?} */ onMouseUp(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 {?} */ mouseWheelFunc(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'],] },], }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWV2ZW50cy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1wbGFuLyIsInNvdXJjZXMiOlsibGliL2NhbnZhcy1ldmVudHMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzlFLE1BQU07O3VCQUVnQixJQUFJLFlBQVksRUFBRTtzQkFDbkIsSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLElBQUksWUFBWSxFQUFFO29CQUN0QixJQUFJLFlBQVksRUFBRTt1QkFDZixJQUFJLFlBQVksRUFBRTt1QkFDbEIsSUFBSSxZQUFZLEVBQUU7MkJBQ2QsSUFBSSxZQUFZLEVBQUU7eUJBRWIsS0FBSzt3QkFDTixLQUFLOzs7Ozs7SUFLTyxrQkFBa0IsQ0FBQyxLQUFVO1FBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7OztJQUdlLG1CQUFtQixDQUFDLEtBQVU7UUFDeEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBR2EsY0FBYyxDQUFDLEtBQVU7UUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBSTdCLFNBQVMsQ0FBQyxFQUFnQjtRQUN0QixFQUFFLENBQUEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEI7UUFDRCxFQUFFLENBQUEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFBLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkI7UUFDRCxFQUFFLENBQUEsQ0FBQyxFQUFFLENBQUMs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SyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjtRQUFDLElBQUksQ0FBQyxFQUFFLENBQUEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1Qjs7UUFFRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7UUFFMUIsRUFBRSxDQUFBLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzFCO0tBQ0Y7OztZQTNHRixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUU7Ozs7d0JBR3RDLE1BQU07dUJBQ04sTUFBTTt5QkFDTixNQUFNO3FCQUNOLE1BQU07d0JBQ04sTUFBTTt3QkFDTixNQUFNOzRCQUNOLE1BQU07bUNBUU4sWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztvQ0FJckMsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOytCQUl6QyxZQUFZLFNBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQUl2QyxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBa0IzQyxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkJBYXpDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7NEJBZ0JwQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQU9wQyxZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2FudmFzRXZlbnRzXScgfSlcclxuZXhwb3J0IGNsYXNzIENhbnZhc0V2ZW50c0RpcmVjdGl2ZSB7XHJcblxyXG4gIEBPdXRwdXQoKSB6b29tT3V0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSB6b29tSW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG1vdmVJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBtb3ZlRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBwYW5Nb2RlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBhZGROb2RlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcHJpdmF0ZSBtb3VzZURvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGRyYWdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2xpY2tYO1xyXG4gIHByaXZhdGUgY2xpY2tZO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXdoZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsQ2hyb21lKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMubW91c2VXaGVlbEZ1bmMoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBbJyRldmVudCddKSBvbk1vdXNlV2hlZWxGaXJlZm94KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMubW91c2VXaGVlbEZ1bmMoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignb25tb3VzZXdoZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsSUUoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5tb3VzZVdoZWVsRnVuYyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZXY6S2V5Ym9hcmRFdmVudCl7XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkFycm93RG93blwiKXtcclxuICAgICAgICB0aGlzLnpvb21Jbi5lbWl0KGV2KTtcclxuICAgICAgfVxyXG4gICAgICBpZihldi5rZXkgPT0gXCJBcnJvd1VwXCIpe1xyXG4gICAgICAgIHRoaXMuem9vbU91dC5lbWl0KGV2KTtcclxuICAgICAgfVxyXG4gICAgICBpZihldi5rZXkgPT0gXCJBbHRcIil7XHJcbiAgICAgICAgLy8gZW5hYmxlIGRyYWcgbW9kZSBpZiBob2xkaW5nIEFsdFxyXG4gICAgICAgIHRoaXMuZHJhZ01vZGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGFuTW9kZS5lbWl0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkNvbnRyb2xcIil7XHJcbiAgICAgICAgdGhpcy5hZGROb2RlTW9kZS5lbWl0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlVcChldjpLZXlib2FyZEV2ZW50KXtcclxuICAgICAgaWYoZXYua2V5ID09IFwiQWx0XCIpe1xyXG4gICAgICAgIC8vIGRpc2FibGUgZHJhZyBtb2RlIGlmIHJlbGVhc2luZyBBbHRcclxuICAgICAgICB0aGlzLmRyYWdNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wYW5Nb2RlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGV2LmtleSA9PSBcIkNvbnRyb2xcIil7XHJcbiAgICAgICAgdGhpcy5hZGROb2RlTW9kZS5lbWl0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZUNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICB0aGlzLm1vdXNlRG93biA9IHRydWU7XHJcblxyXG4gICAgICAvLyBlbmFibGUgZHJhZyBtb2RlIGlmIGNsaWNraW5nIG1pZGRsZSBidXR0b25cclxuICAgICAgaWYoZXYuYnV0dG9uID09IDEpIHRoaXMuZHJhZ01vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYodGhpcy5kcmFnTW9kZSl7XHJcbiAgICAgICAgdGhpcy5jbGlja1ggPSBldi5vZmZzZXRYO1xyXG4gICAgICAgIHRoaXMuY2xpY2tZID0gZXYub2Zmc2V0WTtcclxuICAgICAgICB0aGlzLnBhbk1vZGUuZW1pdCh0cnVlKTtcclxuICAgICAgICB0aGlzLm1vdmVJbml0LmVtaXQoW2V2Lm9mZnNldFgsZXYub2Zmc2V0WV0pO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VNb3ZlKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgIGlmKHRoaXMuZHJhZ01vZGUgJiYgdGhpcy5tb3VzZURvd24pe1xyXG4gICAgICAgICAgdGhpcy5tb3ZlLmVtaXQoW2V2Lm9mZnNldFgtdGhpcy5jbGlja1gsZXYub2Zmc2V0WS10aGlzLmNsaWNrWV0pO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlVXAoZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcclxuICAgICAgaWYodGhpcy5kcmFnTW9kZSl7XHJcbiAgICAgICAgdGhpcy5kcmFnTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGFuTW9kZS5lbWl0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1vdmVFbmQuZW1pdChbZXYub2Zmc2V0WC10aGlzLmNsaWNrWCxldi5vZmZzZXRZLXRoaXMuY2xpY2tZXSk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlV2hlZWxGdW5jKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBldmVudCA9IHdpbmRvdy5ldmVudCB8fCBldmVudDsgLy8gb2xkIElFIHN1cHBvcnRcclxuICAgIHZhciBkZWx0YSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCAoZXZlbnQud2hlZWxEZWx0YSB8fCAtZXZlbnQuZGV0YWlsKSkpO1xyXG4gICAgaWYoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy56b29tSW4uZW1pdChldmVudCk7XHJcbiAgICB9IGVsc2UgaWYoZGVsdGEgPCAwKSB7XHJcbiAgICAgICAgdGhpcy56b29tT3V0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gZm9yIElFXHJcbiAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgLy8gZm9yIENocm9tZSBhbmQgRmlyZWZveFxyXG4gICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==