intersection-drawer.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. export class IntersectionDrawer extends Drawer {
  8. static FIRST_OBJECT_STATE() {
  9. return "FIRST_OBJECT";
  10. }
  11. static SECOND_OBJECT_STATE() {
  12. return "SECOND_OBJECTf";
  13. }
  14. constructor() {
  15. super();
  16. this.objectA;
  17. this.objectB;
  18. this.aggregatorA;
  19. this.aggregatorB;
  20. this.label;
  21. this.point;
  22. this.states = [
  23. IntersectionDrawer.FIRST_OBJECT_STATE,
  24. IntersectionDrawer.SECOND_OBJECT_STATE
  25. ];
  26. this.intersections = [];
  27. this.pointDrawer = new PointDrawer();
  28. super.setElementClass(ELEMENTS_CLASS.INTERSECTION_POINT);
  29. }
  30. draw(e) {
  31. if (e == undefined || !this.isValidObject(e.target)) return;
  32. const selectedTool = App.getSelectedTool();
  33. if (
  34. selectedTool != undefined &&
  35. selectedTool.drawer != undefined &&
  36. selectedTool.drawer.elementClass == ELEMENTS_CLASS.INTERSECTION_POINT
  37. ) {
  38. if (
  39. this.state == undefined ||
  40. this.state == IntersectionDrawer.FIRST_OBJECT_STATE
  41. ) {
  42. this.setFirstObject(e.target);
  43. this.setState(IntersectionDrawer.SECOND_OBJECT_STATE);
  44. } else if (this.state == IntersectionDrawer.SECOND_OBJECT_STATE) {
  45. this.setSecondObject(e.target);
  46. this.drawPoint();
  47. this.clear();
  48. }
  49. }
  50. }
  51. setFirstObject(konvaObject) {
  52. const aggregator = this.getObjectAggregator(konvaObject);
  53. this.aggregatorA = aggregator;
  54. }
  55. setSecondObject(konvaObject) {
  56. const aggregator = this.getObjectAggregator(konvaObject);
  57. this.aggregatorB = aggregator;
  58. }
  59. getObjectAggregator(konvaObject) {
  60. return objects.getByKonvaObject(konvaObject)[0];
  61. }
  62. drawPoint() {
  63. const intersectionPoints = this.aggregatorA.genericObject.getIntersection(
  64. this.aggregatorB.genericObject
  65. );
  66. for (let index = 0; index < intersectionPoints.length; index++) {
  67. const intersectionPoint = intersectionPoints[index];
  68. intersectionPoint.update();
  69. const point = PointDrawer.drawPoint(
  70. intersectionPoint,
  71. false,
  72. false,
  73. true
  74. );
  75. const aggregator = new DrawerAggregator(
  76. this,
  77. intersectionPoint,
  78. point.konvaObject,
  79. ELEMENTS_CLASS.INTERSECTION_POINT
  80. );
  81. this.point = point.geometricObject;
  82. super.addAggregator(aggregator);
  83. this.aggregatorB.addAggregator(aggregator);
  84. this.aggregatorA.addAggregator(aggregator);
  85. }
  86. }
  87. isValidObject(konvaObject) {
  88. switch (konvaObject.attrs.class) {
  89. case ELEMENTS_CLASS.LINE_SEGMENT:
  90. return true;
  91. case ELEMENTS_CLASS.CIRCUMFERENCE:
  92. return true;
  93. default:
  94. return false;
  95. }
  96. }
  97. update(aggregator, e) {
  98. aggregator.genericObject.update(aggregator, e);
  99. if (!aggregator.genericObject.visible) {
  100. if (aggregator.visible) {
  101. aggregator.konvaObject.hide();
  102. aggregator.aggregators.forEach(a => {
  103. a.visible = false;
  104. a.konvaObject.hide();
  105. });
  106. this.batchDraw();
  107. }
  108. aggregator.visible = false;
  109. return;
  110. }
  111. aggregator.konvaObject.x(aggregator.genericObject.posX);
  112. aggregator.konvaObject.y(aggregator.genericObject.posY);
  113. if (!aggregator.visible) {
  114. aggregator.konvaObject.show();
  115. aggregator.aggregators.forEach(a => {
  116. a.visible = true;
  117. a.konvaObject.show();
  118. });
  119. aggregator.visible = true;
  120. }
  121. this.batchDraw();
  122. }
  123. }