# HG changeset patch # User Sebastien Jodogne # Date 1374141711 -7200 # Node ID 6e4bd06c17c5bfbf454f17546186c00bb2fb3e23 # Parent 50d9660f960c0080a0c32a98f6357d70357a39ed the wrapper is working diff -r 50d9660f960c -r 6e4bd06c17c5 CMakeLists.txt --- a/CMakeLists.txt Thu Jul 18 10:12:20 2013 +0200 +++ b/CMakeLists.txt Thu Jul 18 12:01:51 2013 +0200 @@ -41,6 +41,8 @@ include(${CMAKE_SOURCE_DIR}/Resources/CMake/DownloadPackage.cmake) include(${CMAKE_SOURCE_DIR}/Resources/CMake/Compiler.cmake) +set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR}) + # Configuration of the standalone builds if (${CMAKE_CROSSCOMPILING}) # Cross-compilation implies the standalone build diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/OrthancConnection.cpp --- a/OrthancCppClient/OrthancConnection.cpp Thu Jul 18 10:12:20 2013 +0200 +++ b/OrthancCppClient/OrthancConnection.cpp Thu Jul 18 12:01:51 2013 +0200 @@ -70,6 +70,4 @@ client_.SetCredentials(username, password); ReadPatients(); } - - } diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/OrthancConnection.h --- a/OrthancCppClient/OrthancConnection.h Thu Jul 18 10:12:20 2013 +0200 +++ b/OrthancCppClient/OrthancConnection.h Thu Jul 18 12:01:51 2013 +0200 @@ -64,6 +64,10 @@ const char* username, const char* password); + virtual ~OrthancConnection() + { + } + uint32_t GetThreadCount() const { return patients_.GetThreadCount(); diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancCppClient/Package/CMakeLists.txt Thu Jul 18 12:01:51 2013 +0200 @@ -0,0 +1,57 @@ +# nm -C -D --defined-only libOrthancCppClient.so + + +cmake_minimum_required(VERSION 2.8) + +project(OrthancCppClientTest) + +include_directories(${CMAKE_SOURCE_DIR}/Laaw) + +set(STATIC_BUILD ON) +set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR}/../..) + +include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/JsonCppConfiguration.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/LibCurlConfiguration.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/LibPngConfiguration.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/BoostConfiguration.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/ZlibConfiguration.cmake) + +if (${CMAKE_COMPILER_IS_GNUCXX}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Wno-implicit-function-declaration") # --std=c99 makes libcurl not to compile + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wno-long-long -Wno-variadic-macros") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") +elseif (${MSVC}) + add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) +endif() + +add_library(OrthancCppClient SHARED + SharedLibrary.cpp + ${THIRD_PARTY_SOURCES} + ${ORTHANC_ROOT}/Core/OrthancException.cpp + ${ORTHANC_ROOT}/Core/Enumerations.cpp + ${ORTHANC_ROOT}/Core/Toolbox.cpp + ${ORTHANC_ROOT}/Core/HttpClient.cpp + ${ORTHANC_ROOT}/Core/MultiThreading/ArrayFilledByThreads.cpp + ${ORTHANC_ROOT}/Core/MultiThreading/ThreadedCommandProcessor.cpp + ${ORTHANC_ROOT}/Core/MultiThreading/SharedMessageQueue.cpp + ${ORTHANC_ROOT}/Core/FileFormats/PngReader.cpp + ${ORTHANC_ROOT}/OrthancCppClient/OrthancConnection.cpp + ${ORTHANC_ROOT}/OrthancCppClient/Series.cpp + ${ORTHANC_ROOT}/OrthancCppClient/Study.cpp + ${ORTHANC_ROOT}/OrthancCppClient/Instance.cpp + ${ORTHANC_ROOT}/OrthancCppClient/Patient.cpp + ${ORTHANC_ROOT}/Resources/sha1/sha1.cpp + ${ORTHANC_ROOT}/Resources/md5/md5.c + ${ORTHANC_ROOT}/Resources/base64/base64.cpp + ) + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script=${CMAKE_SOURCE_DIR}/Laaw/VersionScript.map") + target_link_libraries(OrthancCppClient pthread) +endif() + + + +set(CMAKE_CXX_FLAGS "-fpermissive") #TODO REMOVE diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/ConfigurationCpp.json --- a/OrthancCppClient/Package/ConfigurationCpp.json Thu Jul 18 10:12:20 2013 +0200 +++ b/OrthancCppClient/Package/ConfigurationCpp.json Thu Jul 18 12:01:51 2013 +0200 @@ -1,5 +1,5 @@ { "InternalsNamespace" : [ "OrthancClient", "Internals" ], "PublicNamespace" : [ "OrthancClient" ], - "ExceptionClassName" : "OrthancException" + "ExceptionClassName" : "OrthancClientException" } diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/Laaw/VersionScript.map --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancCppClient/Package/Laaw/VersionScript.map Thu Jul 18 12:01:51 2013 +0200 @@ -0,0 +1,9 @@ +# This is a version-script + +{ +global: + LAAW_EXTERNC_*; + +local: + *; +}; diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/Test.sh --- a/OrthancCppClient/Package/Test.sh Thu Jul 18 10:12:20 2013 +0200 +++ b/OrthancCppClient/Package/Test.sh Thu Jul 18 12:01:51 2013 +0200 @@ -3,7 +3,7 @@ mkdir -p Build LAAW_ROOT=~/Subversion/Jomago/Src/Labo/Laaw -#${LAAW_ROOT}/Parser/Build/LaawParser.exe Build/CodeModelRaw.json ../OrthancConnection.h -I`pwd`/../../s/jsoncpp-src-0.6.0-rc2/include -fms-extensions && \ -# python ${LAAW_ROOT}/Generators/CodeModelPostProcessing.py Build/CodeModel.json Build/CodeModelRaw.json Product.json && \ +${LAAW_ROOT}/Parser/Build/LaawParser.exe Build/CodeModelRaw.json ../OrthancConnection.h -I`pwd`/../../s/jsoncpp-src-0.6.0-rc2/include -fms-extensions && \ + python ${LAAW_ROOT}/Generators/CodeModelPostProcessing.py Build/CodeModel.json Build/CodeModelRaw.json Product.json && \ python ${LAAW_ROOT}/Generators/GenerateWrapperCpp.py Build/OrthancClient.h Build/CodeModel.json Product.json ConfigurationCpp.json && \ python ${LAAW_ROOT}/Generators/GenerateExternC.py Build/ExternC.cpp Build/CodeModel.json Product.json diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/Test/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancCppClient/Package/Test/CMakeLists.txt Thu Jul 18 12:01:51 2013 +0200 @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 2.8) + +project(OrthancCppClientTest) + +find_package(VTK REQUIRED) +include(${VTK_USE_FILE}) + +add_executable(Test + main.cpp + ) + +if(VTK_LIBRARIES) + target_link_libraries(Test ${VTK_LIBRARIES}) +else() + target_link_libraries(Test vtkHybrid vtkVolumeRendering) +endif() + +set(CMAKE_CXX_FLAGS "-fpermissive") #TODO REMOVE diff -r 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Package/Test/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancCppClient/Package/Test/main.cpp Thu Jul 18 12:01:51 2013 +0200 @@ -0,0 +1,183 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege, + * Belgium + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + **/ + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../Build/OrthancClient.h" + + +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 + { + OrthancClient::Initialize("libOrthancCppClient.so"); + + // 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, "c1c4cb95-05e3bd11-8da9f5bb-87278f71-0b2b43f5"); + Display(series); + return 0; + } + */ + + + // Try and find a 3D image inside the local store + OrthancClient::OrthancConnection orthanc("http://localhost:8042"); + + printf(">> %d\n", orthanc.GetPatientCount()); + + for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++) + { + OrthancClient::Patient patient = orthanc.GetPatient(i); + printf("-- %d\n", (int) &patient); + printf(">>>> %d\n", patient.GetStudyCount()); + 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 50d9660f960c -r 6e4bd06c17c5 OrthancCppClient/Series.h --- a/OrthancCppClient/Series.h Thu Jul 18 10:12:20 2013 +0200 +++ b/OrthancCppClient/Series.h Thu Jul 18 12:01:51 2013 +0200 @@ -95,7 +95,7 @@ bool Is3DImage(); uint32_t GetInstanceCount(); - + Instance& GetInstance(uint32_t index); const char* GetId() const diff -r 50d9660f960c -r 6e4bd06c17c5 Resources/CMake/LibCurlConfiguration.cmake --- a/Resources/CMake/LibCurlConfiguration.cmake Thu Jul 18 10:12:20 2013 +0200 +++ b/Resources/CMake/LibCurlConfiguration.cmake Thu Jul 18 12:01:51 2013 +0200 @@ -9,8 +9,9 @@ AUX_SOURCE_DIRECTORY(${CURL_SOURCES_DIR}/lib CURL_SOURCES) source_group(ThirdParty\\LibCurl REGULAR_EXPRESSION ${CURL_SOURCES_DIR}/.*) - add_library(Curl STATIC ${CURL_SOURCES}) - link_libraries(Curl) + #add_library(Curl STATIC ${CURL_SOURCES}) + #link_libraries(Curl) + list(APPEND THIRD_PARTY_SOURCES ${CURL_SOURCES}) add_definitions( -DCURL_STATICLIB=1 diff -r 50d9660f960c -r 6e4bd06c17c5 Resources/CMake/ZlibConfiguration.cmake --- a/Resources/CMake/ZlibConfiguration.cmake Thu Jul 18 10:12:20 2013 +0200 +++ b/Resources/CMake/ZlibConfiguration.cmake Thu Jul 18 12:01:51 2013 +0200 @@ -1,7 +1,7 @@ # This is the minizip distribution to create ZIP files list(APPEND THIRD_PARTY_SOURCES - ${CMAKE_SOURCE_DIR}/Resources/minizip/ioapi.c - ${CMAKE_SOURCE_DIR}/Resources/minizip/zip.c + ${ORTHANC_ROOT}/Resources/minizip/ioapi.c + ${ORTHANC_ROOT}/Resources/minizip/zip.c ) if (${STATIC_BUILD})