intersection-drawer.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. * iGeom by LInE
  3. * Provides intersetion point to Geometric Objects (GO)
  4. * www.matematica.br/igeom
  5. * ./app/components/intersection-component/drawers/intersection-drawer.js
  6. * @calledby
  7. * @version 2020/11/02: Implemented Line instersection.
  8. */
  9. import { PointDrawer } from "../../point-component/drawers/point-drawer";
  10. import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
  11. import { Drawer } from "../../../core/drawers/drawer";
  12. import { app as App } from "../../../app";
  13. import { objects } from "../../../core/application/objects";
  14. import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator";
  15. import { intersectionService } from "../services/intersection-service";
  16. export class IntersectionDrawer extends Drawer {
  17. static FIRST_OBJECT_STATE() {
  18. return "FIRST_OBJECT";
  19. }
  20. static SECOND_OBJECT_STATE() {
  21. return "SECOND_OBJECTf";
  22. }
  23. constructor() {
  24. super();
  25. this.aggregatorA;
  26. this.aggregatorB;
  27. this.label;
  28. this.states = [IntersectionDrawer.FIRST_OBJECT_STATE, IntersectionDrawer.SECOND_OBJECT_STATE];
  29. this.intersections = [];
  30. this.pointDrawer = new PointDrawer();
  31. super.setElementClass(ELEMENTS_CLASS.INTERSECTION_POINT);
  32. }
  33. draw(e) {
  34. if (e != undefined && e.attrs != undefined) {
  35. this.aggregatorA = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.r);
  36. this.aggregatorB = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.s);
  37. this.drawByIntersectionPoints([e.attrs.genericObject]);
  38. return;
  39. }
  40. if (e == undefined || !this.isValidObject(e.target)) return;
  41. const selectedTool = App.getSelectedTool();
  42. if (selectedTool != undefined &&
  43. selectedTool.drawer != undefined &&
  44. selectedTool.drawer.elementClass == ELEMENTS_CLASS.INTERSECTION_POINT
  45. ) {
  46. if (this.state == undefined || this.state == IntersectionDrawer.FIRST_OBJECT_STATE) {
  47. this.setFirstObject(e.target);
  48. this.setState(IntersectionDrawer.SECOND_OBJECT_STATE);
  49. }
  50. else if (this.state == IntersectionDrawer.SECOND_OBJECT_STATE) {
  51. this.setSecondObject(e.target);
  52. this.drawPoint();
  53. this.reset();
  54. // this.clear();
  55. }
  56. }
  57. }
  58. setFirstObject(konvaObject) {
  59. const aggregator = this.getObjectAggregator(konvaObject);
  60. this.aggregatorA = aggregator;
  61. }
  62. setSecondObject(konvaObject) {
  63. const aggregator = this.getObjectAggregator(konvaObject);
  64. this.aggregatorB = aggregator;
  65. }
  66. getObjectAggregator(konvaObject) {
  67. return objects.getByKonvaObject(konvaObject)[0];
  68. }
  69. getObjectAggregatorByGenericObject(genericObject) {
  70. return objects.getByGenericObject(genericObject)[0];
  71. }
  72. drawPoint() {
  73. const intersectionPoints = intersectionService.addIntersections(
  74. this.aggregatorA.genericObject.getIntersection(this.aggregatorB.genericObject));
  75. this.drawByIntersectionPoints(intersectionPoints);
  76. }
  77. drawByIntersectionPoints(intersectionPoints) {
  78. for (let index = 0; index < intersectionPoints.length; index++) {
  79. const intersectionPoint = intersectionPoints[index];
  80. intersectionPoint.update();
  81. // if (!intersectionPoint.visible) return;
  82. const point = PointDrawer.drawPoint(intersectionPoint, true, false, true);
  83. const aggregator = new DrawerAggregator(this, intersectionPoint, point.konvaObject, ELEMENTS_CLASS.INTERSECTION_POINT);
  84. super.addAggregator(aggregator);
  85. this.aggregatorB.addAggregator(aggregator);
  86. this.aggregatorA.addAggregator(aggregator);
  87. }
  88. }
  89. isValidObject(konvaObject) {
  90. switch (konvaObject.attrs.class) {
  91. case ELEMENTS_CLASS.LINE:
  92. return true;
  93. case ELEMENTS_CLASS.LINE_SEGMENT:
  94. return true;
  95. case ELEMENTS_CLASS.CIRCUMFERENCE:
  96. return true;
  97. default:
  98. return false;
  99. }
  100. }
  101. update(aggregator, e) {
  102. aggregator.genericObject.update(aggregator, e);
  103. if (!aggregator.genericObject.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  104. if (aggregator.visible) {
  105. aggregator.konvaObject.hide();
  106. aggregator.aggregators.forEach(a => {
  107. a.visible = false;
  108. a.konvaObject.hide();
  109. });
  110. this.batchDraw();
  111. }
  112. aggregator.visible = false;
  113. return;
  114. }
  115. //todo: konva objects
  116. aggregator.konvaObject.children[0].x(aggregator.genericObject.posX + 10);
  117. aggregator.konvaObject.children[0].y(aggregator.genericObject.posY - 10);
  118. aggregator.konvaObject.children[1].x(aggregator.genericObject.posX);
  119. aggregator.konvaObject.children[1].y(aggregator.genericObject.posY);
  120. if (!aggregator.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  121. aggregator.genericObject.visible = true;
  122. aggregator.konvaObject.show();
  123. aggregator.aggregators.forEach(a => {
  124. a.visible = true;
  125. a.konvaObject.show();
  126. });
  127. aggregator.visible = true;
  128. }
  129. this.batchDraw();
  130. }
  131. reset() {
  132. this.aggregatorA = undefined;
  133. this.aggregatorB = undefined;
  134. this.setState(undefined);
  135. }
  136. }