measure_tools_title.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  3. import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
  4. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  5. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  6. import 'package:fis_measure/process/workspace/measure_handler.dart';
  7. import 'package:fis_ui/index.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:get/get.dart';
  10. import 'package:fis_theme/theme.dart';
  11. import 'package:vid/us/vid_us_mode.dart';
  12. import 'package:vid/us/vid_us_unit.dart';
  13. /// 测量方法 Har
  14. class LeftMeasureTools extends StatefulWidget implements FWidget {
  15. const LeftMeasureTools();
  16. @override
  17. State<LeftMeasureTools> createState() => _LeftMeasureToolsState();
  18. }
  19. class _LeftMeasureToolsState extends State<LeftMeasureTools> {
  20. late final application = Get.find<IApplication>();
  21. late final measureHandler = Get.find<MeasureHandler>();
  22. /// 数据
  23. late final measureData = Get.find<MeasureDataController>();
  24. void changeItem(ItemMeta itemMeta) {
  25. application.switchItem(itemMeta);
  26. if (mounted) {
  27. setState(() {});
  28. }
  29. }
  30. void applicationModesChanged(sender, List<VidUsMode> e) {
  31. if (mounted) {
  32. setState(() {});
  33. }
  34. }
  35. void visualAreaChanged(sender, IVisualArea e) {
  36. if (mounted) {
  37. setAvailableModes(e.mode.modeType.toString().split('.')[1]);
  38. }
  39. }
  40. /// 获取组合测量项
  41. void comboList() {
  42. List<ItemMeta> itemMetaList = [];
  43. for (var element in measureData.itemMetaList) {
  44. if (measureData.getMeasureApplicationList.contains(element.name)) {
  45. List<ItemOutputMeta> itemOutputMeta = [];
  46. String? multiMethod;
  47. List<OutputItemMetaDTO> availableOutputs =
  48. element.calculator?.availableOutputs ?? [];
  49. for (var element in availableOutputs) {
  50. itemOutputMeta.add(
  51. ItemOutputMeta(
  52. element.name ?? '',
  53. element.description ?? '',
  54. VidUsUnitMap.getUnit(element.unit),
  55. ),
  56. );
  57. }
  58. List<ItemMeta> childItemMetas = [];
  59. if (element.multiMethodItems?.isNotEmpty ?? false) {
  60. ChildItemMetaDTO? itemMeta = element.multiMethodItems!
  61. .firstWhereOrNull((element) => element.isWorking == true);
  62. List<ChildItemMetaDTO> childItems = itemMeta?.childItems ?? [];
  63. /// 组合测量项部分
  64. for (var element in childItems) {
  65. childItemMetas.add(
  66. ItemMeta(
  67. element.name ?? '',
  68. measureType: element.measureTypeName!,
  69. description: element.description ?? '',
  70. outputs: itemOutputMeta,
  71. childItems: childItemMetas,
  72. ),
  73. );
  74. }
  75. }
  76. itemMetaList.add(
  77. ItemMeta(
  78. element.name ?? '',
  79. measureType: element.measureTypeName!,
  80. description: element.description ?? '',
  81. outputs: itemOutputMeta,
  82. childItems: childItemMetas,
  83. ),
  84. );
  85. }
  86. }
  87. measureData.getItemMetaList = itemMetaList;
  88. }
  89. void setAvailableModes(String name) {
  90. var models = measureData.availableModes;
  91. measureData.currentMode = name;
  92. if (models.isNotEmpty) {
  93. ///群组列表
  94. var groups = models
  95. .firstWhereOrNull(
  96. (element) => element.modeName == measureData.currentMode)
  97. ?.availableGroups;
  98. if (groups != null && groups.isNotEmpty) {
  99. ///项目列表
  100. var folders = groups[0].availableFolders;
  101. if (folders != null && folders.isNotEmpty) {
  102. measureData.getMeasureApplicationList =
  103. folders[0].workingItemNames ?? [];
  104. if (folders[0].availableItems != null) {
  105. measureData.itemMetaList = folders[0].availableItems!.toList();
  106. comboList();
  107. }
  108. if (measureData.getMeasureApplicationList.isNotEmpty) {
  109. changeItem(measureData.getItemMetaList[0]);
  110. }
  111. }
  112. }
  113. }
  114. setState(() {});
  115. }
  116. @override
  117. void initState() {
  118. super.initState();
  119. measureData.applicationModesChanged.addListener(applicationModesChanged);
  120. application.visualAreaChanged.addListener(visualAreaChanged);
  121. }
  122. @override
  123. void dispose() {
  124. super.dispose();
  125. measureData.applicationModesChanged.removeListener(applicationModesChanged);
  126. application.visualAreaChanged.removeListener(visualAreaChanged);
  127. }
  128. @override
  129. FWidget build(BuildContext context) {
  130. return FContainer(
  131. width: 300,
  132. height: 50,
  133. alignment: Alignment.topCenter,
  134. padding: const EdgeInsets.symmetric(horizontal: 15),
  135. child: FGridView.count(
  136. shrinkWrap: true,
  137. crossAxisCount: 4,
  138. crossAxisSpacing: 10,
  139. mainAxisSpacing: 10,
  140. childAspectRatio: 1 / 0.5,
  141. children: measureData.applicationModes.asMap().entries.map((e) {
  142. final bool isACtiveModes =
  143. measureData.currentMode == e.value.type.name;
  144. return FInkWell(
  145. onTap: () {
  146. setAvailableModes(e.value.type.name);
  147. setState(() {});
  148. },
  149. child: FContainer(
  150. alignment: Alignment.center,
  151. decoration: BoxDecoration(
  152. border: isACtiveModes
  153. ? Border.all(
  154. color: FTheme.ins.colorScheme.primary,
  155. )
  156. : Border.all(
  157. color: Colors.grey,
  158. ),
  159. borderRadius: BorderRadius.circular(4),
  160. color: isACtiveModes
  161. ? FTheme.ins.colorScheme.primary
  162. : Colors.grey,
  163. ),
  164. child: FText(
  165. e.value.displayName,
  166. style: const TextStyle(
  167. color: Colors.white,
  168. ),
  169. ),
  170. ),
  171. );
  172. }).toList(),
  173. ),
  174. );
  175. }
  176. }