LineService.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import Point from "../Geometry/Point.js";
  2. import Line from "../Geometry/Line.js";
  3. import CurvePoint from "../Geometry/CurvePoint.js";
  4. import CurveLine from "../Geometry/CurveLine.js";
  5. import { dataService } from "./DataService.js";
  6. import { curvePointService } from "./CurvePointService.js";
  7. import VectorCategory from "../enum/VectorCategory.js";
  8. import { mathUtil } from "../Util/MathUtil.js";
  9. import { uiService } from "./UIService.js";
  10. import { addLine } from "../Controls/AddLine.js";
  11. import Constant from "../Constant.js";
  12. export default class LineService {
  13. constructor() {}
  14. create(startPoint, endPoint, category, vectorId) {
  15. if (!startPoint || !endPoint || mathUtil.equalPoint(startPoint, endPoint)) {
  16. return null;
  17. }
  18. let start = new Point(startPoint);
  19. let end = new Point(endPoint);
  20. let line = new Line(start.vectorId, end.vectorId, vectorId);
  21. if (category) {
  22. line.setCategory(category);
  23. }
  24. start.setPointParent(line.vectorId, "start");
  25. end.setPointParent(line.vectorId, "end");
  26. dataService.addPoint(start);
  27. dataService.addPoint(end);
  28. dataService.addLine(line);
  29. return line;
  30. }
  31. createByPointId(startId, endId, category, vectorId) {
  32. let line = new Line(startId, endId, vectorId);
  33. if (category) {
  34. line.setCategory(category);
  35. }
  36. let start = dataService.getPoint(startId);
  37. let end = dataService.getPoint(endId);
  38. start.setPointParent(line.vectorId, "start");
  39. end.setPointParent(line.vectorId, "end");
  40. dataService.addLine(line);
  41. return line;
  42. }
  43. deleteLine(lineId) {
  44. let line = dataService.getLine(lineId);
  45. //如果是基准线
  46. if (line.getCategory() == VectorCategory.Line.BaseLine) {
  47. let points = dataService.getPoints();
  48. for (let key in points) {
  49. let point = dataService.getPoint(key);
  50. let category = point.getCategory();
  51. if (
  52. category == VectorCategory.Point.BasePoint ||
  53. category == VectorCategory.Point.TestBasePoint
  54. ) {
  55. dataService.deletePoint(key);
  56. }
  57. }
  58. uiService.setBaseLineId(null);
  59. }
  60. dataService.deleteLine();
  61. }
  62. copy(vectorId) {
  63. let line = dataService.getLine(vectorId);
  64. let startPoint = dataService.getPoint(line.startId);
  65. let endPoint = dataService.getPoint(line.endId);
  66. startPoint = uiService.getNewPositionForPop(startPoint);
  67. endPoint = uiService.getNewPositionForPop(endPoint);
  68. let newLine = this.create(startPoint, endPoint, line.category);
  69. newLine.setColor(line.color);
  70. if (line.weight) {
  71. newLine.setWeight(line.weight);
  72. }
  73. if (line.style) {
  74. newLine.setStyle(line.style);
  75. }
  76. return newLine.vectorId;
  77. }
  78. getLine(pointId1, pointId2) {
  79. let lines = dataService.getLines();
  80. for (let key in lines) {
  81. const line = dataService.getLine(key);
  82. if (
  83. (line.startId == pointId1 && line.endId == pointId2) ||
  84. (line.endId == pointId1 && line.startId == pointId2)
  85. ) {
  86. return key;
  87. }
  88. }
  89. return null;
  90. }
  91. //是否已经设置了直角测量法
  92. hasLocationModeByAngle() {
  93. let lines = dataService.getLines();
  94. for (let key in lines) {
  95. let line = dataService.getLine(key);
  96. if (line.getLocationMode() == Constant.angleLocationMode) {
  97. return true;
  98. }
  99. }
  100. return false;
  101. }
  102. /******************************************************************************曲线**************************************************************************************/
  103. createCurveLine(startPosition, endPosition, vectorId) {
  104. if (
  105. !startPosition ||
  106. !endPosition ||
  107. mathUtil.equalPoint(startPosition, endPosition)
  108. ) {
  109. return null;
  110. }
  111. let startPoint = curvePointService.create(startPosition);
  112. let endPoint = curvePointService.create(endPosition);
  113. let curveLine = new CurveLine(
  114. startPoint.vectorId,
  115. endPoint.vectorId,
  116. vectorId
  117. );
  118. startPoint.setPointParent(curveLine.vectorId);
  119. startPoint.setIndex(0);
  120. endPoint.setPointParent(curveLine.vectorId);
  121. endPoint.setIndex(2);
  122. let midPoint = curvePointService.create({
  123. x: (startPoint.x + endPoint.x) / 2,
  124. y: (startPoint.y + endPoint.y) / 2,
  125. });
  126. midPoint.setPointParent(curveLine.vectorId);
  127. midPoint.setIndex(1);
  128. curveLine.points = [];
  129. curveLine.points.push(startPoint);
  130. curveLine.points.push(midPoint);
  131. curveLine.points.push(endPoint);
  132. curveLine.curves = mathUtil.getCurvesByPoints(curveLine.points);
  133. dataService.addCurveLine(curveLine);
  134. return curveLine;
  135. }
  136. createCurveLineByPointIds(curvePoints, vectorId) {
  137. let curveLine = new CurveLine(
  138. curvePoints[0].vectorId,
  139. curvePoints[curvePoints.length - 1].vectorId,
  140. vectorId
  141. );
  142. curveLine.points = [];
  143. for (let i = 0; i < curvePoints.length; ++i) {
  144. curveLine.points[i] = dataService.getCurvePoint(curvePoints[i].vectorId);
  145. curveLine.points[i].setIndex(i);
  146. curveLine.points[i].setPointParent(curveLine.vectorId);
  147. }
  148. curveLine.curves = mathUtil.getCurvesByPoints(curveLine.points);
  149. dataService.addCurveLine(curveLine);
  150. return curveLine;
  151. }
  152. createCurveLineByPoints(points, vectorId) {
  153. let curvePoints = [];
  154. for (let i = 0; i < points.length; ++i) {
  155. let curvePoint = curvePointService.create(points[i]);
  156. curvePoint.setIndex(i);
  157. curvePoints.push(curvePoint);
  158. }
  159. let curveLine = new CurveLine(
  160. curvePoints[0].vectorId,
  161. curvePoints[curvePoints.length - 1].vectorId,
  162. vectorId
  163. );
  164. curveLine.points = curvePoints;
  165. for (let i = 0; i < curvePoints.length; ++i) {
  166. curvePoints[i].setIndex(i);
  167. curvePoints[i].setPointParent(curveLine.vectorId);
  168. }
  169. curveLine.curves = mathUtil.getCurvesByPoints(curvePoints);
  170. dataService.addCurveLine(curveLine);
  171. return curveLine;
  172. }
  173. addCPoint(position, index, vectorId) {
  174. let curveLine = dataService.getCurveLine(vectorId);
  175. let newPoint = curvePointService.create(position);
  176. newPoint.setIndex(index);
  177. newPoint.setPointParent(vectorId);
  178. curveLine.points.splice(index, 0, newPoint);
  179. for (let i = index + 1; i < curveLine.points.length; ++i) {
  180. curveLine.points[i].setIndex(i);
  181. }
  182. curveLine.startId = curveLine.points[0].vectorId;
  183. curveLine.endId = curveLine.points[curveLine.points.length - 1].vectorId;
  184. curveLine.curves = mathUtil.getCurvesByPoints(curveLine.points);
  185. }
  186. copyCurveLine(vectorId) {
  187. let curveLine = dataService.getCurveLine(vectorId);
  188. let startPoint = dataService.getCurvePoint(curveLine.startId);
  189. let endPoint = dataService.getCurvePoint(curveLine.endId);
  190. startPoint = uiService.getNewPositionForPop(startPoint);
  191. endPoint = uiService.getNewPositionForPop(endPoint);
  192. let newCurveLine = this.createCurveLine(startPoint, endPoint);
  193. newCurveLine.setColor(curveLine.color);
  194. if (curveLine.weight) {
  195. newCurveLine.setWeight(curveLine.weight);
  196. }
  197. if (curveLine.style) {
  198. newCurveLine.setStyle(curveLine.style);
  199. }
  200. mathUtil.clonePoint(
  201. newCurveLine.points[1],
  202. uiService.getNewPositionForPop(curveLine.points[1])
  203. );
  204. newCurveLine.points[1].setIndex(curveLine.points[1].getIndex());
  205. for (let i = 2; i < curveLine.points.length - 1; ++i) {
  206. let newPoint = uiService.getNewPositionForPop(curveLine.points[i]);
  207. newPoint = curvePointService.create(newPoint);
  208. newPoint.setPointParent(vectorId);
  209. newPoint.setIndex(curveLine.points[i].getIndex());
  210. newCurveLine.points.splice(i, 0, newPoint);
  211. }
  212. newCurveLine.points[newCurveLine.points.length - 1].setIndex(
  213. curveLine.points[curveLine.points.length - 1].getIndex()
  214. );
  215. newCurveLine.curves = mathUtil.getCurvesByPoints(newCurveLine.points);
  216. return newCurveLine.vectorId;
  217. }
  218. deleteCrossPointForCurveLine(curvePointId, curveLineId) {
  219. let curveLine = dataService.getCurveLine(curveLineId);
  220. for (let i = 0; i < curveLine.points.length; ++i) {
  221. if (curveLine.points[i].vectorId == curvePointId) {
  222. if (i == 0) {
  223. curveLine.points.shift();
  224. curveLine.startId = curveLine.points[0].vectorId;
  225. for (let j = 0; j < curveLine.points.length; ++j) {
  226. let _curvePoint = dataService.getCurvePoint(
  227. curveLine.points[j].vectorId
  228. );
  229. const index = _curvePoint.getIndex();
  230. _curvePoint.setIndex(index - 1);
  231. }
  232. } else if (i == curveLine.points.length - 1) {
  233. curveLine.points.pop();
  234. curveLine.endId =
  235. curveLine.points[curveLine.points.length - 1].vectorId;
  236. } else {
  237. curveLine.points.splice(i, 1);
  238. for (let j = i; j < curveLine.points.length; ++j) {
  239. let _curvePoint = dataService.getCurvePoint(
  240. curveLine.points[j].vectorId
  241. );
  242. const index = _curvePoint.getIndex();
  243. _curvePoint.setIndex(index - 1);
  244. }
  245. }
  246. break;
  247. }
  248. }
  249. dataService.deleteCurvePoint(curvePointId);
  250. if (curveLine.points.length == 2) {
  251. let startPoint = dataService.getCurvePoint(curveLine.startId);
  252. let endPoint = dataService.getCurvePoint(curveLine.endId);
  253. let line = this.create(startPoint, endPoint);
  254. const weight = curveLine.getWeight();
  255. line.setWeight(weight);
  256. const style = curveLine.getStyle();
  257. line.setStyle(style);
  258. this.deleteCurveLine(curveLineId);
  259. } else {
  260. curveLine.curves = mathUtil.getCurvesByPoints(curveLine.points);
  261. }
  262. }
  263. deleteCurveLine(curveLineId) {
  264. let curveLine = dataService.getCurveLine(curveLineId);
  265. for (let i = 0; i < curveLine.points.length; ++i) {
  266. dataService.deleteCurvePoint(curveLine.points[i].vectorId);
  267. }
  268. dataService.deleteCurveLine(curveLineId);
  269. }
  270. }
  271. const lineService = new LineService();
  272. export { lineService };