|
@@ -0,0 +1,110 @@
|
|
|
+import 'package:fis_measure/configs/patient.dart';
|
|
|
+import 'package:fis_measure/interfaces/process/items/terms.dart';
|
|
|
+import 'package:fis_measure/process/calcuators/formulas/cardiac.dart';
|
|
|
+import 'package:fis_measure/process/primitives/combos/sv.dart';
|
|
|
+import 'package:fis_measure/process/primitives/multi_method/multiple_trace.dart';
|
|
|
+import 'package:vid/us/vid_us_unit.dart';
|
|
|
+
|
|
|
+import 'calculator.dart';
|
|
|
+import 'formulas/general.dart';
|
|
|
+import 'trace.dart';
|
|
|
+
|
|
|
+class SvCal extends Calculator<Sv, double> {
|
|
|
+ SvCal(super.ref);
|
|
|
+
|
|
|
+ @override
|
|
|
+ void calculate() {
|
|
|
+ if (ref.feature == null) return;
|
|
|
+
|
|
|
+ final feature = ref.feature!;
|
|
|
+
|
|
|
+ final diam = pickChildFloatValue(ref.l);
|
|
|
+ if (diam == null) {
|
|
|
+ updateStringValue("");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ double? vti;
|
|
|
+ double? sv;
|
|
|
+ int? hr;
|
|
|
+ double? co;
|
|
|
+ final bsa = GlobalPatientConfig.bsa;
|
|
|
+
|
|
|
+ TraceItemFeatureAbstract? traceFeature = ref.trace.feature;
|
|
|
+ if (traceFeature == null) {
|
|
|
+ if (ref.trace.measuredFeatures.isNotEmpty) {
|
|
|
+ traceFeature = ref.trace.measuredFeatures.first;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (traceFeature != null) {
|
|
|
+ final countVTIResult = TraceCal.getCountVTI(traceFeature);
|
|
|
+ var outputVTI = countVTIResult[0];
|
|
|
+ var outputHR = countVTIResult[5];
|
|
|
+
|
|
|
+ vti = outputVTI;
|
|
|
+ hr = outputHR.toInt();
|
|
|
+
|
|
|
+ sv = GeneralFormulas.svDiam(diam, vti);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sv != null) {
|
|
|
+ updateFloatValue(sv, unit: VidUsUnit.cm3);
|
|
|
+ } else {
|
|
|
+ updateStringValue("");
|
|
|
+ }
|
|
|
+
|
|
|
+ // Diam 输出
|
|
|
+ // feature.updateFloatValue(ref.l.meta.outputs[0], diam, VidUsUnit.cm);
|
|
|
+
|
|
|
+ if (traceFeature != null) {
|
|
|
+ // Trace 输出
|
|
|
+ for (var output in ref.trace.meta.outputs) {
|
|
|
+ if (output.name == MeasureTerms.SV_Trace) {
|
|
|
+ // feature.updateStringValue(output, '', VidUsUnit.None);
|
|
|
+ } else if (output.name == MeasureTerms.VTI) {
|
|
|
+ if (vti != null) {
|
|
|
+ feature.updateFloatValue(output, vti, VidUsUnit.cm);
|
|
|
+ }
|
|
|
+ } else if (output.name == MeasureTerms.HeartRate) {
|
|
|
+ if (hr != null) {
|
|
|
+ feature.updateFloatValue(output, hr.toDouble(), VidUsUnit.HR);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sv != null) {
|
|
|
+ for (var output in ref.meta.outputs) {
|
|
|
+ switch (output.name) {
|
|
|
+ case MeasureTerms.SI:
|
|
|
+ if (bsa > 0) {
|
|
|
+ final si = CardiacFormulas.si(sv, bsa);
|
|
|
+ feature.updateFloatValue(output, si, VidUsUnit.mlm2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MeasureTerms.CO:
|
|
|
+ if (hr != null) {
|
|
|
+ co = CardiacFormulas.co(sv, hr: hr);
|
|
|
+ feature.updateFloatValue(output, co, VidUsUnit.Lmin);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MeasureTerms.CI:
|
|
|
+ if (co != null && bsa > 0) {
|
|
|
+ final ci = CardiacFormulas.ci(sv, hr: hr!, bsa: bsa);
|
|
|
+ feature.updateFloatValue(output, ci, VidUsUnit.Lminm2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ final csaIndex =
|
|
|
+ ref.meta.outputs.indexWhere((e) => e.name == MeasureTerms.CSA);
|
|
|
+ if (csaIndex > -1) {
|
|
|
+ final output = ref.meta.outputs[csaIndex];
|
|
|
+ final csa = GeneralFormulas.csa(diam);
|
|
|
+ feature.updateFloatValue(output, csa, VidUsUnit.cm2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|