comparison Samples/Sdl/Loader.cpp @ 784:9f3b2027a4a9

DicomStructureSetLoader
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 27 May 2019 17:20:59 +0200
parents cd13a062c9bd
children c83a45f864b2
comparison
equal deleted inserted replaced
783:cd13a062c9bd 784:9f3b2027a4a9
35 #include "../../Framework/Scene2D/PolylineSceneLayer.h" 35 #include "../../Framework/Scene2D/PolylineSceneLayer.h"
36 #include "../../Framework/Scene2D/LookupTableTextureSceneLayer.h" 36 #include "../../Framework/Scene2D/LookupTableTextureSceneLayer.h"
37 #include "../../Framework/StoneInitialization.h" 37 #include "../../Framework/StoneInitialization.h"
38 #include "../../Framework/Toolbox/GeometryToolbox.h" 38 #include "../../Framework/Toolbox/GeometryToolbox.h"
39 #include "../../Framework/Toolbox/SlicesSorter.h" 39 #include "../../Framework/Toolbox/SlicesSorter.h"
40 #include "../../Framework/Toolbox/DicomStructureSet.h"
40 #include "../../Framework/Volumes/ImageBuffer3D.h" 41 #include "../../Framework/Volumes/ImageBuffer3D.h"
41 #include "../../Framework/Volumes/VolumeImageGeometry.h" 42 #include "../../Framework/Volumes/VolumeImageGeometry.h"
42 #include "../../Framework/Volumes/VolumeReslicer.h" 43 #include "../../Framework/Volumes/VolumeReslicer.h"
43 44
44 // From Orthanc framework 45 // From Orthanc framework
1460 } 1461 }
1461 }; 1462 };
1462 1463
1463 1464
1464 1465
1466 class DicomStructureSetLoader :
1467 public IObserver,
1468 public IVolumeSlicer
1469 {
1470 private:
1471 enum State
1472 {
1473 State_Setup,
1474 State_Loading,
1475 State_Ready
1476 };
1477
1478
1479 std::auto_ptr<DicomStructureSet> content_;
1480 IOracle& oracle_;
1481 State state_;
1482 std::string instanceId_;
1483
1484 void Handle(const OrthancRestApiCommand::SuccessMessage& message)
1485 {
1486 if (state_ != State_Loading)
1487 {
1488 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
1489 }
1490
1491 const boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
1492
1493 {
1494 OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer());
1495 content_.reset(new DicomStructureSet(dicom));
1496 }
1497
1498 const boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
1499
1500 printf("LOADED: %d\n", (end - start).total_milliseconds());
1501 state_ = State_Ready;
1502 }
1503
1504
1505 public:
1506 DicomStructureSetLoader(IOracle& oracle,
1507 IObservable& oracleObservable) :
1508 IObserver(oracleObservable.GetBroker()),
1509 oracle_(oracle),
1510 state_(State_Setup)
1511 {
1512 oracleObservable.RegisterObserverCallback(
1513 new Callable<DicomStructureSetLoader, OrthancRestApiCommand::SuccessMessage>
1514 (*this, &DicomStructureSetLoader::Handle));
1515 }
1516
1517
1518 void LoadInstance(const std::string& instanceId)
1519 {
1520 if (state_ != State_Setup)
1521 {
1522 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
1523 }
1524 else
1525 {
1526 state_ = State_Loading;
1527 instanceId_ = instanceId;
1528
1529 {
1530 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
1531 command->SetHttpHeader("Accept-Encoding", "gzip");
1532 command->SetUri("/instances/" + instanceId + "/tags?ignore-length=3006-0050");
1533 oracle_.Schedule(*this, command.release());
1534 }
1535 }
1536 }
1537
1538 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane)
1539 {
1540 return NULL;
1541 }
1542 };
1543
1544
1545
1465 class VolumeSceneLayerSource : public boost::noncopyable 1546 class VolumeSceneLayerSource : public boost::noncopyable
1466 { 1547 {
1467 private: 1548 private:
1468 Scene2D& scene_; 1549 Scene2D& scene_;
1469 int layerDepth_; 1550 int layerDepth_;
1852 1933
1853 1934
1854 boost::shared_ptr<Toto> toto; 1935 boost::shared_ptr<Toto> toto;
1855 boost::shared_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> ctLoader; 1936 boost::shared_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> ctLoader;
1856 boost::shared_ptr<OrthancStone::OrthancMultiframeVolumeLoader> doseLoader; 1937 boost::shared_ptr<OrthancStone::OrthancMultiframeVolumeLoader> doseLoader;
1938 boost::shared_ptr<OrthancStone::DicomStructureSetLoader> rtstructLoader;
1857 1939
1858 { 1940 {
1859 OrthancStone::NativeApplicationContext::WriterLock lock(context); 1941 OrthancStone::NativeApplicationContext::WriterLock lock(context);
1860 toto.reset(new Toto(oracle, lock.GetOracleObservable())); 1942 toto.reset(new Toto(oracle, lock.GetOracleObservable()));
1861 ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); 1943 ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable()));
1862 doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); 1944 doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable()));
1945 rtstructLoader.reset(new OrthancStone::DicomStructureSetLoader(oracle, lock.GetOracleObservable()));
1863 } 1946 }
1864 1947
1865 1948
1866 toto->SetReferenceLoader(*ctLoader); 1949 toto->SetReferenceLoader(*ctLoader);
1867 1950
1880 std::auto_ptr<OrthancStone::LookupTableStyleConfigurator> config(new OrthancStone::LookupTableStyleConfigurator); 1963 std::auto_ptr<OrthancStone::LookupTableStyleConfigurator> config(new OrthancStone::LookupTableStyleConfigurator);
1881 config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); 1964 config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT);
1882 toto->SetVolume2(1, doseLoader, config.release()); 1965 toto->SetVolume2(1, doseLoader, config.release());
1883 } 1966 }
1884 1967
1885 oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100)); 1968 //oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100));
1886 1969
1887 if (0) 1970 if (0)
1888 { 1971 {
1889 Json::Value v = Json::objectValue; 1972 Json::Value v = Json::objectValue;
1890 v["Level"] = "Series"; 1973 v["Level"] = "Series";
1957 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i)); 2040 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i));
1958 oracle.Schedule(*toto, command.release()); 2041 oracle.Schedule(*toto, command.release());
1959 } 2042 }
1960 } 2043 }
1961 2044
2045
1962 // 2017-11-17-Anonymized 2046 // 2017-11-17-Anonymized
1963 ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT 2047 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT
1964 doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE 2048 //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE
2049 rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT
1965 2050
1966 // 2015-01-28-Multiframe 2051 // 2015-01-28-Multiframe
1967 //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT 2052 //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT
1968 2053
1969 // Delphine 2054 // Delphine