two_distance.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/urology.dart';
  4. import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
  5. import 'package:fis_measure/process/primitives/straightline.dart';
  6. import 'package:vid/us/vid_us_unit.dart';
  7. import 'calculator.dart';
  8. import 'formulas/general.dart';
  9. class TwoDistanceCalBase extends Calculator<TwoStraightLine, double> {
  10. TwoDistanceCalBase(TwoStraightLine ref) : super(ref);
  11. @override
  12. void calculate() {
  13. // TODO: implement calculate
  14. }
  15. }
  16. class ResidualUrineCal extends Calculator<TwoStraightLine, double> {
  17. ResidualUrineCal(TwoStraightLine ref) : super(ref);
  18. @override
  19. void calculate() {
  20. if (ref.feature == null) return;
  21. final x = _pickChildValue(ref.x);
  22. final y = _pickChildValue(ref.y);
  23. final feature = ref.feature!;
  24. final viewport = feature.hostVisualArea!.viewport!;
  25. if (x != null && y != null) {
  26. final value = UrologyFormulas.calcRUV(
  27. x,
  28. y,
  29. );
  30. updateFloatValue(value);
  31. }
  32. }
  33. double? _pickChildValue(StraightLine item) {
  34. if (item.calculator == null) return null;
  35. ValueBase? value;
  36. if (item.measuredFeatures.isNotEmpty) {
  37. value = item.measuredFeatures.first.value;
  38. } else if (item.feature != null) {
  39. value = item.feature!.value;
  40. }
  41. if (value != null) {
  42. return (value as FloatValue).value ?? 0;
  43. }
  44. return null;
  45. }
  46. }
  47. class TwoDistanceVolumeCal extends Calculator<TwoStraightLine, double> {
  48. TwoDistanceVolumeCal(TwoStraightLine ref) : super(ref);
  49. @override
  50. void calculate() {
  51. if (ref.feature == null) return;
  52. final f1 = findChildFeature(ref.child1);
  53. final f2 = findChildFeature(ref.child2);
  54. if (f1 == null || f2 == null) return;
  55. final feature = ref.feature!;
  56. final val1 = f1.value?.pickFloat() ?? 0;
  57. final val2 = f2.value?.pickFloat() ?? 0;
  58. final unitY = f1.hostVisualArea!.viewport!.yUnit;
  59. for (var ouput in ref.meta.outputs) {
  60. if (ouput.name == MeasureTerms.Volume) {
  61. var volume = GeneralFormulas.volumeTwoLine(val1, val2);
  62. final unit = unitY == VidUsUnit.cm ? VidUsUnit.cm3 : VidUsUnit.None;
  63. feature.updateFloatValue(
  64. ouput,
  65. roundDouble(volume, ouput.fractionalDigits),
  66. unit,
  67. );
  68. } else if (ouput.name == MeasureTerms.AvgDistance) {
  69. double avg = (val1 + val2) / 2;
  70. feature.updateFloatValue(
  71. ouput,
  72. roundDouble(avg, ouput.fractionalDigits),
  73. unitY,
  74. );
  75. }
  76. }
  77. }
  78. }