PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/DICOM/DicomVR.cs

https://github.com/petnet/fo-dicom
C# | 559 lines | 460 code | 44 blank | 55 comment | 1 complexity | 7d39e881dcbdc2476521418d26441162 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Serialization;
  5. using System.Text;
  6. namespace Dicom {
  7. /// <summary>DICOM Value Representation</summary>
  8. public sealed class DicomVR {
  9. private const byte PadZero = 0x00;
  10. private const byte PadSpace = 0x20;
  11. private DicomVR() {
  12. }
  13. /// <summary>Code used to represent VR.</summary>
  14. public string Code {
  15. get;
  16. private set;
  17. }
  18. /// <summary>Descriptive name of VR.</summary>
  19. public string Name {
  20. get;
  21. private set;
  22. }
  23. /// <summary>Value is a string.</summary>
  24. public bool IsString {
  25. get;
  26. private set;
  27. }
  28. /// <summary>String is encoded using the specified character set.</summary>
  29. public bool IsStringEncoded {
  30. get;
  31. private set;
  32. }
  33. /// <summary>Length field of value is a 16-bit short integer.</summary>
  34. public bool Is16bitLength {
  35. get;
  36. private set;
  37. }
  38. /// <summary>Value can contain multiple items.</summary>
  39. public bool IsMultiValue {
  40. get;
  41. private set;
  42. }
  43. /// <summary>Byte value used to pad value to even length.</summary>
  44. public byte PaddingValue {
  45. get;
  46. private set;
  47. }
  48. /// <summary>Maximum length of single value.</summary>
  49. public uint MaximumLength {
  50. get;
  51. private set;
  52. }
  53. /// <summary>Size of each individual value unit.</summary>
  54. public int UnitSize {
  55. get;
  56. private set;
  57. }
  58. /// <summary>Number of bytes to swap when changing endian representation of value.</summary>
  59. public int ByteSwap {
  60. get;
  61. private set;
  62. }
  63. /// <summary>Type used to represent VR value.</summary>
  64. public Type ValueType {
  65. get;
  66. private set;
  67. }
  68. /// <summary>
  69. /// Serializes VR code
  70. /// </summary>
  71. /// <param name="info"></param>
  72. /// <param name="context"></param>
  73. public void GetObjectData(SerializationInfo info, StreamingContext context) {
  74. info.AddValue("vr", Code);
  75. }
  76. /// <summary>
  77. ///
  78. /// </summary>
  79. /// <returns></returns>
  80. public override string ToString() {
  81. return Code;
  82. }
  83. /// <summary>
  84. /// Get VR for given string value.
  85. /// </summary>
  86. /// <param name="vr">String representation of VR</param>
  87. /// <returns>VR</returns>
  88. public static DicomVR Parse(string vr) {
  89. switch (vr) {
  90. case "NONE": return DicomVR.NONE;
  91. case "AE": return DicomVR.AE;
  92. case "AS": return DicomVR.AS;
  93. case "AT": return DicomVR.AT;
  94. case "CS": return DicomVR.CS;
  95. case "DA": return DicomVR.DA;
  96. case "DS": return DicomVR.DS;
  97. case "DT": return DicomVR.DT;
  98. case "FD": return DicomVR.FD;
  99. case "FL": return DicomVR.FL;
  100. case "IS": return DicomVR.IS;
  101. case "LO": return DicomVR.LO;
  102. case "LT": return DicomVR.LT;
  103. case "OB": return DicomVR.OB;
  104. case "OF": return DicomVR.OF;
  105. case "OW": return DicomVR.OW;
  106. case "PN": return DicomVR.PN;
  107. case "SH": return DicomVR.SH;
  108. case "SL": return DicomVR.SL;
  109. case "SQ": return DicomVR.SQ;
  110. case "SS": return DicomVR.SS;
  111. case "ST": return DicomVR.ST;
  112. case "TM": return DicomVR.TM;
  113. case "UI": return DicomVR.UI;
  114. case "UL": return DicomVR.UL;
  115. case "UN": return DicomVR.UN;
  116. case "US": return DicomVR.US;
  117. case "UT": return DicomVR.UT;
  118. default:
  119. throw new DicomDataException("Unknown VR: '" + vr + "'");
  120. }
  121. }
  122. /// <summary>No VR</summary>
  123. public readonly static DicomVR NONE = new DicomVR {
  124. Code = "NONE",
  125. Name = "No Value Representation",
  126. IsString = false,
  127. IsStringEncoded = false,
  128. Is16bitLength = false,
  129. IsMultiValue = false,
  130. PaddingValue = PadZero,
  131. MaximumLength = 0,
  132. UnitSize = 0,
  133. ByteSwap = 0,
  134. ValueType = typeof(object)
  135. };
  136. /// <summary>Application Entity</summary>
  137. public readonly static DicomVR AE = new DicomVR {
  138. Code = "AE",
  139. Name = "Application Entity",
  140. IsString = true,
  141. IsStringEncoded = false,
  142. Is16bitLength = true,
  143. IsMultiValue = true,
  144. PaddingValue = PadSpace,
  145. MaximumLength = 16,
  146. UnitSize = 1,
  147. ByteSwap = 1,
  148. ValueType = typeof(string)
  149. };
  150. /// <summary>Age String</summary>
  151. public readonly static DicomVR AS = new DicomVR {
  152. Code = "AS",
  153. Name = "Age String",
  154. IsString = true,
  155. IsStringEncoded = false,
  156. Is16bitLength = true,
  157. IsMultiValue = true,
  158. PaddingValue = PadSpace,
  159. MaximumLength = 4,
  160. UnitSize = 1,
  161. ByteSwap = 1,
  162. ValueType = typeof(string)
  163. };
  164. /// <summary>Attribute Tag</summary>
  165. public readonly static DicomVR AT = new DicomVR {
  166. Code = "AT",
  167. Name = "Attribute Tag",
  168. IsString = false,
  169. IsStringEncoded = false,
  170. Is16bitLength = true,
  171. IsMultiValue = true,
  172. PaddingValue = PadZero,
  173. MaximumLength = 4,
  174. UnitSize = 4,
  175. ByteSwap = 2,
  176. ValueType = typeof(DicomTag)
  177. };
  178. /// <summary>Code String</summary>
  179. public readonly static DicomVR CS = new DicomVR {
  180. Code = "CS",
  181. Name = "Code String",
  182. IsString = true,
  183. IsStringEncoded = false,
  184. Is16bitLength = true,
  185. IsMultiValue = true,
  186. PaddingValue = PadSpace,
  187. MaximumLength = 16,
  188. UnitSize = 1,
  189. ByteSwap = 1,
  190. ValueType = typeof(string)
  191. };
  192. /// <summary>Date</summary>
  193. public readonly static DicomVR DA = new DicomVR {
  194. Code = "DA",
  195. Name = "Date",
  196. IsString = true,
  197. IsStringEncoded = false,
  198. Is16bitLength = true,
  199. IsMultiValue = true,
  200. PaddingValue = PadSpace,
  201. MaximumLength = 8,
  202. UnitSize = 1,
  203. ByteSwap = 1,
  204. ValueType = typeof(DateTime)
  205. };
  206. /// <summary>Decimal String</summary>
  207. public readonly static DicomVR DS = new DicomVR {
  208. Code = "DS",
  209. Name = "Decimal String",
  210. IsString = true,
  211. IsStringEncoded = false,
  212. Is16bitLength = true,
  213. IsMultiValue = true,
  214. PaddingValue = PadSpace,
  215. MaximumLength = 16,
  216. UnitSize = 1,
  217. ByteSwap = 1,
  218. ValueType = typeof(decimal)
  219. };
  220. /// <summary>Date Time</summary>
  221. public readonly static DicomVR DT = new DicomVR {
  222. Code = "DT",
  223. Name = "Date Time",
  224. IsString = true,
  225. IsStringEncoded = false,
  226. Is16bitLength = true,
  227. IsMultiValue = true,
  228. PaddingValue = PadSpace,
  229. MaximumLength = 26,
  230. UnitSize = 1,
  231. ByteSwap = 1,
  232. ValueType = typeof(DateTime)
  233. };
  234. /// <summary>Floating Point Double</summary>
  235. public readonly static DicomVR FD = new DicomVR {
  236. Code = "FD",
  237. Name = "Floating Point Double",
  238. IsString = false,
  239. IsStringEncoded = false,
  240. Is16bitLength = true,
  241. IsMultiValue = true,
  242. PaddingValue = PadZero,
  243. MaximumLength = 8,
  244. UnitSize = 8,
  245. ByteSwap = 8,
  246. ValueType = typeof(double)
  247. };
  248. /// <summary>Floating Point Single</summary>
  249. public readonly static DicomVR FL = new DicomVR {
  250. Code = "FL",
  251. Name = "Floating Point Single",
  252. IsString = false,
  253. IsStringEncoded = false,
  254. Is16bitLength = true,
  255. IsMultiValue = true,
  256. PaddingValue = PadZero,
  257. MaximumLength = 4,
  258. UnitSize = 4,
  259. ByteSwap = 4,
  260. ValueType = typeof(float)
  261. };
  262. /// <summary>Integer String</summary>
  263. public readonly static DicomVR IS = new DicomVR {
  264. Code = "IS",
  265. Name = "Integer String",
  266. IsString = true,
  267. IsStringEncoded = false,
  268. Is16bitLength = true,
  269. IsMultiValue = true,
  270. PaddingValue = PadSpace,
  271. MaximumLength = 12,
  272. UnitSize = 1,
  273. ByteSwap = 1,
  274. ValueType = typeof(int)
  275. };
  276. /// <summary>Long String</summary>
  277. public readonly static DicomVR LO = new DicomVR {
  278. Code = "LO",
  279. Name = "Long String",
  280. IsString = true,
  281. IsStringEncoded = true,
  282. Is16bitLength = true,
  283. IsMultiValue = false,
  284. PaddingValue = PadSpace,
  285. MaximumLength = 64,
  286. UnitSize = 1,
  287. ByteSwap = 1,
  288. ValueType = typeof(string)
  289. };
  290. /// <summary>Long Text</summary>
  291. public readonly static DicomVR LT = new DicomVR {
  292. Code = "LT",
  293. Name = "Long Text",
  294. IsString = true,
  295. IsStringEncoded = true,
  296. Is16bitLength = true,
  297. IsMultiValue = false,
  298. PaddingValue = PadSpace,
  299. MaximumLength = 10240,
  300. UnitSize = 1,
  301. ByteSwap = 1,
  302. ValueType = typeof(string)
  303. };
  304. /// <summary>Other Byte</summary>
  305. public readonly static DicomVR OB = new DicomVR {
  306. Code = "OB",
  307. Name = "Other Byte",
  308. IsString = false,
  309. IsStringEncoded = false,
  310. Is16bitLength = false,
  311. IsMultiValue = true,
  312. PaddingValue = PadZero,
  313. MaximumLength = 0,
  314. UnitSize = 1,
  315. ByteSwap = 1,
  316. ValueType = typeof(byte[])
  317. };
  318. /// <summary>Other Float</summary>
  319. public readonly static DicomVR OF = new DicomVR {
  320. Code = "OF",
  321. Name = "Other Float",
  322. IsString = false,
  323. IsStringEncoded = false,
  324. Is16bitLength = false,
  325. IsMultiValue = true,
  326. PaddingValue = PadZero,
  327. MaximumLength = 0,
  328. UnitSize = 4,
  329. ByteSwap = 4,
  330. ValueType = typeof(float[])
  331. };
  332. /// <summary>Other Word</summary>
  333. public readonly static DicomVR OW = new DicomVR {
  334. Code = "OW",
  335. Name = "Other Word",
  336. IsString = false,
  337. IsStringEncoded = false,
  338. Is16bitLength = false,
  339. IsMultiValue = true,
  340. PaddingValue = PadZero,
  341. MaximumLength = 0,
  342. UnitSize = 2,
  343. ByteSwap = 2,
  344. ValueType = typeof(ushort)
  345. };
  346. /// <summary>Person Name</summary>
  347. public readonly static DicomVR PN = new DicomVR {
  348. Code = "PN",
  349. Name = "Person Name",
  350. IsString = true,
  351. IsStringEncoded = true,
  352. Is16bitLength = true,
  353. IsMultiValue = false,
  354. PaddingValue = PadSpace,
  355. MaximumLength = 64,
  356. UnitSize = 1,
  357. ByteSwap = 1,
  358. ValueType = typeof(String)
  359. };
  360. /// <summary>Short String</summary>
  361. public readonly static DicomVR SH = new DicomVR {
  362. Code = "SH",
  363. Name = "Short String",
  364. IsString = true,
  365. IsStringEncoded = true,
  366. Is16bitLength = true,
  367. IsMultiValue = true,
  368. PaddingValue = PadSpace,
  369. MaximumLength = 16,
  370. UnitSize = 1,
  371. ByteSwap = 1,
  372. ValueType = typeof(string)
  373. };
  374. /// <summary>Signed Long</summary>
  375. public readonly static DicomVR SL = new DicomVR {
  376. Code = "SL",
  377. Name = "Signed Long",
  378. IsString = false,
  379. IsStringEncoded = false,
  380. Is16bitLength = true,
  381. IsMultiValue = true,
  382. PaddingValue = PadZero,
  383. MaximumLength = 4,
  384. UnitSize = 4,
  385. ByteSwap = 4,
  386. ValueType = typeof(int)
  387. };
  388. /// <summary>Sequence of Items</summary>
  389. public readonly static DicomVR SQ = new DicomVR {
  390. Code = "SQ",
  391. Name = "Sequence of Items",
  392. IsString = false,
  393. IsStringEncoded = false,
  394. Is16bitLength = false,
  395. IsMultiValue = false,
  396. PaddingValue = PadSpace,
  397. MaximumLength = 0,
  398. UnitSize = 0,
  399. ByteSwap = 0,
  400. //ValueType = typeof(IList<DicomDataset>)
  401. };
  402. /// <summary>Signed Short</summary>
  403. public readonly static DicomVR SS = new DicomVR {
  404. Code = "SS",
  405. Name = "Signed Short",
  406. IsString = false,
  407. IsStringEncoded = false,
  408. Is16bitLength = true,
  409. IsMultiValue = true,
  410. PaddingValue = PadZero,
  411. MaximumLength = 2,
  412. UnitSize = 2,
  413. ByteSwap = 2,
  414. ValueType = typeof(short)
  415. };
  416. /// <summary>Short Text</summary>
  417. public readonly static DicomVR ST = new DicomVR {
  418. Code = "ST",
  419. Name = "Short Text",
  420. IsString = true,
  421. IsStringEncoded = true,
  422. Is16bitLength = true,
  423. IsMultiValue = false,
  424. PaddingValue = PadSpace,
  425. MaximumLength = 1024,
  426. UnitSize = 1,
  427. ByteSwap = 1,
  428. ValueType = typeof(string)
  429. };
  430. /// <summary>Time</summary>
  431. public readonly static DicomVR TM = new DicomVR {
  432. Code = "TM",
  433. Name = "Time",
  434. IsString = true,
  435. IsStringEncoded = false,
  436. Is16bitLength = true,
  437. IsMultiValue = true,
  438. PaddingValue = PadSpace,
  439. MaximumLength = 16,
  440. UnitSize = 1,
  441. ByteSwap = 1,
  442. ValueType = typeof(DateTime)
  443. };
  444. /// <summary>Unique Identifier</summary>
  445. public readonly static DicomVR UI = new DicomVR {
  446. Code = "UI",
  447. Name = "Unique Identifier",
  448. IsString = true,
  449. IsStringEncoded = false,
  450. Is16bitLength = true,
  451. IsMultiValue = true,
  452. PaddingValue = PadZero,
  453. MaximumLength = 64,
  454. UnitSize = 1,
  455. ByteSwap = 1,
  456. ValueType = typeof(string)
  457. };
  458. /// <summary>Unsigned Long</summary>
  459. public readonly static DicomVR UL = new DicomVR {
  460. Code = "UL",
  461. Name = "Unsigned Long",
  462. IsString = false,
  463. IsStringEncoded = false,
  464. Is16bitLength = true,
  465. IsMultiValue = true,
  466. PaddingValue = PadZero,
  467. MaximumLength = 4,
  468. UnitSize = 4,
  469. ByteSwap = 4,
  470. ValueType = typeof(uint)
  471. };
  472. /// <summary>Unknown</summary>
  473. public readonly static DicomVR UN = new DicomVR {
  474. Code = "UN",
  475. Name = "Unknown",
  476. IsString = false,
  477. IsStringEncoded = false,
  478. Is16bitLength = false,
  479. IsMultiValue = true,
  480. PaddingValue = PadZero,
  481. MaximumLength = 0,
  482. UnitSize = 1,
  483. ByteSwap = 1,
  484. ValueType = typeof(byte[])
  485. };
  486. /// <summary>Unsigned Short</summary>
  487. public readonly static DicomVR US = new DicomVR {
  488. Code = "US",
  489. Name = "Unsigned Short",
  490. IsString = false,
  491. IsStringEncoded = false,
  492. Is16bitLength = true,
  493. IsMultiValue = true,
  494. PaddingValue = PadZero,
  495. MaximumLength = 2,
  496. UnitSize = 2,
  497. ByteSwap = 2,
  498. ValueType = typeof(ushort)
  499. };
  500. /// <summary>Unlimited Text</summary>
  501. public readonly static DicomVR UT = new DicomVR {
  502. Code = "UT",
  503. Name = "Unlimited Text",
  504. IsString = true,
  505. IsStringEncoded = true,
  506. Is16bitLength = false,
  507. IsMultiValue = false,
  508. PaddingValue = PadSpace,
  509. MaximumLength = 0,
  510. UnitSize = 1,
  511. ByteSwap = 1,
  512. ValueType = typeof(string)
  513. };
  514. }
  515. }