urm.dart 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. import 'dart:math';
  2. import 'dart:ui';
  3. import 'package:fis_common/logger/logger.dart';
  4. import 'package:fis_jsonrpc/rpc.dart';
  5. import 'package:fis_measure/interfaces/date_types/point.dart';
  6. import 'package:fis_measure/interfaces/process/calculators/values.dart';
  7. import 'package:fis_measure/interfaces/process/items/terms.dart';
  8. import 'package:fis_measure/interfaces/process/items/types.dart';
  9. import 'package:fis_measure/process/items/item.dart';
  10. import 'package:fis_measure/process/primitives/area_abstract.dart';
  11. import 'package:fis_measure/process/primitives/combos/urm_den_combo.dart';
  12. import 'package:fis_measure/process/primitives/combos/urm_sr_roi_rect_combo.dart';
  13. import 'package:fis_measure/process/primitives/combos/urm_vel_combo.dart';
  14. import 'package:fis_measure/process/primitives/location.dart';
  15. import 'package:fis_measure/process/primitives/straightline.dart';
  16. import 'package:fis_measure/process/primitives/urm_rect.dart';
  17. import 'package:fis_measure/process/workspace/urm/application.dart';
  18. import 'package:vid/us/vid_us_unit.dart';
  19. import 'calculator.dart';
  20. class URMRectCal extends Calculator<URMRect, double> {
  21. URMRectCal(
  22. URMRect ref, {
  23. required this.type,
  24. }) : super(ref);
  25. final String type;
  26. @override
  27. void calculate() {}
  28. @override
  29. Future<void> calculateAsync() async {
  30. if (ref.feature == null) return;
  31. Size urmResultSize = const Size(0, 0);
  32. try {
  33. if (ref.application is! URMApplication) {
  34. return;
  35. }
  36. final URMApplication urmApplication = ref.application as URMApplication;
  37. urmResultSize = Size(urmApplication.resultWidth.toDouble(),
  38. urmApplication.resultHeight.toDouble());
  39. final p1 = ref.feature!.startPoint;
  40. final p2 = ref.feature!.endPoint;
  41. //左上顶点
  42. final leftTopPercent =
  43. DPoint(p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y);
  44. //右下顶点
  45. final rightBottomPercent =
  46. DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
  47. final startPoint = leftTopPercent.scale2Size(urmResultSize);
  48. final endPoint = rightBottomPercent.scale2Size(urmResultSize);
  49. String description = "URM\n Calculating...";
  50. updateStringValue(description);
  51. switch (type) {
  52. case MeasureTypes.DensitySR:
  53. case MeasureTypes.SRRoiDensity:
  54. case MeasureTypes.Roi1:
  55. case MeasureTypes.Roi2:
  56. await getSRRoiDensityResult(urmApplication, startPoint, endPoint);
  57. break;
  58. case MeasureTypes.FractalDimSR:
  59. case MeasureTypes.SRROIFractalDim:
  60. await getSRRoiFractalDimResult(urmApplication, startPoint, endPoint);
  61. break;
  62. case MeasureTypes.SRRoiVel:
  63. await getSRRoiVelResult(urmApplication, startPoint, endPoint);
  64. break;
  65. case MeasureTypes.URMVelMeasure:
  66. await getURMVelMeasureResult(urmApplication, startPoint, endPoint);
  67. break;
  68. default:
  69. }
  70. } catch (e) {
  71. logger.e('URM Measure error: $e');
  72. return;
  73. }
  74. }
  75. //✅ URM 测量项 2
  76. Future<void> getSRRoiDensityResult(
  77. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  78. String description = "URM\n Measuring";
  79. try {
  80. GetSRRoiVelResult? result =
  81. await app.getSRRoiVelResult(startPoint, endPoint);
  82. if (result != null) {
  83. print("URM Measure output: ${result.output} ");
  84. final feature = ref.feature!;
  85. for (var output in ref.meta.outputs) {
  86. if ([MeasureTerms.URMDenROI, MeasureTerms.URMDenFractalDim]
  87. .contains(output.name)) {
  88. output.unit = VidUsUnit.percent;
  89. feature.updateFloatValue(output, result.output, output.unit);
  90. }
  91. }
  92. } else {
  93. throw Exception("URM Measure API error");
  94. }
  95. } catch (e) {
  96. description = " ";
  97. updateStringValue(description);
  98. return;
  99. }
  100. ref.application.updateRenderReady.emit(this, null);
  101. }
  102. //✅ URM 测量项 3 未验证需要组合测量项
  103. Future<void> getSRRoiFractalDimResult(
  104. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  105. String description = "URM\n Measuring";
  106. try {
  107. GetSRRoiFractalDimResult? result =
  108. await app.getSRRoiFractalDimResult(startPoint, endPoint);
  109. if (result != null) {
  110. print("URM Measure output: ${result.output} ");
  111. final feature = ref.feature!;
  112. for (var output in ref.meta.outputs) {
  113. if (output.name == MeasureTerms.URMDenFractalDim) {
  114. output.unit = VidUsUnit.None;
  115. feature.updateFloatValue(output, result.output, output.unit);
  116. }
  117. }
  118. } else {
  119. throw Exception("URM Measure API error");
  120. }
  121. } catch (e) {
  122. description = " ";
  123. updateStringValue(description);
  124. return;
  125. }
  126. ref.application.updateRenderReady.emit(this, null);
  127. }
  128. //✅ URM 测量项 7 未验证需要组合测量项
  129. Future<void> getSRRoiVelResult(
  130. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  131. String description = "URM\n Measuring";
  132. try {
  133. GetSRRoiVelResult? result =
  134. await app.getSRRoiVelResult(startPoint, endPoint);
  135. if (result != null) {
  136. print("URM Measure output: ${result.output} ");
  137. final feature = ref.feature!;
  138. for (var output in ref.meta.outputs) {
  139. if (output.name == MeasureTerms.SRRoiVel) {
  140. output.unit = VidUsUnit.percent;
  141. feature.updateFloatValue(output, result.output, output.unit);
  142. }
  143. }
  144. } else {
  145. throw Exception("URM Measure API error");
  146. }
  147. } catch (e) {
  148. description = " ";
  149. updateStringValue(description);
  150. return;
  151. }
  152. ref.application.updateRenderReady.emit(this, null);
  153. }
  154. //✅ URM 测量项 9
  155. Future<void> getURMVelMeasureResult(
  156. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  157. String description = "URM\n Measuring";
  158. try {
  159. GetURMVelMeasureResult? result =
  160. await app.getURMVelMeasureResult(startPoint, endPoint);
  161. if (result != null) {
  162. // TODO 全部内容展示
  163. print("URM Measure inMaxVel: ${result.inMaxVel} ");
  164. final feature = ref.feature!;
  165. for (var output in ref.meta.outputs) {
  166. if (output.name == MeasureTerms.URMVelMax) {
  167. output.unit = VidUsUnit.mms;
  168. feature.updateFloatValue(
  169. output, result.maxVel + app.urmMinVel, VidUsUnit.mms);
  170. }
  171. if (output.name == MeasureTerms.URMVelMin) {
  172. output.unit = VidUsUnit.mms;
  173. feature.updateFloatValue(
  174. output, result.minVel + app.urmMinVel, VidUsUnit.mms);
  175. }
  176. if (output.name == MeasureTerms.URMVelMean) {
  177. output.unit = VidUsUnit.mms;
  178. feature.updateFloatValue(
  179. output, result.meanVel + app.urmMinVel, VidUsUnit.mms);
  180. }
  181. if (output.name == MeasureTerms.URMVelStd) {
  182. output.unit = VidUsUnit.mms;
  183. feature.updateFloatValue(
  184. output, sqrt(result.varianceVel), VidUsUnit.mms);
  185. }
  186. if (output.name == MeasureTerms.Area) {
  187. output.unit = VidUsUnit.cm2;
  188. feature.updateFloatValue(output, result.roiArea, VidUsUnit.cm2);
  189. }
  190. }
  191. } else {
  192. throw Exception("URM Measure API error");
  193. }
  194. } catch (e) {
  195. description = " ";
  196. updateStringValue(description);
  197. return;
  198. }
  199. ref.application.updateRenderReady.emit(this, null);
  200. }
  201. }
  202. class URMLocationCal extends Calculator<Location, double> {
  203. URMLocationCal(Location ref) : super(ref);
  204. @override
  205. void calculate() {}
  206. @override
  207. Future<void> calculateAsync() async {
  208. if (ref.feature == null) return;
  209. Size urmResultSize = const Size(0, 0);
  210. try {
  211. if (ref.application is! URMApplication) {
  212. return;
  213. }
  214. final URMApplication urmApplication = ref.application as URMApplication;
  215. urmResultSize = Size(urmApplication.resultWidth.toDouble(),
  216. urmApplication.resultHeight.toDouble());
  217. // urmResultWidth = urmApplication.resultWidth;
  218. // urmResultHeight = urmApplication.resultHeight;
  219. final point = ref.feature!.point.clone();
  220. final startPoint = point.scale2Size(urmResultSize);
  221. print("URM Measure startPoint: $startPoint");
  222. await getSRLoactionVelResult(urmApplication, startPoint);
  223. return;
  224. } catch (e) {
  225. logger.e('URM Measure error: $e');
  226. return;
  227. }
  228. }
  229. // ✅ URM 测量项 6
  230. Future<void> getSRLoactionVelResult(
  231. URMApplication app, DPoint startPoint) async {
  232. String description = "URM\n Measuring";
  233. try {
  234. GetSRLoactionVelResult? result =
  235. await app.getSRLoactionVelResult(startPoint);
  236. if (result != null) {
  237. print("URM Measure output: ${result.output}");
  238. final feature = ref.feature!;
  239. for (var output in ref.meta.outputs) {
  240. if (output.name == MeasureTerms.SRVel) {
  241. output.unit = VidUsUnit.mms;
  242. feature.updateFloatValue(output, result.output, output.unit);
  243. }
  244. }
  245. } else {
  246. throw Exception("URM Measure API error");
  247. }
  248. } catch (e) {
  249. description = " ";
  250. updateStringValue(description);
  251. return;
  252. }
  253. ref.application.updateRenderReady.emit(this, null);
  254. }
  255. }
  256. class URMStraightLineCal extends Calculator<StraightLine, double> {
  257. URMStraightLineCal(
  258. StraightLine ref, {
  259. required this.type,
  260. }) : super(ref);
  261. final String type;
  262. @override
  263. void calculate() {}
  264. @override
  265. Future<void> calculateAsync() async {
  266. if (ref.feature == null) return;
  267. try {
  268. if (ref.application is! URMApplication) {
  269. return;
  270. }
  271. Size urmResultSize = const Size(0, 0);
  272. final URMApplication urmApplication = ref.application as URMApplication;
  273. urmResultSize = Size(urmApplication.resultWidth.toDouble(),
  274. urmApplication.resultHeight.toDouble());
  275. final p1 = ref.feature!.startPoint;
  276. final p2 = ref.feature!.endPoint;
  277. final leftTopPercent =
  278. DPoint(p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y);
  279. final rightBottomPercent =
  280. DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
  281. final startPoint = leftTopPercent.scale2Size(urmResultSize);
  282. final endPoint = rightBottomPercent.scale2Size(urmResultSize);
  283. switch (type) {
  284. case MeasureTypes.SRCurvature:
  285. await getSRCurvatureResult(urmApplication, startPoint, endPoint);
  286. break;
  287. case MeasureTypes.URMDensityMeasure:
  288. await getURMDenMeasureResult(urmApplication, startPoint, endPoint);
  289. break;
  290. case MeasureTypes.URMVesselMeasure:
  291. final feature = ref.feature!;
  292. final viewport = feature.hostVisualArea!.viewport!;
  293. final p1 = feature.startPoint;
  294. final p2 = feature.endPoint;
  295. final pp1 = viewport.convert(p1);
  296. final pp2 = viewport.convert(p2);
  297. final cmlength = (pp2 - pp1).length.abs();
  298. await getURMVessMeasureResult(
  299. urmApplication, startPoint, endPoint, cmlength);
  300. break;
  301. default:
  302. }
  303. } catch (e) {
  304. logger.e('URM Measure error: $e');
  305. return;
  306. }
  307. }
  308. // ✅ URM 测量项 1
  309. Future<void> getSRCurvatureResult(
  310. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  311. String description = "URM\n Measuring";
  312. try {
  313. GetSRCurvatureResult? result =
  314. await app.getSRCurvatureResult(startPoint, endPoint);
  315. if (result != null) {
  316. print(
  317. "URM Measure curvature: ${result.curvature} nums: ${result.outPointsNum}");
  318. final feature = ref.feature!;
  319. for (var output in ref.meta.outputs) {
  320. if (output.name == MeasureTerms.SRCurvature) {
  321. output.unit = VidUsUnit.None;
  322. feature.updateFloatValue(output, result.curvature, output.unit);
  323. }
  324. }
  325. } else {
  326. throw Exception("URM Measure API error");
  327. }
  328. } catch (e) {
  329. description = " ";
  330. updateStringValue(description);
  331. return;
  332. }
  333. ref.application.updateRenderReady.emit(this, null);
  334. }
  335. //✅ URM 测量项 8
  336. Future<void> getURMDenMeasureResult(
  337. URMApplication app, DPoint startPoint, DPoint endPoint) async {
  338. String description = "URM\n Measuring";
  339. try {
  340. GetURMDenMeasureResult? result =
  341. await app.getURMDenMeasureResult(startPoint, endPoint);
  342. if (result != null) {
  343. print(
  344. "URM Measure inMaxDensity: ${result.inMaxDensity} inMeanDensity: ${result.inMeanDensity}");
  345. // description = "${(result.inMaxDensity).toStringAsFixed(2)}mm/s ...";
  346. final feature = ref.feature!;
  347. for (var output in ref.meta.outputs) {
  348. if (output.name == MeasureTerms.URMDenROI) {
  349. output.unit = VidUsUnit.percent;
  350. feature.updateFloatValue(
  351. output, result.roiDen * 100, VidUsUnit.percent);
  352. }
  353. if (output.name == MeasureTerms.URMDenFractalDim) {
  354. output.unit = VidUsUnit.None;
  355. feature.updateFloatValue(
  356. output, result.roiFractalDim, VidUsUnit.None);
  357. }
  358. if (output.name == MeasureTerms.URMDenMax) {
  359. output.unit = VidUsUnit.None;
  360. feature.updateFloatValue(output, result.maxDensity, VidUsUnit.None);
  361. }
  362. if (output.name == MeasureTerms.URMDenMin) {
  363. output.unit = VidUsUnit.None;
  364. feature.updateFloatValue(output, result.minDensity, VidUsUnit.None);
  365. }
  366. if (output.name == MeasureTerms.URMDenMean) {
  367. output.unit = VidUsUnit.None;
  368. feature.updateFloatValue(
  369. output, result.meanDensity, VidUsUnit.None);
  370. }
  371. if (output.name == MeasureTerms.URMDenStd) {
  372. output.unit = VidUsUnit.None;
  373. feature.updateFloatValue(
  374. output, sqrt(result.varianceDensity), VidUsUnit.None);
  375. }
  376. if (output.name == MeasureTerms.Area) {
  377. output.unit = VidUsUnit.cm2;
  378. feature.updateFloatValue(output, result.roiArea, VidUsUnit.cm2);
  379. }
  380. }
  381. } else {
  382. throw Exception("URM Measure API error");
  383. }
  384. } catch (e) {
  385. description = " ";
  386. updateStringValue(description);
  387. return;
  388. }
  389. ref.application.updateRenderReady.emit(this, null);
  390. }
  391. //✅ URM 测量项 10
  392. Future<void> getURMVessMeasureResult(URMApplication app, DPoint startPoint,
  393. DPoint endPoint, double cmlength) async {
  394. String description = "URM\n Measuring";
  395. try {
  396. GetUrmVessMeasureResult? result =
  397. await app.getURMVessMeasureResult(startPoint, endPoint, cmlength);
  398. if (result != null) {
  399. app.onUpdateChart?.call(
  400. URMChartParams(
  401. cmlength: cmlength,
  402. minPointIndex: result.minPos,
  403. maxPointIndex: result.maxPos,
  404. points: convertPoints(result.outputPoints),
  405. ),
  406. );
  407. print(
  408. "URM Measure inMaxDensity: ${result.maxVessDiameter} inMeanDensity: ${result.meanVessDistacne}");
  409. final feature = ref.feature!;
  410. for (var output in ref.meta.outputs) {
  411. if (output.name == MeasureTerms.MaxVessDistance) {
  412. output.unit = VidUsUnit.mm;
  413. feature.updateFloatValue(
  414. output, result.maxVessDistance, VidUsUnit.mm);
  415. }
  416. if (output.name == MeasureTerms.MinVessDistance) {
  417. output.unit = VidUsUnit.mm;
  418. feature.updateFloatValue(
  419. output, result.minVessDistance, VidUsUnit.mm);
  420. }
  421. if (output.name == MeasureTerms.MeanVessDistacne) {
  422. output.unit = VidUsUnit.mm;
  423. feature.updateFloatValue(
  424. output, result.meanVessDistacne, VidUsUnit.mm);
  425. }
  426. if (output.name == MeasureTerms.StdVessDistance) {
  427. output.unit = VidUsUnit.mm;
  428. feature.updateFloatValue(
  429. output, sqrt(result.varianceVessDistance), VidUsUnit.mm);
  430. }
  431. if (output.name == MeasureTerms.MaxVessDiameter) {
  432. output.unit = VidUsUnit.mm;
  433. feature.updateFloatValue(
  434. output, result.maxVessDiameter, VidUsUnit.mm);
  435. }
  436. if (output.name == MeasureTerms.MinVessDiameter) {
  437. output.unit = VidUsUnit.mm;
  438. feature.updateFloatValue(
  439. output, result.minVessDiameter, VidUsUnit.mm);
  440. }
  441. if (output.name == MeasureTerms.MeanVessDiameter) {
  442. output.unit = VidUsUnit.mm;
  443. feature.updateFloatValue(
  444. output, result.meanVessDiameter, VidUsUnit.mm);
  445. }
  446. if (output.name == MeasureTerms.StdVessDiameter) {
  447. output.unit = VidUsUnit.mm;
  448. feature.updateFloatValue(
  449. output, sqrt(result.varianceVessDiameter), VidUsUnit.mm);
  450. }
  451. }
  452. } else {
  453. throw Exception("URM Measure API error");
  454. }
  455. } catch (e) {
  456. description = " ";
  457. updateStringValue(description);
  458. return;
  459. }
  460. ref.application.updateRenderReady.emit(this, null);
  461. }
  462. List<Point> convertPoints(List<UrmPoint>? points) {
  463. if (points == null) return [];
  464. List<Point> urmPoints = [];
  465. for (var point in points) {
  466. urmPoints.add(Point(point.x, point.y));
  467. }
  468. return urmPoints;
  469. }
  470. //
  471. }
  472. class URMTraceCal extends Calculator<AreaItemAbstract, double> {
  473. URMTraceCal(
  474. AreaItemAbstract ref, {
  475. required this.type,
  476. }) : super(ref);
  477. final String type;
  478. @override
  479. void calculate() {}
  480. @override
  481. Future<void> calculateAsync() async {
  482. if (ref.feature == null) return;
  483. final feature = ref.feature!;
  484. try {
  485. if (ref.application is! URMApplication) {
  486. return;
  487. }
  488. Size urmResultSize = const Size(0, 0);
  489. final URMApplication urmApplication = ref.application as URMApplication;
  490. urmResultSize = Size(urmApplication.resultWidth.toDouble(),
  491. urmApplication.resultHeight.toDouble());
  492. final List<DPoint> points =
  493. feature.innerPoints.map((e) => e.scale2Size(urmResultSize)).toList();
  494. switch (type) {
  495. case MeasureTypes.SRTraceDensity:
  496. await getSRTraceVelResult(urmApplication, convertPoints(points));
  497. break;
  498. case MeasureTypes.SRTraceFractalDim:
  499. await getSRTraceFractalDimResult(
  500. urmApplication, convertPoints(points));
  501. break;
  502. default:
  503. }
  504. } catch (e) {
  505. logger.e('URM Measure error: $e');
  506. return;
  507. }
  508. }
  509. //✅ URM 测量项 4
  510. Future<void> getSRTraceVelResult(
  511. URMApplication app, List<UrmPoint> points) async {
  512. String description = "URM\n Measuring";
  513. try {
  514. GetSRTraceVelResult? result = await app.getSRTraceVelResult(points);
  515. if (result != null) {
  516. print("URM Measure output: ${result.output} ");
  517. final feature = ref.feature!;
  518. for (var output in ref.meta.outputs) {
  519. if (output.name == MeasureTerms.URMDenROI) {
  520. output.unit = VidUsUnit.percent;
  521. feature.updateFloatValue(output, result.output, output.unit);
  522. }
  523. }
  524. } else {
  525. throw Exception("URM Measure API error");
  526. }
  527. } catch (e) {
  528. description = " ";
  529. updateStringValue(description);
  530. return;
  531. }
  532. ref.application.updateRenderReady.emit(this, null);
  533. }
  534. //✅ URM 测量项 5
  535. Future<void> getSRTraceFractalDimResult(
  536. URMApplication app, List<UrmPoint> points) async {
  537. String description = "URM\n Measuring";
  538. try {
  539. GetSRTraceFractalDimResult? result =
  540. await app.getSRTraceFractalDimResult(points);
  541. if (result != null) {
  542. print("URM Measure output: ${result.output} ");
  543. final feature = ref.feature!;
  544. for (var output in ref.meta.outputs) {
  545. if (output.name == MeasureTerms.URMDenFractalDim) {
  546. output.unit = VidUsUnit.None;
  547. feature.updateFloatValue(output, result.output, output.unit);
  548. }
  549. }
  550. } else {
  551. throw Exception("URM Measure API error");
  552. }
  553. } catch (e) {
  554. description = " ";
  555. updateStringValue(description);
  556. return;
  557. }
  558. ref.application.updateRenderReady.emit(this, null);
  559. }
  560. List<UrmPoint> convertPoints(List<DPoint> points) {
  561. List<UrmPoint> urmPoints = [];
  562. for (var point in points) {
  563. urmPoints.add(UrmPoint(x: point.x, y: point.y));
  564. }
  565. return urmPoints;
  566. }
  567. }
  568. class URMVelCal extends Calculator<URMVelAbstract, double> {
  569. URMVelCal(URMVelAbstract ref) : super(ref);
  570. @override
  571. void calculate() {
  572. if (ref.feature == null) return;
  573. final a1 = _pickChildValue(ref.child1);
  574. final a2 = _pickChildValue(ref.child2);
  575. final a3 = _pickChildValue(ref.child2);
  576. final feature = ref.feature!;
  577. final viewport = feature.hostVisualArea!.viewport!;
  578. // if (a1 != null && a2 != null) {
  579. // final value = GeneralFormulas.countStenosis(
  580. // a1,
  581. // a2,
  582. // );
  583. // updateFloatValue(value);
  584. // }
  585. }
  586. double? _pickChildValue(MeasureItem item) {
  587. if (item.calculator == null) return null;
  588. ValueBase? value;
  589. if (item.measuredFeatures.isNotEmpty) {
  590. value = item.measuredFeatures.first.value;
  591. } else if (item.feature != null) {
  592. value = item.feature!.value;
  593. }
  594. if (value != null && value is FloatValue) {
  595. return (value).value ?? 0;
  596. }
  597. return null;
  598. }
  599. }
  600. class URMDenCal extends Calculator<URMDenAbstract, double> {
  601. URMDenCal(URMDenAbstract ref) : super(ref);
  602. @override
  603. void calculate() {
  604. if (ref.feature == null) return;
  605. final a1 = _pickChildValue(ref.child1);
  606. final a2 = _pickChildValue(ref.child2);
  607. final a3 = _pickChildValue(ref.child2);
  608. final feature = ref.feature!;
  609. final viewport = feature.hostVisualArea!.viewport!;
  610. // if (a1 != null && a2 != null) {
  611. // final value = GeneralFormulas.countStenosis(
  612. // a1,
  613. // a2,
  614. // );
  615. // updateFloatValue(value);
  616. // }
  617. }
  618. double? _pickChildValue(MeasureItem item) {
  619. if (item.calculator == null) return null;
  620. ValueBase? value;
  621. if (item.measuredFeatures.isNotEmpty) {
  622. value = item.measuredFeatures.first.value;
  623. } else if (item.feature != null) {
  624. value = item.feature!.value;
  625. }
  626. if (value != null && value is FloatValue) {
  627. return (value).value ?? 0;
  628. }
  629. return null;
  630. }
  631. }
  632. class URMSrDensityCal extends Calculator<URMTwoSRRoiRectAbstract, double> {
  633. URMSrDensityCal(URMTwoSRRoiRectAbstract ref) : super(ref);
  634. @override
  635. void calculate() {
  636. if (ref.feature == null) return;
  637. final a1 = _pickChildValue(ref.child1);
  638. final a2 = _pickChildValue(ref.child2);
  639. final a3 = _pickChildValue(ref.child2);
  640. final feature = ref.feature!;
  641. final viewport = feature.hostVisualArea!.viewport!;
  642. // if (a1 != null && a2 != null) {
  643. // final value = GeneralFormulas.countStenosis(
  644. // a1,
  645. // a2,
  646. // );
  647. // updateFloatValue(value);
  648. // }
  649. }
  650. double? _pickChildValue(MeasureItem item) {
  651. if (item.calculator == null) return null;
  652. ValueBase? value;
  653. if (item.measuredFeatures.isNotEmpty) {
  654. value = item.measuredFeatures.first.value;
  655. } else if (item.feature != null) {
  656. value = item.feature!.value;
  657. }
  658. if (value != null && value is FloatValue) {
  659. return (value).value ?? 0;
  660. }
  661. return null;
  662. }
  663. }