changeset 506:6e4bd06c17c5 laaw

the wrapper is working
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 18 Jul 2013 12:01:51 +0200
parents 50d9660f960c
children a8938e00bc08
files CMakeLists.txt OrthancCppClient/OrthancConnection.cpp OrthancCppClient/OrthancConnection.h OrthancCppClient/Package/CMakeLists.txt OrthancCppClient/Package/ConfigurationCpp.json OrthancCppClient/Package/Laaw/VersionScript.map OrthancCppClient/Package/Test.sh OrthancCppClient/Package/Test/CMakeLists.txt OrthancCppClient/Package/Test/main.cpp OrthancCppClient/Series.h Resources/CMake/LibCurlConfiguration.cmake Resources/CMake/ZlibConfiguration.cmake
diffstat 12 files changed, 282 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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();
   }
-
-
 }
--- 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();
--- /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
--- 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"
 }
--- /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:
+  *;
+};
--- 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
--- /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
--- /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 <iostream>
+
+#include <vtkRenderWindow.h>
+#include <vtkImageData.h>
+#include <vtkPiecewiseFunction.h>
+#include <vtkFixedPointVolumeRayCastMapper.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkVolumeProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkSmartPointer.h>
+#include <vtkOpenGLRenderer.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+
+#include "../Build/OrthancClient.h"
+
+
+void Display(OrthancClient::Series& series)
+{
+  /**
+   * Load the 3D image from Orthanc into VTK.
+   **/
+
+  vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::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<vtkPiecewiseFunction> opacityTransfer = 
+    vtkSmartPointer<vtkPiecewiseFunction>::New();
+  opacityTransfer->AddSegment(range[0], 0.0, range[1], 1.0);
+ 
+  vtkSmartPointer<vtkColorTransferFunction> colorTransfer = 
+    vtkSmartPointer<vtkColorTransferFunction>::New();
+  colorTransfer->AddRGBPoint(0, 1.0, 1.0, 1.0);
+  colorTransfer->AddRGBPoint(range[1], 1.0, 1.0, 1.0);
+ 
+  vtkSmartPointer<vtkVolumeProperty> property = 
+    vtkSmartPointer<vtkVolumeProperty>::New();
+  property->SetScalarOpacity(opacityTransfer);
+  property->SetColor(colorTransfer);
+  property->SetInterpolationTypeToLinear();
+
+  // Create a Maximum Intensity Projection rendering
+  vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = 
+    vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
+  mapper->SetBlendModeToMaximumIntensity();
+  mapper->SetInput(image);
+
+  vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
+  volume->SetMapper(mapper);
+  volume->SetProperty(property);
+  
+  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkOpenGLRenderer>::New();
+  renderer->AddViewProp(volume);
+  renderer->SetBackground(0.1, 0.2, 0.3); // Background color dark blue
+
+  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = 
+    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
+ 
+  vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
+  window->AddRenderer(renderer); 
+
+  vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::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;
+  }
+}
--- 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
--- 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
--- 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})