line-drawer.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
  2. import { label as Label } from "../../../component-registry/label";
  3. import { LineModel } from "../models/line-model";
  4. import { objects as Objects } from "../../../core/application/objects";
  5. import { SelectableDrawer } from "../../../core/drawers/selectable-drawer";
  6. import { LineSegmentDrawer } from "../../line-segment-component/drawers/line-segment-drawer";
  7. import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator";
  8. import { LineSegmentModel } from "../../line-segment-component/models/line-segment-model";
  9. export class LineDrawer extends LineSegmentDrawer {
  10. constructor() {
  11. super();
  12. this.setElementClass(ELEMENTS_CLASS.LINE);
  13. }
  14. drawByStates(konvaObject) {
  15. let aggregator = undefined;
  16. if (konvaObject != undefined) {
  17. aggregator = Objects.getByKonvaObject(konvaObject)[0];
  18. }
  19. if (this.state == undefined) {
  20. super.setState(LineDrawer.FIRST_POINT_STATE);
  21. } else if (this.state == LineDrawer.FIRST_POINT_STATE) {
  22. aggregator =
  23. aggregator != undefined ? aggregator : this.pointDrawer.drawPoint();
  24. this.setAggregatorA(aggregator);
  25. super.setState(LineDrawer.SECOND_POINT_STATE);
  26. } else if (this.state == LineDrawer.SECOND_POINT_STATE) {
  27. aggregator =
  28. aggregator != undefined ? aggregator : this.pointDrawer.drawPoint();
  29. this.setAggregatorB(aggregator);
  30. this.drawByPoints(
  31. [this.pointA, this.pointB],
  32. [this.aggregatorA, this.aggregatorB]
  33. );
  34. super.setState(LineDrawer.FIRST_POINT_STATE);
  35. }
  36. }
  37. drawByLineSegment(lineSegment) {
  38. this.lineSegment = lineSegment;
  39. const group = SelectableDrawer.getKonvaGroup(false);
  40. const text = LineDrawer.getKonvaText(lineSegment, lineSegment.label);
  41. group.add(text);
  42. const konvaObject = LineDrawer.getKonvaLine(
  43. lineSegment.pointA,
  44. lineSegment.pointB
  45. );
  46. group.add(konvaObject);
  47. super.setKonvaObject(group);
  48. const aggregator = new DrawerAggregator(
  49. this,
  50. this.lineSegment,
  51. group,
  52. ELEMENTS_CLASS.LINE
  53. );
  54. super.addAggregator(aggregator);
  55. const aggregators = this.resolveAggregators([this.lineSegment.pointA, this.lineSegment.pointB], undefined);
  56. aggregators[1].addAggregator(aggregator);
  57. aggregators[0].addAggregator(aggregator);
  58. SelectableDrawer.drawObject(this.konvaObject);
  59. this.konvaObject.zIndex(1);
  60. super.batchDraw();
  61. SelectableDrawer.setMaxIndex(aggregators[0].konvaObject);
  62. SelectableDrawer.setMaxIndex(aggregators[1].konvaObject);
  63. }
  64. drawByPoints(points, aggregators) {
  65. if (points == undefined || points.length < 1) return;
  66. this.setPointA(points[0]);
  67. this.setPointB(points[1]);
  68. aggregators = this.resolveAggregators(points, aggregators, true);
  69. this.label = Label.draw(true);
  70. this.lineSegment = new LineModel(
  71. this.pointA,
  72. this.pointB,
  73. this.label
  74. );
  75. this.drawByLineSegment(this.lineSegment);
  76. this.reset();
  77. }
  78. update(aggregator, e) {
  79. if (!aggregator.visible) return;
  80. const pointA = aggregator.genericObject.pointA;
  81. const pointB = aggregator.genericObject.pointB;
  82. const pos = aggregator.genericObject.getMiddlePoint();
  83. aggregator.konvaObject.children[0].x(pos.posX);
  84. aggregator.konvaObject.children[0].y(pos.posY - 20);
  85. super.batchDra
  86. aggregator.konvaObject.children[1].points([
  87. pointA.posX,
  88. pointA.posY,
  89. pointB.posX,
  90. pointB.posY
  91. ]);
  92. super.batchDraw();
  93. }
  94. // insertPoint(aggregator) {
  95. // const pointA = aggregator.genericObject.pointA;
  96. // const pointB = aggregator.genericObject.pointB;
  97. // const pointCAggregator = this.pointDrawer.drawPoint();
  98. // const pointC = pointCAggregator.genericObject;
  99. // aggregator.konvaObject.points([
  100. // pointA.posX,
  101. // pointA.posY,
  102. // pointB.posX,
  103. // pointB.posY,
  104. // pointC.posX,
  105. // pointC.posY
  106. // ]);
  107. // super.batchDraw();
  108. // }
  109. static getKonvaLine(pointA, pointB, useLabel) {
  110. const lineSegment = new LineSegmentModel(pointA, pointB);
  111. const xA = pointA.posX,
  112. xB = pointB.posX,
  113. yA = pointA.posY,
  114. yB = pointB.posY;
  115. // x0 - x
  116. const d1 = xB - xA,
  117. // y0 - y
  118. d2 = yB - yA;
  119. // const dA = d1 * xA + d2 * yA;
  120. // const dB = d1 * xB + d2 * yB;
  121. const a = -d1 / d2;
  122. const b = (a * xA) * -1;
  123. // y = ax + b;
  124. const Qy = -d1 / d2 * 0 + b;
  125. const Px = (0 - b) / a;
  126. const points = [Px, 0, 0, Qy];
  127. const line = new Konva.Line({
  128. points: points,
  129. stroke: "grey",
  130. strokeWidth: 2,
  131. lineJoin: "round",
  132. draggable: false,
  133. strokeScaleEnabled: false,
  134. class: ELEMENTS_CLASS.LINE,
  135. connections: [],
  136. index: 1,
  137. selectable: false,
  138. draggable: false,
  139. style: { stroke: "grey", fill: "grey" }
  140. });
  141. SelectableDrawer.setSelectableIfIntersectionChanged(line);
  142. return line;
  143. }
  144. static drawKonvaLine(pointA, pointB) {
  145. const line = LineDrawer.getKonvaLine(pointA, pointB);
  146. return line;
  147. }
  148. }