1
0

intersection-drawer.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. // @calledby ./app/core/drawers/stage.js! draw (e): this.drawer.draw(e);
  34. draw (e) {
  35. if (e != undefined && e.attrs != undefined) {
  36. this.aggregatorA = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.r);
  37. this.aggregatorB = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.s);
  38. this.drawByIntersectionPoints([e.attrs.genericObject]);
  39. return;
  40. }
  41. if (e == undefined || !this.isValidObject(e.target)) return;
  42. const selectedTool = App.getSelectedTool();
  43. if (selectedTool != undefined && selectedTool.drawer != undefined && selectedTool.drawer.elementClass == ELEMENTS_CLASS.INTERSECTION_POINT) {
  44. if (this.state == undefined || this.state == IntersectionDrawer.FIRST_OBJECT_STATE) {
  45. this.setFirstObject(e.target);
  46. this.setState(IntersectionDrawer.SECOND_OBJECT_STATE);
  47. }
  48. else if (this.state == IntersectionDrawer.SECOND_OBJECT_STATE) {
  49. this.setSecondObject(e.target);
  50. this.drawPoint();
  51. this.reset();
  52. // this.clear();
  53. }
  54. }
  55. }
  56. setFirstObject (konvaObject) {
  57. const aggregator = this.getObjectAggregator(konvaObject);
  58. this.aggregatorA = aggregator;
  59. }
  60. setSecondObject (konvaObject) {
  61. const aggregator = this.getObjectAggregator(konvaObject);
  62. this.aggregatorB = aggregator;
  63. }
  64. getObjectAggregator (konvaObject) {
  65. return objects.getByKonvaObject(konvaObject)[0];
  66. }
  67. getObjectAggregatorByGenericObject (genericObject) {
  68. return objects.getByGenericObject(genericObject)[0];
  69. }
  70. // Avoid to create intersection between lines/segments when some defining point is the intersection
  71. // Return true <=> need a new point
  72. alreadyHasIntersection (og1, og2, str_a1, str_a2) {
  73. if ((og1.elementClass==ELEMENTS_CLASS.LINE || og1.elementClass==ELEMENTS_CLASS.LINE_SEGMENT) &&
  74. (og2.elementClass==ELEMENTS_CLASS.LINE || og2.elementClass==ELEMENTS_CLASS.LINE_SEGMENT)) {
  75. // Try to avoid redundant point
  76. //D var aux = " ELEMENTS_CLASS.LINE=" + ELEMENTS_CLASS.LINE + ", ";
  77. if (og1.pointA==og2.pointA || og1.pointA==og2.pointB || og1.pointB==og2.pointA || og1.pointB==og2.pointB) {
  78. var aux2 = " "+og1.pointA+","+og1.pointB+";"+og2.pointA+","+og2.pointB+" ";
  79. console.log("intersection-drawer.js!alreadyHasIntersection(): existing intersection, nothing to be done: " + str_a1 + " , " + str_a2 + ", " + aux2);
  80. //TODO need to become visible? "og1.visible = true;" or "og2.visible = true;"
  81. return true;
  82. }
  83. }
  84. return false;
  85. }
  86. // Used to create new intersection point
  87. //@calledby this.draw()
  88. drawPoint () {
  89. const og1 = this.aggregatorA.genericObject, og2 = this.aggregatorB.genericObject;
  90. const str_a1 = "og1=(" + og1.elementClass + ",id=" + og1.id + ")"; //D genericObject
  91. const str_a2 = "og2=(" + og2.elementClass + ",id=" + og2.id + ")"; //D
  92. if (this.alreadyHasIntersection(og1,og2,str_a1,str_a2)) return;
  93. console.log("intersection-drawer.js!drawPoint(): create intersection between " + str_a1 + " , " + str_a2);
  94. const intersectionOg1Og2 = og1.getIntersection(og2);
  95. const intersectionPoints = intersectionService.addIntersections(intersectionOg1Og2);
  96. this.drawByIntersectionPoints(intersectionPoints);
  97. }
  98. drawByIntersectionPoints (intersectionPoints) {
  99. for (let index = 0; index < intersectionPoints.length; index++) {
  100. const intersectionPoint = intersectionPoints[index];
  101. intersectionPoint.update();
  102. // if (!intersectionPoint.visible) return;
  103. const point = PointDrawer.drawPoint(intersectionPoint, true, false, true);
  104. const aggregator = new DrawerAggregator(this, intersectionPoint, point.konvaObject, ELEMENTS_CLASS.INTERSECTION_POINT);
  105. super.addAggregator(aggregator);
  106. this.aggregatorB.addAggregator(aggregator);
  107. this.aggregatorA.addAggregator(aggregator);
  108. }
  109. }
  110. isValidObject (konvaObject) {
  111. switch (konvaObject.attrs.class) {
  112. case ELEMENTS_CLASS.LINE:
  113. return true;
  114. case ELEMENTS_CLASS.LINE_SEGMENT:
  115. return true;
  116. case ELEMENTS_CLASS.CIRCUMFERENCE:
  117. return true;
  118. case ELEMENTS_CLASS.MIDDLE_POINT:
  119. return true;
  120. default:
  121. return false;
  122. }
  123. }
  124. update (aggregator, e) {
  125. aggregator.genericObject.update(aggregator, e);
  126. if (!aggregator.genericObject.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  127. if (aggregator.visible) {
  128. aggregator.konvaObject.hide();
  129. aggregator.aggregators.forEach(a => {
  130. a.visible = false;
  131. a.konvaObject.hide();
  132. });
  133. this.batchDraw();
  134. }
  135. aggregator.visible = false;
  136. return;
  137. }
  138. //todo: konva objects
  139. aggregator.konvaObject.children[0].x(aggregator.genericObject.posX + 10);
  140. aggregator.konvaObject.children[0].y(aggregator.genericObject.posY - 10);
  141. aggregator.konvaObject.children[1].x(aggregator.genericObject.posX);
  142. aggregator.konvaObject.children[1].y(aggregator.genericObject.posY);
  143. if (!aggregator.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  144. aggregator.genericObject.visible = true;
  145. aggregator.konvaObject.show();
  146. aggregator.aggregators.forEach(a => {
  147. a.visible = true;
  148. a.konvaObject.show();
  149. });
  150. aggregator.visible = true;
  151. }
  152. this.batchDraw();
  153. }
  154. reset () {
  155. this.aggregatorA = undefined;
  156. this.aggregatorB = undefined;
  157. this.setState(undefined);
  158. }
  159. } // export class IntersectionDrawer extends Drawer