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/carotid_imt.dart'; import 'package:fis_measure/process/primitives/combos/afi.dart'; import 'package:fis_measure/process/primitives/combos/area_straightline.dart'; import 'package:fis_measure/process/primitives/combos/depth2baseline.dart'; import 'package:fis_measure/process/primitives/combos/lwh_straightline.dart'; import 'package:fis_measure/process/primitives/combos/three_ray.dart'; import 'package:fis_measure/process/primitives/combos/two_area.dart'; import 'package:fis_measure/process/primitives/combos/two_location.dart'; import 'package:fis_measure/process/primitives/combos/two_ray.dart'; import 'package:fis_measure/process/primitives/combos/two_straightline.dart'; import 'package:fis_measure/process/primitives/detection.dart'; import 'package:fis_measure/process/primitives/ellipse.dart'; import 'package:fis_measure/process/primitives/empty.dart'; import 'package:fis_measure/process/primitives/location.dart'; import 'package:fis_measure/process/primitives/multi_method/multiple_trace.dart'; import 'package:fis_measure/process/primitives/polyline.dart'; import 'package:fis_measure/process/primitives/polyline_angle.dart'; import 'package:fis_measure/process/primitives/ray.dart'; import 'package:fis_measure/process/primitives/single_straightline.dart'; import 'package:fis_measure/process/primitives/spline.dart'; import 'package:fis_measure/process/primitives/straightline.dart'; import 'package:fis_measure/process/primitives/trace.dart'; import 'package:fis_measure/process/primitives/twoline_angle.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() { // Empty _singleton._register(MeasureTypes.Empty, Empty.createEmpty); // Locations _singleton._register(MeasureTypes.Depth, Location.createTissueDepth); _singleton._register( MeasureTypes.DepthToBaseLine, DepthToBaseLine.createDepthToBaseLine); // Two Locations _singleton._register( MeasureTypes.AbRatioTwoVelocity, TwoLocation.createAbRatioTwoVelocity); _singleton._register(MeasureTypes.ResistivityIndexTwoLocationByEd, TwoLocation.createResistivityIndexTwoLocationByEd); _singleton._register( MeasureTypes.MaxPgTwoLocation, TwoLocation.createMaxPgTwoLocation); // Straight _singleton._register(MeasureTypes.Distance, StraightLine.createDistance); _singleton._register(MeasureTypes.Ray, Ray.createRay); // Three StraightLine _singleton._register( MeasureTypes.VolumeThreeDistance, LWHStraightLine.createVolume); _singleton._register( MeasureTypes.ThreeDistanceMean, LWHStraightLine.createMean); _singleton._register( MeasureTypes.ThreeDistanceMax, LWHStraightLine.createMax); _singleton._register( MeasureTypes.VolumeTwoDistance, TwoStraightLine.createVolume); _singleton._register(MeasureTypes.VolumeEllipse, Ellipse.createVolume); // Two Area _singleton._register(MeasureTypes.StenosisTwoArea, TwoArea.crateStenosis); _singleton._register(MeasureTypes.AbRatioTwoArea, TwoArea.crateABRatio); // Two StraightLine _singleton._register( MeasureTypes.TwoDistanceBase, TwoStraightLine.createTwoDistanceBase); _singleton._register(MeasureTypes.ResidualUrine, TwoStraightLine.createRUV); _singleton._register(MeasureTypes.StenosisTwoDistance, TwoStraightLine.createStenosisTwoDistance); _singleton._register( MeasureTypes.AbRatioTwoDistance, TwoStraightLine.createAbRatioDistance); _singleton._register( MeasureTypes.OBRatioFLBPD, TwoStraightLine.createAbRatioDistance); _singleton._register( MeasureTypes.OBRatioBPDOFD, TwoStraightLine.createAbRatioDistance); _singleton._register(MeasureTypes.TwoDistanceAverage, TwoStraightLine.createTwoDistanceAverage); _singleton._register( MeasureTypes.TwoStraightLineAngle, TwoStraightLine.createAngle); _singleton._register(MeasureTypes.IvsThck, TwoStraightLine.createIvsThck); // Angle _singleton._register( MeasureTypes.PolyLineAngle, PolylineAngle.createPolyAngle); // TissueTM _singleton._register( MeasureTypes.VerticalDistance, StraightLine.createVerticalDistance); _singleton._register(MeasureTypes.TimeSpan, StraightLine.createTimeSpan); _singleton._register(MeasureTypes.MDepth, Location.createTissueTMDepth); _singleton._register(MeasureTypes.StenosisTwoVerticalDistance, TwoStraightLine.createStenosisTwoVerticalDistance); _singleton._register(MeasureTypes.AbRatioTwoVerticalDistance, TwoStraightLine.createAbRatioTwoVerticalDistance); _singleton._register(MeasureTypes.Slope, StraightLine.createSlope); _singleton._register( MeasureTypes.SlopeDoppler, StraightLine.createSlopeDoppler); _singleton._register(MeasureTypes.Velocity, Location.createVelocity); _singleton._register(MeasureTypes.DopplerTrace, MultiTrace.createTrace); _singleton._register(MeasureTypes.Pht, StraightLine.createTimeSpan); _singleton._register(MeasureTypes.TeiIndex, TwoStraightLine.createTeiIndex); _singleton._register(MeasureTypes.AbRatioTwoTimeSpan, TwoStraightLine.createAbRatioTwoTimeSpan); // Area Perimeter _singleton._register( MeasureTypes.AreaPerimeterEllipse, Ellipse.createAreaPerimeter); _singleton._register( MeasureTypes.AreaPerimeterPolyline, Polyline.createAreaPerimeter); _singleton._register( MeasureTypes.AreaPerimeterSpline, Spline.createAreaPerimeter); _singleton._register( MeasureTypes.AreaPerimeterTrace, Trace.createAreaPerimeter); // Area & H _singleton._register( MeasureTypes.AreaStraightLine, AreaStraightLine.createVolume); _singleton._register( MeasureTypes.CurveLengthPolyline, Polyline.createCurveLength); _singleton._register( MeasureTypes.CurveLengthSpline, Spline.createCurveLength); _singleton._register( MeasureTypes.CurveLengthTrace, Trace.createCurveLength); // Specific _singleton._register(MeasureTypes.Afi, Afi.createAfi); _singleton._register(MeasureTypes.HR, SingleStraightLine.createHeartRate); _singleton._register(MeasureTypes.HipOneRay, TwoRay.createTwoRay); _singleton._register(MeasureTypes.HipTwoRay, ThreeRay.createThreeRay); _singleton._register( MeasureTypes.CardiacAxis, TwolineAngle.createTwolineAngle); _singleton._register(MeasureTypes.AntCCA_IMT, CarotidIMT.createMeasureRect); _singleton._register( MeasureTypes.PostCCA_IMT, CarotidIMT.createMeasureRect); _singleton._register( MeasureTypes.BothCCA_IMT, CarotidIMT.createMeasureRect); _singleton._register( MeasureTypes.PlaqueDetection, CarotidDetection.createDetectionRect); _singleton._register( MeasureTypes.IntimaDetection, CarotidDetection.createDetectionRect); } }