calculator.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import 'package:fis_common/event/event_type.dart';
  2. import 'package:fis_measure/interfaces/process/calculators/calculator.dart';
  3. import 'package:fis_measure/interfaces/process/calculators/output.dart';
  4. import 'package:fis_measure/interfaces/process/calculators/values.dart';
  5. import 'package:fis_measure/interfaces/process/items/item.dart';
  6. import 'package:fis_measure/process/items/item.dart';
  7. import 'package:fis_measure/process/items/item_feature.dart';
  8. import 'package:flutter/foundation.dart';
  9. import 'package:vid/us/vid_us_unit.dart';
  10. abstract class Calculator<T extends IMeasureItem, TValue>
  11. implements ICalculator<TValue> {
  12. late T _ref;
  13. Calculator(T ref) {
  14. _ref = ref;
  15. }
  16. T get ref => _ref;
  17. @override
  18. var outputChanged = FEventHandler<OutputItem<TValue>?>();
  19. @override
  20. void finishOnce() {}
  21. @override
  22. Future<void> calculateAsync() async {}
  23. @protected
  24. FloatValue? updateFloatValue(
  25. double value, {
  26. VidUsUnit? unit,
  27. bool useUnitY = false,
  28. bool useRound = false,
  29. }) {
  30. if (ref.feature == null) return null;
  31. final feature = ref.feature! as MeasureItemFeature;
  32. if (unit == null) {
  33. final viewport = feature.hostVisualArea!.viewport!;
  34. unit = useUnitY ? viewport.yUnit : viewport.xUnit;
  35. }
  36. final output = ref.meta.outputs.first;
  37. final val = useRound ? roundDouble(value, output.fractionalDigits) : value;
  38. return feature.updateFloatValue(
  39. ref.meta.outputs.first,
  40. val,
  41. unit,
  42. );
  43. }
  44. @protected
  45. StringValue? updateStringValue(String value) {
  46. if (ref.feature == null) return null;
  47. final feature = ref.feature! as MeasureItemFeature;
  48. return feature.updateStringValue(ref.meta.outputs.first, value);
  49. }
  50. /// 对double四舍五入
  51. double roundDouble(double value, [int digits = 2]) {
  52. final digitsStr = value.toStringAsFixed(digits);
  53. final result = double.parse(digitsStr);
  54. return result;
  55. }
  56. /// 获取结果精度
  57. @protected
  58. int getResultDigits(OutputItem item) {
  59. int fractionalDigits = 2;
  60. VidUsUnit? targetUnit = item.unit;
  61. switch (targetUnit) {
  62. case VidUsUnit.mm:
  63. fractionalDigits = 3;
  64. break;
  65. case VidUsUnit.mm2:
  66. fractionalDigits = 4;
  67. break;
  68. case VidUsUnit.mm3:
  69. fractionalDigits = 5;
  70. break;
  71. case VidUsUnit.msec:
  72. fractionalDigits = 3;
  73. break;
  74. default:
  75. // fractionalDigits = GetConfigDigits(item);
  76. break;
  77. }
  78. return fractionalDigits;
  79. }
  80. @protected
  81. double? pickChildFloatValue(MeasureItem item) {
  82. if (item.calculator == null) return null;
  83. ValueBase? value;
  84. if (item.measuredFeatures.isNotEmpty) {
  85. value = item.measuredFeatures.first.value;
  86. } else if (item.feature != null) {
  87. value = item.feature!.value;
  88. }
  89. if (value != null) {
  90. return (value as FloatValue).value ?? 0;
  91. }
  92. return null;
  93. }
  94. @protected
  95. FloatValue? pickChildToFloatValue(MeasureItem item) {
  96. if (item.calculator == null) return null;
  97. ValueBase? value;
  98. if (item.measuredFeatures.isNotEmpty) {
  99. value = item.measuredFeatures.first as FloatValue;
  100. } else if (item.feature != null) {
  101. value = item.feature!.value;
  102. }
  103. if (value != null) {
  104. return value as FloatValue;
  105. }
  106. return null;
  107. }
  108. @protected
  109. TF? findChildFeature<TF extends MeasureItemFeature>(MeasureItem child) {
  110. if (child.measuredFeatures.isNotEmpty) {
  111. return child.measuredFeatures.first as TF;
  112. }
  113. return child.feature as TF?;
  114. }
  115. }