standard_line.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // ignore_for_file: non_constant_identifier_names, constant_identifier_names
  2. import 'dart:typed_data';
  3. import 'package:fis_common/event/event_type.dart';
  4. import 'package:fis_measure/interfaces/process/standard_line/pixel_space.dart';
  5. import 'package:fis_measure/interfaces/process/standard_line/standard_line.dart';
  6. import 'package:fis_vid_ext/vid_extended_data.dart';
  7. import 'package:fis_vid_ext/vid_tag.dart';
  8. import 'package:fis_vid_ext/vid_value.dart';
  9. /// 参考线
  10. class StandardLine extends IStandardLine {
  11. /// Default Standard Line Physical Length (unit cm)
  12. static const double DefaultPhysicsLength = 4.0;
  13. /// 0028,0030 PixelSpacing from dicom
  14. static final VidTag DicomTagPixelSpacing = VidTag("0028", "0030");
  15. /// 0018, 602E Physical Delta Y
  16. static final VidTag DicomTagPhysicalDeltaY = VidTag("0018", "602E");
  17. /// 0018,602C Physical Delta X
  18. static final VidTag DicomTagPhysicalDeltaX = VidTag("0018", "602C");
  19. /// 0018, 6024 Physical Units X
  20. static final VidTag DicomTagPhysicalUnitsX = VidTag("0018", "6024");
  21. /// 0018, 6026 Physical Units Y
  22. static final VidTag DicomTagPhysicalUnitsY = VidTag("0018", "6026");
  23. PixelSpacing _currentPixelSpacing = PixelSpacing();
  24. double _physicsLength = DefaultPhysicsLength;
  25. double _pixelLength = 0.0;
  26. double _perPixelPhysicalLength = 0.0;
  27. StandardLine() {
  28. pixelSpacingChanged = FEventHandler<PixelSpacing?>();
  29. }
  30. /// 参考线物理长度(cm)
  31. @override
  32. double get physicsLength => _physicsLength;
  33. @override
  34. set physicsLength(double val) {
  35. if (val != _physicsLength) {
  36. _physicsLength = val;
  37. _onLineLengthChanged();
  38. }
  39. }
  40. /// 参考线像素长度
  41. @override
  42. double get pixelLength => _pixelLength;
  43. @override
  44. set pixelLength(double val) {
  45. if (val != _pixelLength) {
  46. _pixelLength = val;
  47. _onLineLengthChanged();
  48. }
  49. }
  50. /// 单位像素物理长度(cm)
  51. @override
  52. double get perPixelPhysicalLength => _perPixelPhysicalLength;
  53. /// 当前像素距离尺
  54. @override
  55. PixelSpacing get currentPixelSpacing => _currentPixelSpacing;
  56. @override
  57. set currentPixelSpacing(PixelSpacing val) {
  58. if (val != _currentPixelSpacing) {
  59. _currentPixelSpacing = val;
  60. _onPixelSpacingChanged();
  61. }
  62. }
  63. /// 像素距离尺变化事件
  64. @override
  65. late final FEventHandler<PixelSpacing?> pixelSpacingChanged;
  66. /// 通过vid扩展信息加载像素距离信息
  67. void loadFromVidExtData(Uint8List bytes) {
  68. final extInfo = VidExtendedData.fromBytes(bytes);
  69. if (extInfo == null) {
  70. currentPixelSpacing = PixelSpacing();
  71. return;
  72. }
  73. PixelSpacing pixelSpacing = PixelSpacing();
  74. var pixelSpacingValue = _getVidValueByTag(DicomTagPixelSpacing, extInfo);
  75. if (pixelSpacingValue != null) {
  76. var pixelSpacingArray =
  77. pixelSpacingValue.getValue().toString().split('\\');
  78. if (pixelSpacingArray.length > 1) {
  79. double? pixelSpacingX = double.tryParse(pixelSpacingArray[0]);
  80. if (pixelSpacingX != null) {
  81. pixelSpacing.physicalDeltaX = pixelSpacingX;
  82. }
  83. double? pixelSpacingY = double.tryParse(pixelSpacingArray[1]);
  84. if (pixelSpacingY != null) {
  85. pixelSpacing.physicalDeltaY = pixelSpacingY;
  86. }
  87. }
  88. } else {
  89. pixelSpacing.physicalDeltaX = _getPhysicalDeltaX(extInfo);
  90. pixelSpacing.physicalDeltaY = _getPhysicalDeltaY(extInfo);
  91. }
  92. if (pixelSpacing.physicalDeltaX > 0 &&
  93. pixelSpacing.physicalDeltaX < 1.0 &&
  94. pixelSpacing.physicalDeltaY > 0 &&
  95. pixelSpacing.physicalDeltaY < 1.0) {
  96. currentPixelSpacing = pixelSpacing;
  97. } else {
  98. currentPixelSpacing = PixelSpacing();
  99. }
  100. if (currentPixelSpacing.isEmpty == false) {
  101. _initPixelLength();
  102. }
  103. }
  104. /// 加载初始参考线像素长度
  105. void _initPixelLength() {
  106. final pixelsPerCM = 1 / _perPixelPhysicalLength;
  107. _pixelLength = pixelsPerCM * physicsLength;
  108. }
  109. void _onLineLengthChanged() {
  110. final physicalDeltaX = physicsLength * 10 / pixelLength;
  111. final physicalDeltaY = physicalDeltaX;
  112. currentPixelSpacing = PixelSpacing.fill(physicalDeltaX, physicalDeltaY);
  113. }
  114. void _onPixelSpacingChanged() {
  115. _perPixelPhysicalLength =
  116. _getPixelLengthWithUnit(currentPixelSpacing.physicalDeltaX);
  117. pixelSpacingChanged.emit(this, currentPixelSpacing);
  118. }
  119. double _getPixelLengthWithUnit(double length) {
  120. // if (_mearsureUnit == MearsureUnit.cm)
  121. // {
  122. length = length / 10;
  123. // }
  124. return length;
  125. }
  126. IVidValue? _getVidValueByTag(VidTag vidTag, VidExtendedData extendedData) {
  127. var matchKeys = extendedData.data.keys
  128. .where((v) => v.group == vidTag.group && v.element == vidTag.element);
  129. if (matchKeys.isNotEmpty) {
  130. final vidTagKey = matchKeys.first;
  131. var vidValue = extendedData.data[vidTagKey];
  132. return vidValue;
  133. }
  134. return null;
  135. }
  136. double _getPhysicalDeltaX(VidExtendedData extendedData) {
  137. final physicalDeltaXvalue =
  138. _getVidValueByTag(DicomTagPhysicalDeltaX, extendedData);
  139. if (physicalDeltaXvalue != null) {
  140. final physicalUnitsXvalue =
  141. _getVidValueByTag(DicomTagPhysicalUnitsX, extendedData);
  142. if (physicalUnitsXvalue != null) {
  143. var unitsvalue = int.parse(physicalUnitsXvalue.getValue().toString());
  144. if (unitsvalue == 3) {
  145. var physicalDeltaX =
  146. double.parse(physicalDeltaXvalue.getValue().toString()) * 10;
  147. return physicalDeltaX;
  148. }
  149. }
  150. }
  151. return 1.0;
  152. }
  153. double _getPhysicalDeltaY(VidExtendedData extendedData) {
  154. final physicalDeltaYvalue =
  155. _getVidValueByTag(DicomTagPhysicalDeltaY, extendedData);
  156. if (physicalDeltaYvalue != null) {
  157. final physicalUnitsYvalue =
  158. _getVidValueByTag(DicomTagPhysicalUnitsY, extendedData);
  159. if (physicalUnitsYvalue != null) {
  160. var unitsvalue = int.parse(physicalUnitsYvalue.getValue().toString());
  161. if (unitsvalue == 3) {
  162. var physicalDeltaX =
  163. double.parse(physicalDeltaYvalue.getValue().toString()) * 10;
  164. return physicalDeltaX;
  165. }
  166. }
  167. }
  168. return 1.0;
  169. }
  170. }