line-segment-drawer.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
  2. import { label as Label } from "../../../component-registry/label";
  3. import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator";
  4. import { selector as Selector } from "../../../core/application/selector";
  5. import { LineSegmentModel } from "../models/line-segment-model";
  6. import { PointDrawer } from "../../point-component/drawers/point-drawer";
  7. import { objects as Objects } from "../../../core/application/objects";
  8. import { SelectableDrawer } from "../../../core/drawers/selectable-drawer";
  9. export class LineSegmentDrawer extends SelectableDrawer {
  10. static FIRST_POINT_STATE() {
  11. return "FIRST_POINT";
  12. }
  13. static SECOND_POINT_STATE() {
  14. return "SECOND_POINT";
  15. }
  16. constructor() {
  17. super();
  18. this.pointA;
  19. this.pointB;
  20. this.aggregatorA;
  21. this.aggregatorB;
  22. this.label;
  23. this.states = [
  24. LineSegmentDrawer.FIRST_POINT_STATE,
  25. LineSegmentDrawer.SECOND_POINT_STATE
  26. ];
  27. this.lineSegment;
  28. this.pointDrawer = new PointDrawer();
  29. super.setElementClass(ELEMENTS_CLASS.LINE_SEGMENT);
  30. }
  31. setPointA(point) {
  32. this.pointA = point;
  33. }
  34. setPointB(point) {
  35. this.pointB = point;
  36. }
  37. setAggregatorA(aggregator) {
  38. this.aggregatorA = aggregator;
  39. this.setPointA(aggregator.genericObject);
  40. }
  41. setAggregatorB(aggregator) {
  42. this.aggregatorB = aggregator;
  43. this.setPointB(aggregator.genericObject);
  44. }
  45. draw(e) {
  46. if (e != undefined) {
  47. if (
  48. e.target != undefined &&
  49. e.target.attrs.class != undefined &&
  50. (e.target.attrs.class == ELEMENTS_CLASS.POINT ||
  51. e.target.attrs.class == ELEMENTS_CLASS.INTERSECTION_POINT)
  52. ) {
  53. this.drawByStates(e.target);
  54. return;
  55. } else if (e.attrs != undefined && e.attrs.genericObject != undefined) {
  56. this.drawByLineSegment(e.attrs.genericObject)
  57. return;
  58. }
  59. }
  60. const points = Selector.getSelectedPoints();
  61. if (points == undefined || points.length == 0) {
  62. this.drawByStates();
  63. return;
  64. }
  65. this.drawByPoints(points);
  66. }
  67. drawByStates(konvaObject) {
  68. let aggregator = undefined;
  69. if (konvaObject != undefined) {
  70. aggregator = Objects.getByKonvaObject(konvaObject)[0];
  71. }
  72. if (this.state == undefined) {
  73. super.setState(LineSegmentDrawer.FIRST_POINT_STATE);
  74. } else if (this.state == LineSegmentDrawer.FIRST_POINT_STATE) {
  75. aggregator =
  76. aggregator != undefined ? aggregator : this.pointDrawer.drawPoint();
  77. this.setAggregatorA(aggregator);
  78. super.setState(LineSegmentDrawer.SECOND_POINT_STATE);
  79. } else if (this.state == LineSegmentDrawer.SECOND_POINT_STATE) {
  80. aggregator =
  81. aggregator != undefined ? aggregator : this.pointDrawer.drawPoint();
  82. this.setAggregatorB(aggregator);
  83. this.drawByPoints(
  84. [this.pointA, this.pointB],
  85. [this.aggregatorA, this.aggregatorB]
  86. );
  87. super.setState(LineSegmentDrawer.FIRST_POINT_STATE);
  88. }
  89. }
  90. drawByPoints(points, aggregators) {
  91. if (points == undefined || points.length < 1) return;
  92. this.setPointA(points[0]);
  93. this.setPointB(points[1]);
  94. aggregators = this.resolveAggregators(points, aggregators, true);
  95. this.label = Label.draw(true);
  96. this.lineSegment = new LineSegmentModel(
  97. this.pointA,
  98. this.pointB,
  99. this.label
  100. );
  101. this.drawByLineSegment(this.lineSegment);
  102. this.reset();
  103. }
  104. drawByLineSegment(lineSegment) {
  105. this.lineSegment = lineSegment;
  106. const group = SelectableDrawer.getKonvaGroup(false);
  107. const text = LineSegmentDrawer.getKonvaText(lineSegment, lineSegment.label);
  108. group.add(text);
  109. const konvaObject = LineSegmentDrawer.getKonvaLine(
  110. lineSegment.pointA,
  111. lineSegment.pointB
  112. );
  113. group.add(konvaObject);
  114. super.setKonvaObject(group);
  115. const aggregator = new DrawerAggregator(
  116. this,
  117. this.lineSegment,
  118. group,
  119. ELEMENTS_CLASS.LINE_SEGMENT
  120. );
  121. super.addAggregator(aggregator);
  122. const aggregators = this.resolveAggregators([this.lineSegment.pointA, this.lineSegment.pointB], undefined);
  123. aggregators[1].addAggregator(aggregator);
  124. aggregators[0].addAggregator(aggregator);
  125. SelectableDrawer.drawObject(this.konvaObject);
  126. this.konvaObject.zIndex(1);
  127. super.batchDraw();
  128. SelectableDrawer.setMaxIndex(aggregators[0].konvaObject);
  129. SelectableDrawer.setMaxIndex(aggregators[1].konvaObject);
  130. }
  131. resolveAggregators(points, aggregators, selected) {
  132. this.pointA = points[0];
  133. this.pointB = points[1];
  134. if (aggregators == undefined && selected == true)
  135. aggregators = Selector.getSelectedPointsAggregators();
  136. else {
  137. aggregators = [
  138. Objects.getByGenericObject(this.pointA)[0],
  139. Objects.getByGenericObject(this.pointB)[0]
  140. ];
  141. }
  142. return aggregators;
  143. }
  144. update(aggregator, e) {
  145. if (!aggregator.visible) return;
  146. const pointA = aggregator.genericObject.pointA;
  147. const pointB = aggregator.genericObject.pointB;
  148. const pos = aggregator.genericObject.getMiddlePoint();
  149. aggregator.konvaObject.children[0].x(pos.posX);
  150. aggregator.konvaObject.children[0].y(pos.posY - 20);
  151. super.batchDra
  152. aggregator.konvaObject.children[1].points([
  153. pointA.posX,
  154. pointA.posY,
  155. pointB.posX,
  156. pointB.posY
  157. ]);
  158. super.batchDraw();
  159. }
  160. insertPoint(aggregator) {
  161. const pointA = aggregator.genericObject.pointA;
  162. const pointB = aggregator.genericObject.pointB;
  163. const pointCAggregator = this.pointDrawer.drawPoint();
  164. const pointC = pointCAggregator.genericObject;
  165. aggregator.konvaObject.points([
  166. pointA.posX,
  167. pointA.posY,
  168. pointB.posX,
  169. pointB.posY,
  170. pointC.posX,
  171. pointC.posY
  172. ]);
  173. super.batchDraw();
  174. }
  175. static getKonvaText(lineSegment, label) {
  176. const pos = lineSegment.getMiddlePoint();
  177. return new Konva.Text({
  178. x: pos.posX,
  179. y: pos.posY - 20,
  180. text: label,
  181. fontSize: 14,
  182. fontFamily: "Calibri",
  183. fill: "#434a45",
  184. stroke: "#ffffff",
  185. strokeWidth: 0.2,
  186. draggable: false,
  187. resizeEnabled: false,
  188. transformEnabled: false,
  189. selectable: false
  190. });
  191. }
  192. static getKonvaLine(pointA, pointB, useLabel) {
  193. const points = [pointA.posX, pointA.posY, pointB.posX, pointB.posY];
  194. const line = new Konva.Line({
  195. points: points,
  196. stroke: "grey",
  197. strokeWidth: 2,
  198. lineJoin: "round",
  199. draggable: false,
  200. strokeScaleEnabled: false,
  201. class: ELEMENTS_CLASS.LINE_SEGMENT,
  202. connections: [],
  203. index: 1,
  204. selectable: false,
  205. draggable: false,
  206. style: { stroke: "grey", fill: "grey" }
  207. });
  208. SelectableDrawer.setSelectableIfIntersectionChanged(line);
  209. return line;
  210. }
  211. static drawKonvaLine(pointA, pointB) {
  212. const line = LineSegmentDrawer.getKonvaLine(pointA, pointB);
  213. return line;
  214. }
  215. }