import 'package:fis_measure/interfaces/process/items/item.dart'; import 'package:fis_measure/interfaces/process/items/item_metas.dart'; import 'package:fis_measure/interfaces/process/items/types.dart'; import 'package:fis_measure/process/items/item.dart'; import 'package:fis_measure/process/primitives/combos/lwh_straightline.dart'; import 'package:fis_measure/process/primitives/ellipse.dart'; import 'package:fis_measure/process/primitives/location.dart'; import 'package:fis_measure/process/primitives/polyline.dart'; import 'package:fis_measure/process/primitives/straightline.dart'; /// 测量项创建器 /// /// [meta] 测量项元信息 /// /// [parent] 父项 typedef MeasureItemCreator = MeasureItem Function( ItemMeta meta, IMeasureItem? parent, ); /// 测量项工厂 class MeasureItemFactory { MeasureItemFactory._(); static MeasureItemFactory? _singletonInstance; static MeasureItemFactory get _singleton { if (_singletonInstance == null) { _singletonInstance = MeasureItemFactory._(); _registerItemCreators(); } return _singletonInstance!; } final _itemCreatorMap = {}; void _register(String typeName, MeasureItemCreator creator) { final key = typeName; _itemCreatorMap[key] = creator; } MeasureItemCreator? _findCreator(String typeName) { final key = typeName; if (_itemCreatorMap.containsKey(key)) { return _itemCreatorMap[key]; } return null; } /// 创建测量项 /// /// [meta] 元信息 /// /// [parent] 父项 static MeasureItem? createItem(ItemMeta meta, [IMeasureItem? parent]) { if (meta.measureType.isEmpty) return null; final creator = _singleton._findCreator(meta.measureType); if (creator == null) return null; final item = creator.call(meta, parent); return item; } static void _registerItemCreators() { _singleton._register(MeasureTypes.Distance, StraightLine.createDistance); _singleton._register(MeasureTypes.Depth, Location.createTissueDepth); _singleton._register( MeasureTypes.VolumeThreeDistance, LWHStraightLine.createVolume); //Ellipse _singleton._register( MeasureTypes.AreaPerimeterEllipse, Ellipse.createAreaPerimeter); _singleton._register(MeasureTypes.VolumeEllipse, Ellipse.createVolume); //Polylines _singleton._register( MeasureTypes.AreaPerimeterPolyline, Polyline.createAreaPerimeter); } }