factory.dart 2.4 KB

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