intersection-drawer.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { PointDrawer } from "../../point-component/drawers/point-drawer";
  2. import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
  3. import { Drawer } from "../../../core/drawers/drawer";
  4. import { app as App } from "../../../app";
  5. import { objects } from "../../../core/application/objects";
  6. import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator";
  7. import { intersectionService } from "../services/intersection-service";
  8. export class IntersectionDrawer extends Drawer {
  9. static FIRST_OBJECT_STATE() {
  10. return "FIRST_OBJECT";
  11. }
  12. static SECOND_OBJECT_STATE() {
  13. return "SECOND_OBJECTf";
  14. }
  15. constructor() {
  16. super();
  17. this.aggregatorA;
  18. this.aggregatorB;
  19. this.label;
  20. this.states = [
  21. IntersectionDrawer.FIRST_OBJECT_STATE,
  22. IntersectionDrawer.SECOND_OBJECT_STATE
  23. ];
  24. this.intersections = [];
  25. this.pointDrawer = new PointDrawer();
  26. super.setElementClass(ELEMENTS_CLASS.INTERSECTION_POINT);
  27. }
  28. draw(e) {
  29. if (e != undefined && e.attrs != undefined) {
  30. this.aggregatorA = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.r);
  31. this.aggregatorB = this.getObjectAggregatorByGenericObject(e.attrs.genericObject.s);
  32. this.drawByIntersectionPoints([e.attrs.genericObject]);
  33. return;
  34. }
  35. if (e == undefined || !this.isValidObject(e.target)) return;
  36. const selectedTool = App.getSelectedTool();
  37. if (
  38. selectedTool != undefined &&
  39. selectedTool.drawer != undefined &&
  40. selectedTool.drawer.elementClass == ELEMENTS_CLASS.INTERSECTION_POINT
  41. ) {
  42. if (
  43. this.state == undefined ||
  44. this.state == IntersectionDrawer.FIRST_OBJECT_STATE
  45. ) {
  46. this.setFirstObject(e.target);
  47. this.setState(IntersectionDrawer.SECOND_OBJECT_STATE);
  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. drawPoint() {
  71. const intersectionPoints = intersectionService.addIntersections(this.aggregatorA.genericObject.getIntersection(
  72. this.aggregatorB.genericObject
  73. ));
  74. this.drawByIntersectionPoints(intersectionPoints);
  75. }
  76. drawByIntersectionPoints(intersectionPoints) {
  77. for (let index = 0; index < intersectionPoints.length; index++) {
  78. const intersectionPoint = intersectionPoints[index];
  79. intersectionPoint.update();
  80. // if (!intersectionPoint.visible) return;
  81. const point = PointDrawer.drawPoint(
  82. intersectionPoint,
  83. true,
  84. false,
  85. true
  86. );
  87. const aggregator = new DrawerAggregator(
  88. this,
  89. intersectionPoint,
  90. point.konvaObject,
  91. ELEMENTS_CLASS.INTERSECTION_POINT
  92. );
  93. super.addAggregator(aggregator);
  94. this.aggregatorB.addAggregator(aggregator);
  95. this.aggregatorA.addAggregator(aggregator);
  96. }
  97. }
  98. isValidObject(konvaObject) {
  99. switch (konvaObject.attrs.class) {
  100. case ELEMENTS_CLASS.LINE_SEGMENT:
  101. return true;
  102. case ELEMENTS_CLASS.CIRCUMFERENCE:
  103. return true;
  104. default:
  105. return false;
  106. }
  107. }
  108. update(aggregator, e) {
  109. aggregator.genericObject.update(aggregator, e);
  110. if (!aggregator.genericObject.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  111. if (aggregator.visible) {
  112. aggregator.konvaObject.hide();
  113. aggregator.aggregators.forEach(a => {
  114. a.visible = false;
  115. a.konvaObject.hide();
  116. });
  117. this.batchDraw();
  118. }
  119. aggregator.visible = false;
  120. return;
  121. }
  122. //todo: konva objects
  123. aggregator.konvaObject.children[0].x(aggregator.genericObject.posX + 10);
  124. aggregator.konvaObject.children[0].y(aggregator.genericObject.posY - 10);
  125. aggregator.konvaObject.children[1].x(aggregator.genericObject.posX);
  126. aggregator.konvaObject.children[1].y(aggregator.genericObject.posY);
  127. if (!aggregator.visible || aggregator.genericObject.posX == Number.MAX_SAFE_INTEGER) {
  128. aggregator.genericObject.visible = true;
  129. aggregator.konvaObject.show();
  130. aggregator.aggregators.forEach(a => {
  131. a.visible = true;
  132. a.konvaObject.show();
  133. });
  134. aggregator.visible = true;
  135. }
  136. this.batchDraw();
  137. }
  138. reset() {
  139. this.aggregatorA = undefined;
  140. this.aggregatorB = undefined;
  141. this.setState(undefined);
  142. }
  143. }