|
@@ -1,9 +1,13 @@
|
|
|
import 'dart:ui' as ui;
|
|
|
import 'package:fis_measure/interfaces/process/calculators/output.dart';
|
|
|
+import 'package:fis_measure/interfaces/process/calculators/values.dart';
|
|
|
+import 'package:fis_measure/interfaces/process/items/item.dart';
|
|
|
+import 'package:fis_measure/interfaces/process/items/item_feature.dart';
|
|
|
import 'package:fis_measure/interfaces/process/modes/mode.dart';
|
|
|
import 'package:fis_measure/interfaces/process/workspace/application.dart';
|
|
|
import 'package:fis_measure/process/items/item_feature.dart';
|
|
|
import 'package:fis_measure/values/colors.dart';
|
|
|
+import 'package:fis_measure/values/unit_desc.dart';
|
|
|
import 'package:fis_ui/index.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:get/get.dart';
|
|
@@ -19,11 +23,9 @@ class _MeasureResultPanelState extends State<MeasureResultPanel> {
|
|
|
final _scrollController = ScrollController();
|
|
|
final application = Get.find<IApplication>();
|
|
|
|
|
|
- final List<OutputItem> outputs = [];
|
|
|
- final _outputMap = <IMode, List<OutputItem>>{};
|
|
|
- int idStrLength = 1;
|
|
|
+ final List<String> lines = [];
|
|
|
|
|
|
- bool get hasOutputs => outputs.isNotEmpty;
|
|
|
+ bool get hasOutputs => lines.isNotEmpty;
|
|
|
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
@@ -109,27 +111,14 @@ class _MeasureResultPanelState extends State<MeasureResultPanel> {
|
|
|
}
|
|
|
|
|
|
List<FWidget> _buildMainList() {
|
|
|
- final list = <FWidget>[];
|
|
|
- list.addAll(_buildModeOutput(application.applicationName, outputs));
|
|
|
- return list;
|
|
|
- }
|
|
|
-
|
|
|
- List<FWidget> _buildModeOutput(
|
|
|
- String title, List<OutputItem<dynamic>> dataList) {
|
|
|
final list = <FWidget>[
|
|
|
const FSizedBox(height: 6),
|
|
|
- _buildTitle(title),
|
|
|
+ _buildTitle(application.applicationName),
|
|
|
_buildTitleDivider(),
|
|
|
];
|
|
|
-
|
|
|
- final length = dataList.length;
|
|
|
- for (var i = 0; i < length; i++) {
|
|
|
- final output = dataList[i];
|
|
|
- final idStr = _getIdDisplayStr(output.id);
|
|
|
- list.add(const FSizedBox(height: 4));
|
|
|
- list.add(_buildLine('$idStr ${output.description}'));
|
|
|
+ for (var line in lines) {
|
|
|
+ list.add(_buildLine(line));
|
|
|
}
|
|
|
-
|
|
|
return list;
|
|
|
}
|
|
|
|
|
@@ -171,41 +160,134 @@ class _MeasureResultPanelState extends State<MeasureResultPanel> {
|
|
|
}
|
|
|
|
|
|
void _updateOutputs() {
|
|
|
- outputs.clear();
|
|
|
-
|
|
|
+ lines.clear();
|
|
|
+ final features = <IMeasureItemFeature>[];
|
|
|
for (var item in application.measureItems) {
|
|
|
- for (var feature in item.measuredFeatures) {
|
|
|
- (feature as MeasureItemFeature).hostVisualArea?.mode;
|
|
|
+ if (item.measuredFeatures.isNotEmpty) {
|
|
|
+ features.addAll(item.measuredFeatures);
|
|
|
+ }
|
|
|
+ if (item.feature != null) {
|
|
|
+ features.add(item.feature!);
|
|
|
}
|
|
|
}
|
|
|
- for (var item in application.measureItems) {
|
|
|
- if (item.calculator != null) {
|
|
|
-
|
|
|
- outputs.addAll(item.calculator!.outputs);
|
|
|
+ final idLength = features.length.toString().length;
|
|
|
+ for (var feature in features) {
|
|
|
+ final strList = _FeatureDescConverter(feature).generate(idLength);
|
|
|
+ lines.addAll(strList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void _autoScrollToBottom() {
|
|
|
+ if (lines.isEmpty) return;
|
|
|
+ Future.delayed(const Duration(milliseconds: 200), () {
|
|
|
+ if (_scrollController.hasClients) {
|
|
|
+ _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _FeatureDescConverter {
|
|
|
+ final IMeasureItemFeature feature;
|
|
|
+ _FeatureDescConverter(this.feature);
|
|
|
+
|
|
|
+ String idPlaceStr = ' ';
|
|
|
+ String idStr = ' ';
|
|
|
+
|
|
|
+ List<String> generate(int idLength) {
|
|
|
+ idPlaceStr = ' '.padRight(idLength, ' ');
|
|
|
+ idStr = feature.id.toString().padRight(idLength, ' ');
|
|
|
+
|
|
|
+ final List<String> arr = [];
|
|
|
+ final mainLines = _findFeatureLines(feature);
|
|
|
+ arr.addAll(mainLines);
|
|
|
|
|
|
- if (item.feature?.isActive == true && item.calculator!.output != null) {
|
|
|
-
|
|
|
- outputs.add(item.calculator!.output!);
|
|
|
+ final ref = feature.refItem;
|
|
|
+ if (ref is ITopMeasureItem) {
|
|
|
+ for (var child in ref.childItems) {
|
|
|
+ for (var feature in child.measuredFeatures) {
|
|
|
+ final str = _findChildLine(feature);
|
|
|
+ if (str != null && str.isNotEmpty) {
|
|
|
+ arr.add(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (child.feature != null) {
|
|
|
+ final str = _findChildLine(child.feature!);
|
|
|
+ if (str != null && str.isNotEmpty) {
|
|
|
+ arr.add(str);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- _checkIdStrLength();
|
|
|
+
|
|
|
+ return arr;
|
|
|
}
|
|
|
|
|
|
- void _checkIdStrLength() {
|
|
|
- idStrLength = outputs.length.toString().length;
|
|
|
+ String? _findChildLine(IMeasureItemFeature feature) {
|
|
|
+ if (feature.value == null) return null;
|
|
|
+
|
|
|
+ final value = feature.value!;
|
|
|
+ final valueStr = _pickValueStr(value);
|
|
|
+
|
|
|
+ final name = feature.refItem.description;
|
|
|
+ final unitStr = UnitDescriptionMap.getDesc(value.meta.unit);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return ' $idPlaceStr $name: $valueStr$unitStr';
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> _findFeatureLines(IMeasureItemFeature feature) {
|
|
|
+ final count = feature.values.length;
|
|
|
+ if (count == 0) {
|
|
|
+ final output = feature.refItem.meta.outputs.first;
|
|
|
+ final name =
|
|
|
+ _findDisplayName(output.description, output.briefAnnotation, false);
|
|
|
+ return ['$idStr $name'];
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> arr = [];
|
|
|
+ for (var i = 0; i < count; i++) {
|
|
|
+ final val = feature.values[i];
|
|
|
+ final meta = val.meta;
|
|
|
+ final valueStr = _pickValueStr(val);
|
|
|
+ final name =
|
|
|
+ _findDisplayName(meta.description, meta.briefAnnotation, false);
|
|
|
+ final unitStr = UnitDescriptionMap.getDesc(meta.unit);
|
|
|
+
|
|
|
+ if (i == 0) {
|
|
|
+ arr.add('$idStr $name: $valueStr$unitStr');
|
|
|
+ } else {
|
|
|
+ arr.add('$idPlaceStr $name: $valueStr$unitStr');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return arr;
|
|
|
}
|
|
|
|
|
|
- String _getIdDisplayStr(int id) {
|
|
|
- return id.toString().padRight(idStrLength, ' ');
|
|
|
+ String _pickValueStr(ValueBase value) {
|
|
|
+ if (value is FloatValue) {
|
|
|
+ return _roundDouble(value.value!, value.meta.fractionalDigits).toString();
|
|
|
+ } else if (value is StringValue) {
|
|
|
+ return value.value!;
|
|
|
+ }
|
|
|
+ return '';
|
|
|
}
|
|
|
|
|
|
- void _autoScrollToBottom() {
|
|
|
- if (outputs.isEmpty) return;
|
|
|
- Future.delayed(const Duration(milliseconds: 200), () {
|
|
|
- if (_scrollController.hasClients) {
|
|
|
- _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
|
|
|
+ String _findDisplayName(String description, String? briefAnnotation,
|
|
|
+ [bool showAnnotation = false]) {
|
|
|
+ if (showAnnotation) {
|
|
|
+ if (briefAnnotation != null && briefAnnotation.isNotEmpty) {
|
|
|
+ return briefAnnotation;
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ return description;
|
|
|
+ }
|
|
|
+
|
|
|
+ double _roundDouble(double value, [int digits = 2]) {
|
|
|
+ final digitsStr = value.toStringAsFixed(digits);
|
|
|
+ final result = double.parse(digitsStr);
|
|
|
+ return result;
|
|
|
}
|
|
|
}
|