time_motion.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import 'package:fis_measure/interfaces/process/calculators/values.dart';
  2. import 'package:fis_measure/interfaces/process/items/terms.dart';
  3. import 'package:fis_measure/process/calcuators/formulas/general.dart';
  4. import 'package:fis_measure/process/items/item.dart';
  5. import 'package:fis_measure/process/primitives/combos/two_length.dart';
  6. import 'package:vid/us/vid_us_unit.dart';
  7. import '../primitives/straightline.dart';
  8. import 'calculator.dart';
  9. class VerticalDistanceCal extends Calculator<StraightLine, double> {
  10. VerticalDistanceCal(StraightLine ref) : super(ref);
  11. @override
  12. void calculate() {
  13. if (ref.feature == null) return;
  14. final feature = ref.feature!;
  15. final viewport = feature.hostVisualArea!.viewport!;
  16. final p1 = feature.startPoint;
  17. final p2 = feature.endPoint;
  18. final pp1 = viewport.convert(p1);
  19. final pp2 = viewport.convert(p2);
  20. final value = (pp2.y - pp1.y).abs();
  21. // updateFloatValue(value);
  22. final ouput = ref.meta.outputs.first;
  23. feature.updateFloatValue(
  24. ouput, roundDouble(value, ouput.fractionalDigits), VidUsUnit.cm);
  25. }
  26. }
  27. class TimeSpanCal extends Calculator<StraightLine, double> {
  28. TimeSpanCal(StraightLine ref) : super(ref);
  29. @override
  30. void calculate() {
  31. if (ref.feature == null) return;
  32. final feature = ref.feature!;
  33. final viewport = feature.hostVisualArea!.viewport!;
  34. final p1 = feature.startPoint;
  35. final p2 = feature.endPoint;
  36. final pp1 = viewport.convert(p1);
  37. final pp2 = viewport.convert(p2);
  38. final value = (pp2.x - pp1.x).abs();
  39. updateFloatValue(value);
  40. }
  41. }
  42. class StenosisCal extends Calculator<TwoLengthAbstract, double> {
  43. StenosisCal(TwoLengthAbstract ref) : super(ref);
  44. @override
  45. void calculate() {
  46. if (ref.feature == null) return;
  47. final a1 = _pickChildValue(ref.child1);
  48. final a2 = _pickChildValue(ref.child2);
  49. final feature = ref.feature!;
  50. final viewport = feature.hostVisualArea!.viewport!;
  51. if (a1 != null && a2 != null) {
  52. final value = GeneralFormulas.countStenosis(
  53. a1,
  54. a2,
  55. );
  56. updateFloatValue(value);
  57. }
  58. }
  59. double? _pickChildValue(MeasureItem item) {
  60. if (item.calculator == null) return null;
  61. ValueBase? value;
  62. if (item.measuredFeatures.isNotEmpty) {
  63. value = item.measuredFeatures.first.value;
  64. } else if (item.feature != null) {
  65. value = item.feature!.value;
  66. }
  67. if (value != null) {
  68. return (value as FloatValue).value ?? 0;
  69. }
  70. return null;
  71. }
  72. }
  73. class SlopeCal extends Calculator<StraightLine, double> {
  74. SlopeCal(StraightLine ref) : super(ref);
  75. @override
  76. void calculate() {
  77. if (ref.feature == null) return;
  78. final feature = ref.feature!;
  79. final viewport = feature.hostVisualArea!.viewport!;
  80. final p1 = feature.startPoint;
  81. final p2 = feature.endPoint;
  82. final pp1 = viewport.convert(p1);
  83. final pp2 = viewport.convert(p2);
  84. final distance = (pp2.y - pp1.y).abs();
  85. final time = (pp2.x - pp1.x).abs();
  86. for (var output in ref.meta.outputs) {
  87. if (output.name == MeasureTerms.Slope) {
  88. var slope = GeneralFormulas.countSlope(pp1, pp2);
  89. feature.updateFloatValue(output, slope, output.unit);
  90. } else if (output.name == MeasureTerms.Timespan) {
  91. feature.updateFloatValue(output, time, output.unit);
  92. } else if (output.name == MeasureTerms.Distance) {
  93. feature.updateFloatValue(output, distance, output.unit);
  94. }
  95. }
  96. }
  97. }
  98. class SlopeDopplerCal extends Calculator<StraightLine, double> {
  99. SlopeDopplerCal(StraightLine ref) : super(ref);
  100. @override
  101. void calculate() {
  102. if (ref.feature == null) return;
  103. final feature = ref.feature!;
  104. final viewport = feature.hostVisualArea!.viewport!;
  105. final p1 = feature.startPoint;
  106. final p2 = feature.endPoint;
  107. final pp1 = viewport.convert(p1);
  108. final pp2 = viewport.convert(p2);
  109. final distance = (pp2.y - pp1.y).abs();
  110. final time = (pp2.x - pp1.x).abs();
  111. for (var output in ref.meta.outputs) {
  112. if (output.name == MeasureTerms.Slope) {
  113. var slope = GeneralFormulas.countSlope(pp2, pp1);
  114. feature.updateFloatValue(output, slope, output.unit);
  115. } else if (output.name == MeasureTerms.Timespan) {
  116. feature.updateFloatValue(output, time, output.unit);
  117. } else if (output.name == MeasureTerms.Distance) {
  118. feature.updateFloatValue(output, distance, output.unit);
  119. }
  120. }
  121. }
  122. }