Mercurial > hg > orthanc
comparison Core/DicomParsing/FromDcmtkBridge.cpp @ 3199:9316f341e40f
unit testing json for dicomweb
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 06 Feb 2019 10:37:03 +0100 |
parents | 7724ed267b5c |
children | f6374c36a671 |
comparison
equal
deleted
inserted
replaced
3198:7724ed267b5c | 3199:9316f341e40f |
---|---|
88 #include <dcmtk/dcmdata/dcvrsh.h> | 88 #include <dcmtk/dcmdata/dcvrsh.h> |
89 #include <dcmtk/dcmdata/dcvrsl.h> | 89 #include <dcmtk/dcmdata/dcvrsl.h> |
90 #include <dcmtk/dcmdata/dcvrss.h> | 90 #include <dcmtk/dcmdata/dcvrss.h> |
91 #include <dcmtk/dcmdata/dcvrst.h> | 91 #include <dcmtk/dcmdata/dcvrst.h> |
92 #include <dcmtk/dcmdata/dcvrtm.h> | 92 #include <dcmtk/dcmdata/dcvrtm.h> |
93 #include <dcmtk/dcmdata/dcvruc.h> | |
93 #include <dcmtk/dcmdata/dcvrui.h> | 94 #include <dcmtk/dcmdata/dcvrui.h> |
94 #include <dcmtk/dcmdata/dcvrul.h> | 95 #include <dcmtk/dcmdata/dcvrul.h> |
96 #include <dcmtk/dcmdata/dcvrur.h> | |
95 #include <dcmtk/dcmdata/dcvrus.h> | 97 #include <dcmtk/dcmdata/dcvrus.h> |
96 #include <dcmtk/dcmdata/dcvrut.h> | 98 #include <dcmtk/dcmdata/dcvrut.h> |
97 | 99 |
98 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1 | 100 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1 |
99 # include <EmbeddedResources.h> | 101 # include <EmbeddedResources.h> |
1287 return ValueRepresentation_LongText; | 1289 return ValueRepresentation_LongText; |
1288 | 1290 |
1289 case EVR_OB: | 1291 case EVR_OB: |
1290 return ValueRepresentation_OtherByte; | 1292 return ValueRepresentation_OtherByte; |
1291 | 1293 |
1292 #if DCMTK_VERSION_NUMBER >= 362 | 1294 #if DCMTK_VERSION_NUMBER >= 361 |
1293 case EVR_OD: | 1295 case EVR_OD: |
1294 return ValueRepresentation_OtherDouble; | 1296 return ValueRepresentation_OtherDouble; |
1295 #endif | 1297 #endif |
1296 | 1298 |
1297 case EVR_OF: | 1299 case EVR_OF: |
1324 return ValueRepresentation_ShortText; | 1326 return ValueRepresentation_ShortText; |
1325 | 1327 |
1326 case EVR_TM: | 1328 case EVR_TM: |
1327 return ValueRepresentation_Time; | 1329 return ValueRepresentation_Time; |
1328 | 1330 |
1329 #if DCMTK_VERSION_NUMBER >= 362 | 1331 #if DCMTK_VERSION_NUMBER >= 361 |
1330 case EVR_UC: | 1332 case EVR_UC: |
1331 return ValueRepresentation_UnlimitedCharacters; | 1333 return ValueRepresentation_UnlimitedCharacters; |
1332 #endif | 1334 #endif |
1333 | 1335 |
1334 case EVR_UI: | 1336 case EVR_UI: |
1338 return ValueRepresentation_UnsignedLong; | 1340 return ValueRepresentation_UnsignedLong; |
1339 | 1341 |
1340 case EVR_UN: | 1342 case EVR_UN: |
1341 return ValueRepresentation_Unknown; | 1343 return ValueRepresentation_Unknown; |
1342 | 1344 |
1343 #if DCMTK_VERSION_NUMBER >= 362 | 1345 #if DCMTK_VERSION_NUMBER >= 361 |
1344 case EVR_UR: | 1346 case EVR_UR: |
1345 return ValueRepresentation_UniversalResource; | 1347 return ValueRepresentation_UniversalResource; |
1346 #endif | 1348 #endif |
1347 | 1349 |
1348 case EVR_US: | 1350 case EVR_US: |
1357 } | 1359 } |
1358 | 1360 |
1359 | 1361 |
1360 static bool IsBinaryTag(const DcmTag& key) | 1362 static bool IsBinaryTag(const DcmTag& key) |
1361 { | 1363 { |
1362 return (key.isUnknownVR() || | 1364 return (key.isUnknownVR() || |
1365 #if DCMTK_VERSION_NUMBER >= 361 | |
1366 key.getEVR() == EVR_OD || | |
1367 #endif | |
1368 | |
1369 #if DCMTK_VERSION_NUMBER >= 362 | |
1370 key.getEVR() == EVR_OL || | |
1371 #endif | |
1363 key.getEVR() == EVR_OB || | 1372 key.getEVR() == EVR_OB || |
1364 key.getEVR() == EVR_OF || | 1373 key.getEVR() == EVR_OF || |
1365 key.getEVR() == EVR_OW || | 1374 key.getEVR() == EVR_OW || |
1366 key.getEVR() == EVR_UN || | 1375 key.getEVR() == EVR_UN || |
1367 key.getEVR() == EVR_ox); | 1376 key.getEVR() == EVR_ox); |
1384 | 1393 |
1385 /** | 1394 /** |
1386 * Binary types, handled above | 1395 * Binary types, handled above |
1387 **/ | 1396 **/ |
1388 | 1397 |
1398 #if DCMTK_VERSION_NUMBER >= 361 | |
1399 case EVR_OD: | |
1400 #endif | |
1401 | |
1402 #if DCMTK_VERSION_NUMBER >= 362 | |
1403 case EVR_OL: | |
1404 #endif | |
1405 | |
1389 case EVR_OB: // other byte | 1406 case EVR_OB: // other byte |
1390 case EVR_OF: // other float | 1407 case EVR_OF: // other float |
1391 case EVR_OW: // other word | 1408 case EVR_OW: // other word |
1392 case EVR_UN: // unknown value representation | 1409 case EVR_UN: // unknown value representation |
1393 case EVR_ox: // OB or OW depending on context | 1410 case EVR_ox: // OB or OW depending on context |
1442 return new DcmShortString(key); | 1459 return new DcmShortString(key); |
1443 | 1460 |
1444 case EVR_PN: // person name | 1461 case EVR_PN: // person name |
1445 return new DcmPersonName(key); | 1462 return new DcmPersonName(key); |
1446 | 1463 |
1464 case EVR_UC: // unlimited characters | |
1465 return new DcmUnlimitedCharacters(key); | |
1466 | |
1467 case EVR_UR: // URI/URL | |
1468 return new DcmUniversalResourceIdentifierOrLocator(key); | |
1469 | |
1447 | 1470 |
1448 /** | 1471 /** |
1449 * Numerical types | 1472 * Numerical types |
1450 **/ | 1473 **/ |
1451 | 1474 |
1542 DcmTag key(tag.GetGroup(), tag.GetElement()); | 1565 DcmTag key(tag.GetGroup(), tag.GetElement()); |
1543 | 1566 |
1544 if (tag.IsPrivate() || | 1567 if (tag.IsPrivate() || |
1545 IsBinaryTag(key)) | 1568 IsBinaryTag(key)) |
1546 { | 1569 { |
1547 if (element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good()) | 1570 bool ok; |
1571 | |
1572 switch (key.getEVR()) | |
1573 { | |
1574 case EVR_OW: | |
1575 if (decoded->size() % sizeof(Uint16) != 0) | |
1576 { | |
1577 LOG(ERROR) << "A tag with OW VR must have an even number of bytes"; | |
1578 ok = false; | |
1579 } | |
1580 else | |
1581 { | |
1582 ok = element.putUint16Array((const Uint16*) decoded->c_str(), decoded->size() / sizeof(Uint16)).good(); | |
1583 } | |
1584 | |
1585 break; | |
1586 | |
1587 default: | |
1588 ok = element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good(); | |
1589 break; | |
1590 } | |
1591 | |
1592 if (ok) | |
1548 { | 1593 { |
1549 return; | 1594 return; |
1550 } | 1595 } |
1551 else | 1596 else |
1552 { | 1597 { |
1593 case EVR_ST: // short text | 1638 case EVR_ST: // short text |
1594 case EVR_LT: // long text | 1639 case EVR_LT: // long text |
1595 case EVR_UT: // unlimited text | 1640 case EVR_UT: // unlimited text |
1596 case EVR_PN: // person name | 1641 case EVR_PN: // person name |
1597 case EVR_UI: // unique identifier | 1642 case EVR_UI: // unique identifier |
1643 case EVR_UC: // unlimited characters | |
1644 case EVR_UR: // URI/URL | |
1598 { | 1645 { |
1599 ok = element.putString(decoded->c_str()).good(); | 1646 ok = element.putString(decoded->c_str()).good(); |
1600 break; | 1647 break; |
1601 } | 1648 } |
1602 | 1649 |
2197 * Deal with binary data (including PixelData). | 2244 * Deal with binary data (including PixelData). |
2198 **/ | 2245 **/ |
2199 | 2246 |
2200 if (evr == EVR_OB || // other byte | 2247 if (evr == EVR_OB || // other byte |
2201 evr == EVR_OF || // other float | 2248 evr == EVR_OF || // other float |
2249 #if DCMTK_VERSION_NUMBER >= 361 | |
2250 evr == EVR_OD || // other double | |
2251 #endif | |
2202 #if DCMTK_VERSION_NUMBER >= 362 | 2252 #if DCMTK_VERSION_NUMBER >= 362 |
2203 evr == EVR_OD || // other double | |
2204 evr == EVR_OL || // other long | 2253 evr == EVR_OL || // other long |
2205 #endif | 2254 #endif |
2206 evr == EVR_OW || // other word | 2255 evr == EVR_OW || // other word |
2207 evr == EVR_UN) // unknown value representation | 2256 evr == EVR_UN) // unknown value representation |
2208 { | 2257 { |
2258 Uint16* data16 = NULL; | |
2209 Uint8* data = NULL; | 2259 Uint8* data = NULL; |
2210 | 2260 |
2211 if (element.getUint8Array(data) == EC_Normal) | 2261 if (evr == EVR_OW && |
2262 element.getUint16Array(data16) == EC_Normal) | |
2263 { | |
2264 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data16, element.getLength()); | |
2265 } | |
2266 else if (evr != EVR_OW && | |
2267 element.getUint8Array(data) == EC_Normal) | |
2212 { | 2268 { |
2213 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data, element.getLength()); | 2269 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data, element.getLength()); |
2214 } | 2270 } |
2215 else | 2271 else |
2216 { | 2272 { |