import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_measure/interfaces/process/items/item_metas.dart'; import 'package:fis_measure/interfaces/process/visuals/visual_area.dart'; import 'package:fis_measure/interfaces/process/workspace/application.dart'; import 'package:fis_measure/process/workspace/measure_data_controller.dart'; import 'package:fis_measure/process/workspace/measure_handler.dart'; import 'package:fis_ui/index.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:fis_theme/theme.dart'; import 'package:vid/us/vid_us_mode.dart'; import 'package:vid/us/vid_us_unit.dart'; /// 测量方法 Har class LeftMeasureTools extends StatefulWidget implements FWidget { const LeftMeasureTools(); @override State createState() => _LeftMeasureToolsState(); } class _LeftMeasureToolsState extends State { late final application = Get.find(); late final measureHandler = Get.find(); /// 数据 late final measureData = Get.find(); void changeItem(ItemMeta itemMeta) { application.switchItem(itemMeta); if (mounted) { setState(() {}); } } void applicationModesChanged(sender, List e) { if (mounted) { setState(() {}); } } void visualAreaChanged(sender, IVisualArea e) { if (mounted) { setAvailableModes(e.mode.modeType.toString().split('.')[1]); } } /// 获取组合测量项 void comboList() { List itemMetaList = []; for (var element in measureData.itemMetaList) { if (measureData.getMeasureApplicationList.contains(element.name)) { List itemOutputMeta = []; String? multiMethod; List availableOutputs = element.calculator?.availableOutputs ?? []; for (var element in availableOutputs) { itemOutputMeta.add( ItemOutputMeta( element.name ?? '', element.description ?? '', VidUsUnitMap.getUnit(element.unit), ), ); } List childItemMetas = []; if (element.multiMethodItems?.isNotEmpty ?? false) { ChildItemMetaDTO? itemMeta = element.multiMethodItems! .firstWhereOrNull((element) => element.isWorking == true); List childItems = itemMeta?.childItems ?? []; /// 组合测量项部分 for (var element in childItems) { childItemMetas.add( ItemMeta( element.name ?? '', measureType: element.measureTypeName!, description: element.description ?? '', outputs: itemOutputMeta, childItems: childItemMetas, ), ); } } itemMetaList.add( ItemMeta( element.name ?? '', measureType: element.measureTypeName!, description: element.description ?? '', outputs: itemOutputMeta, childItems: childItemMetas, ), ); } } measureData.getItemMetaList = itemMetaList; } void setAvailableModes(String name) { var models = measureData.availableModes; measureData.currentMode = name; if (models.isNotEmpty) { ///群组列表 var groups = models .firstWhereOrNull( (element) => element.modeName == measureData.currentMode) ?.availableGroups; if (groups != null && groups.isNotEmpty) { ///项目列表 var folders = groups[0].availableFolders; if (folders != null && folders.isNotEmpty) { measureData.getMeasureApplicationList = folders[0].workingItemNames ?? []; if (folders[0].availableItems != null) { measureData.itemMetaList = folders[0].availableItems!.toList(); comboList(); } if (measureData.getMeasureApplicationList.isNotEmpty) { changeItem(measureData.getItemMetaList[0]); } } } } setState(() {}); } @override void initState() { super.initState(); measureData.applicationModesChanged.addListener(applicationModesChanged); application.visualAreaChanged.addListener(visualAreaChanged); } @override void dispose() { super.dispose(); measureData.applicationModesChanged.removeListener(applicationModesChanged); application.visualAreaChanged.removeListener(visualAreaChanged); } @override FWidget build(BuildContext context) { return FContainer( width: 300, height: 50, alignment: Alignment.topCenter, padding: const EdgeInsets.symmetric(horizontal: 15), child: FGridView.count( shrinkWrap: true, crossAxisCount: 4, crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 1 / 0.5, children: measureData.applicationModes.asMap().entries.map((e) { final bool isACtiveModes = measureData.currentMode == e.value.type.name; return FInkWell( onTap: () { setAvailableModes(e.value.type.name); setState(() {}); }, child: FContainer( alignment: Alignment.center, decoration: BoxDecoration( border: isACtiveModes ? Border.all( color: FTheme.ins.colorScheme.primary, ) : Border.all( color: Colors.grey, ), borderRadius: BorderRadius.circular(4), color: isACtiveModes ? FTheme.ins.colorScheme.primary : Colors.grey, ), child: FText( e.value.displayName, style: const TextStyle( color: Colors.white, ), ), ), ); }).toList(), ), ); } }