sv.dart 3.2 KB

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