sv.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import 'package:fis_measure/configs/patient.dart';
  2. import 'package:fis_measure/interfaces/process/calculators/values.dart';
  3. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  4. import 'package:fis_measure/interfaces/process/items/terms.dart';
  5. import 'package:fis_measure/process/primitives/combos/sv.dart';
  6. import 'package:fis_measure/process/primitives/multi_method/multiple_trace.dart';
  7. import 'package:vid/us/vid_us_unit.dart';
  8. import 'calculator.dart';
  9. import 'trace.dart';
  10. import 'unit_formulas/index.dart';
  11. class SvCal extends Calculator<Sv, double> {
  12. SvCal(super.ref);
  13. @override
  14. void calculate() {
  15. if (ref.feature == null) return;
  16. final feature = ref.feature!;
  17. feature.values.clear();
  18. final itemName = ref.meta.name;
  19. if (['qp', 'qs'].contains(itemName.toLowerCase())) {
  20. final output = ItemOutputMeta(itemName, itemName, VidUsUnit.None);
  21. // Qp、Qs仅占位
  22. feature.updateStringValue(output, '');
  23. } else {
  24. updateStringValue("");
  25. }
  26. final diam = pickChildToFloatValue(ref.l)?.toUnitFloatValue();
  27. if (diam == null) {
  28. return;
  29. }
  30. final viewport = ref.application.currentVisualArea.viewport!;
  31. UnitFloatValue? vti;
  32. UnitFloatValue? sv;
  33. UnitFloatValue? co;
  34. int? hr;
  35. final bsa = GlobalPatientConfig.bsa;
  36. TraceItemFeatureAbstract? traceFeature = ref.trace.feature;
  37. if (traceFeature == null) {
  38. if (ref.trace.measuredFeatures.isNotEmpty) {
  39. traceFeature = ref.trace.measuredFeatures.first;
  40. }
  41. }
  42. if (traceFeature != null) {
  43. final countVTIResult = TraceCal.getCountVTI(traceFeature);
  44. var outputVTI = countVTIResult[0];
  45. var outputHR = countVTIResult[5];
  46. // vti = UnitFloatValue(outputVTI, viewport.yUnit);
  47. vti = UnitFloatValue(outputVTI, VidUsUnit.cm); // TODO: cm/s 取 cm
  48. hr = outputHR.toInt();
  49. sv = UnitFormulas.general.svDiam(diam, vti);
  50. }
  51. if (traceFeature != null) {
  52. // Trace 输出
  53. for (var output in ref.trace.meta.outputs) {
  54. if (output.name == MeasureTerms.SV_Trace) {
  55. // feature.updateStringValue(output, '', VidUsUnit.None);
  56. } else if (output.name == MeasureTerms.VTI) {
  57. // if (vti != null) {
  58. // feature.updateFloatValue(output, vti, VidUsUnit.cm);
  59. // }
  60. } else if (output.name == MeasureTerms.HeartRate) {
  61. if (hr != null) {
  62. feature.updateFloatValue(output, hr.toDouble(), VidUsUnit.HR);
  63. }
  64. }
  65. }
  66. }
  67. if (sv != null) {
  68. for (var output in ref.meta.outputs) {
  69. switch (output.name) {
  70. case MeasureTerms.SV:
  71. feature.updateFloatValue(output, sv.value, sv.unit);
  72. break;
  73. case MeasureTerms.SI:
  74. if (bsa > 0) {
  75. final si = UnitFormulas.cardiac.si(sv, bsa: bsa);
  76. feature.updateFloatValue(output, si.value, si.unit);
  77. }
  78. break;
  79. case MeasureTerms.CO:
  80. if (hr != null) {
  81. final co = UnitFormulas.cardiac.co(sv, hr: hr);
  82. feature.updateFloatValue(output, co.value, co.unit);
  83. }
  84. break;
  85. case MeasureTerms.CI:
  86. if (hr != null && bsa > 0) {
  87. final ci = UnitFormulas.cardiac.ci(sv, bsa: bsa, hr: hr);
  88. feature.updateFloatValue(output, ci.value, ci.unit);
  89. }
  90. break;
  91. }
  92. }
  93. }
  94. final csaIndex =
  95. ref.meta.outputs.indexWhere((e) => e.name == MeasureTerms.CSA);
  96. if (csaIndex > -1) {
  97. final output = ref.meta.outputs[csaIndex];
  98. final csa = UnitFormulas.general.csa(diam);
  99. feature.updateFloatValue(output, csa.value, csa.unit);
  100. }
  101. }
  102. }