factory.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'package:fis_measure/interfaces/process/items/item.dart';
  2. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  3. import 'package:fis_measure/interfaces/process/items/types.dart';
  4. import 'package:fis_measure/process/items/item.dart';
  5. import 'package:fis_measure/process/primitives/combos/lwh_straightline.dart';
  6. import 'package:fis_measure/process/primitives/ellipse.dart';
  7. import 'package:fis_measure/process/primitives/location.dart';
  8. import 'package:fis_measure/process/primitives/polyline.dart';
  9. import 'package:fis_measure/process/primitives/straightline.dart';
  10. /// 测量项创建器
  11. ///
  12. /// [meta] 测量项元信息
  13. ///
  14. /// [parent] 父项
  15. typedef MeasureItemCreator = MeasureItem Function(
  16. ItemMeta meta,
  17. IMeasureItem? parent,
  18. );
  19. /// 测量项工厂
  20. class MeasureItemFactory {
  21. MeasureItemFactory._();
  22. static MeasureItemFactory? _singletonInstance;
  23. static MeasureItemFactory get _singleton {
  24. if (_singletonInstance == null) {
  25. _singletonInstance = MeasureItemFactory._();
  26. _registerItemCreators();
  27. }
  28. return _singletonInstance!;
  29. }
  30. final _itemCreatorMap = <String, MeasureItemCreator>{};
  31. void _register(String typeName, MeasureItemCreator creator) {
  32. final key = typeName;
  33. _itemCreatorMap[key] = creator;
  34. }
  35. MeasureItemCreator? _findCreator(String typeName) {
  36. final key = typeName;
  37. if (_itemCreatorMap.containsKey(key)) {
  38. return _itemCreatorMap[key];
  39. }
  40. return null;
  41. }
  42. /// 创建测量项
  43. ///
  44. /// [meta] 元信息
  45. ///
  46. /// [parent] 父项
  47. static MeasureItem? createItem(ItemMeta meta, [IMeasureItem? parent]) {
  48. if (meta.measureType.isEmpty) return null;
  49. final creator = _singleton._findCreator(meta.measureType);
  50. if (creator == null) return null;
  51. final item = creator.call(meta, parent);
  52. return item;
  53. }
  54. static void _registerItemCreators() {
  55. _singleton._register(MeasureTypes.Distance, StraightLine.createDistance);
  56. _singleton._register(MeasureTypes.Depth, Location.createTissueDepth);
  57. _singleton._register(
  58. MeasureTypes.VolumeThreeDistance, LWHStraightLine.createVolume);
  59. //Ellipse
  60. _singleton._register(
  61. MeasureTypes.AreaPerimeterEllipse, Ellipse.createAreaPerimeter);
  62. _singleton._register(MeasureTypes.VolumeEllipse, Ellipse.createVolume);
  63. //Polylines
  64. _singleton._register(
  65. MeasureTypes.AreaPerimeterPolyline, Polyline.createAreaPerimeter);
  66. }
  67. }