whole-line.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { Attrib, ShapeType } from "../../../type";
  2. import { DEV } from "../../../env";
  3. import { WholeLinePointHelper, WholeLineLineHelper } from "../helper";
  4. import { WholeLinePoint, WholeLinePointAttrib } from "./whole-line-point";
  5. import { WholeLineLine, WholeLineLineAttrib } from "./whole-line-line";
  6. import { WholeLinePolygon, WholeLinePolygonAttrib } from "./whole-line-polygon";
  7. import { Group } from "konva/lib/Group";
  8. import { Entity, EntityProps } from "../../entity";
  9. import {
  10. IncEntitysFactory,
  11. incEntitysFactoryGenerate,
  12. } from "../../../shared/entity-utils";
  13. import { watch } from "vue";
  14. export type WholeLineAttrib<
  15. P extends WholeLinePointAttrib = WholeLinePointAttrib,
  16. L extends WholeLineLineAttrib = WholeLineLineAttrib,
  17. PY extends WholeLinePolygonAttrib = WholeLinePolygonAttrib
  18. > = Attrib & {
  19. points: P[];
  20. lines: L[];
  21. polygons: PY[];
  22. };
  23. export type WholeLineProps<
  24. W extends WholeLineAttrib<P, L, PY>,
  25. P extends WholeLinePointAttrib = WholeLinePointAttrib,
  26. L extends WholeLineLineAttrib = WholeLineLineAttrib,
  27. PY extends WholeLinePolygonAttrib = WholeLinePolygonAttrib
  28. > = EntityProps<W>;
  29. export type WLP<W extends WholeLineAttrib> = W extends WholeLineAttrib<infer P>
  30. ? P
  31. : never;
  32. export type WLL<W extends WholeLineAttrib> = W extends WholeLineAttrib<
  33. WholeLinePointAttrib,
  34. infer L
  35. >
  36. ? L
  37. : never;
  38. export type WLPY<W extends WholeLineAttrib> = W extends WholeLineAttrib<
  39. WholeLinePointAttrib,
  40. WholeLineLineAttrib,
  41. infer PY
  42. >
  43. ? PY
  44. : never;
  45. export class WholeLine<
  46. W extends WholeLineAttrib = WholeLineAttrib,
  47. PS extends ShapeType = ShapeType,
  48. LS extends ShapeType = ShapeType,
  49. PYS extends ShapeType = ShapeType
  50. > extends Entity<W, Group> {
  51. static namespace = "whole-line";
  52. incLinesFactory: IncEntitysFactory<WLL<W>, WholeLineLine<WLL<W>, LS>>;
  53. incPointsFactory: IncEntitysFactory<WLP<W>, WholeLinePoint<WLP<W>, PS>>;
  54. incPolygonFactory: IncEntitysFactory<WLPY<W>, WholeLinePolygon<WLPY<W>, PYS>>;
  55. private incLinesHelperFactory: IncEntitysFactory<
  56. WholeLineLineAttrib,
  57. WholeLineLineHelper
  58. >;
  59. private incPointsHelperFactory?: IncEntitysFactory<
  60. WholeLinePointAttrib,
  61. WholeLinePointHelper
  62. >;
  63. constructor(props: WholeLineProps<W>) {
  64. props.name = props.name || WholeLine.namespace + props.attrib.id;
  65. super(props);
  66. }
  67. initIncFactory() {
  68. this.incLinesFactory = incEntitysFactoryGenerate(
  69. WholeLineLine<WLL<W>, LS>,
  70. this,
  71. (line) => {
  72. line.setConfig(this.attrib);
  73. }
  74. );
  75. this.incPointsFactory = incEntitysFactoryGenerate(
  76. WholeLinePoint<WLP<W>, PS>,
  77. this
  78. );
  79. this.incPolygonFactory = incEntitysFactoryGenerate(
  80. WholeLinePolygon<WLPY<W>, PYS>,
  81. this
  82. );
  83. if (DEV) {
  84. this.incLinesHelperFactory = incEntitysFactoryGenerate(
  85. WholeLineLineHelper,
  86. this,
  87. (line) => {
  88. line.setConfig(this.attrib);
  89. }
  90. );
  91. this.incPointsHelperFactory = incEntitysFactoryGenerate(
  92. WholeLinePointHelper,
  93. this
  94. );
  95. this.incPointsHelperFactory = incEntitysFactoryGenerate(
  96. WholeLinePointHelper,
  97. this
  98. );
  99. }
  100. }
  101. init() {
  102. this.initIncFactory();
  103. super.init();
  104. }
  105. initShape() {
  106. return new Group({ id: this.name });
  107. }
  108. getRedrawLines() {
  109. // 去重 防止来回线段绘画两次
  110. const lines: WLL<W>[] = [];
  111. for (let i = this.attrib.lines.length - 1; i >= 0; i--) {
  112. const a = this.attrib.lines[i];
  113. let j = 0;
  114. for (j = 0; j < i; j++) {
  115. const b = this.attrib.lines[j];
  116. if (
  117. b.pointIds.includes(a.pointIds[0]) &&
  118. b.pointIds.includes(a.pointIds[1])
  119. ) {
  120. break;
  121. }
  122. }
  123. if (i === j) {
  124. lines.push(a as WLL<W>);
  125. }
  126. }
  127. return lines;
  128. }
  129. diffRedraw() {
  130. const lineAttribs = this.getRedrawLines();
  131. if (DEV) {
  132. this.incLinesHelperFactory(lineAttribs);
  133. this.incPointsHelperFactory(this.attrib.points);
  134. }
  135. const pointEntityInc = this.incPointsFactory(this.attrib.points as any);
  136. const lineEntityInc = this.incLinesFactory(lineAttribs);
  137. const polygonEntityInc = this.incPolygonFactory(
  138. this.attrib.polygons as any
  139. );
  140. return { lineEntityInc, pointEntityInc, polygonEntityInc };
  141. }
  142. initReactive() {
  143. return watch(
  144. () => ({
  145. pointIds: this.attrib.points.map(({ id }) => id),
  146. lineIds: this.attrib.lines.map(({ id }) => id),
  147. }),
  148. this.diffRedraw.bind(this),
  149. { immediate: true, flush: "sync" }
  150. );
  151. }
  152. }