item.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import 'package:fis_common/event/event_type.dart';
  2. import 'package:fis_measure/interfaces/enums/items.dart';
  3. import 'package:fis_measure/interfaces/process/calculators/calculator.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/items/item_feature.dart';
  6. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  7. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  8. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  9. import 'package:flutter/foundation.dart';
  10. import 'package:get/get.dart';
  11. import 'item_feature.dart';
  12. import 'top_item.dart';
  13. abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
  14. late final ItemMeta _meta;
  15. late final IMeasureItem? _parent;
  16. ItemStates _state = ItemStates.waiting;
  17. ICalculator? _calculator;
  18. T? _feature;
  19. final List<T> _measuredFeatures = [];
  20. final application = Get.find<IApplication>();
  21. MeasureItem(ItemMeta meta, [IMeasureItem? parent]) {
  22. _parent = parent;
  23. _meta = meta;
  24. }
  25. @override
  26. String get displayName {
  27. if (briefAnnotation.isNotEmpty) {
  28. return briefAnnotation;
  29. }
  30. if (description.isNotEmpty) {
  31. return description;
  32. }
  33. return meta.name;
  34. }
  35. @override
  36. String get briefAnnotation => meta.briefAnnotation;
  37. @override
  38. String get description => meta.description;
  39. @override
  40. T? get feature => _feature;
  41. @protected
  42. set feature(T? value) {
  43. if (value != _feature) {
  44. _feature = value;
  45. }
  46. }
  47. @override
  48. ICalculator? get calculator => _calculator;
  49. @protected
  50. set calculator(ICalculator? value) {
  51. if (value != _calculator) {
  52. _calculator = value;
  53. }
  54. }
  55. @override
  56. IMeasureItem? get parent => _parent;
  57. @override
  58. ItemMeta get meta => _meta;
  59. @override
  60. ItemStates get state => _state;
  61. @protected
  62. set state(ItemStates value) {
  63. if (value != _state) {
  64. _state = value;
  65. }
  66. }
  67. @override
  68. double get scaleRatio => application.displayScaleRatio;
  69. @override
  70. late final featureUpdated = FEventHandler<IMeasureItemFeature?>();
  71. @override
  72. bool execute(PointInfo args) {
  73. bool hasFeatureBefore = feature != null;
  74. bool result = false;
  75. if (state == ItemStates.waiting ||
  76. state == ItemStates.running ||
  77. state == ItemStates.finished) {
  78. switch (args.pointType) {
  79. case PointInfoType.mouseUp:
  80. case PointInfoType.mouseDown:
  81. case PointInfoType.mouseMove:
  82. result = onExecuteMouse(args);
  83. break;
  84. case PointInfoType.touchUp:
  85. case PointInfoType.touchDown:
  86. case PointInfoType.touchMove:
  87. result = onExecuteTouch(args);
  88. break;
  89. }
  90. }
  91. if (result) {
  92. /// 未创建测量,不通知刷新
  93. if (feature == null && !hasFeatureBefore) return result;
  94. /// 通知刷新
  95. doFeatureUpdate();
  96. }
  97. return result;
  98. }
  99. @override
  100. void clear() {
  101. feature = null;
  102. if (calculator != null) {
  103. calculator!.finishOnce();
  104. }
  105. measuredFeatures.clear();
  106. }
  107. @override
  108. void finishOnce() {
  109. doFeatureFinish();
  110. }
  111. @override
  112. void cancelOnce() {
  113. if (this is TopMeasureItem) {
  114. final that = this as TopMeasureItem;
  115. for (var item in that.childItems) {
  116. item.cancelOnce();
  117. item.measuredFeatures.clear();
  118. }
  119. }
  120. feature = null;
  121. state = ItemStates.waiting;
  122. onCancelingOnce();
  123. doFeatureUpdate();
  124. }
  125. @protected
  126. void onCancelingOnce() {}
  127. @protected
  128. void doFeatureUpdate() {
  129. featureUpdated.emit(this, feature);
  130. }
  131. @protected
  132. void doFeatureFinish() {
  133. if (feature != null) {
  134. feature!.isActive = false;
  135. measuredFeatures.add(feature!);
  136. calculator?.finishOnce();
  137. }
  138. feature = null;
  139. state = ItemStates.finished;
  140. }
  141. @protected
  142. void doCalculate() {
  143. calculator?.calculate();
  144. }
  145. @protected
  146. bool onExecuteMouse(PointInfo args);
  147. @protected
  148. bool onExecuteTouch(PointInfo args);
  149. @override
  150. List<T> get measuredFeatures => _measuredFeatures;
  151. @override
  152. int assignId() {
  153. return application.recorder.newRecordId();
  154. }
  155. }