straightline.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import 'dart:ui';
  2. import 'package:fis_measure/interfaces/date_types/point.dart';
  3. import 'package:fis_measure/interfaces/enums/items.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
  6. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  7. import 'package:fis_measure/process/items/item.dart';
  8. import 'package:fis_measure/view/canvas/utils.dart';
  9. import '../calcuators/distance.dart';
  10. import '../items/item_feature.dart';
  11. class StraightLine extends MeasureItem<StraightLineFeature> {
  12. StraightLine(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  13. static StraightLine createDistance(ItemMeta meta, [IMeasureItem? parent]) {
  14. StraightLine sraightLine = StraightLine(meta, parent);
  15. sraightLine.calculator = DistanceCal(sraightLine);
  16. return sraightLine;
  17. }
  18. @override
  19. bool onExecuteMouse(PointInfo args) {
  20. if (state == ItemStates.finished) {
  21. if (args.pointType == PointInfoType.mouseDown) {
  22. state = ItemStates.waiting;
  23. }
  24. }
  25. if (state == ItemStates.waiting) {
  26. if (args.pointType == PointInfoType.mouseDown) {
  27. handleMouseDownWhileWaiting(args);
  28. }
  29. state = ItemStates.running;
  30. } else if (state == ItemStates.running) {
  31. if (args.pointType == PointInfoType.mouseUp) return false;
  32. feature?.endPoint = args;
  33. if (args.pointType == PointInfoType.mouseDown) {
  34. state = ItemStates.finished;
  35. feature?.isActive = false;
  36. }
  37. }
  38. doFeatureChanged();
  39. return true;
  40. }
  41. @override
  42. bool onExecuteTouch(PointInfo args) {
  43. // TODO: implement onExecuteTouch
  44. throw UnimplementedError();
  45. }
  46. void handleMouseDownWhileWaiting(PointInfo args) {
  47. // TODO: 判断是否当前area
  48. // 转换为Area逻辑位置
  49. final point = args.toAreaLogicPoint();
  50. feature = StraightLineFeature(this, point, point);
  51. if (args.hostVisualArea != null) {
  52. feature!.hostVisualArea = args.hostVisualArea;
  53. }
  54. }
  55. }
  56. class StraightLineFeature extends MeasureItemFeature {
  57. StraightLineFeature(
  58. IMeasureItem refItem,
  59. DPoint startPoint,
  60. DPoint endPoint,
  61. ) : super(refItem) {
  62. innerPoints.add(startPoint);
  63. innerPoints.add(endPoint);
  64. }
  65. /// 起点
  66. DPoint get startPoint => innerPoints[0];
  67. set startPoint(DPoint value) => innerPoints[0] = value;
  68. /// 终点
  69. DPoint get endPoint => innerPoints[1];
  70. set endPoint(DPoint value) => innerPoints[1] = value;
  71. /// 长度
  72. double get length => (endPoint - startPoint).length;
  73. @override
  74. void paint(Canvas canvas, Size size) {
  75. if (startPoint == endPoint) return;
  76. const double vertexSize = 10;
  77. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  78. canvas.drawVertex(startOffset, vertexSize);
  79. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  80. canvas.drawDashLine(startOffset, endOffset, 1, 10, paintPan);
  81. canvas.drawVertex(endOffset, vertexSize, active: isActive);
  82. }
  83. }