import { PointDrawer } from "../../point-component/drawers/point-drawer"; import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum"; import { Drawer } from "../../../core/drawers/drawer"; import { app as App } from "../../../app"; import { objects } from "../../../core/application/objects"; import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator"; export class IntersectionDrawer extends Drawer { static FIRST_OBJECT_STATE() { return "FIRST_OBJECT"; } static SECOND_OBJECT_STATE() { return "SECOND_OBJECTf"; } constructor() { super(); this.objectA; this.objectB; this.aggregatorA; this.aggregatorB; this.label; this.point; this.states = [ IntersectionDrawer.FIRST_OBJECT_STATE, IntersectionDrawer.SECOND_OBJECT_STATE ]; this.intersections = []; this.pointDrawer = new PointDrawer(); super.setElementClass(ELEMENTS_CLASS.INTERSECTION_POINT); } draw(e) { if (e == undefined || !this.isValidObject(e.target)) return; const selectedTool = App.getSelectedTool(); if ( selectedTool != undefined && selectedTool.drawer != undefined && selectedTool.drawer.elementClass == ELEMENTS_CLASS.INTERSECTION_POINT ) { if ( this.state == undefined || this.state == IntersectionDrawer.FIRST_OBJECT_STATE ) { this.setFirstObject(e.target); this.setState(IntersectionDrawer.SECOND_OBJECT_STATE); } else if (this.state == IntersectionDrawer.SECOND_OBJECT_STATE) { this.setSecondObject(e.target); this.drawPoint(); this.clear(); } } } setFirstObject(konvaObject) { const aggregator = this.getObjectAggregator(konvaObject); this.aggregatorA = aggregator; } setSecondObject(konvaObject) { const aggregator = this.getObjectAggregator(konvaObject); this.aggregatorB = aggregator; } getObjectAggregator(konvaObject) { return objects.getByKonvaObject(konvaObject)[0]; } drawPoint() { const intersectionPoint = this.aggregatorA.genericObject.getIntersection( this.aggregatorB.genericObject ); intersectionPoint.update(); const point = PointDrawer.drawPoint(intersectionPoint, false, false, true); const aggregator = new DrawerAggregator( this, intersectionPoint, point.konvaObject, ELEMENTS_CLASS.INTERSECTION_POINT ); this.point = point.geometricObject; super.addAggregator(aggregator); this.aggregatorB.addAggregator(aggregator); this.aggregatorA.addAggregator(aggregator); } isValidObject(konvaObject) { return konvaObject.attrs.class == ELEMENTS_CLASS.LINE_SEGMENT; } update(aggregator, e) { aggregator.genericObject.update(aggregator, e); if (!aggregator.genericObject.visible) { if (aggregator.visible) { aggregator.konvaObject.hide(); aggregator.aggregators.forEach(a => { a.visible = false; a.konvaObject.hide(); }); this.batchDraw(); } aggregator.visible = false; return; } aggregator.konvaObject.x(aggregator.genericObject.posX); aggregator.konvaObject.y(aggregator.genericObject.posY); if (!aggregator.visible) { aggregator.konvaObject.show(); aggregator.aggregators.forEach(a => { a.visible = true; a.konvaObject.show(); }); aggregator.visible = true; } this.batchDraw(); } }