# HG changeset patch # User Sebastien Jodogne # Date 1433159952 -7200 # Node ID 8f22ed9d48d5e22d26f2c6ea641242ed3d50dec4 # Parent fd402e53d263c96bb3044db27013ca759c10c338 cont diff -r fd402e53d263 -r 8f22ed9d48d5 Samples/Basic/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/Basic/CMakeLists.txt Mon Jun 01 13:59:12 2015 +0200 @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.8) + +project(Basic) + +add_executable(Test main.cpp) + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + # Linking with "pthread" is necessary, otherwise the software crashes + # http://sourceware.org/bugzilla/show_bug.cgi?id=10652#c17 + target_link_libraries(Test pthread dl) +endif() diff -r fd402e53d263 -r 8f22ed9d48d5 Samples/Basic/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/Basic/main.cpp Mon Jun 01 13:59:12 2015 +0200 @@ -0,0 +1,80 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + **/ + + +#include +#include + +int main() +{ + try + { + // The following explicit initialization is not required, except + // if you wish to specify the full path to the shared library + OrthancClient::Initialize(); + + // Display the content of the local Orthanc instance + OrthancClient::OrthancConnection orthanc("http://localhost:8042"); + + for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++) + { + OrthancClient::Patient patient(orthanc.GetPatient(i)); + std::cout << "Patient: " << patient.GetId() << std::endl; + + for (unsigned int j = 0; j < patient.GetStudyCount(); j++) + { + OrthancClient::Study study(patient.GetStudy(j)); + std::cout << " Study: " << study.GetId() << std::endl; + + for (unsigned int k = 0; k < study.GetSeriesCount(); k++) + { + OrthancClient::Series series(study.GetSeries(k)); + std::cout << " Series: " << series.GetId() << std::endl; + + if (series.Is3DImage()) + { + std::cout << " This is a 3D image whose voxel size is " + << series.GetVoxelSizeX() << " x " + << series.GetVoxelSizeY() << " x " + << series.GetVoxelSizeZ() << ", and slice thickness is " + << series.GetSliceThickness() << std::endl; + } + + for (unsigned int l = 0; l < series.GetInstanceCount(); l++) + { + std::cout << " Instance: " << series.GetInstance(l).GetId() << std::endl; + + // Load and display some raw DICOM tag + series.GetInstance(l).LoadTagContent("0020-000d"); + std::cout << " SOP instance UID: " << series.GetInstance(l).GetLoadedTagContent() << std::endl; + } + } + } + } + + OrthancClient::Finalize(); + + return 0; + } + catch (OrthancClient::OrthancClientException& e) + { + std::cerr << "EXCEPTION: [" << e.What() << "]" << std::endl; + return -1; + } +} diff -r fd402e53d263 -r 8f22ed9d48d5 Samples/Vtk/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/Vtk/CMakeLists.txt Mon Jun 01 13:59:12 2015 +0200 @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 2.8) + +project(Vtk) + +find_package(VTK REQUIRED) +include(${VTK_USE_FILE}) + +add_executable(Test + main.cpp + ) + +# Linking with "pthread" is necessary, otherwise the software crashes +# http://sourceware.org/bugzilla/show_bug.cgi?id=10652#c17 +target_link_libraries(Test pthread dl) + +if(VTK_LIBRARIES) + target_link_libraries(Test ${VTK_LIBRARIES}) +else() + target_link_libraries(Test vtkHybrid vtkVolumeRendering) +endif() diff -r fd402e53d263 -r 8f22ed9d48d5 Samples/Vtk/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/Vtk/main.cpp Mon Jun 01 13:59:12 2015 +0200 @@ -0,0 +1,174 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + **/ + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +void Display(OrthancClient::Series& series) +{ + /** + * Load the 3D image from Orthanc into VTK. + **/ + + vtkSmartPointer image = vtkSmartPointer::New(); + image->SetDimensions(series.GetWidth(), series.GetHeight(), series.GetInstanceCount()); + image->SetScalarType(VTK_SHORT); + image->AllocateScalars(); + + if (series.GetWidth() != 0 && + series.GetHeight() != 0 && + series.GetInstanceCount() != 0) + { + series.Load3DImage(image->GetScalarPointer(0, 0, 0), Orthanc::PixelFormat_SignedGrayscale16, + 2 * series.GetWidth(), 2 * series.GetHeight() * series.GetWidth()); + } + + image->SetSpacing(series.GetVoxelSizeX(), + series.GetVoxelSizeY(), + series.GetVoxelSizeZ()); + + + /** + * The following code is based on the VTK sample for MIP + * http://www.vtk.org/Wiki/VTK/Examples/Cxx/VolumeRendering/MinIntensityRendering + **/ + + // Create a transfer function mapping scalar value to opacity + double range[2]; + image->GetScalarRange(range); + + vtkSmartPointer opacityTransfer = + vtkSmartPointer::New(); + opacityTransfer->AddSegment(range[0], 0.0, range[1], 1.0); + + vtkSmartPointer colorTransfer = + vtkSmartPointer::New(); + colorTransfer->AddRGBPoint(0, 1.0, 1.0, 1.0); + colorTransfer->AddRGBPoint(range[1], 1.0, 1.0, 1.0); + + vtkSmartPointer property = + vtkSmartPointer::New(); + property->SetScalarOpacity(opacityTransfer); + property->SetColor(colorTransfer); + property->SetInterpolationTypeToLinear(); + + // Create a Maximum Intensity Projection rendering + vtkSmartPointer mapper = + vtkSmartPointer::New(); + mapper->SetBlendModeToMaximumIntensity(); + mapper->SetInput(image); + + vtkSmartPointer volume = vtkSmartPointer::New(); + volume->SetMapper(mapper); + volume->SetProperty(property); + + vtkSmartPointer renderer = vtkSmartPointer::New(); + renderer->AddViewProp(volume); + renderer->SetBackground(0.1, 0.2, 0.3); // Background color dark blue + + vtkSmartPointer style = + vtkSmartPointer::New(); + + vtkSmartPointer window = vtkSmartPointer::New(); + window->AddRenderer(renderer); + + vtkSmartPointer interactor = vtkSmartPointer::New(); + interactor->SetRenderWindow(window); + interactor->SetInteractorStyle(style); + interactor->Start(); +} + + +int main() +{ + try + { + // The following explicit initialization is not required, except + // if you wish to specify the full path to the shared library + OrthancClient::Initialize(); + + // Use the commented code below if you know the identifier of a + // series that corresponds to a 3D image. + + /* + { + OrthancClient::OrthancConnection orthanc("http://localhost:8042"); + OrthancClient::Series series(orthanc, "dc5ec3d9-6e1a7b2c-73a829f0-64c609f6-ef976a97"); + Display(series); + return 0; + } + */ + + + // Try and find a 3D image inside the local store + OrthancClient::OrthancConnection orthanc("http://localhost:8042"); + + for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++) + { + OrthancClient::Patient patient(orthanc.GetPatient(i)); + std::cout << "Patient: " << patient.GetId() << std::endl; + + for (unsigned int j = 0; j < patient.GetStudyCount(); j++) + { + OrthancClient::Study study(patient.GetStudy(j)); + std::cout << " Study: " << study.GetId() << std::endl; + + for (unsigned int k = 0; k < study.GetSeriesCount(); k++) + { + OrthancClient::Series series(study.GetSeries(k)); + std::cout << " Series: " << series.GetId() << std::endl; + + if (series.Is3DImage()) + { + Display(series); + return 0; + } + else + { + std::cout << " => Not a 3D image..." << std::endl; + } + } + } + } + + std::cout << "Unable to find a 3D image in the local Orthanc store" << std::endl; + + return 0; + } + catch (OrthancClient::OrthancClientException& e) + { + std::cerr << "EXCEPTION: [" << e.What() << "]" << std::endl; + return -1; + } +} diff -r fd402e53d263 -r 8f22ed9d48d5 TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TODO Mon Jun 01 13:59:12 2015 +0200 @@ -0,0 +1,2 @@ +WindowsFull/Debug/OrthancClient_Windows32.dll=>Binaries +OrthancCppClient/SharedLibrary/AUTOGENERATED/OrthancCppClient.h=>Binaries