pisa.dart 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import 'package:fis_measure/interfaces/process/items/item_metas.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/pisa.dart';
  5. import 'package:vid/us/vid_us_unit.dart';
  6. import 'calculator.dart';
  7. import 'trace.dart';
  8. class PisaCal extends Calculator<Pisa, double> {
  9. PisaCal(super.ref);
  10. static const String vMaxKey = "Vmax";
  11. static const String rvKey = "RV";
  12. static const String eroaKey = "EROA";
  13. static const String flowRateKey = "Flow Rate";
  14. @override
  15. void calculate() {
  16. if (ref.feature == null) return;
  17. final feature = ref.feature!;
  18. feature.values.clear();
  19. feature.updateStringValue(
  20. ItemOutputMeta(ref.displayName, ref.description, VidUsUnit.None),
  21. '',
  22. );
  23. // final yUnit= ref.application.currentViewPort.yUnit;
  24. double mrRadius = double.nan;
  25. double vti = double.nan;
  26. double mrVmax = double.nan;
  27. final radiusFeature = findChildFeature(ref.radius);
  28. if (radiusFeature != null) {
  29. mrRadius = pickChildFloatValue(ref.radius)!;
  30. final output = ref.radius.meta.outputs.first;
  31. feature.updateFloatValue(output, mrRadius, VidUsUnit.cm);
  32. }
  33. final vtiFeature = findChildFeature(ref.trace);
  34. if (vtiFeature != null) {
  35. final countVTIResult = TraceCal.getCountVTI(vtiFeature);
  36. var outputVTI = countVTIResult[0];
  37. var outputVelocityMax = countVTIResult[3];
  38. vti = outputVTI;
  39. mrVmax = outputVelocityMax;
  40. final outputs = ref.trace.meta.outputs;
  41. for (var output in outputs) {
  42. if (output.name == MeasureTerms.Placeholder) {
  43. feature.updateStringValue(output, "");
  44. } else if (output.name == MeasureTerms.VTI) {
  45. feature.updateFloatValue(
  46. output, vti.abs(), VidUsUnit.cm); // 特殊处理,显示绝对值
  47. } else if (output.name == MeasureTerms.VelocityMax) {
  48. feature.updateFloatValue(output, mrVmax, VidUsUnit.cms);
  49. }
  50. }
  51. }
  52. double mrAlsVel = ref.alsVel.value!; // TODO: with unit
  53. double mrRV = double.nan;
  54. double mrEROA = double.nan;
  55. double mrFlowRate = double.nan;
  56. if (!mrRadius.isNaN && !vti.isNaN && !mrVmax.isNaN && !mrAlsVel.isNaN) {
  57. mrEROA = CardiacFormulas.mrEROA(mrRadius, mrAlsVel, mrVmax);
  58. mrRV = CardiacFormulas.mrRV(mrEROA, vti);
  59. mrFlowRate = CardiacFormulas.mrFlowRate(mrRadius, mrAlsVel);
  60. }
  61. for (var output in ref.meta.outputs) {
  62. if (output.name == rvKey) {
  63. if (!mrRV.isNaN) {
  64. feature.updateFloatValue(
  65. output, mrRV.abs(), VidUsUnit.ml); // 特殊处理,显示绝对值
  66. }
  67. } else if (output.name == eroaKey) {
  68. if (!mrEROA.isNaN) {
  69. feature.updateFloatValue(output, mrEROA, VidUsUnit.cm2);
  70. }
  71. } else if (output.name == flowRateKey) {
  72. if (!mrFlowRate.isNaN) {
  73. feature.updateFloatValue(output, mrFlowRate, VidUsUnit.mls);
  74. }
  75. } else if (output.name == MeasureTerms.AlsVel) {
  76. if (!mrAlsVel.isNaN) {
  77. feature.updateFloatValue(output, mrAlsVel, VidUsUnit.cms);
  78. }
  79. }
  80. }
  81. }
  82. }