# HG changeset patch # User Sebastien Jodogne # Date 1645625024 -3600 # Node ID 01fa632daae95f3fcb72921fa77e2ec40b4d0df6 # Parent 908ca7847b9d9915debb8e26befa38fea7a25153 Orthanc 1.10.0 diff -r 908ca7847b9d -r 01fa632daae9 OpenAPI/orthanc-openapi.json --- a/OpenAPI/orthanc-openapi.json Wed Feb 23 11:08:20 2022 +0100 +++ b/OpenAPI/orthanc-openapi.json Wed Feb 23 15:03:44 2022 +0100 @@ -2,7 +2,7 @@ "info" : { "description" : "This is the full documentation of the [REST API](https://book.orthanc-server.com/users/rest.html) of Orthanc.

This reference is automatically generated from the source code of Orthanc. A [shorter cheat sheet](https://book.orthanc-server.com/users/rest-cheatsheet.html) is part of the Orthanc Book.

An earlier, manually crafted version from August 2019, is [still available](2019-08-orthanc-openapi.html), but is not up-to-date anymore ([source](https://groups.google.com/g/orthanc-users/c/NUiJTEICSl8/m/xKeqMrbqAAAJ)).", "title" : "Orthanc API", - "version" : "1.9.7" + "version" : "1.10.0" }, "openapi" : "3.0.0", "paths" : { @@ -463,6 +463,15 @@ "description" : "Get the list of attachments that are associated with the given instance", "parameters" : [ { + "description" : "If present, retrieve the attachments list and their numerical ids", + "in" : "query", + "name" : "full", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { "description" : "Orthanc identifier of the instance of interest", "in" : "path", "name" : "id", @@ -905,6 +914,61 @@ "tags" : [ "Instances" ] } }, + "/instances/{id}/attachments/{name}/info" : { + "get" : { + "deprecated" : false, + "description" : "Get all the information about the attachment associated with the given instance", + "parameters" : [ + { + "description" : "Optional revision of the attachment, to check if its content has changed", + "in" : "header", + "name" : "If-None-Match", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { + "description" : "Orthanc identifier of the instance of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + }, + { + "description" : "The name of the attachment, or its index (cf. `UserContentType` configuration option)", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : {}, + "schema" : { + "description" : "JSON object containing the information about the attachment" + } + } + }, + "description" : "", + "headers" : { + "ETag" : { + "description" : "Revision of the attachment, to be used in further `PUT` or `DELETE` operations" + } + } + } + }, + "summary" : "Get info about the attachment", + "tags" : [ "Instances" ] + } + }, "/instances/{id}/attachments/{name}/is-compressed" : { "get" : { "deprecated" : false, @@ -1338,6 +1402,7 @@ "image-uint16", "image-uint8", "matlab", + "numpy", "preview", "raw", "raw.gz", @@ -1368,6 +1433,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -1439,6 +1513,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -1510,6 +1593,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -1607,6 +1699,65 @@ "tags" : [ "Instances" ] } }, + "/instances/{id}/frames/{frame}/numpy" : { + "get" : { + "deprecated" : false, + "description" : "Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel).", + "parameters" : [ + { + "description" : "Compress the file as `.npz`", + "in" : "query", + "name" : "compress", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "On grayscale images, apply the rescaling and return floating-point values", + "in" : "query", + "name" : "rescale", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "Index of the frame (starts at `0`)", + "in" : "path", + "name" : "frame", + "required" : true, + "schema" : { + "type" : "number" + } + }, + { + "description" : "Orthanc identifier of the DICOM resource of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "text/plain" : { + "examples" : {}, + "schema" : { + "description" : "Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html" + } + } + }, + "description" : "" + } + }, + "summary" : "Decode frame for numpy", + "tags" : [ "Instances" ] + } + }, "/instances/{id}/frames/{frame}/preview" : { "get" : { "deprecated" : false, @@ -1622,6 +1773,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -1784,6 +1944,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Whether to smooth image on resize", "in" : "query", "name" : "smooth", @@ -1977,6 +2146,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -2039,6 +2217,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -2101,6 +2288,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -2553,6 +2749,56 @@ "tags" : [ "Instances" ] } }, + "/instances/{id}/numpy" : { + "get" : { + "deprecated" : false, + "description" : "Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).", + "parameters" : [ + { + "description" : "Compress the file as `.npz`", + "in" : "query", + "name" : "compress", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "On grayscale images, apply the rescaling and return floating-point values", + "in" : "query", + "name" : "rescale", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "Orthanc identifier of the DICOM resource of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "text/plain" : { + "examples" : {}, + "schema" : { + "description" : "Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html" + } + } + }, + "description" : "" + } + }, + "summary" : "Decode instance for numpy", + "tags" : [ "Instances" ] + } + }, "/instances/{id}/patient" : { "get" : { "deprecated" : false, @@ -2662,6 +2908,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`", "in" : "header", "name" : "Accept", @@ -2757,6 +3012,15 @@ } }, { + "description" : "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", + "in" : "query", + "name" : "returnUnsupportedImage", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { "description" : "Whether to smooth image on resize", "in" : "query", "name" : "smooth", @@ -3265,8 +3529,10 @@ "schema" : { "description" : "JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if `expand` argument is provided)", "example" : [ - "0c686aae-1509-4179-a8c5-1824c180bb84", - "f30d99df-3a10-480f-96a9-d0701550f07c" + "14a3cacd-fdf1-42ce-8cbe-7d882b60872b", + "45948a0f-d176-4ca7-9efc-187a5d14f1c7", + "6aae44fb-dacf-4115-ad79-77a323fd340b", + "..." ] } } @@ -3614,6 +3880,10 @@ "description" : "Whether to accept C-FIND SCU commands issued by the remote modality", "type" : "boolean" }, + "AllowFindWorklist" : { + "description" : "Whether to accept C-FIND SCU commands for worklists issued by the remote modality", + "type" : "boolean" + }, "AllowGet" : { "description" : "Whether to accept C-GET SCU commands issued by the remote modality", "type" : "boolean" @@ -3690,6 +3960,7 @@ "AllowEcho" : true, "AllowEventReport" : true, "AllowFind" : true, + "AllowFindWorklist" : true, "AllowGet" : true, "AllowMove" : true, "AllowNAction" : true, @@ -4746,6 +5017,15 @@ "description" : "Get the list of attachments that are associated with the given patient", "parameters" : [ { + "description" : "If present, retrieve the attachments list and their numerical ids", + "in" : "query", + "name" : "full", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { "description" : "Orthanc identifier of the patient of interest", "in" : "path", "name" : "id", @@ -5188,6 +5468,61 @@ "tags" : [ "Patients" ] } }, + "/patients/{id}/attachments/{name}/info" : { + "get" : { + "deprecated" : false, + "description" : "Get all the information about the attachment associated with the given patient", + "parameters" : [ + { + "description" : "Optional revision of the attachment, to check if its content has changed", + "in" : "header", + "name" : "If-None-Match", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { + "description" : "Orthanc identifier of the patient of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + }, + { + "description" : "The name of the attachment, or its index (cf. `UserContentType` configuration option)", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : {}, + "schema" : { + "description" : "JSON object containing the information about the attachment" + } + } + }, + "description" : "", + "headers" : { + "ETag" : { + "description" : "Revision of the attachment, to be used in further `PUT` or `DELETE` operations" + } + } + } + }, + "summary" : "Get info about the attachment", + "tags" : [ "Patients" ] + } + }, "/patients/{id}/attachments/{name}/is-compressed" : { "get" : { "deprecated" : false, @@ -7007,6 +7342,7 @@ "connectivity-checks", "dicom-web", "gdcm", + "indexer", "mysql-index", "mysql-storage", "odbc-index", @@ -7080,7 +7416,7 @@ "ExtendsOrthancExplorer" : true, "ID" : "dicom-web", "RootUri" : "../dicom-web/app/client/index.html", - "Version" : "1.6" + "Version" : "1.7" } } } @@ -8229,6 +8565,15 @@ "description" : "Get the list of attachments that are associated with the given series", "parameters" : [ { + "description" : "If present, retrieve the attachments list and their numerical ids", + "in" : "query", + "name" : "full", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { "description" : "Orthanc identifier of the series of interest", "in" : "path", "name" : "id", @@ -8671,6 +9016,61 @@ "tags" : [ "Series" ] } }, + "/series/{id}/attachments/{name}/info" : { + "get" : { + "deprecated" : false, + "description" : "Get all the information about the attachment associated with the given series", + "parameters" : [ + { + "description" : "Optional revision of the attachment, to check if its content has changed", + "in" : "header", + "name" : "If-None-Match", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { + "description" : "Orthanc identifier of the series of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + }, + { + "description" : "The name of the attachment, or its index (cf. `UserContentType` configuration option)", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : {}, + "schema" : { + "description" : "JSON object containing the information about the attachment" + } + } + }, + "description" : "", + "headers" : { + "ETag" : { + "description" : "Revision of the attachment, to be used in further `PUT` or `DELETE` operations" + } + } + } + }, + "summary" : "Get info about the attachment", + "tags" : [ "Series" ] + } + }, "/series/{id}/attachments/{name}/is-compressed" : { "get" : { "deprecated" : false, @@ -9670,6 +10070,56 @@ "tags" : [ "Series" ] } }, + "/series/{id}/numpy" : { + "get" : { + "deprecated" : false, + "description" : "Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).", + "parameters" : [ + { + "description" : "Compress the file as `.npz`", + "in" : "query", + "name" : "compress", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "On grayscale images, apply the rescaling and return floating-point values", + "in" : "query", + "name" : "rescale", + "required" : false, + "schema" : { + "type" : "boolean" + } + }, + { + "description" : "Orthanc identifier of the DICOM resource of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "text/plain" : { + "examples" : {}, + "schema" : { + "description" : "Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html" + } + } + }, + "description" : "" + } + }, + "summary" : "Decode series for numpy", + "tags" : [ "Series" ] + } + }, "/series/{id}/ordered-slices" : { "get" : { "deprecated" : true, @@ -10639,6 +11089,15 @@ "description" : "Get the list of attachments that are associated with the given study", "parameters" : [ { + "description" : "If present, retrieve the attachments list and their numerical ids", + "in" : "query", + "name" : "full", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { "description" : "Orthanc identifier of the study of interest", "in" : "path", "name" : "id", @@ -11081,6 +11540,61 @@ "tags" : [ "Studies" ] } }, + "/studies/{id}/attachments/{name}/info" : { + "get" : { + "deprecated" : false, + "description" : "Get all the information about the attachment associated with the given study", + "parameters" : [ + { + "description" : "Optional revision of the attachment, to check if its content has changed", + "in" : "header", + "name" : "If-None-Match", + "required" : false, + "schema" : { + "type" : "string" + } + }, + { + "description" : "Orthanc identifier of the study of interest", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + }, + { + "description" : "The name of the attachment, or its index (cf. `UserContentType` configuration option)", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } + ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : {}, + "schema" : { + "description" : "JSON object containing the information about the attachment" + } + } + }, + "description" : "", + "headers" : { + "ETag" : { + "description" : "Revision of the attachment, to be used in further `PUT` or `DELETE` operations" + } + } + } + }, + "summary" : "Get info about the attachment", + "tags" : [ "Studies" ] + } + }, "/studies/{id}/attachments/{name}/is-compressed" : { "get" : { "deprecated" : false, @@ -12862,7 +13376,7 @@ "schema" : { "description" : "", "example" : { - "ApiVersion" : 14, + "ApiVersion" : 15, "CheckRevisions" : false, "DatabaseBackendPlugin" : null, "DatabaseVersion" : 6, @@ -12873,7 +13387,7 @@ "Name" : "Orthanc Demo", "PluginsEnabled" : true, "StorageAreaPlugin" : null, - "Version" : "1.9.6" + "Version" : "1.9.7" }, "properties" : { "ApiVersion" : { @@ -13195,7 +13709,7 @@ "description" : "" } }, - "summary" : "Describe a set of instances", + "summary" : "Describe a set of resources", "tags" : [ "System" ] } }, @@ -13227,7 +13741,7 @@ "description" : "" } }, - "summary" : "Delete a set of instances", + "summary" : "Delete a set of resources", "tags" : [ "System" ] } }, @@ -14317,7 +14831,7 @@ "200" : { "content" : { "text/plain" : { - "example" : "orthanc_count_instances 2552 1630401803782\northanc_count_patients 8 1630401803782\northanc_count_series 26 1630401803782\northanc_count_studies 8 1630401803782\northanc_dicom_cache_count 213 1630393626028\northanc_dicom_cache_size 125.938728 1630393626028\northanc_disk_size_mb 1018.65021 1630401803782\northanc_jobs_completed 2 1630401803782\northanc_jobs_failed 0 1630401803782\northanc_jobs_pending 0 1630401803782\northanc_jobs_running 0 1630401803782\northanc_jobs_success 2 1630401803782\northanc_rest_api_active_requests 1 1630401803781\northanc_rest_api_duration_ms 353 1630401802149\northanc_storage_read_duration_ms 0 1630401797848\northanc_uncompressed_size_mb 1018.65021 1630401803782\n" + "example" : "orthanc_count_instances 2552 1645624991823\northanc_count_patients 8 1645624991823\northanc_count_series 26 1645624991823\northanc_count_studies 8 1645624991823\northanc_dicom_cache_count 215 1645572656584\northanc_dicom_cache_size 89.9329529 1645572656583\northanc_disk_size_mb 1018.65021 1645624991823\northanc_jobs_completed 10 1645624991823\northanc_jobs_failed 4 1645624991823\northanc_jobs_pending 0 1645624991823\northanc_jobs_running 0 1645624991823\northanc_jobs_success 6 1645624991823\northanc_rest_api_active_requests 1 1645624991823\northanc_rest_api_duration_ms 342 1645624990284\northanc_storage_read_duration_ms 8 1645624986257\northanc_uncompressed_size_mb 1018.65021 1645624991823\n" } }, "description" : "" @@ -14336,7 +14850,7 @@ "200" : { "content" : { "text/plain" : { - "example" : "20210831T092323", + "example" : "20220223T140311", "schema" : { "description" : "The UTC time" } @@ -14358,7 +14872,7 @@ "200" : { "content" : { "text/plain" : { - "example" : "20210831T092323", + "example" : "20220223T140311", "schema" : { "description" : "The local time" } diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/developers/creating-plugins.rst --- a/Sphinx/source/developers/creating-plugins.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/developers/creating-plugins.rst Wed Feb 23 15:03:44 2022 +0100 @@ -15,7 +15,7 @@ Native Orthanc plugins must use the `plugin SDK `__ whose interface is available as a `C header -`__. +`__. As a consequence, an Orthanc plugin will typically be written using C or C++, although it is also possible to create native plugins using languages that feature compatibility with C headers and with `FFI of @@ -96,7 +96,7 @@ that is part of the Orthanc source distribution: * `Plugins/Include/orthanc/OrthancCPlugin.h - `__ + `__ `Online documentation `__ for this C header is available, as generated by `Doxygen @@ -110,8 +110,8 @@ ``HAS_ORTHANC_EXCEPTION`` is set to ``0``: * `Plugins/Samples/Common/OrthanPluginCppWrapper.h - `__ + `__ * `Plugins/Samples/Common/OrthanPluginCppWrapper.cpp - `__ + `__ * `Plugins/Samples/Common/OrthanPluginException.h - `__ + `__ diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/developers/db-versioning.rst --- a/Sphinx/source/developers/db-versioning.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/developers/db-versioning.rst Wed Feb 23 15:03:44 2022 +0100 @@ -26,7 +26,7 @@ Version DB v2 DB v3 DB v4 DB v5 DB v6 =============================== ===== ===== ===== ===== ===== Mainline u u u x -Orthanc 0.9.5 - Orthanc 1.9.7 u u u x +Orthanc 0.9.5 - Orthanc 1.10.0 u u u x Orthanc 0.8.5 - Orthanc 0.9.4 u u x Orthanc 0.7.3 - Orthanc 0.8.4 u x Orthanc 0.4.0 - Orthanc 0.7.2 x diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/dicom-guide.rst --- a/Sphinx/source/dicom-guide.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/dicom-guide.rst Wed Feb 23 15:03:44 2022 +0100 @@ -665,7 +665,7 @@ $ getscu -v localhost 4242 -aec ORTHANC -k "0008,0052=STUDY" -k "0020,000d=1.2.840.113543.6.6.4.7.64067529866380271256212683512383713111129" -*Note:* As of Orthanc 1.9.7, Orthanc only implements C-Get as a +*Note:* As of Orthanc 1.10.0, Orthanc only implements C-Get as a service class provider (SCP). Using C-Get as a service class user (SCU) is not currently supported in Orthanc. diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/faq/crash.rst --- a/Sphinx/source/faq/crash.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/faq/crash.rst Wed Feb 23 15:03:44 2022 +0100 @@ -64,13 +64,13 @@ above ` is available as the ``crash.cpp`` file, here is a sample debug session:: - $ wget https://lsb.orthanc-server.com/orthanc/debug/1.9.7/Orthanc + $ wget https://lsb.orthanc-server.com/orthanc/debug/1.10.0/Orthanc $ chmod +x ./Orthanc $ gcc -fPIC -shared ./crash.cpp -I ~/orthanc/Plugins/Include -o crash.so $ ulimit -c unlimited $ echo '{ "Plugins" : ["crash.so"] }' > Configuration.json $ rm -f core ; ./Orthanc Configuration.json - W0427 15:43:24.215783 main.cpp:1436] Orthanc version: 1.9.7 + W0427 15:43:24.215783 main.cpp:1436] Orthanc version: 1.10.0 W0427 15:43:24.215910 main.cpp:1279] Performance warning: Non-release build, runtime debug assertions are turned on W0427 15:43:24.217585 OrthancConfiguration.cpp:61] Reading the configuration from: "Configuration.json" W0427 15:43:24.254733 main.cpp:700] Loading plugin(s) from: crash.so diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/faq/debugging.rst --- a/Sphinx/source/faq/debugging.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/faq/debugging.rst Wed Feb 23 15:03:44 2022 +0100 @@ -45,13 +45,13 @@ to debug Orthanc without compiling from sources. Here is a sample debug session:: - $ wget https://lsb.orthanc-server.com/orthanc/debug/1.9.7/Orthanc + $ wget https://lsb.orthanc-server.com/orthanc/debug/1.10.0/Orthanc $ chmod +x ./Orthanc $ gdb ./Orthanc Configuration.json (gdb) catch throw Catchpoint 1 (throw) (gdb) run - W0513 15:24:42.374349 main.cpp:1436] Orthanc version: 1.9.7 + W0513 15:24:42.374349 main.cpp:1436] Orthanc version: 1.10.0 ---> Reproduce your error case <--- Thread 15 "Orthanc" hit Catchpoint 1 (exception thrown), 0x00007ffff6de68bd in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (gdb) backtrace diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/faq/orthanc-storage.rst --- a/Sphinx/source/faq/orthanc-storage.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/faq/orthanc-storage.rst Wed Feb 23 15:03:44 2022 +0100 @@ -59,9 +59,9 @@ database schema is kept as simple as possible, and can be found in the following two files of the source code of Orthanc: `PrepareDatabase.sql -`__ +`__ and `InstallTrackAttachmentsSize.sql -`__. +`__. Direct access diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/faq/scalability.rst --- a/Sphinx/source/faq/scalability.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/faq/scalability.rst Wed Feb 23 15:03:44 2022 +0100 @@ -54,7 +54,7 @@ Here is a generic setup that should provide best performance in the presence of large databases: -* Make sure to use the latest release of Orthanc (1.9.7 at the time of +* Make sure to use the latest release of Orthanc (1.10.0 at the time of writing) running on a GNU/Linux distribution. * We suggest to use the latest release of the :ref:`PostgreSQL plugin diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/plugins/python.rst --- a/Sphinx/source/plugins/python.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/plugins/python.rst Wed Feb 23 15:03:44 2022 +0100 @@ -18,7 +18,7 @@ Python plugins have access to more features and a more consistent SDK than :ref:`Lua scripts `. The largest part of the Python API is automatically generated from the `Orthanc plugin SDK in C -`__ +`__ using the `Clang `__ compiler front-end. diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/plugins/python/pil-conversions.py --- a/Sphinx/source/plugins/python/pil-conversions.py Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/plugins/python/pil-conversions.py Wed Feb 23 15:03:44 2022 +0100 @@ -3,7 +3,7 @@ import PIL.ImageDraw import orthanc -URL = 'http://hg.orthanc-server.com/orthanc-tests/raw-file/Orthanc-1.9.7/Database/LenaTwiceWithFragments.dcm' +URL = 'http://hg.orthanc-server.com/orthanc-tests/raw-file/Orthanc-1.10.0/Database/LenaTwiceWithFragments.dcm' USERNAME = '' PASSWORD = '' diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/plugins/python/worklist.py --- a/Sphinx/source/plugins/python/worklist.py Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/plugins/python/worklist.py Wed Feb 23 15:03:44 2022 +0100 @@ -3,7 +3,7 @@ import os # Path to the directory containing the DICOM worklists -# https://hg.orthanc-server.com/orthanc/file/Orthanc-1.9.7/OrthancServer/Plugins/Samples/ModalityWorklists/WorklistsDatabase +# https://hg.orthanc-server.com/orthanc/file/Orthanc-1.10.0/OrthancServer/Plugins/Samples/ModalityWorklists/WorklistsDatabase WORKLIST_DIR = '/tmp/WorklistsDatabase' def OnWorklist(answers, query, issuerAet, calledAet): diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/advanced-rest.rst --- a/Sphinx/source/users/advanced-rest.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/advanced-rest.rst Wed Feb 23 15:03:44 2022 +0100 @@ -134,7 +134,7 @@ ``ErrorCode`` and ``ErrorDescription`` fields for more information. * ``Paused``: The job has been paused. * ``Retry``: The job has failed internally, and has been scheduled for - re-submission after a delay. As of Orthanc 1.9.7, this feature is not + re-submission after a delay. As of Orthanc 1.10.0, this feature is not used by any type of job. In order to wait for the end of an asynchronous call, the caller will @@ -143,7 +143,7 @@ ``Failure``. Note that the `integration tests of Orthanc -`__ +`__ give an example about how to monitor a job in Python using the REST API (cf. function ``MonitorJob()``). @@ -204,7 +204,7 @@ Note how we retrieve the content of the archive by accessing the ``archive`` output of the job (check out the virtual method ``IJob::GetOutput()`` from the `source code -`__ +`__ of Orthanc). Here is the corresponding sequence of commands to generate a DICOMDIR @@ -213,7 +213,7 @@ $ curl http://localhost:8042/studies/27f7126f-4f66fb14-03f4081b-f9341db2-53925988/media -d '{"Asynchronous":true}' $ curl http://localhost:8042/jobs/6332be8a-0052-44fb-8cc2-ac959aeccad9/archive > a.zip -As of Orthanc 1.9.7, only the creation of a ZIP or a DICOMDIR archive +As of Orthanc 1.10.0, only the creation of a ZIP or a DICOMDIR archive produces such "outputs". diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/anonymization.rst --- a/Sphinx/source/users/anonymization.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/anonymization.rst Wed Feb 23 15:03:44 2022 +0100 @@ -80,7 +80,7 @@ **Implementation:** Internally, the setup of the anonymization profiles can be found in the methods ``SetupAnonymizationXXX()`` of the class ``Orthanc::DicomModification`` (cf. `source code -`__). +`__). Modification of a Single Instance diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/configuration.rst --- a/Sphinx/source/users/configuration.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/configuration.rst Wed Feb 23 15:03:44 2022 +0100 @@ -8,7 +8,7 @@ Configuring Orthanc simply consists in providing a configuration file. Orthanc has numerous configuration that are documented in the `default configuration file -`_. This +`_. This file is in the `JSON `_ file format. You can generate this file file with the following call:: diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/debian-packages.rst --- a/Sphinx/source/users/debian-packages.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/debian-packages.rst Wed Feb 23 15:03:44 2022 +0100 @@ -106,10 +106,10 @@ This can be done with this sequence of commands:: $ sudo service orthanc stop - $ sudo wget https://lsb.orthanc-server.com/orthanc/1.9.7/Orthanc --output-document /usr/sbin/Orthanc + $ sudo wget https://lsb.orthanc-server.com/orthanc/1.10.0/Orthanc --output-document /usr/sbin/Orthanc $ sudo rm -f /usr/share/orthanc/plugins/*.so - $ sudo wget https://lsb.orthanc-server.com/orthanc/1.9.7/libServeFolders.so --output-document /usr/share/orthanc/plugins/libServeFolders.so - $ sudo wget https://lsb.orthanc-server.com/orthanc/1.9.7/libModalityWorklists.so --output-document /usr/share/orthanc/plugins/libModalityWorklists.so + $ sudo wget https://lsb.orthanc-server.com/orthanc/1.10.0/libServeFolders.so --output-document /usr/share/orthanc/plugins/libServeFolders.so + $ sudo wget https://lsb.orthanc-server.com/orthanc/1.10.0/libModalityWorklists.so --output-document /usr/share/orthanc/plugins/libModalityWorklists.so $ $ sudo wget https://lsb.orthanc-server.com/plugin-dicom-web/1.6/libOrthancDicomWeb.so --output-document /usr/share/orthanc/plugins/libOrthancDicomWeb.so $ ... diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/docker.rst --- a/Sphinx/source/users/docker.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/docker.rst Wed Feb 23 15:03:44 2022 +0100 @@ -75,7 +75,7 @@ If more stability is required, you can select the official release of Orthanc to be run:: - $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc:1.9.7 + $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc:1.10.0 Passing additional command-line options (e.g. to make Orthanc verbose) can be done as follows (note the ``/etc/orthanc`` option that is @@ -97,7 +97,7 @@ Or you can also start a specific version of Orthanc for more stability:: - $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc-plugins:1.9.7 + $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc-plugins:1.10.0 If you have an interest in the :ref:`Python plugin `, you can use the ``orthanc-python`` image. The latter image is a @@ -105,7 +105,7 @@ Python 3.7 interpreter. Here is how to start this image:: $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc-python - $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc-python:1.9.7 + $ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc-python:1.10.0 Fine-tuning the configuration @@ -157,7 +157,7 @@ version: '3.1' # Secrets are only available since this version of Docker Compose services: orthanc: - image: jodogne/orthanc-plugins:1.9.7 + image: jodogne/orthanc-plugins:1.10.0 command: /run/secrets/ # Path to the configuration files (stored as secrets) ports: - 4242:4242 @@ -206,7 +206,7 @@ container to some path in the filesystem of your Linux host, e.g.:: $ mkdir /tmp/orthanc-db - $ docker run -p 4242:4242 -p 8042:8042 --rm -v /tmp/orthanc-db/:/var/lib/orthanc/db/ jodogne/orthanc:1.9.7 + $ docker run -p 4242:4242 -p 8042:8042 --rm -v /tmp/orthanc-db/:/var/lib/orthanc/db/ jodogne/orthanc:1.10.0 Whole-slide imaging support @@ -327,4 +327,4 @@ * The build artifacts can be found in folder ``/root/orthanc/Build``. * This command launches the mainline version. To start a released version, - use e.g. ``jodogne/orthanc-debug:1.9.7``. + use e.g. ``jodogne/orthanc-debug:1.10.0``. diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/man-orthanc.txt --- a/Sphinx/source/users/man-orthanc.txt Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/man-orthanc.txt Wed Feb 23 15:03:44 2022 +0100 @@ -122,10 +122,11 @@ COPYRIGHT Copyright © 2012-2016 Sebastien Jodogne, Medical Physics Department, University Hospital of Liege (Belgium) - Copyright © 2017-2021 Osimis S.A. (Belgium) Licensing GPLv3+: GNU GPL - version 3 or later , with OpenSSL - exception. + Copyright © 2017-2022 Osimis S.A. (Belgium) + Copyright © 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain (Belgium) + Licensing GPLv3+: GNU GPL version 3 or later + . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. -Orthanc 1.9.7 August 2021 ORTHANC(1) +Orthanc 1.10.0 February 2022 ORTHANC(1) diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/rest-cheatsheet.csv --- a/Sphinx/source/users/rest-cheatsheet.csv Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/rest-cheatsheet.csv Wed Feb 23 15:03:44 2022 +0100 @@ -11,6 +11,7 @@ ``/instances/{id}/attachments/{name}/compressed-md5``,`GET `__,,,,Get MD5 of attachment on disk ``/instances/{id}/attachments/{name}/compressed-size``,`GET `__,,,,Get size of attachment on disk ``/instances/{id}/attachments/{name}/data``,`GET `__,,,,Get attachment +``/instances/{id}/attachments/{name}/info``,`GET `__,,,,Get info about the attachment ``/instances/{id}/attachments/{name}/is-compressed``,`GET `__,,,,Is attachment compressed? ``/instances/{id}/attachments/{name}/md5``,`GET `__,,,,Get MD5 of attachment ``/instances/{id}/attachments/{name}/size``,`GET `__,,,,Get size of attachment @@ -25,6 +26,7 @@ ``/instances/{id}/frames/{frame}/image-uint16``,`GET `__,,,,Decode a frame (uint16) ``/instances/{id}/frames/{frame}/image-uint8``,`GET `__,,,,Decode a frame (uint8) ``/instances/{id}/frames/{frame}/matlab``,`GET `__,,,,Decode frame for Matlab +``/instances/{id}/frames/{frame}/numpy``,`GET `__,,,,Decode frame for numpy ``/instances/{id}/frames/{frame}/preview``,`GET `__,,,,Decode a frame (preview) ``/instances/{id}/frames/{frame}/raw``,`GET `__,,,,Access raw frame ``/instances/{id}/frames/{frame}/raw.gz``,`GET `__,,,,Access raw frame (compressed) @@ -38,6 +40,7 @@ ``/instances/{id}/metadata/{name}``,`GET `__,,`DELETE `__,`PUT `__,Get metadata ``/instances/{id}/modify``,,`POST `__,,,Modify instance ``/instances/{id}/module``,`GET `__,,,,Get instance module +``/instances/{id}/numpy``,`GET `__,,,,Decode instance for numpy ``/instances/{id}/patient``,`GET `__,,,,Get parent patient ``/instances/{id}/pdf``,`GET `__,,,,Get embedded PDF ``/instances/{id}/preview``,`GET `__,,,,Decode an image (preview) @@ -81,6 +84,7 @@ ``/patients/{id}/attachments/{name}/compressed-md5``,`GET `__,,,,Get MD5 of attachment on disk ``/patients/{id}/attachments/{name}/compressed-size``,`GET `__,,,,Get size of attachment on disk ``/patients/{id}/attachments/{name}/data``,`GET `__,,,,Get attachment +``/patients/{id}/attachments/{name}/info``,`GET `__,,,,Get info about the attachment ``/patients/{id}/attachments/{name}/is-compressed``,`GET `__,,,,Is attachment compressed? ``/patients/{id}/attachments/{name}/md5``,`GET `__,,,,Get MD5 of attachment ``/patients/{id}/attachments/{name}/size``,`GET `__,,,,Get size of attachment @@ -132,6 +136,7 @@ ``/series/{id}/attachments/{name}/compressed-md5``,`GET `__,,,,Get MD5 of attachment on disk ``/series/{id}/attachments/{name}/compressed-size``,`GET `__,,,,Get size of attachment on disk ``/series/{id}/attachments/{name}/data``,`GET `__,,,,Get attachment +``/series/{id}/attachments/{name}/info``,`GET `__,,,,Get info about the attachment ``/series/{id}/attachments/{name}/is-compressed``,`GET `__,,,,Is attachment compressed? ``/series/{id}/attachments/{name}/md5``,`GET `__,,,,Get MD5 of attachment ``/series/{id}/attachments/{name}/size``,`GET `__,,,,Get size of attachment @@ -144,6 +149,7 @@ ``/series/{id}/metadata/{name}``,`GET `__,,`DELETE `__,`PUT `__,Get metadata ``/series/{id}/modify``,,`POST `__,,,Modify series ``/series/{id}/module``,`GET `__,,,,Get series module +``/series/{id}/numpy``,`GET `__,,,,Decode series for numpy ``/series/{id}/ordered-slices``,`(get) `__,,,,*(deprecated)* Order the slices ``/series/{id}/patient``,`GET `__,,,,Get parent patient ``/series/{id}/reconstruct``,,`POST `__,,,Reconstruct tags of series @@ -164,6 +170,7 @@ ``/studies/{id}/attachments/{name}/compressed-md5``,`GET `__,,,,Get MD5 of attachment on disk ``/studies/{id}/attachments/{name}/compressed-size``,`GET `__,,,,Get size of attachment on disk ``/studies/{id}/attachments/{name}/data``,`GET `__,,,,Get attachment +``/studies/{id}/attachments/{name}/info``,`GET `__,,,,Get info about the attachment ``/studies/{id}/attachments/{name}/is-compressed``,`GET `__,,,,Is attachment compressed? ``/studies/{id}/attachments/{name}/md5``,`GET `__,,,,Get MD5 of attachment ``/studies/{id}/attachments/{name}/size``,`GET `__,,,,Get size of attachment @@ -188,8 +195,8 @@ ``/tools``,`GET `__,,,,List operations ``/tools/accepted-transfer-syntaxes``,`GET `__,,,`PUT `__,Get accepted transfer syntaxes ``/tools/bulk-anonymize``,,`POST `__,,,Anonymize a set of resources -``/tools/bulk-content``,,`POST `__,,,Describe a set of instances -``/tools/bulk-delete``,,`POST `__,,,Delete a set of instances +``/tools/bulk-content``,,`POST `__,,,Describe a set of resources +``/tools/bulk-delete``,,`POST `__,,,Delete a set of resources ``/tools/bulk-modify``,,`POST `__,,,Modify a set of resources ``/tools/create-archive``,,`POST `__,,,Create ZIP archive ``/tools/create-dicom``,,`POST `__,,,Create one DICOM instance diff -r 908ca7847b9d -r 01fa632daae9 Sphinx/source/users/rest.rst --- a/Sphinx/source/users/rest.rst Wed Feb 23 11:08:20 2022 +0100 +++ b/Sphinx/source/users/rest.rst Wed Feb 23 15:03:44 2022 +0100 @@ -94,7 +94,7 @@ $ curl -X POST -H "Expect:" http://localhost:8042/instances --data-binary @CT.X.1.2.276.0.7230010.dcm The code distribution of Orthanc contains a `sample Python script -`__ +`__ that recursively upload the content of some folder into Orthanc using the REST API:: @@ -106,7 +106,7 @@ import the content of ``.zip``, ``.tar.gz`` or ``.tar.bz2`` archives without having to uncompress them first. It also provides more comprehensive command-line options. `Check this script out -`__. +`__. .. highlight:: perl