lv_study.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import 'package:fis_measure/interfaces/date_types/point.dart';
  2. import 'package:fis_measure/interfaces/enums/items.dart';
  3. import 'package:fis_measure/interfaces/process/items/item.dart';
  4. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  5. import 'package:fis_measure/interfaces/process/items/terms.dart';
  6. import 'package:fis_measure/interfaces/process/items/types.dart';
  7. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  8. import 'package:fis_measure/process/calcuators/distance.dart';
  9. import 'package:fis_measure/process/calcuators/lv_study.dart';
  10. import 'package:fis_measure/process/calcuators/time_motion.dart';
  11. import 'package:fis_measure/process/items/top_item.dart';
  12. import 'package:fis_measure/process/items/top_item_feature.dart';
  13. import 'package:fis_measure/process/primitives/straightline.dart';
  14. import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
  15. class LvStudy extends TopMeasureItem<StraightLineGroupFeature> {
  16. static final _dItemNames = [
  17. MeasureTerms.IVSd,
  18. MeasureTerms.LVIDd,
  19. MeasureTerms.LVPWd,
  20. ];
  21. static final _sItemNames = [
  22. MeasureTerms.IVSs,
  23. MeasureTerms.LVIDs,
  24. MeasureTerms.LVPWs,
  25. ];
  26. final bool ifVertical;
  27. final bool ifTimeSpan;
  28. late final List<StraightLine> _dChildItems = [];
  29. late final List<StraightLine> _sChildItems = [];
  30. DPoint? _dPoint;
  31. DPoint? _sPoint;
  32. IMeasureItem? _lastChild;
  33. LvStudy(ItemMeta meta, {this.ifVertical = false, this.ifTimeSpan = false})
  34. : super(meta) {
  35. for (final childMeta in meta.childItems) {
  36. _LvStudyStraightLine childItem;
  37. if (childMeta.measureType == "VerticalDistance") {
  38. // measureType
  39. // childItem = StraightLine.createVerticalDistance(childMeta, this);
  40. childItem = _LvStudyStraightLine(childMeta, this);
  41. childItem.calculator = VerticalDistanceCal(childItem);
  42. childItem.ifVertical = true;
  43. } else if (ifTimeSpan) {
  44. childItem = _LvStudyStraightLine(childMeta, this);
  45. childItem.calculator = TimeSpanCal(childItem);
  46. } else {
  47. childItem = _LvStudyStraightLine(childMeta, this);
  48. childItem.calculator = DistanceCal(childItem);
  49. }
  50. childItems.add(childItem);
  51. if (_dItemNames.contains(childMeta.name)) {
  52. _dChildItems.add(childItem);
  53. }
  54. if (_sItemNames.contains(childMeta.name)) {
  55. _sChildItems.add(childItem);
  56. }
  57. }
  58. workingChildChanged.addListener(_onWorkingChildChanged);
  59. }
  60. @override
  61. bool get finishAfterUnactive => true;
  62. @override
  63. bool get isCrossFrameMode => true;
  64. @override
  65. StraightLineGroupFeature buildFeature() => StraightLineGroupFeature(this);
  66. static LvStudy createLvStudyByLineGroup(ItemMeta meta,
  67. [IMeasureItem? parent]) {
  68. if (![
  69. MeasureTypes.LvStudyByLineGroup,
  70. MeasureTypes.LvStudyByLineGroupTissue
  71. ].contains(meta.measureType)) {
  72. throw ArgumentError();
  73. }
  74. var ins = LvStudy(meta);
  75. ins.calculator = LvStudyDistanceGroupCal(ins);
  76. return ins;
  77. }
  78. static LvStudy createLvSimpleTissue(ItemMeta meta, [IMeasureItem? parent]) {
  79. var ins = LvStudy(meta);
  80. ins.calculator = LvStudySimpleCal(ins);
  81. return ins;
  82. }
  83. static LvStudy createLvSimpleTissueTm(ItemMeta meta, [IMeasureItem? parent]) {
  84. var ins = LvStudy(
  85. meta,
  86. ifTimeSpan: true,
  87. ifVertical: true,
  88. );
  89. ins.calculator = LvStudySimpleCal(ins);
  90. return ins;
  91. }
  92. void _onWorkingChildChanged(_, int e) {
  93. // final isMBelow =
  94. // ["m", "pw"].contains(application.currentMode.name.toLowerCase());
  95. // if (!isMBelow) {
  96. // return;
  97. // }
  98. if (_lastChild != null) {
  99. _lastChild!.onItemStatesChanged.removeListener(_onChildItemStatesChanged);
  100. }
  101. workingChild.onItemStatesChanged.addListener(_onChildItemStatesChanged);
  102. _lastChild = workingChild;
  103. final childItem = workingChild as _LvStudyStraightLine;
  104. if (_dChildItems.contains(childItem)) {
  105. final point = _findDPoint(childItem);
  106. if (point != null) {
  107. final offset = point.toOffset();
  108. final pointInfo = PointInfo.fromOffset(offset, PointInfoType.mouseDown);
  109. pointInfo.hostVisualArea = application.currentVisualArea;
  110. childItem.refPoint = pointInfo;
  111. childItem.execute(pointInfo);
  112. }
  113. }
  114. if (_sChildItems.contains(childItem)) {
  115. final point = _findSPoint(childItem);
  116. if (point != null) {
  117. final offset = point.toOffset();
  118. final pointInfo = PointInfo.fromOffset(offset, PointInfoType.mouseDown);
  119. pointInfo.hostVisualArea = application.currentVisualArea;
  120. childItem.refPoint = pointInfo;
  121. childItem.execute(pointInfo);
  122. }
  123. }
  124. }
  125. void _onChildItemStatesChanged(_, ItemStates? e) {
  126. final childItem = workingChild as StraightLine;
  127. if (e == ItemStates.finished && childItem.measuredFeatures.isNotEmpty) {
  128. final feature = childItem.measuredFeatures.first;
  129. final point = feature.endPoint;
  130. if (_dChildItems.contains(childItem)) {
  131. _dPoint = point;
  132. }
  133. if (_sChildItems.contains(childItem)) {
  134. _sPoint = point;
  135. }
  136. }
  137. }
  138. void _onChildItemMeasured() {
  139. final childItem = workingChild as _LvStudyStraightLine;
  140. if (_dChildItems.contains(childItem)) {
  141. _handleDChildMeasured(childItem);
  142. }
  143. if (_sChildItems.contains(childItem)) {
  144. _handleSChildMeasured(childItem);
  145. }
  146. }
  147. void _handleDChildMeasured(_LvStudyStraightLine childItem) {
  148. childItem.changeCrossIndicatorStyle(CrossIndicatorStyle.horizontal);
  149. }
  150. void _handleSChildMeasured(_LvStudyStraightLine childItem) {
  151. childItem.changeCrossIndicatorStyle(CrossIndicatorStyle.horizontal);
  152. }
  153. DPoint? _findDPoint(_LvStudyStraightLine item) =>
  154. _findPointFromItems(_dChildItems, item);
  155. DPoint? _findSPoint(_LvStudyStraightLine item) =>
  156. _findPointFromItems(_sChildItems, item);
  157. DPoint? _findPointFromItems(
  158. List<StraightLine> items, _LvStudyStraightLine currItem) {
  159. final lastIndex = workingChildIndex - 1;
  160. if (lastIndex < 0) {
  161. return null;
  162. }
  163. final lastItem = childItems[lastIndex];
  164. if (items.contains(lastItem)) {
  165. if (lastItem.measuredFeatures.isNotEmpty) {
  166. final feature = (lastItem as StraightLine).measuredFeatures.first;
  167. final point =
  168. currItem.ifVertical ? feature.startPoint : feature.endPoint;
  169. return point;
  170. }
  171. }
  172. return null;
  173. }
  174. }
  175. class StraightLineGroupFeature extends TopMeasureItemFeature {
  176. StraightLineGroupFeature(
  177. ITopMeasureItem refItem,
  178. ) : super(refItem);
  179. }
  180. class _LvStudyStraightLine extends StraightLine {
  181. _LvStudyStraightLine(super.meta, super.parent);
  182. DPoint? refPoint;
  183. bool ifVertical = false;
  184. @override
  185. bool onExecuteMouse(PointInfo args) {
  186. if (ifVertical && refPoint != null) {
  187. args.x = refPoint!.x;
  188. }
  189. return super.onExecuteMouse(args);
  190. }
  191. }