lv_study.dart 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. import 'package:fis_measure/configs/cardiac.dart';
  2. import 'package:fis_measure/configs/patient.dart';
  3. import 'package:fis_measure/interfaces/enums/calcuator.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/items/terms.dart';
  6. import 'package:fis_measure/process/items/top_item.dart';
  7. import 'package:fis_measure/process/primitives/combos/lv_study.dart';
  8. import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
  9. import 'package:fis_measure/process/primitives/straightline.dart';
  10. import 'package:flutter/foundation.dart';
  11. import 'package:vid/us/vid_us_unit.dart';
  12. import 'dart:math' as math;
  13. import 'calculator.dart';
  14. import 'formulas/cardiac.dart';
  15. class LvStudySimpleCal extends LvStudyCalculatorBase<LvStudy> {
  16. late final StraightLine kidLVIDd;
  17. late final StraightLine kidLVIDs;
  18. LvStudySimpleCal(super.ref) {
  19. kidLVIDd = ref.findChildByName("L1") as StraightLine;
  20. kidLVIDs = ref.findChildByName("L2") as StraightLine;
  21. }
  22. @override
  23. void calculate() {
  24. if (ref.feature == null) return;
  25. final feature = ref.feature!;
  26. v = _ValTemp();
  27. v.lvidd = pickChildFloatValue(kidLVIDd);
  28. v.lvids = pickChildFloatValue(kidLVIDs);
  29. for (var output in ref.meta.outputs) {
  30. switch (output.name) {
  31. case MeasureTerms.LvStudySimple:
  32. feature.updateStringValue(output, "");
  33. break;
  34. case MeasureTerms.LVEDV:
  35. updateLVEDV();
  36. break;
  37. case MeasureTerms.LVESV:
  38. updateLVESV();
  39. break;
  40. case MeasureTerms.SV:
  41. updateSV();
  42. break;
  43. case MeasureTerms.EF:
  44. updateEF();
  45. break;
  46. case MeasureTerms.FS:
  47. updatePercentFS();
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. class LvStudyDistanceGroupCal extends LvStudyCalculatorBase<LvStudy> {
  54. late final StraightLine kidIVSd;
  55. late final StraightLine kidLVIDd;
  56. late final StraightLine kidLVPWd;
  57. late final StraightLine kidIVSs;
  58. late final StraightLine kidLVIDs;
  59. late final StraightLine kidLVPWs;
  60. LvStudyDistanceGroupCal(super.ref) {
  61. kidIVSd = ref.findChildByName(MeasureTerms.IVSd) as StraightLine;
  62. kidLVIDd = ref.findChildByName(MeasureTerms.LVIDd) as StraightLine;
  63. kidLVPWd = ref.findChildByName(MeasureTerms.LVPWd) as StraightLine;
  64. kidIVSs = ref.findChildByName(MeasureTerms.IVSs) as StraightLine;
  65. kidLVIDs = ref.findChildByName(MeasureTerms.LVIDs) as StraightLine;
  66. kidLVPWs = ref.findChildByName(MeasureTerms.LVPWs) as StraightLine;
  67. }
  68. @override
  69. void calculate() {
  70. if (ref.feature == null) return;
  71. final feature = ref.feature!;
  72. v = _ValTemp();
  73. v.ivsd = pickChildFloatValue(kidIVSd);
  74. v.ivss = pickChildFloatValue(kidIVSs);
  75. v.lvidd = pickChildFloatValue(kidLVIDd);
  76. v.lvids = pickChildFloatValue(kidLVIDs);
  77. v.lvpwd = pickChildFloatValue(kidLVPWd);
  78. v.lvpws = pickChildFloatValue(kidLVPWs);
  79. for (var output in ref.meta.outputs) {
  80. switch (output.name) {
  81. case MeasureTerms.LvStudy:
  82. feature.updateStringValue(output, "");
  83. break;
  84. case MeasureTerms.LVEDV:
  85. updateLVEDV();
  86. break;
  87. case MeasureTerms.LVESV:
  88. updateLVESV();
  89. break;
  90. case MeasureTerms.LVdMass:
  91. updateLVdMass();
  92. break;
  93. case MeasureTerms.PercentIVS:
  94. updatePercentIVS();
  95. break;
  96. case MeasureTerms.SV:
  97. updateSV();
  98. break;
  99. case MeasureTerms.EF:
  100. updateEF();
  101. break;
  102. case MeasureTerms.FS:
  103. updatePercentFS();
  104. break;
  105. case MeasureTerms.PercentLVPW:
  106. updatePercentLVPW();
  107. break;
  108. case MeasureTerms.CO:
  109. updateCO();
  110. break;
  111. case MeasureTerms.CI:
  112. updateCI();
  113. break;
  114. case MeasureTerms.SI:
  115. updateSI();
  116. break;
  117. }
  118. }
  119. }
  120. }
  121. class LvStudyCalculatorBase<T extends TopMeasureItem>
  122. extends Calculator<T, double> {
  123. LvStudyCalculatorBase(super.ref);
  124. @protected
  125. late _ValTemp v;
  126. @override
  127. void calculate() {
  128. // TODO: implement calculate
  129. }
  130. @protected
  131. void updateLVEDV() {
  132. if (v.lvidd == null) {
  133. return;
  134. }
  135. final lvidd = v.lvidd!;
  136. double value = 0;
  137. if (GlobalCardiacConfigs.EDVFormulaMode ==
  138. CardiacEDVFormulaMode.teichholz) {
  139. value = CardiacFormulas.edvTeichholz(lvidd);
  140. } else if (GlobalCardiacConfigs.EDVFormulaMode ==
  141. CardiacEDVFormulaMode.cube) {
  142. value = CardiacFormulas.edvCube(lvidd);
  143. }
  144. updateFloatValueByName(MeasureTerms.LVEDV, value, unit: VidUsUnit.cm3);
  145. v.lvedv = value;
  146. }
  147. @protected
  148. void updateLVESV() {
  149. if (v.lvids == null) {
  150. return;
  151. }
  152. final lvids = v.lvids!;
  153. double value = 0;
  154. if (GlobalCardiacConfigs.EDVFormulaMode ==
  155. CardiacEDVFormulaMode.teichholz) {
  156. value = CardiacFormulas.esvTeichholz(lvids);
  157. } else if (GlobalCardiacConfigs.EDVFormulaMode ==
  158. CardiacEDVFormulaMode.cube) {
  159. value = CardiacFormulas.esvCube(lvids);
  160. }
  161. updateFloatValueByName(MeasureTerms.LVESV, value, unit: VidUsUnit.cm3);
  162. v.lvesv = value;
  163. }
  164. @protected
  165. void updateLVdMass() {
  166. if (v.ivsd == null || v.lvidd == null || v.lvpwd == null) {
  167. return;
  168. }
  169. double value = CardiacFormulas.lvdMass(v.ivsd!, v.lvidd!, v.lvpwd!);
  170. updateFloatValueByName(MeasureTerms.LVdMass, value, unit: VidUsUnit.kg);
  171. }
  172. @protected
  173. void updatePercentIVS() {
  174. if (v.ivsd == null || v.ivss == null) {
  175. return;
  176. }
  177. double value = CardiacFormulas.ivsPercent(v.ivss!, v.ivsd!);
  178. updateFloatValueByName(MeasureTerms.PercentIVS, value);
  179. }
  180. @protected
  181. void updateSV() {
  182. if (v.lvedv == null || v.lvesv == null) {
  183. return;
  184. }
  185. final edv = v.lvedv!;
  186. final esv = v.lvesv!;
  187. double value = CardiacFormulas.sv(edv, esv);
  188. updateFloatValueByName(MeasureTerms.SV, value, unit: VidUsUnit.cm3);
  189. v.sv = value;
  190. }
  191. @protected
  192. void updateEF() {
  193. if (v.lvedv == null || v.lvesv == null) {
  194. return;
  195. }
  196. final edv = v.lvedv!;
  197. final esv = v.lvesv!;
  198. double value = CardiacFormulas.ef(edv, esv);
  199. updateFloatValueByName(MeasureTerms.EF, value);
  200. }
  201. @protected
  202. void updatePercentFS() {
  203. if (v.lvidd == null || v.lvids == null) {
  204. return;
  205. }
  206. final lvidd = v.lvidd!;
  207. final lvids = v.lvids!;
  208. double value = CardiacFormulas.fsPercent(lvidd, lvids);
  209. updateFloatValueByName(MeasureTerms.FS, value);
  210. }
  211. @protected
  212. void updatePercentLVPW() {
  213. if (v.lvpws == null || v.lvpwd == null) {
  214. return;
  215. }
  216. final lvpws = v.lvpws!;
  217. final lvpwd = v.lvpwd!;
  218. double value = CardiacFormulas.lvpwPercent(lvpws, lvpwd);
  219. updateFloatValueByName(MeasureTerms.PercentLVPW, value);
  220. }
  221. @protected
  222. void updateCO() {
  223. if (v.sv == null || v.hr == null) {
  224. return;
  225. }
  226. double value = CardiacFormulas.co(v.sv!, hr: v.hr!);
  227. updateFloatValueByName(MeasureTerms.CO, value);
  228. }
  229. @protected
  230. void updateCI() {
  231. if (v.sv == null || v.hr == null) {
  232. return;
  233. }
  234. if (GlobalPatientConfig.bsa == 0) {
  235. return;
  236. }
  237. double value = CardiacFormulas.ci(
  238. v.sv!,
  239. hr: v.hr!,
  240. bsa: GlobalPatientConfig.bsa,
  241. );
  242. updateFloatValueByName(MeasureTerms.CI, value);
  243. }
  244. @protected
  245. void updateSI() {
  246. //_updateSI
  247. // TODO:
  248. }
  249. @protected
  250. void updateFloatValueByName(
  251. String name,
  252. double value, {
  253. VidUsUnit? unit,
  254. }) {
  255. ref.measuredFeatures;
  256. final feature = ref.feature!;
  257. final outputMeta = ref.meta.outputs.firstWhere((x) => x.name == name);
  258. feature.updateFloatValue(outputMeta, value, unit ?? outputMeta.unit);
  259. }
  260. }
  261. class _ValTemp {
  262. double? ivsd;
  263. double? lvidd;
  264. double? lvpwd;
  265. double? ivss;
  266. double? lvids;
  267. double? lvpws;
  268. double? lvedv;
  269. double? lvesv;
  270. double? sv;
  271. int? hr = GlobalPatientConfig.hr; // TODO: from vid ext
  272. }