123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*
- * iGeom by LInE
- * Provides intersetion point to Geometric Objects (GO)
- * www.matematica.br/igeom
- * ./app/components/intersection-component/drawers/intersection-drawer.js
- * @calledby
- * @version 2020/11/02: Implemented Line instersection.
- */
- 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";
- import { intersectionService } from "../services/intersection-service";
- export class IntersectionDrawer extends Drawer {
- static FIRST_OBJECT_STATE () {
- return "FIRST_OBJECT";
- }
- static SECOND_OBJECT_STATE () {
- return "SECOND_OBJECTf";
- }
- constructor () {
- super();
- this.aggregatorA;
- this.aggregatorB;
- this.label;
- this.states = [IntersectionDrawer.FIRST_OBJECT_STATE, IntersectionDrawer.SECOND_OBJECT_STATE];
- this.intersections = [];
- this.pointDrawer = new PointDrawer();
- super.setElementClass(ELEMENTS_CLASS.INTERSECTION_POINT);
- }
- // @calledby ./app/core/drawers/stage.js! draw (e): this.drawer.draw(e);
- draw (e) {
- if (e != undefined && e.attrs != undefined) {
- this.aggregatorA = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.r);
- this.aggregatorB = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.s);
- this.drawByIntersectionPoints([e.attrs.genericObject]);
- return;
- }
- 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.reset();
- // 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];
- }
- getObjectAggregatorByGenericObject (genericObject) {
- return objects.getByGenericObject(genericObject)[0];
- }
- // Avoid to create intersection between lines/segments when some defining point is the intersection
- // Return true <=> need a new point
- alreadyHasIntersection (og1, og2, str_a1, str_a2) {
- if ((og1.elementClass==ELEMENTS_CLASS.LINE || og1.elementClass==ELEMENTS_CLASS.LINE_SEGMENT) &&
- (og2.elementClass==ELEMENTS_CLASS.LINE || og2.elementClass==ELEMENTS_CLASS.LINE_SEGMENT)) {
- // Try to avoid redundant point
- //D var aux = " ELEMENTS_CLASS.LINE=" + ELEMENTS_CLASS.LINE + ", ";
- if (og1.pointA==og2.pointA || og1.pointA==og2.pointB || og1.pointB==og2.pointA || og1.pointB==og2.pointB) {
- var aux2 = " "+og1.pointA+","+og1.pointB+";"+og2.pointA+","+og2.pointB+" ";
- console.log("intersection-drawer.js!alreadyHasIntersection(): existing intersection, nothing to be done: " + str_a1 + " , " + str_a2 + ", " + aux2);
- //TODO need to become visible? "og1.visible = true;" or "og2.visible = true;"
- return true;
- }
- }
- return false;
- }
- // Used to create new intersection point
- //@calledby this.draw()
- drawPoint () {
- const og1 = this.aggregatorA.genericObject, og2 = this.aggregatorB.genericObject;
- const str_a1 = "og1=(" + og1.elementClass + ",id=" + og1.id + ")"; //D genericObject
- const str_a2 = "og2=(" + og2.elementClass + ",id=" + og2.id + ")"; //D
- if (this.alreadyHasIntersection(og1,og2,str_a1,str_a2)) return;
- console.log("intersection-drawer.js!drawPoint(): create intersection between " + str_a1 + " , " + str_a2);
- const intersectionOg1Og2 = og1.getIntersection(og2);
- const intersectionPoints = intersectionService.addIntersections(intersectionOg1Og2);
- this.drawByIntersectionPoints(intersectionPoints);
- }
- drawByIntersectionPoints (intersectionPoints) {
- for (let index = 0; index < intersectionPoints.length; index++) {
- const intersectionPoint = intersectionPoints[index];
- intersectionPoint.update();
- // if (!intersectionPoint.visible) return;
- const point = PointDrawer.drawPoint(intersectionPoint, true, false, true);
- const aggregator = new DrawerAggregator(this, intersectionPoint, point.konvaObject, ELEMENTS_CLASS.INTERSECTION_POINT);
- super.addAggregator(aggregator);
- this.aggregatorB.addAggregator(aggregator);
- this.aggregatorA.addAggregator(aggregator);
- }
- }
- isValidObject (konvaObject) {
- switch (konvaObject.attrs.class) {
- case ELEMENTS_CLASS.LINE:
- return true;
- case ELEMENTS_CLASS.LINE_SEGMENT:
- return true;
- case ELEMENTS_CLASS.CIRCUMFERENCE:
- return true;
- case ELEMENTS_CLASS.MIDDLE_POINT:
- return true;
- default:
- return false;
- }
- }
- update (aggregator, e) {
- aggregator.genericObject.update(aggregator, e);
- if (!aggregator.genericObject.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
- if (aggregator.visible) {
- aggregator.konvaObject.hide();
- aggregator.aggregators.forEach(a => {
- a.visible = false;
- a.konvaObject.hide();
- });
- this.batchDraw();
- }
- aggregator.visible = false;
- return;
- }
- //todo: konva objects
- aggregator.konvaObject.children[0].x(aggregator.genericObject.posX + 10);
- aggregator.konvaObject.children[0].y(aggregator.genericObject.posY - 10);
- aggregator.konvaObject.children[1].x(aggregator.genericObject.posX);
- aggregator.konvaObject.children[1].y(aggregator.genericObject.posY);
- if (!aggregator.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
- aggregator.genericObject.visible = true;
- aggregator.konvaObject.show();
- aggregator.aggregators.forEach(a => {
- a.visible = true;
- a.konvaObject.show();
- });
- aggregator.visible = true;
- }
- this.batchDraw();
- }
- reset () {
- this.aggregatorA = undefined;
- this.aggregatorB = undefined;
- this.setState(undefined);
- }
- } // export class IntersectionDrawer extends Drawer
|